diff --git a/package.json b/package.json index f5ad3392..39fa7ed4 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "cleanup": "sa cleanup", "commit": "sa git-commit", "dev": "vite", + "gen-route": "sa gen-route", "lint": "eslint . --fix", "prepare": "simple-git-hooks", "preview": "vite preview", diff --git a/packages/scripts/src/commands/index.ts b/packages/scripts/src/commands/index.ts index 78815bc5..db4fc150 100644 --- a/packages/scripts/src/commands/index.ts +++ b/packages/scripts/src/commands/index.ts @@ -3,3 +3,4 @@ export * from './cleanup'; export * from './update-pkg'; export * from './changelog'; export * from './release'; +export * from './router'; diff --git a/packages/scripts/src/commands/router.ts b/packages/scripts/src/commands/router.ts new file mode 100644 index 00000000..2b2a7b80 --- /dev/null +++ b/packages/scripts/src/commands/router.ts @@ -0,0 +1,79 @@ +import process from 'node:process'; +import path from 'node:path'; +import { writeFile } from 'node:fs/promises'; +import { existsSync, mkdirSync } from 'node:fs'; +import prompts from 'prompts'; +import { green, red } from 'kolorist'; + +/** generate route */ +export async function generateRoute() { + const result = await prompts([ + { + type: 'text', + name: 'routeName', + message: 'please enter route name', + initial: 'demo-route_child' + }, + { + type: 'confirm', + name: 'addRouteParams', + message: 'add route params?', + initial: false + }, + { + type: pre => (pre ? 'text' : null), + name: 'routeParams', + message: 'please enter route params', + initial: 'id' + } + ]); + + const PAGE_DIR_NAME_PATTERN = /^[\w-]+[0-9a-zA-Z]+$/; + + if (!PAGE_DIR_NAME_PATTERN.test(result.routeName)) { + throw new Error(`${red('route name is invalid, it only allow letters, numbers, "-" or "_"')}. +For example: +(1) one level route: ${green('demo-route')} +(2) two level route: ${green('demo-route_child')} +(3) multi level route: ${green('demo-route_child_child')} +(4) group route: ${green('_ignore_demo-route')}' +`); + } + + const PARAM_REG = /^\w+$/g; + + if (!PARAM_REG.test(result.routeParams)) { + throw new Error(red('route params is invalid, it only allow letters, numbers or "_".')); + } + + const cwd = process.cwd(); + + const [dir, ...rest] = result.routeName.split('_') as string[]; + + let routeDir = path.join(cwd, 'src', 'views', dir); + + if (rest.length) { + routeDir = path.join(routeDir, rest.join('_')); + } + + if (!existsSync(routeDir)) { + mkdirSync(routeDir, { recursive: true }); + } else { + throw new Error(red('route already exists')); + } + + const fileName = result.routeParams ? `[${result.routeParams}].vue` : 'index.vue'; + + const vueTemplate = ` + + + + +`; + + const filePath = path.join(routeDir, fileName); + + await writeFile(filePath, vueTemplate); +} diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts index da75ee38..909dda3d 100755 --- a/packages/scripts/src/index.ts +++ b/packages/scripts/src/index.ts @@ -1,10 +1,10 @@ import cac from 'cac'; import { blue, lightGreen } from 'kolorist'; import { version } from '../package.json'; -import { cleanup, genChangelog, gitCommit, gitCommitVerify, release, updatePkg } from './commands'; +import { cleanup, genChangelog, generateRoute, gitCommit, gitCommitVerify, release, updatePkg } from './commands'; import { loadCliOptions } from './config'; -type Command = 'cleanup' | 'update-pkg' | 'git-commit' | 'git-commit-verify' | 'changelog' | 'release'; +type Command = 'cleanup' | 'update-pkg' | 'git-commit' | 'git-commit-verify' | 'changelog' | 'release' | 'gen-route'; type CommandAction = (args?: A) => Promise | void; @@ -82,6 +82,12 @@ export async function setupCli() { action: async args => { await release(args?.execute, args?.push); } + }, + 'gen-route': { + desc: 'generate route', + action: async () => { + await generateRoute(); + } } };