From 92ac6e029032cded9b74b1b67359fcd7152c91e4 Mon Sep 17 00:00:00 2001 From: MK Date: Wed, 5 Nov 2025 16:29:06 +0800 Subject: [PATCH] feat: code generator --- packages/global/package.json | 9 +- packages/global/rolldown.config.ts | 5 +- packages/global/snap-tests/gen-check/snap.txt | 96 + .../global/snap-tests/gen-check/steps.json | 7 + .../snap.txt | 7 + .../steps.json | 13 + .../snap-tests/gen-create-tsdown/snap.txt | 11 + .../snap-tests/gen-create-tsdown/steps.json | 18 + .../gen-create-vite-with-scope-name/snap.txt | 7 + .../steps.json | 13 + .../snap-tests/gen-create-vite/snap.txt | 11 + .../snap-tests/gen-create-vite/steps.json | 18 + .../snap-tests/gen-vite-monorepo/snap.txt | 153 ++ .../snap-tests/gen-vite-monorepo/steps.json | 38 + .../global/snap-tests/new-monorepo/snap.txt | 272 -- .../global/snap-tests/new-monorepo/steps.json | 15 - .../global/snap-tests/new-singlerepo/snap.txt | 59 - .../snap-tests/new-singlerepo/steps.json | 8 - packages/global/src/gen.ts | 607 +++++ .../__snapshots__/utils.spec.ts.snap | 93 + .../global/src/gen/__tests__/utils.spec.ts | 35 + packages/global/src/gen/command.ts | 173 ++ packages/global/src/gen/discovery.ts | 136 + packages/global/src/gen/migration.ts | 127 + packages/global/src/gen/prompts.ts | 86 + packages/global/src/gen/templates/builtin.ts | 49 + .../global/src/gen/templates/generator.ts | 44 + packages/global/src/gen/templates/index.ts | 3 + packages/global/src/gen/templates/monorepo.ts | 182 ++ packages/global/src/gen/templates/remote.ts | 93 + packages/global/src/gen/types.ts | 91 + packages/global/src/gen/utils.ts | 189 ++ packages/global/src/gen/workspace.ts | 192 ++ packages/global/src/index.ts | 7 +- packages/global/src/new.ts | 1017 -------- packages/global/templates/generator/README.md | 35 + .../global/templates/generator/bin/index.ts | 7 + .../global/templates/generator/package.json | 28 + .../templates/generator/src/template.ts | 66 + .../global/templates/generator/tsconfig.json | 8 + .../templates/minimal-js/.oxlintrc.json | 5 - .../global/templates/minimal-js/index.html | 1 - .../global/templates/minimal-js/package.json | 19 - .../global/templates/minimal-js/src/index.js | 11 - .../global/templates/minimal-js/tsconfig.json | 21 - packages/global/templates/minimal/index.html | 1 - .../global/templates/minimal/package.json | 14 - .../global/templates/minimal/src/index.ts | 1 - .../global/templates/minimal/tsconfig.json | 17 - packages/global/templates/monorepo/README.md | 4 +- .../global/templates/monorepo/_yarnrc.yml | 15 +- .../global/templates/monorepo/package.json | 17 +- .../templates/monorepo/pnpm-workspace.yaml | 11 +- packages/tools/src/snap-test.ts | 22 +- pnpm-lock.yaml | 127 +- pnpm-workspace.yaml | 5 +- rfcs/code-generator.md | 2199 +++++++++++++++++ 57 files changed, 4920 insertions(+), 1598 deletions(-) create mode 100644 packages/global/snap-tests/gen-check/snap.txt create mode 100644 packages/global/snap-tests/gen-check/steps.json create mode 100644 packages/global/snap-tests/gen-create-tsdown-with-scope-name/snap.txt create mode 100644 packages/global/snap-tests/gen-create-tsdown-with-scope-name/steps.json create mode 100644 packages/global/snap-tests/gen-create-tsdown/snap.txt create mode 100644 packages/global/snap-tests/gen-create-tsdown/steps.json create mode 100644 packages/global/snap-tests/gen-create-vite-with-scope-name/snap.txt create mode 100644 packages/global/snap-tests/gen-create-vite-with-scope-name/steps.json create mode 100644 packages/global/snap-tests/gen-create-vite/snap.txt create mode 100644 packages/global/snap-tests/gen-create-vite/steps.json create mode 100644 packages/global/snap-tests/gen-vite-monorepo/snap.txt create mode 100644 packages/global/snap-tests/gen-vite-monorepo/steps.json delete mode 100644 packages/global/snap-tests/new-monorepo/snap.txt delete mode 100644 packages/global/snap-tests/new-monorepo/steps.json delete mode 100644 packages/global/snap-tests/new-singlerepo/snap.txt delete mode 100644 packages/global/snap-tests/new-singlerepo/steps.json create mode 100644 packages/global/src/gen.ts create mode 100644 packages/global/src/gen/__tests__/__snapshots__/utils.spec.ts.snap create mode 100644 packages/global/src/gen/__tests__/utils.spec.ts create mode 100644 packages/global/src/gen/command.ts create mode 100644 packages/global/src/gen/discovery.ts create mode 100644 packages/global/src/gen/migration.ts create mode 100644 packages/global/src/gen/prompts.ts create mode 100644 packages/global/src/gen/templates/builtin.ts create mode 100644 packages/global/src/gen/templates/generator.ts create mode 100644 packages/global/src/gen/templates/index.ts create mode 100644 packages/global/src/gen/templates/monorepo.ts create mode 100644 packages/global/src/gen/templates/remote.ts create mode 100644 packages/global/src/gen/types.ts create mode 100644 packages/global/src/gen/utils.ts create mode 100644 packages/global/src/gen/workspace.ts delete mode 100644 packages/global/src/new.ts create mode 100644 packages/global/templates/generator/README.md create mode 100755 packages/global/templates/generator/bin/index.ts create mode 100644 packages/global/templates/generator/package.json create mode 100644 packages/global/templates/generator/src/template.ts create mode 100644 packages/global/templates/generator/tsconfig.json delete mode 100644 packages/global/templates/minimal-js/.oxlintrc.json delete mode 100644 packages/global/templates/minimal-js/index.html delete mode 100644 packages/global/templates/minimal-js/package.json delete mode 100644 packages/global/templates/minimal-js/src/index.js delete mode 100644 packages/global/templates/minimal-js/tsconfig.json delete mode 100644 packages/global/templates/minimal/index.html delete mode 100644 packages/global/templates/minimal/package.json delete mode 100644 packages/global/templates/minimal/src/index.ts delete mode 100644 packages/global/templates/minimal/tsconfig.json create mode 100644 rfcs/code-generator.md diff --git a/packages/global/package.json b/packages/global/package.json index 2fe8ace507..87e4aa673e 100644 --- a/packages/global/package.json +++ b/packages/global/package.json @@ -23,17 +23,20 @@ }, "dependencies": { "@voidzero-dev/vite-plus": "workspace:*", - "create-tsdown": "catalog:", - "create-vite": "catalog:", "cross-spawn": "catalog:", "oxlint": "catalog:", "oxlint-tsgolint": "catalog:", - "rolldown-vite": "workspace:*" + "rolldown-vite": "workspace:*", + "validate-npm-package-name": "catalog:" }, "devDependencies": { "@clack/prompts": "catalog:", + "@std/yaml": "catalog:", "@types/cross-spawn": "catalog:", + "@types/validate-npm-package-name": "catalog:", "@voidzero-dev/vite-plus-tools": "workspace:", + "glob": "catalog:", + "minimatch": "catalog:", "mri": "catalog:", "picocolors": "catalog:", "rolldown": "workspace:*" diff --git a/packages/global/rolldown.config.ts b/packages/global/rolldown.config.ts index 4d629d4d43..0d3d6f3b72 100644 --- a/packages/global/rolldown.config.ts +++ b/packages/global/rolldown.config.ts @@ -5,12 +5,13 @@ export default defineConfig({ external: [ /^node:/, '@voidzero-dev/vite-plus/bin', - 'create-vite', - 'create-tsdown', + '@voidzero-dev/vite-plus/binding', // FIXME: Calling `require` for "child_process" in an environment that doesn't expose the `require` function 'cross-spawn', // FIXME: will lost colors if not external 'picocolors', + // FIXME: Calling `require` for "module" in an environment that doesn't expose the `require` function + 'validate-npm-package-name', ], output: { format: 'esm', diff --git a/packages/global/snap-tests/gen-check/snap.txt b/packages/global/snap-tests/gen-check/snap.txt new file mode 100644 index 0000000000..b261ffc461 --- /dev/null +++ b/packages/global/snap-tests/gen-check/snap.txt @@ -0,0 +1,96 @@ +> vp gen --help # show help +Usage: vite gen [TEMPLATE] [OPTIONS] [-- TEMPLATE_OPTIONS] + +Run any template (builtin, remote, or local) with automatic vite+ integration. + +Arguments: + TEMPLATE Template name (optional; you will be prompted if omitted) + - Built-in: vite:monorepo, vite:application, vite:library, vite:generator + - Remote: create-vite, @tanstack/create-start, create-next-app, create-nuxt, + github:user/repo, https://github.com/user/template-repo + - Local: @company/generator-*, ./tools/create-ui-component + +Options (before --): + --directory DIR Target directory for the generated project. + Only works for built-in templates; auto-detected for remote templates. + --no-interactive Run in non-interactive mode (skip prompts and use defaults) + --list List all available templates + -h, --help Show this help message + +Template options (after --): + All arguments after -- are passed directly through to the template command. + +Examples: + # Interactive mode - choose template via prompt + vite gen + + # Run any existing template (npx / pnpm dlx / yarn dlx / bunx auto-detected) + vite gen create-vite + vite gen create-next-app + vite gen @tanstack/create-start + + # With template-specific options (after --) + vite gen create-vite -- --template react-ts + vite gen create-next-app -- --typescript --app + + # Create vite+ monorepo, application, library, or generator scaffolds + vite gen vite:monorepo + vite gen vite:application + vite gen vite:library + vite gen vite:generator + + # Monorepo: specify target directory + vite gen vite:application --directory=packages/my-app + + # Combine gen command options and template options + vite gen vite:application --directory=apps/my-app -- --template vue-ts + + # Run templates from GitHub (via degit) + vite gen github:user/repo + vite gen https://github.com/user/template-repo + +Note: Templates are executed via npx / pnpm dlx / yarn dlx / bunx, + based on the detected package manager. + No global installation required - always uses the latest version. + +Aliases: g, generate, new + + +> vp gen --list # list templates + +๐Ÿ“ฆ Available Templates + +Vite+ Built-in Templates: + โ€ข vite:monorepo - Create a new monorepo + โ€ข vite:application - Create a new application + โ€ข vite:library - Create a new library + โ€ข vite:generator - Scaffold a new code generator + +Popular Remote Templates: + โ€ข create-vite - Official Vite templates + โ€ข @tanstack/create-start - TanStack applications + โ€ข create-next-app - Next.js application + โ€ข create-nuxt - Nuxt application + โ€ข create-typescript-app - TypeScript application + โ€ข create-react-router - React Router application + โ€ข create-vue - Vue application + +Run vite gen for interactive mode +Run vite gen