@farris/cli 2.3.7 → 2.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/lib/commands/add-app.js +5 -5
  2. package/lib/commands/add-app.js.map +1 -1
  3. package/lib/commands/add-lib.js +5 -5
  4. package/lib/commands/add-lib.js.map +1 -1
  5. package/lib/commands/add-micro.js +12 -0
  6. package/lib/commands/add-micro.js.map +1 -0
  7. package/lib/commands/add-project.js +196 -194
  8. package/lib/commands/add-project.js.map +1 -1
  9. package/lib/commands/build-components.js +60 -60
  10. package/lib/commands/build-components.js.map +1 -1
  11. package/lib/commands/build-css.js +38 -38
  12. package/lib/commands/build-css.js.map +1 -1
  13. package/lib/commands/build-lib.js +30 -30
  14. package/lib/commands/build-lib.js.map +1 -1
  15. package/lib/commands/build.js +19 -19
  16. package/lib/commands/build.js.map +1 -1
  17. package/lib/commands/create-app-options.js +85 -74
  18. package/lib/commands/create-app-options.js.map +1 -1
  19. package/lib/commands/create-app.js +131 -131
  20. package/lib/commands/create-app.js.map +1 -1
  21. package/lib/commands/create-options.js +58 -32
  22. package/lib/commands/create-options.js.map +1 -1
  23. package/lib/commands/create.js +341 -331
  24. package/lib/commands/create.js.map +1 -1
  25. package/lib/commands/dev-serve.js +18 -18
  26. package/lib/commands/extract-i18n.js +74 -74
  27. package/lib/commands/extract-i18n.js.map +1 -1
  28. package/lib/commands/generate/api.js +124 -124
  29. package/lib/commands/generate/api.js.map +1 -1
  30. package/lib/commands/generate/common.js +101 -101
  31. package/lib/commands/generate/common.js.map +1 -1
  32. package/lib/commands/generate/component.js +156 -156
  33. package/lib/commands/generate/component.js.map +1 -1
  34. package/lib/commands/generate/view.js +168 -168
  35. package/lib/commands/generate/view.js.map +1 -1
  36. package/lib/commands/preview-serve.js +16 -16
  37. package/lib/commands/workspace/add-app.js +15 -15
  38. package/lib/commands/workspace/add-app.js.map +1 -1
  39. package/lib/commands/workspace/create.js +62 -62
  40. package/lib/commands/workspace/create.js.map +1 -1
  41. package/lib/commands/workspace/inspect.js +30 -30
  42. package/lib/commands/workspace/inspect.js.map +1 -1
  43. package/lib/commands/workspace/verify.js +38 -38
  44. package/lib/commands/workspace/verify.js.map +1 -1
  45. package/lib/common/agents-doc.js +33 -33
  46. package/lib/common/agents-doc.js.map +1 -1
  47. package/lib/common/apply-catalog-deps.js +15 -15
  48. package/lib/common/apply-catalog-deps.js.map +1 -1
  49. package/lib/common/component-file-name.js +3 -3
  50. package/lib/common/constant.js +85 -84
  51. package/lib/common/constant.js.map +1 -1
  52. package/lib/common/create-app-target.js +46 -46
  53. package/lib/common/create-app-target.js.map +1 -1
  54. package/lib/common/generate-app.js +106 -109
  55. package/lib/common/generate-app.js.map +1 -1
  56. package/lib/common/get-dependencies.js +9 -9
  57. package/lib/common/get-farris-config.js +25 -25
  58. package/lib/common/get-farris-config.js.map +1 -1
  59. package/lib/common/get-version.js +6 -6
  60. package/lib/common/get-vite-config.js +192 -192
  61. package/lib/common/get-vite-config.js.map +1 -1
  62. package/lib/common/lib-package-exports.js +24 -24
  63. package/lib/common/lib-package-exports.js.map +1 -1
  64. package/lib/common/list-lib-components.js +23 -23
  65. package/lib/common/list-lib-components.js.map +1 -1
  66. package/lib/common/output.js +164 -164
  67. package/lib/common/output.js.map +1 -1
  68. package/lib/common/project-layout.js +155 -183
  69. package/lib/common/project-layout.js.map +1 -1
  70. package/lib/common/safety.js +172 -173
  71. package/lib/common/safety.js.map +1 -1
  72. package/lib/common/template-manifest.js +18 -14
  73. package/lib/common/template-manifest.js.map +1 -1
  74. package/lib/common/template-renderer.js +114 -114
  75. package/lib/common/template-renderer.js.map +1 -1
  76. package/lib/common/transaction.js +83 -83
  77. package/lib/common/transaction.js.map +1 -1
  78. package/lib/common/verifier.js +187 -201
  79. package/lib/common/verifier.js.map +1 -1
  80. package/lib/common/workspace-contract.js +191 -157
  81. package/lib/common/workspace-contract.js.map +1 -1
  82. package/lib/config/vite-app.js +13 -13
  83. package/lib/config/vite-common.js +20 -20
  84. package/lib/config/vite-common.js.map +1 -1
  85. package/lib/config/vite-component.js +32 -32
  86. package/lib/config/vite-component.js.map +1 -1
  87. package/lib/config/vite-lib.js +26 -26
  88. package/lib/config/vite-lib.js.map +1 -1
  89. package/lib/index.js +261 -238
  90. package/lib/index.js.map +1 -1
  91. package/lib/plugins/create-app-package-json.js +23 -23
  92. package/lib/plugins/create-component-style.js +44 -44
  93. package/lib/plugins/create-package-json.js +48 -48
  94. package/lib/plugins/create-package-json.js.map +1 -1
  95. package/lib/plugins/dts.js +8 -8
  96. package/lib/plugins/html-system.js +9 -9
  97. package/lib/plugins/mock.js +240 -292
  98. package/lib/plugins/mock.js.map +1 -1
  99. package/lib/plugins/msw-adapter.js +141 -0
  100. package/lib/plugins/msw-adapter.js.map +1 -0
  101. package/lib/plugins/replace.js +17 -17
  102. package/lib/plugins/systemjs-bundle.js +15 -15
  103. package/lib/plugins/systemjs-bundle.js.map +1 -1
  104. package/package.json +6 -1
  105. package/templates/create/.gitignore.tpl +28 -8
  106. package/templates/create/AGENTS.md +76 -45
  107. package/templates/create/README.md +44 -11
  108. package/templates/create/package.json +2 -1
  109. package/templates/lib/.gitignore.tpl +31 -1
  110. package/templates/lib/.gitlab-ci.yml +2 -2
  111. package/templates/lib/README.md +24 -1
  112. package/templates/lib/{test → components/__tests__}/index.spec.ts +1 -1
  113. package/templates/lib/{test → components/__tests__}/index.spec.tsx +2 -2
  114. package/templates/lib/farris.config.mjs +2 -2
  115. package/templates/lib/package.json +1 -1
  116. package/templates/lib/tsconfig.json +1 -2
  117. package/templates/lib/vitest.config.ts +4 -2
  118. package/templates/micro/.eslintrc.cjs +15 -0
  119. package/templates/micro/.gitignore.tpl +33 -0
  120. package/templates/micro/.gitlab-ci.yml +59 -0
  121. package/templates/micro/.prettierrc.json +8 -0
  122. package/templates/micro/farris.config.mjs +34 -0
  123. package/templates/micro/index.html +12 -0
  124. package/templates/micro/mock/README.md +53 -0
  125. package/templates/micro/mock/tsconfig.json +10 -0
  126. package/templates/micro/package.json +47 -0
  127. package/templates/micro/src/App.tsx +25 -0
  128. package/templates/micro/src/locales/index.ts +5 -0
  129. package/templates/micro/src/locales/zh-CHS.json +1 -0
  130. package/templates/micro/src/main.ts +47 -0
  131. package/templates/micro/src/router/index.ts +24 -0
  132. package/templates/micro/src/views/AboutView.tsx +12 -0
  133. package/templates/micro/src/views/HomeView.tsx +13 -0
  134. package/templates/micro/src/views/__tests__/AboutView.spec.tsx +11 -0
  135. package/templates/micro/src/views/__tests__/HomeView.spec.tsx +11 -0
  136. package/templates/micro/tsconfig.json +18 -0
  137. package/templates/micro/vitest.config.ts +12 -0
  138. package/templates/mobile/.gitignore.tpl +25 -24
  139. package/templates/mobile/farris.config.mjs +2 -2
  140. package/templates/mobile/mock/README.md +39 -20
  141. package/templates/mobile/mock/tsconfig.json +10 -0
  142. package/templates/mobile/package.json +5 -2
  143. package/templates/mobile/src/main.ts +5 -40
  144. package/templates/mobile/src/views/HomeView.tsx +2 -2
  145. package/templates/mobile/src/views/__tests__/AboutView.spec.tsx +11 -0
  146. package/templates/mobile/src/views/__tests__/HomeView.spec.tsx +11 -0
  147. package/templates/mobile/tsconfig.json +1 -2
  148. package/templates/mobile/vitest.config.ts +4 -2
  149. package/templates/web/.gitignore.tpl +25 -24
  150. package/templates/web/farris.config.mjs +2 -2
  151. package/templates/web/mock/README.md +39 -20
  152. package/templates/web/mock/tsconfig.json +10 -0
  153. package/templates/web/package.json +5 -2
  154. package/templates/web/src/App.tsx +0 -4
  155. package/templates/web/src/main.ts +5 -40
  156. package/templates/web/src/views/HomeView.tsx +2 -2
  157. package/templates/web/src/views/__tests__/AboutView.spec.tsx +11 -0
  158. package/templates/web/src/views/__tests__/HomeView.spec.tsx +11 -0
  159. package/templates/web/tsconfig.json +1 -2
  160. package/templates/web/vitest.config.ts +4 -2
  161. package/templates/mobile/src/components/TheButton.tsx +0 -9
  162. package/templates/mobile/test/src/components/TheButton.spec.ts +0 -15
  163. package/templates/mobile/test/src/components/TheButton.spec.tsx +0 -15
  164. package/templates/web/src/components/TheButton.tsx +0 -9
  165. package/templates/web/src/micro-app.d.ts +0 -20
  166. package/templates/web/src/styles/index.css +0 -0
  167. package/templates/web/test/src/components/TheButton.spec.ts +0 -15
  168. package/templates/web/test/src/components/TheButton.spec.tsx +0 -15
  169. /package/templates/{web → micro}/src/micro/context.ts +0 -0
  170. /package/templates/{mobile → micro}/src/micro-app.d.ts +0 -0
  171. /package/templates/{mobile/src/styles/index.css → micro/src/styles/index.scss} +0 -0
