From c1ae7b7a30a7da25f857a715b76984277f598396 Mon Sep 17 00:00:00 2001 From: neverland Date: Sat, 8 Aug 2026 14:39:45 +0800 Subject: [PATCH] feat(create-rstack): add Vue app templates --- packages/create-rstack/README.md | 2 ++ packages/create-rstack/src/index.ts | 3 ++ .../template-app-vue-js/AGENTS.md | 12 ++++++++ .../template-app-vue-js/package.json | 21 ++++++++++++++ .../template-app-vue-js/rstack.config.js | 21 ++++++++++++++ .../template-app-vue-js/src/App.vue | 28 +++++++++++++++++++ .../template-app-vue-js/src/index.css | 6 ++++ .../template-app-vue-js/src/index.js | 5 ++++ .../template-app-vue-ts/AGENTS.md | 12 ++++++++ .../template-app-vue-ts/package.json | 24 ++++++++++++++++ .../template-app-vue-ts/rstack.config.ts | 20 +++++++++++++ .../template-app-vue-ts/src/App.vue | 28 +++++++++++++++++++ .../template-app-vue-ts/src/index.css | 6 ++++ .../template-app-vue-ts/src/index.ts | 5 ++++ .../template-app-vue-ts/tsconfig.json | 24 ++++++++++++++++ packages/create-rstack/tests/create.test.ts | 12 ++++++++ 16 files changed, 229 insertions(+) create mode 100644 packages/create-rstack/template-app-vue-js/AGENTS.md create mode 100644 packages/create-rstack/template-app-vue-js/package.json create mode 100644 packages/create-rstack/template-app-vue-js/rstack.config.js create mode 100644 packages/create-rstack/template-app-vue-js/src/App.vue create mode 100644 packages/create-rstack/template-app-vue-js/src/index.css create mode 100644 packages/create-rstack/template-app-vue-js/src/index.js create mode 100644 packages/create-rstack/template-app-vue-ts/AGENTS.md create mode 100644 packages/create-rstack/template-app-vue-ts/package.json create mode 100644 packages/create-rstack/template-app-vue-ts/rstack.config.ts create mode 100644 packages/create-rstack/template-app-vue-ts/src/App.vue create mode 100644 packages/create-rstack/template-app-vue-ts/src/index.css create mode 100644 packages/create-rstack/template-app-vue-ts/src/index.ts create mode 100644 packages/create-rstack/template-app-vue-ts/tsconfig.json diff --git a/packages/create-rstack/README.md b/packages/create-rstack/README.md index b62318ab..c0b7c4f0 100644 --- a/packages/create-rstack/README.md +++ b/packages/create-rstack/README.md @@ -25,6 +25,8 @@ npx create-rstack -d my-project -t app-vanilla-ts - `app-vanilla-ts` - TypeScript Vanilla application - `app-react-js` - JavaScript React application - `app-react-ts` - TypeScript React application +- `app-vue-js` - JavaScript Vue application +- `app-vue-ts` - TypeScript Vue application - `lib-node-js` - JavaScript Node.js library - `lib-node-ts` - TypeScript Node.js library - `lib-react-js` - JavaScript React library diff --git a/packages/create-rstack/src/index.ts b/packages/create-rstack/src/index.ts index 81364077..e895cecd 100644 --- a/packages/create-rstack/src/index.ts +++ b/packages/create-rstack/src/index.ts @@ -45,6 +45,7 @@ const getTemplateName = async ({ template }: Argv): Promise => { ? [ { value: 'vanilla', label: 'Vanilla' }, { value: 'react', label: 'React' }, + { value: 'vue', label: 'Vue' }, ] : [ { value: 'node', label: 'Node.js' }, @@ -74,6 +75,8 @@ await create({ 'app-vanilla-ts', 'app-react-js', 'app-react-ts', + 'app-vue-js', + 'app-vue-ts', 'lib-node-js', 'lib-node-ts', 'lib-react-js', diff --git a/packages/create-rstack/template-app-vue-js/AGENTS.md b/packages/create-rstack/template-app-vue-js/AGENTS.md new file mode 100644 index 00000000..fb378511 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/AGENTS.md @@ -0,0 +1,12 @@ +# AGENTS.md + +## Commands + +- `{{ packageManager }} run dev` - Start the development server +- `{{ packageManager }} run build` - Build the app for production +- `{{ packageManager }} run preview` - Preview the production build locally + +## Docs + +- Rsbuild: https://rsbuild.rs/llms.txt +- Rspack: https://rspack.rs/llms.txt diff --git a/packages/create-rstack/template-app-vue-js/package.json b/packages/create-rstack/template-app-vue-js/package.json new file mode 100644 index 00000000..c3466a77 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/package.json @@ -0,0 +1,21 @@ +{ + "name": "rstack-app-vue-js", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "rs build", + "dev": "rs dev", + "format": "rs fmt", + "lint": "rs lint", + "preview": "rs preview", + "test": "rs test" + }, + "dependencies": { + "vue": "^3.5.40" + }, + "devDependencies": { + "@rsbuild/plugin-vue": "^2.0.1", + "rstack": "^0.3.5" + } +} diff --git a/packages/create-rstack/template-app-vue-js/rstack.config.js b/packages/create-rstack/template-app-vue-js/rstack.config.js new file mode 100644 index 00000000..376d57d9 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/rstack.config.js @@ -0,0 +1,21 @@ +// @ts-check +// Rstack configuration guide: https://rstack.rs/config +import { define } from 'rstack'; + +define.app(async () => { + const { pluginVue } = await import('@rsbuild/plugin-vue'); + + return { + plugins: [pluginVue()], + }; +}); + +define.test({ + // Configure Rstest +}); + +define.lint(async () => { + const { js } = await import('rstack/lint'); + + return [js.configs.recommended]; +}); diff --git a/packages/create-rstack/template-app-vue-js/src/App.vue b/packages/create-rstack/template-app-vue-js/src/App.vue new file mode 100644 index 00000000..bf4fbb63 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/src/App.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/create-rstack/template-app-vue-js/src/index.css b/packages/create-rstack/template-app-vue-js/src/index.css new file mode 100644 index 00000000..85e7e2b4 --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/src/index.css @@ -0,0 +1,6 @@ +body { + margin: 0; + color: #fff; + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + background-image: linear-gradient(to bottom, #020917, #101725); +} diff --git a/packages/create-rstack/template-app-vue-js/src/index.js b/packages/create-rstack/template-app-vue-js/src/index.js new file mode 100644 index 00000000..aa3ede0b --- /dev/null +++ b/packages/create-rstack/template-app-vue-js/src/index.js @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import './index.css'; + +createApp(App).mount('#root'); diff --git a/packages/create-rstack/template-app-vue-ts/AGENTS.md b/packages/create-rstack/template-app-vue-ts/AGENTS.md new file mode 100644 index 00000000..fb378511 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/AGENTS.md @@ -0,0 +1,12 @@ +# AGENTS.md + +## Commands + +- `{{ packageManager }} run dev` - Start the development server +- `{{ packageManager }} run build` - Build the app for production +- `{{ packageManager }} run preview` - Preview the production build locally + +## Docs + +- Rsbuild: https://rsbuild.rs/llms.txt +- Rspack: https://rspack.rs/llms.txt diff --git a/packages/create-rstack/template-app-vue-ts/package.json b/packages/create-rstack/template-app-vue-ts/package.json new file mode 100644 index 00000000..77e0ab0b --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/package.json @@ -0,0 +1,24 @@ +{ + "name": "rstack-app-vue-ts", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "vue-tsc && rs build", + "dev": "rs dev", + "format": "rs fmt", + "lint": "rs lint", + "preview": "rs preview", + "test": "rs test" + }, + "dependencies": { + "vue": "^3.5.40" + }, + "devDependencies": { + "@rsbuild/plugin-vue": "^2.0.1", + "@types/node": "^24.13.3", + "rstack": "^0.3.5", + "typescript": "^6.0.3", + "vue-tsc": "^3.3.9" + } +} diff --git a/packages/create-rstack/template-app-vue-ts/rstack.config.ts b/packages/create-rstack/template-app-vue-ts/rstack.config.ts new file mode 100644 index 00000000..0399271d --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/rstack.config.ts @@ -0,0 +1,20 @@ +// Rstack configuration guide: https://rstack.rs/config +import { define } from 'rstack'; + +define.app(async () => { + const { pluginVue } = await import('@rsbuild/plugin-vue'); + + return { + plugins: [pluginVue()], + }; +}); + +define.test({ + // Configure Rstest +}); + +define.lint(async () => { + const { js, ts } = await import('rstack/lint'); + + return [js.configs.recommended, ts.configs.recommended]; +}); diff --git a/packages/create-rstack/template-app-vue-ts/src/App.vue b/packages/create-rstack/template-app-vue-ts/src/App.vue new file mode 100644 index 00000000..bf4fbb63 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/src/App.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/create-rstack/template-app-vue-ts/src/index.css b/packages/create-rstack/template-app-vue-ts/src/index.css new file mode 100644 index 00000000..85e7e2b4 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/src/index.css @@ -0,0 +1,6 @@ +body { + margin: 0; + color: #fff; + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + background-image: linear-gradient(to bottom, #020917, #101725); +} diff --git a/packages/create-rstack/template-app-vue-ts/src/index.ts b/packages/create-rstack/template-app-vue-ts/src/index.ts new file mode 100644 index 00000000..aa3ede0b --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/src/index.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import './index.css'; + +createApp(App).mount('#root'); diff --git a/packages/create-rstack/template-app-vue-ts/tsconfig.json b/packages/create-rstack/template-app-vue-ts/tsconfig.json new file mode 100644 index 00000000..fe3ca093 --- /dev/null +++ b/packages/create-rstack/template-app-vue-ts/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "lib": ["DOM", "ES2020"], + "jsx": "preserve", + "target": "ES2020", + "noEmit": true, + "skipLibCheck": true, + "types": ["rstack/types", "node"], + "jsxImportSource": "vue", + "useDefineForClassFields": true, + + /* modules */ + "moduleDetection": "force", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + + /* type checking */ + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/packages/create-rstack/tests/create.test.ts b/packages/create-rstack/tests/create.test.ts index a55a130c..74306421 100644 --- a/packages/create-rstack/tests/create.test.ts +++ b/packages/create-rstack/tests/create.test.ts @@ -57,6 +57,18 @@ test.each([ sourceExtension: 'tsx', hasTypeScript: true, }, + { + template: 'app-vue-js', + configExtension: 'js', + sourceExtension: 'js', + hasTypeScript: false, + }, + { + template: 'app-vue-ts', + configExtension: 'ts', + sourceExtension: 'ts', + hasTypeScript: true, + }, ])( 'creates the $template template', async ({ template, configExtension, sourceExtension, hasTypeScript }) => {