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 = `
+
+
+ ${result.routeName}
+
+
+
+`;
+
+ 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();
+ }
}
};