@@ -1,27 +1,27 @@
1
- import { mergeConfig } from 'vite';
2
- import { resolve } from "node:path";
3
- import { CWD, getPackageName } from '../common/constant.js';
4
- import { systemjsBundle } from '../plugins/systemjs-bundle.js';
5
- import CommonConfig from "./vite-common.js";
6
- export default mergeConfig(CommonConfig, {
7
- logLevel: 'silent',
8
- plugins: [systemjsBundle()],
9
- build: {
10
- lib: {
11
- entry: resolve(CWD, `./src/main.ts`),
12
- fileName: "index",
13
- },
14
- target: 'es2019',
15
- outDir: resolve(CWD, `./lib`),
16
- rollupOptions: {
17
- output: {
18
- exports: "named",
19
- globals: {
20
- vue: "Vue",
21
- [getPackageName()]: getPackageName()
22
- }
23
- }
24
- },
25
- }
26
- });
1
+ import { mergeConfig } from 'vite';
2
+ import { resolve } from "node:path";
3
+ import { CWD, getPackageName } from '../common/constant.js';
4
+ import { systemjsBundle } from '../plugins/systemjs-bundle.js';
5
+ import CommonConfig from "./vite-common.js";
6
+ export default mergeConfig(CommonConfig, {
7
+ logLevel: 'silent',
8
+ plugins: [systemjsBundle()],
9
+ build: {
10
+ lib: {
11
+ entry: resolve(CWD, `./src/main.ts`),
12
+ fileName: "index",
13
+ },
14
+ target: 'es2019',
15
+ outDir: resolve(CWD, `./dist`),
16
+ rollupOptions: {
17
+ output: {
18
+ exports: "named",
19
+ globals: {
20
+ vue: "Vue",
21
+ [getPackageName()]: getPackageName()
22
+ }
23
+ }
24
+ },
25
+ }
26
+ });
27
27
  //# sourceMappingURL=vite-lib.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-lib.js","sourceRoot":"","sources":["../../src/config/vite-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAE5C,eAAe,WAAW,CAAC,YAAY,EAAE;IACvC,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,CAAC,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAC;QACJ,GAAG,EAAE;YACH,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC;YACpC,QAAQ,EAAE,OAAO;SAClB;QACD,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;QAC7B,aAAa,EAAE;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,GAAG,EAAE,KAAK;oBACV,CAAC,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE;iBACrC;aACF;SACF;KACF;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"vite-lib.js","sourceRoot":"","sources":["../../src/config/vite-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAE5C,eAAe,WAAW,CAAC,YAAY,EAAE;IACvC,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,CAAC,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAC;QACJ,GAAG,EAAE;YACH,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC;YACpC,QAAQ,EAAE,OAAO;SAClB;QACD,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC9B,aAAa,EAAE;YACb,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,GAAG,EAAE,KAAK;oBACV,CAAC,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE;iBACrC;aACF;SACF;KACF;CACF,CAAC,CAAC"}
package/lib/index.js CHANGED
@@ -1,239 +1,262 @@
1
- #!/usr/bin/env node
2
- import { Command } from 'commander';
3
- import { getVersion } from './common/get-version.js';
4
- import { PROJECT_CONTAINERS } from './common/project-layout.js';
5
- const program = new Command();
6
- program.version(`@farris/cli ${getVersion()}`);
7
- // ==========================================
8
- // 存量命令 (保持向后兼容)
9
- // ==========================================
10
- program
11
- .command('build')
12
- .description('构建应用产物')
13
- .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
14
- .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
15
- .option('-b, --base [base]', '覆盖构建公共路径 Base (如 / 或 ./ 或 /apps/xxx/)')
16
- .option('-ep, --emitPackage', '是否生成 dist/package.json 发布清单')
17
- .option('-f, --format <format>', '覆盖产物交付格式 (es | umd | systemjs | iife)')
18
- .option('-o, --outDir <outDir>', '覆盖产物输出目录 (默认 ./dist)')
19
- .action(async (options) => {
20
- process.env.BUILD_TYPE = 'app';
21
- const { buildCommon } = await import('./commands/build.js');
22
- await buildCommon({ ...options, type: 'app' });
23
- });
24
- program
25
- .command('build-lib')
26
- .description('构建 Library 产物')
27
- .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
28
- .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
29
- .option('-f, --format [format]', '产物格式 (es | umd | systemjs)')
30
- .option('-d, --dts', '是否生成类型声明文件')
31
- .option('-ep, --emitPackage', '是否生成 package.json')
32
- .action(async (options) => {
33
- process.env.BUILD_TYPE = 'lib';
34
- const { buildLib } = await import('./commands/build-lib.js');
35
- await buildLib(options);
36
- });
37
- program
38
- .command('build-components')
39
- .description('构建组件库产物')
40
- .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
41
- .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
42
- .action(async (options) => {
43
- process.env.BUILD_TYPE = 'components';
44
- const { buildComponents } = await import('./commands/build-components.js');
45
- await buildComponents(options);
46
- });
47
- program
48
- .command('build-css')
49
- .description('构建样式产物')
50
- .option('-e, --entry [entry]', '样式入口文件')
51
- .option('-o, --outfile [outfile]', '样式输出文件')
52
- .option('-m, --minify [minify]', '是否压缩')
53
- .action(async (options) => {
54
- process.env.BUILD_TYPE = 'css';
55
- const { buildCss } = await import('./commands/build-css.js');
56
- await buildCss(options);
57
- });
58
- program
59
- .command('create [name]')
60
- .description('新建 pnpm workspace,可选创建一个工程')
61
- .option('-y, --yes', '使用默认值,跳过问答')
62
- .option('--json', '以 JSON 格式输出结果')
63
- .option('--app <appName>', '非交互时指定工程目录名')
64
- .option('--no-app', '不创建工程')
65
- .option('--install', '生成后执行 pnpm install')
66
- .option('--force', '确认覆盖与模板同名的已有文件(非交互模式必须显式指定)')
67
- .action(async (name, options) => {
68
- const { create } = await import('./commands/create.js');
69
- const noApp = options.noApp === true || options.app === false;
70
- const app = typeof options.app === 'string' ? options.app : undefined;
71
- await create(name, {
72
- yes: options.yes,
73
- json: options.json,
74
- install: options.install,
75
- app,
76
- noApp,
77
- force: options.force
78
- });
79
- });
80
- program
81
- .command('add-app [name]')
82
- .description(`向当前 workspace 添加应用 → ${PROJECT_CONTAINERS.app}/<name>`)
83
- .option('-t, --title <title>', '应用展示标题')
84
- .option('--platform <platform>', '应用平台 (web | mobile)', 'web')
85
- .option('--style <style>', '应用全局样式 (none | css | scss)', 'css')
86
- .option('--format <format>', '产物交付格式 (es | systemjs)', 'es')
87
- .option('--json', '以 JSON 格式输出结果')
88
- .option('--force', '确认覆盖与模板同名的已有文件')
89
- .option('--install', '添加后执行 pnpm install', false)
90
- .action(async (name, options) => {
91
- const { addApp } = await import('./commands/add-app.js');
92
- await addApp(name, options);
93
- });
94
- program
95
- .command('add-lib [name]')
96
- .description(`向当前 workspace 添加组件库 → ${PROJECT_CONTAINERS.lib}/<name>`)
97
- .option('-t, --title <title>', '组件库展示标题')
98
- .option('--formats <formats>', 'lib 产物格式,逗号分隔 (es,cjs,umd,systemjs)')
99
- .option('--json', '以 JSON 格式输出结果')
100
- .option('--force', '确认覆盖与模板同名的已有文件')
101
- .option('--install', '添加后执行 pnpm install', false)
102
- .action(async (name, options) => {
103
- const { addLib } = await import('./commands/add-lib.js');
104
- await addLib(name, options);
105
- });
106
- program
107
- .command('create-app [name]')
108
- .description('新建 App / Lib 模板')
109
- .option('--type <type>', '工程类型 (app | lib)')
110
- .option('--platform <platform>', '应用平台 (web | mobile)')
111
- .option('--formats <formats>', 'lib 产物格式,逗号分隔 (es,cjs,umd,systemjs)')
112
- .option('--format <format>', 'app 产物格式 (iife | es | umd | systemjs)')
113
- .option('-y, --yes', '使用默认值,跳过问答')
114
- .option('--json', '以 JSON 格式输出结果')
115
- .action(async (name, options) => {
116
- const { createApp } = await import('./commands/create-app.js');
117
- await createApp(name, options);
118
- });
119
- program
120
- .command('dev')
121
- .description('创建 Dev Server')
122
- .option('-p, --port [port]', '开发服务器端口')
123
- .option('--no-mock', '关闭开发期 mock,接口请求全部走代理')
124
- .action(async (options) => {
125
- process.env.BUILD_TYPE = 'app';
126
- const { devServe } = await import('./commands/dev-serve.js');
127
- await devServe(options);
128
- });
129
- program
130
- .command('preview')
131
- .description('创建 Preview Server')
132
- .option('-p, --port [port]', '预览服务器端口')
133
- .action(async (options) => {
134
- process.env.BUILD_TYPE = 'app';
135
- const { previewServe } = await import('./commands/preview-serve.js');
136
- await previewServe(options);
137
- });
138
- program
139
- .command('extract-i18n')
140
- .description('抽取国际化资源到 JSON 文件')
141
- .option('-c, --configFile [configFile]', '国际化配置文件路径')
142
- .action(async (options) => {
143
- const { extractI18n } = await import('./commands/extract-i18n.js');
144
- await extractI18n(options);
145
- });
146
- // ==========================================
147
- // Workspace 命令组
148
- // ==========================================
149
- const workspaceCmd = program.command('workspace').description('Farris pnpm workspace 规范管理');
150
- workspaceCmd
151
- .command('inspect [target]')
152
- .description('检查目标目录安全状态')
153
- .option('--json', '以 JSON 格式输出结果')
154
- .action(async (target = '.', options) => {
155
- const { inspectWorkspace } = await import('./commands/workspace/inspect.js');
156
- await inspectWorkspace(target, options);
157
- });
158
- workspaceCmd
159
- .command('create [target]')
160
- .description('初始化标准 Farris Vue pnpm workspace')
161
- .option('-n, --name <name>', '应用名称 (package name)')
162
- .option('-t, --title <title>', '应用展示标题')
163
- .option('--router', '启用 Vue Router')
164
- .option('--router-mode <mode>', '路由模式 (hash | history)', 'hash')
165
- .option('--format <format>', '产物交付格式 (iife | es | systemjs)', 'iife')
166
- .option('--style <style>', '应用全局样式 (none | css | scss)', 'css')
167
- .option('--json', '以 JSON 格式输出结果')
168
- .option('--force', '确认覆盖与模板同名的已有文件(非交互模式必须显式指定)')
169
- .option('--install', '是否在初始化完成后自动安装依赖 (pnpm install)', false)
170
- .option('-y, --yes', '接受默认配置')
171
- .action(async (target = '.', options) => {
172
- const { createWorkspace } = await import('./commands/workspace/create.js');
173
- await createWorkspace(target, options);
174
- });
175
- workspaceCmd
176
- .command('add-app <name>')
177
- .description('[已废弃] 请改用 farris-cli add-app')
178
- .option('-t, --title <title>', '应用展示标题')
179
- .option('--router', '启用 Vue Router')
180
- .option('--router-mode <mode>', '路由模式 (hash | history)', 'hash')
181
- .option('--format <format>', '产物交付格式 (iife | es | systemjs)', 'iife')
182
- .option('--style <style>', '应用全局样式 (none | css | scss)', 'css')
183
- .option('--json', '以 JSON 格式输出结果')
184
- .action(async (name, options) => {
185
- const { addAppToWorkspace } = await import('./commands/workspace/add-app.js');
186
- await addAppToWorkspace(name, options);
187
- });
188
- workspaceCmd
189
- .command('verify [target]')
190
- .description('验证 Workspace 结构与规范合规性')
191
- .option('--json', '以 JSON 格式输出结果')
192
- .action(async (target = '.', options) => {
193
- const { verifyWorkspaceCommand } = await import('./commands/workspace/verify.js');
194
- await verifyWorkspaceCommand(target, options);
195
- });
196
- // ==========================================
197
- // Generate 命令组
198
- // ==========================================
199
- const generateCmd = program.command('generate').alias('g').description('应用级代码生成器');
200
- generateCmd
201
- .command('view <name>')
202
- .description('生成 View 页面 (含必须调用的 composable)')
203
- .option('-t, --title <title>', '页面展示标题')
204
- .option('--with-route', '自动在路由中注册页面')
205
- .option('--with-props', '生成页面 Props 文件')
206
- .option('--json', '以 JSON 格式输出结果')
207
- .action(async (name, options) => {
208
- const { generateView } = await import('./commands/generate/view.js');
209
- await generateView(name, options);
210
- });
211
- generateCmd
212
- .command('component <name>')
213
- .description('生成通用组件 (位于 src/components/)')
214
- .option('--with-props', '生成组件 Props 文件')
215
- .option('--no-props', '不生成组件 Props 文件')
216
- .option('--style <style>', '组件样式方案 (none | css | scss)', 'none')
217
- .option('--json', '以 JSON 格式输出结果')
218
- .action(async (name, options) => {
219
- const { generateComponent } = await import('./commands/generate/component.js');
220
- await generateComponent(name, options);
221
- });
222
- generateCmd
223
- .command('api <name>')
224
- .description('生成 API 模块 (位于 src/api/)')
225
- .option('-e, --endpoint <endpoint>', 'API 请求路径 (如 /api/v1/orders)')
226
- .option('-m, --method <method>', 'HTTP 请求方法 (get | post | put | patch | delete)', 'get')
227
- .option('--client <client>', '指定已有 HTTP 客户端路径')
228
- .option('--init-client', '若不存在则初始化标准 HTTP 客户端')
229
- .option('--json', '以 JSON 格式输出结果')
230
- .action(async (name, options) => {
231
- const { generateApi } = await import('./commands/generate/api.js');
232
- await generateApi(name, options);
233
- });
234
- program.parseAsync(process.argv).catch((err) => {
235
- const message = err instanceof Error ? err.message : String(err);
236
- console.error(message);
237
- process.exit(1);
238
- });
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { getVersion } from './common/get-version.js';
4
+ import { PROJECT_CONTAINERS } from './common/project-layout.js';
5
+ const program = new Command();
6
+ program.version(`@farris/cli ${getVersion()}`);
7
+ // ==========================================
8
+ // 存量命令 (保持向后兼容)
9
+ // ==========================================
10
+ program
11
+ .command('build')
12
+ .description('构建应用产物')
13
+ .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
14
+ .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
15
+ .option('-b, --base [base]', '覆盖构建公共路径 Base (如 / 或 ./ 或 /apps/xxx/)')
16
+ .option('-ep, --emitPackage', '是否生成 dist/package.json 发布清单')
17
+ .option('-f, --format <format>', '覆盖产物交付格式 (es | umd | systemjs | iife)')
18
+ .option('-o, --outDir <outDir>', '覆盖产物输出目录 (默认 ./dist)')
19
+ .action(async (options) => {
20
+ process.env.BUILD_TYPE = 'app';
21
+ const { buildCommon } = await import('./commands/build.js');
22
+ await buildCommon({ ...options, type: 'app' });
23
+ });
24
+ program
25
+ .command('build-lib')
26
+ .description('构建 Library 产物')
27
+ .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
28
+ .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
29
+ .option('-f, --format [format]', '产物格式 (es | umd | systemjs)')
30
+ .option('-d, --dts', '是否生成类型声明文件')
31
+ .option('-ep, --emitPackage', '是否生成 package.json')
32
+ .action(async (options) => {
33
+ process.env.BUILD_TYPE = 'lib';
34
+ const { buildLib } = await import('./commands/build-lib.js');
35
+ await buildLib(options);
36
+ });
37
+ program
38
+ .command('build-components')
39
+ .description('构建组件库产物')
40
+ .option('-c, --configFile [configFile]', 'Farris 配置文件路径')
41
+ .option('-vc, --viteConfigFile [viteConfigFile]', 'Vite 配置文件路径')
42
+ .action(async (options) => {
43
+ process.env.BUILD_TYPE = 'components';
44
+ const { buildComponents } = await import('./commands/build-components.js');
45
+ await buildComponents(options);
46
+ });
47
+ program
48
+ .command('build-css')
49
+ .description('构建样式产物')
50
+ .option('-e, --entry [entry]', '样式入口文件')
51
+ .option('-o, --outfile [outfile]', '样式输出文件')
52
+ .option('-m, --minify [minify]', '是否压缩')
53
+ .action(async (options) => {
54
+ process.env.BUILD_TYPE = 'css';
55
+ const { buildCss } = await import('./commands/build-css.js');
56
+ await buildCss(options);
57
+ });
58
+ program
59
+ .command('create [name]')
60
+ .description('新建 pnpm workspace,可选创建一个工程')
61
+ .option('-y, --yes', '使用默认值,跳过问答')
62
+ .option('--json', '以 JSON 格式输出结果')
63
+ .option('--project <name>', '非交互时指定工程名(旧名 --app 仍可用)')
64
+ .option('--no-project', '不创建工程')
65
+ .option('--type <type>', '工程类型 (app | lib | micro)', 'app')
66
+ .option('--style <style>', '应用全局样式 (none | scss)', 'scss')
67
+ .option('--platform <platform>', '应用平台 (web | mobile)', 'web')
68
+ .option('--format <format>', '应用默认交付格式 (es | umd | systemjs | iife)', 'es')
69
+ .option('--formats <formats>', 'lib 产物格式,逗号分隔 (es,cjs,umd,systemjs)')
70
+ .option('--install', '生成后执行 pnpm install')
71
+ .option('--force', '确认覆盖与模板同名的已有文件(非交互模式必须显式指定)')
72
+ .action(async (name, options) => {
73
+ const { create } = await import('./commands/create.js');
74
+ const noProject = options.noProject === true || options.project === false;
75
+ const project = typeof options.project === 'string' ? options.project : undefined;
76
+ await create(name, {
77
+ yes: options.yes,
78
+ json: options.json,
79
+ install: options.install,
80
+ project,
81
+ noProject,
82
+ type: options.type,
83
+ style: options.style,
84
+ platform: options.platform,
85
+ format: options.format,
86
+ formats: options.formats,
87
+ force: options.force
88
+ });
89
+ });
90
+ program
91
+ .command('add-app [name]')
92
+ .description(`向当前 workspace 添加应用 → ${PROJECT_CONTAINERS.app}/<name>`)
93
+ .option('-t, --title <title>', '应用展示标题')
94
+ .option('--platform <platform>', '应用平台 (web | mobile)', 'web')
95
+ .option('--style <style>', '应用全局样式 (none | scss)', 'scss')
96
+ .option('--format <format>', '产物交付格式 (es | systemjs)', 'es')
97
+ .option('--json', '以 JSON 格式输出结果')
98
+ .option('--force', '确认覆盖与模板同名的已有文件')
99
+ .option('--install', '添加后执行 pnpm install', false)
100
+ .action(async (name, options) => {
101
+ const { addApp } = await import('./commands/add-app.js');
102
+ await addApp(name, options);
103
+ });
104
+ program
105
+ .command('add-lib [name]')
106
+ .description(`向当前 workspace 添加组件库 → ${PROJECT_CONTAINERS.lib}/<name>`)
107
+ .option('-t, --title <title>', '组件库展示标题')
108
+ .option('--formats <formats>', 'lib 产物格式,逗号分隔 (es,cjs,umd,systemjs)')
109
+ .option('--json', '以 JSON 格式输出结果')
110
+ .option('--force', '确认覆盖与模板同名的已有文件')
111
+ .option('--install', '添加后执行 pnpm install', false)
112
+ .action(async (name, options) => {
113
+ const { addLib } = await import('./commands/add-lib.js');
114
+ await addLib(name, options);
115
+ });
116
+ program
117
+ .command('add-micro [name]')
118
+ .description(`向当前 workspace 添加微应用 → ${PROJECT_CONTAINERS.app}/<name>`)
119
+ .option('-t, --title <title>', '微应用展示标题')
120
+ .option('--style <style>', '应用全局样式 (none | scss)', 'scss')
121
+ .option('--format <format>', '产物交付格式 (iife | es | systemjs)', 'iife')
122
+ .option('--json', '以 JSON 格式输出结果')
123
+ .option('--force', '确认覆盖与模板同名的已有文件')
124
+ .option('--install', '添加后执行 pnpm install', false)
125
+ .action(async (name, options) => {
126
+ const { addMicro } = await import('./commands/add-micro.js');
127
+ await addMicro(name, options);
128
+ });
129
+ program
130
+ .command('create-app [name]')
131
+ .description('新建 App / Lib 模板')
132
+ .option('--type <type>', '工程类型 (app | lib)')
133
+ .option('--platform <platform>', '应用平台 (web | mobile)')
134
+ .option('--formats <formats>', 'lib 产物格式,逗号分隔 (es,cjs,umd,systemjs)')
135
+ .option('--format <format>', 'app 产物格式 (iife | es | umd | systemjs)')
136
+ .option('-y, --yes', '使用默认值,跳过问答')
137
+ .option('--json', '以 JSON 格式输出结果')
138
+ .action(async (name, options) => {
139
+ const { createApp } = await import('./commands/create-app.js');
140
+ await createApp(name, options);
141
+ });
142
+ program
143
+ .command('dev')
144
+ .description('创建 Dev Server')
145
+ .option('-p, --port [port]', '开发服务器端口')
146
+ .option('--no-mock', '关闭开发期 mock,接口请求全部走代理')
147
+ .action(async (options) => {
148
+ process.env.BUILD_TYPE = 'app';
149
+ const { devServe } = await import('./commands/dev-serve.js');
150
+ await devServe(options);
151
+ });
152
+ program
153
+ .command('preview')
154
+ .description('创建 Preview Server')
155
+ .option('-p, --port [port]', '预览服务器端口')
156
+ .action(async (options) => {
157
+ process.env.BUILD_TYPE = 'app';
158
+ const { previewServe } = await import('./commands/preview-serve.js');
159
+ await previewServe(options);
160
+ });
161
+ program
162
+ .command('extract-i18n')
163
+ .description('抽取国际化资源到 JSON 文件')
164
+ .option('-c, --configFile [configFile]', '国际化配置文件路径')
165
+ .action(async (options) => {
166
+ const { extractI18n } = await import('./commands/extract-i18n.js');
167
+ await extractI18n(options);
168
+ });
169
+ // ==========================================
170
+ // Workspace 命令组
171
+ // ==========================================
172
+ const workspaceCmd = program.command('workspace').description('Farris pnpm workspace 规范管理');
173
+ workspaceCmd
174
+ .command('inspect [target]')
175
+ .description('检查目标目录安全状态')
176
+ .option('--json', '以 JSON 格式输出结果')
177
+ .action(async (target = '.', options) => {
178
+ const { inspectWorkspace } = await import('./commands/workspace/inspect.js');
179
+ await inspectWorkspace(target, options);
180
+ });
181
+ workspaceCmd
182
+ .command('create [target]')
183
+ .description('初始化标准 Farris Vue pnpm workspace')
184
+ .option('-n, --name <name>', '应用名称 (package name)')
185
+ .option('-t, --title <title>', '应用展示标题')
186
+ .option('--router', '启用 Vue Router')
187
+ .option('--router-mode <mode>', '路由模式 (hash | history)', 'hash')
188
+ .option('--format <format>', '产物交付格式 (iife | es | systemjs)', 'iife')
189
+ .option('--style <style>', '应用全局样式 (none | scss)', 'scss')
190
+ .option('--json', '以 JSON 格式输出结果')
191
+ .option('--force', '确认覆盖与模板同名的已有文件(非交互模式必须显式指定)')
192
+ .option('--install', '是否在初始化完成后自动安装依赖 (pnpm install)', false)
193
+ .option('-y, --yes', '接受默认配置')
194
+ .action(async (target = '.', options) => {
195
+ const { createWorkspace } = await import('./commands/workspace/create.js');
196
+ await createWorkspace(target, options);
197
+ });
198
+ workspaceCmd
199
+ .command('add-app <name>')
200
+ .description('[已废弃] 请改用 farris-cli add-app')
201
+ .option('-t, --title <title>', '应用展示标题')
202
+ .option('--router', '启用 Vue Router')
203
+ .option('--router-mode <mode>', '路由模式 (hash | history)', 'hash')
204
+ .option('--format <format>', '产物交付格式 (iife | es | systemjs)', 'iife')
205
+ .option('--style <style>', '应用全局样式 (none | scss)', 'scss')
206
+ .option('--json', '以 JSON 格式输出结果')
207
+ .action(async (name, options) => {
208
+ const { addAppToWorkspace } = await import('./commands/workspace/add-app.js');
209
+ await addAppToWorkspace(name, options);
210
+ });
211
+ workspaceCmd
212
+ .command('verify [target]')
213
+ .description('验证 Workspace 结构与规范合规性')
214
+ .option('--json', '以 JSON 格式输出结果')
215
+ .action(async (target = '.', options) => {
216
+ const { verifyWorkspaceCommand } = await import('./commands/workspace/verify.js');
217
+ await verifyWorkspaceCommand(target, options);
218
+ });
219
+ // ==========================================
220
+ // Generate 命令组
221
+ // ==========================================
222
+ const generateCmd = program.command('generate').alias('g').description('应用级代码生成器');
223
+ generateCmd
224
+ .command('view <name>')
225
+ .description('生成 View 页面 (含必须调用的 composable)')
226
+ .option('-t, --title <title>', '页面展示标题')
227
+ .option('--with-route', '自动在路由中注册页面')
228
+ .option('--with-props', '生成页面 Props 文件')
229
+ .option('--json', '以 JSON 格式输出结果')
230
+ .action(async (name, options) => {
231
+ const { generateView } = await import('./commands/generate/view.js');
232
+ await generateView(name, options);
233
+ });
234
+ generateCmd
235
+ .command('component <name>')
236
+ .description('生成通用组件(按需创建 src/components/)')
237
+ .option('--with-props', '生成组件 Props 文件')
238
+ .option('--no-props', '不生成组件 Props 文件')
239
+ .option('--style <style>', '组件样式方案 (none | css | scss)', 'none')
240
+ .option('--json', '以 JSON 格式输出结果')
241
+ .action(async (name, options) => {
242
+ const { generateComponent } = await import('./commands/generate/component.js');
243
+ await generateComponent(name, options);
244
+ });
245
+ generateCmd
246
+ .command('api <name>')
247
+ .description('生成 API 模块 (位于 src/api/)')
248
+ .option('-e, --endpoint <endpoint>', 'API 请求路径 (如 /api/v1/orders)')
249
+ .option('-m, --method <method>', 'HTTP 请求方法 (get | post | put | patch | delete)', 'get')
250
+ .option('--client <client>', '指定已有 HTTP 客户端路径')
251
+ .option('--init-client', '若不存在则初始化标准 HTTP 客户端')
252
+ .option('--json', '以 JSON 格式输出结果')
253
+ .action(async (name, options) => {
254
+ const { generateApi } = await import('./commands/generate/api.js');
255
+ await generateApi(name, options);
256
+ });
257
+ program.parseAsync(process.argv).catch((err) => {
258
+ const message = err instanceof Error ? err.message : String(err);
259
+ console.error(message);
260
+ process.exit(1);
261
+ });
239
262
  //# sourceMappingURL=index.js.map