@farris/cli 2.2.0-beta.2 → 2.2.4

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 (38) hide show
  1. package/lib/commands/build-components.js +3 -1
  2. package/lib/commands/build-components.js.map +1 -1
  3. package/lib/commands/create-app-options.js +12 -10
  4. package/lib/commands/create-app-options.js.map +1 -1
  5. package/lib/commands/create-app.js +53 -12
  6. package/lib/commands/create-app.js.map +1 -1
  7. package/lib/commands/create-options.js +30 -0
  8. package/lib/commands/create-options.js.map +1 -0
  9. package/lib/commands/create.js +203 -0
  10. package/lib/commands/create.js.map +1 -0
  11. package/lib/common/apply-catalog-deps.js +16 -0
  12. package/lib/common/apply-catalog-deps.js.map +1 -0
  13. package/lib/common/create-app-target.js +47 -0
  14. package/lib/common/create-app-target.js.map +1 -0
  15. package/lib/common/generate-app.js +50 -18
  16. package/lib/common/generate-app.js.map +1 -1
  17. package/lib/common/lib-package-exports.js +10 -6
  18. package/lib/common/lib-package-exports.js.map +1 -1
  19. package/lib/index.js +22 -1
  20. package/lib/index.js.map +1 -1
  21. package/lib/plugins/create-package-json.js +5 -5
  22. package/lib/plugins/create-package-json.js.map +1 -1
  23. package/package.json +8 -3
  24. package/templates/create/.gitlab-ci.yml +58 -0
  25. package/templates/create/README.md +9 -0
  26. package/templates/create/package.json +13 -0
  27. package/templates/create/pnpm-workspace.yaml +12 -0
  28. package/templates/lib/.gitlab-ci.yml +31 -31
  29. package/templates/lib/README.md +1 -1
  30. package/templates/lib/components/button/button.spec.ts +4 -2
  31. package/templates/lib/farris.config.mjs +6 -1
  32. package/templates/lib/package.json +4 -2
  33. package/templates/lib/src/main.ts +2 -0
  34. package/templates/lib/vitest.config.ts +1 -0
  35. package/templates/mobile/.gitlab-ci.yml +31 -29
  36. package/templates/mobile/package.json +2 -2
  37. package/templates/web/.gitlab-ci.yml +31 -29
  38. package/templates/web/package.json +2 -2
@@ -14,7 +14,9 @@ export async function buildComponents(options) {
14
14
  }
15
15
  const componentOutDir = farris.componentOutDir || './package/components';
16
16
  const outDir = farris.outDir || 'lib';
17
- const entry = Object.fromEntries(names.map((name) => [name, resolve(CWD, 'components', name, 'index.ts')]));
17
+ // Relative to Vite root. Absolute Windows paths get realpath'd (f: → F:)
18
+ // and break plugin-vue SFC subrequests.
19
+ const entry = Object.fromEntries(names.map((name) => [name, `components/${name}/index.ts`]));
18
20
  const spinner = ora('build components begin').start();
19
21
  spinner.text = 'building components';
20
22
  await buildCommon({
@@ -1 +1 @@
1
- {"version":3,"file":"build-components.js","sourceRoot":"","sources":["../../src/commands/build-components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-components.js","sourceRoot":"","sources":["../../src/commands/build-components.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,17 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
+ import { ExitCode } from '../common/constant.js';
4
+ import { assertTargetInsideCwd, CreateAppError, resolvePackageName } from '../common/create-app-target.js';
3
5
  import { toProjectPackageName } from '../common/project-package-name.js';
4
6
  export { toProjectPackageName };
7
+ export { assertTargetInsideCwd, CreateAppError, resolvePackageName };
5
8
  export const ALLOWED_TYPES = ['app', 'lib'];
6
9
  export const ALLOWED_PLATFORMS = ['web', 'mobile'];
7
- export const ALLOWED_FORMATS = ['es', 'umd', 'systemjs'];
10
+ export const ALLOWED_FORMATS = ['es', 'cjs', 'umd', 'systemjs'];
8
11
  export const DEFAULT_NAME = 'my-project';
9
- export const DEFAULT_LIB_FORMATS = ['es', 'umd'];
12
+ export const DEFAULT_LIB_FORMATS = ['es', 'cjs', 'umd'];
10
13
  export const DEFAULT_APP_FORMAT = 'es';
11
14
  export const DEFAULT_PLATFORM = 'web';
12
- export class CreateAppError extends Error {
13
- constructor(message) {
14
- super(message);
15
- this.name = 'CreateAppError';
16
- }
17
- }
18
15
  function assertAllowed(kind, value, allowed) {
19
16
  if (!allowed.includes(value)) {
20
17
  throw new CreateAppError(`非法的 ${kind}: ${value},允许值为 ${allowed.join(', ')}`);
@@ -48,26 +45,31 @@ export function validateCliInput(input) {
48
45
  export function resolveNonInteractiveOptions(input) {
49
46
  validateCliInput(input);
50
47
  if (!input.type) {
51
- throw new CreateAppError('--type 在使用 -y / --yes 时必填');
48
+ throw new CreateAppError('--type 在使用 -y / --yes 或 --json 时必填');
52
49
  }
53
50
  const name = input.name && input.name.trim() !== '' ? input.name : DEFAULT_NAME;
51
+ assertTargetInsideCwd(name);
52
+ const packageName = resolvePackageName(name);
54
53
  if (input.type === 'lib') {
55
54
  return {
56
55
  name,
56
+ packageName,
57
57
  type: 'lib',
58
58
  formats: parseFormatsFlag(input.formats) ?? [...DEFAULT_LIB_FORMATS]
59
59
  };
60
60
  }
61
61
  return {
62
62
  name,
63
+ packageName,
63
64
  type: 'app',
64
65
  platform: input.platform ?? DEFAULT_PLATFORM,
65
66
  format: input.format ?? DEFAULT_APP_FORMAT
66
67
  };
67
68
  }
68
69
  export function assertTargetDirectoryFree(name, cwd = process.cwd()) {
70
+ assertTargetInsideCwd(name, cwd);
69
71
  if (existsSync(resolve(cwd, name))) {
70
- throw new CreateAppError(`目标目录已存在: ${name}`);
72
+ throw new CreateAppError(`目标目录已存在: ${name}`, ExitCode.TARGET_CONFLICT);
71
73
  }
72
74
  }
73
75
  //# sourceMappingURL=create-app-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-app-options.js","sourceRoot":"","sources":["../../src/commands/create-app-options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-app-options.js","sourceRoot":"","sources":["../../src/commands/create-app-options.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
+ import { resolve } from 'node:path';
1
2
  import inquirer from 'inquirer';
3
+ import { ExitCode } from '../common/constant.js';
2
4
  import { generateApp } from '../common/generate-app.js';
3
- import { assertTargetDirectoryFree, parseFormatsFlag, resolveNonInteractiveOptions, validateCliInput } from './create-app-options.js';
5
+ import { fail, sendJson, setJsonMode } from '../common/output.js';
6
+ import { assertTargetDirectoryFree, CreateAppError, DEFAULT_LIB_FORMATS, parseFormatsFlag, resolveNonInteractiveOptions, resolvePackageName, validateCliInput } from './create-app-options.js';
4
7
  const prompt = inquirer.createPromptModule();
5
8
  const questions = [
6
9
  {
@@ -26,8 +29,8 @@ const questions = [
26
29
  type: 'checkbox',
27
30
  name: 'formats',
28
31
  message: 'What output format of project is this?',
29
- choices: ['es', 'umd', 'systemjs'],
30
- default: ['es', 'umd'],
32
+ choices: ['es', 'cjs', 'umd', 'systemjs'],
33
+ default: [...DEFAULT_LIB_FORMATS],
31
34
  when: (response) => response.type === 'lib'
32
35
  },
33
36
  {
@@ -40,11 +43,13 @@ const questions = [
40
43
  }
41
44
  ];
42
45
  function toGenerateOptions(answers) {
46
+ const packageName = resolvePackageName(answers.name);
43
47
  if (answers.type === 'lib') {
44
- return { name: answers.name, type: 'lib', formats: answers.formats };
48
+ return { name: answers.name, packageName, type: 'lib', formats: answers.formats };
45
49
  }
46
50
  return {
47
51
  name: answers.name,
52
+ packageName,
48
53
  type: 'app',
49
54
  platform: answers.platform,
50
55
  format: answers.format
@@ -69,18 +74,54 @@ function initialAnswers(input) {
69
74
  }
70
75
  return initial;
71
76
  }
77
+ function emitCreateAppJson(options) {
78
+ sendJson({
79
+ command: 'create-app',
80
+ ok: true,
81
+ name: options.name,
82
+ ...(options.packageName ? { packageName: options.packageName } : {}),
83
+ type: options.type,
84
+ ...(options.platform ? { platform: options.platform } : {}),
85
+ ...(options.format ? { format: options.format } : {}),
86
+ ...(options.formats ? { formats: options.formats } : {}),
87
+ target: resolve(process.cwd(), options.name)
88
+ });
89
+ }
90
+ function failCreateApp(error) {
91
+ const message = error instanceof Error ? error.message : String(error);
92
+ const exitCode = error instanceof CreateAppError ? error.exitCode : ExitCode.GENERAL_ERROR;
93
+ fail({
94
+ command: 'create-app',
95
+ error: message,
96
+ exitCode
97
+ });
98
+ }
72
99
  export async function createApp(nameArg, commandOptions = {}) {
100
+ const isJson = !!commandOptions.json;
101
+ setJsonMode(isJson);
73
102
  const input = { ...commandOptions, name: nameArg ?? commandOptions.name };
74
- validateCliInput(input);
75
- if (input.yes) {
76
- const options = resolveNonInteractiveOptions(input);
103
+ try {
104
+ validateCliInput(input);
105
+ const skipPrompt = !!(input.yes || input.json);
106
+ let options;
107
+ if (skipPrompt) {
108
+ options = resolveNonInteractiveOptions(input);
109
+ }
110
+ else {
111
+ const answers = await prompt(questions, initialAnswers(input));
112
+ options = toGenerateOptions(answers);
113
+ }
77
114
  assertTargetDirectoryFree(options.name);
78
115
  generateApp(options);
79
- return;
116
+ if (isJson) {
117
+ emitCreateAppJson(options);
118
+ }
119
+ }
120
+ catch (error) {
121
+ if (isJson) {
122
+ failCreateApp(error);
123
+ }
124
+ throw error;
80
125
  }
81
- const answers = await prompt(questions, initialAnswers(input));
82
- const options = toGenerateOptions(answers);
83
- assertTargetDirectoryFree(options.name);
84
- generateApp(options);
85
126
  }
86
127
  //# sourceMappingURL=create-app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-app.js","sourceRoot":"","sources":["../../src/commands/create-app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-app.js","sourceRoot":"","sources":["../../src/commands/create-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export function parseCreateArgv(argv) {
2
+ const options = {};
3
+ let name;
4
+ for (let i = 0; i < argv.length; i++) {
5
+ const arg = argv[i];
6
+ if (arg === '--json') {
7
+ options.json = true;
8
+ }
9
+ else if (arg === '--install') {
10
+ options.install = true;
11
+ }
12
+ else if (arg === '-y' || arg === '--yes') {
13
+ options.yes = true;
14
+ }
15
+ else if (arg === '--no-app') {
16
+ options.noApp = true;
17
+ }
18
+ else if (arg === '--app') {
19
+ options.app = argv[++i];
20
+ }
21
+ else if (arg.startsWith('--app=')) {
22
+ options.app = arg.slice('--app='.length);
23
+ }
24
+ else if (!arg.startsWith('-')) {
25
+ name = arg;
26
+ }
27
+ }
28
+ return { name, options };
29
+ }
30
+ //# sourceMappingURL=create-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-options.js","sourceRoot":"","sources":["../../src/commands/create-options.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,IAAwB,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import inquirer from 'inquirer';
4
+ import { ExitCode, DEFAULT_CATALOG_VERSIONS, getDirname } from '../common/constant.js';
5
+ import { applyCatalogDeps } from '../common/apply-catalog-deps.js';
6
+ import { generateApp } from '../common/generate-app.js';
7
+ import { fail, logInfo, sendJson, setJsonMode } from '../common/output.js';
8
+ import { renderTemplateDir } from '../common/template-renderer.js';
9
+ import { assertTargetDirectoryFree, CreateAppError, resolvePackageName } from './create-app-options.js';
10
+ export { parseCreateArgv } from './create-options.js';
11
+ const DEFAULT_WORKSPACE = 'my-workspace';
12
+ const DEFAULT_APP = 'app';
13
+ function createTemplateDir() {
14
+ return resolve(getDirname(import.meta.url), '../../templates/create');
15
+ }
16
+ function catalogVariables() {
17
+ return {
18
+ pnpmVersion: DEFAULT_CATALOG_VERSIONS.pnpm,
19
+ farrisUiVueVersion: DEFAULT_CATALOG_VERSIONS['@farris/ui-vue'],
20
+ farrisCliVersion: DEFAULT_CATALOG_VERSIONS['@farris/cli'],
21
+ typescriptVersion: DEFAULT_CATALOG_VERSIONS.typescript,
22
+ viteVersion: DEFAULT_CATALOG_VERSIONS.vite,
23
+ vueVersion: DEFAULT_CATALOG_VERSIONS.vue,
24
+ vueRouterVersion: DEFAULT_CATALOG_VERSIONS['vue-router'],
25
+ vueTscVersion: DEFAULT_CATALOG_VERSIONS['vue-tsc'],
26
+ sassVersion: DEFAULT_CATALOG_VERSIONS.sass
27
+ };
28
+ }
29
+ function assertAppName(appName) {
30
+ const trimmed = appName.trim();
31
+ if (!trimmed || trimmed === '.' || trimmed === '..') {
32
+ throw new CreateAppError('应用名称不能为空或为 . / ..');
33
+ }
34
+ if (trimmed.includes('/') || trimmed.includes('\\') || trimmed.includes('\0')) {
35
+ throw new CreateAppError(`应用名称必须是单段目录名: ${appName}`);
36
+ }
37
+ }
38
+ function rootTemplateVariables(createApp, appRel) {
39
+ if (createApp && appRel) {
40
+ return {
41
+ rootDevScript: `pnpm --filter ./${appRel} run dev`,
42
+ rootBuildScript: `pnpm --filter ./${appRel} run build`,
43
+ rootTestScript: `pnpm --filter ./${appRel} run test`,
44
+ ciBuildSteps: [
45
+ ` - pnpm --filter ./${appRel} run build`,
46
+ ' - mkdir -p dist',
47
+ ` - cp -r ${appRel}/dist/. dist/`
48
+ ].join('\n'),
49
+ ciPublishSteps: [
50
+ ` - cp ${appRel}/project.json dist/package.json`,
51
+ ' - cd dist',
52
+ ' - npm publish'
53
+ ].join('\n'),
54
+ readmeBody: `pnpm workspace with one Farris web app in \`${appRel}\`.`
55
+ };
56
+ }
57
+ return {
58
+ rootDevScript: 'pnpm --recursive --if-present run dev',
59
+ rootBuildScript: 'pnpm --recursive --if-present run build',
60
+ rootTestScript: 'pnpm --recursive --if-present run test',
61
+ ciBuildSteps: '',
62
+ ciPublishSteps: ' - echo "no app to publish"',
63
+ readmeBody: 'pnpm workspace. Add an app under `packages/`.'
64
+ };
65
+ }
66
+ export async function create(nameArg, options = {}) {
67
+ const isJson = !!options.json;
68
+ setJsonMode(isJson);
69
+ const skipPrompt = !!(options.yes || options.json);
70
+ try {
71
+ let name = (nameArg ?? options.name ?? '').trim();
72
+ let createApp = options.noApp ? false : skipPrompt || options.app != null;
73
+ let appName = (options.app ?? '').trim() || DEFAULT_APP;
74
+ if (!skipPrompt) {
75
+ const prompt = inquirer.createPromptModule();
76
+ if (!name) {
77
+ const answers = await prompt([
78
+ {
79
+ type: 'input',
80
+ name: 'name',
81
+ message: '请输入 workspace 名称',
82
+ default: DEFAULT_WORKSPACE
83
+ }
84
+ ]);
85
+ name = String(answers.name).trim() || DEFAULT_WORKSPACE;
86
+ }
87
+ if (!options.noApp && options.app == null) {
88
+ const answers = await prompt([
89
+ {
90
+ type: 'confirm',
91
+ name: 'createApp',
92
+ message: '是否现在创建一个应用?',
93
+ default: true
94
+ }
95
+ ]);
96
+ createApp = !!answers.createApp;
97
+ if (createApp) {
98
+ const appAnswers = await prompt([
99
+ {
100
+ type: 'input',
101
+ name: 'appName',
102
+ message: '请输入应用名称',
103
+ default: DEFAULT_APP
104
+ }
105
+ ]);
106
+ appName = String(appAnswers.appName).trim() || DEFAULT_APP;
107
+ }
108
+ }
109
+ }
110
+ else if (!name) {
111
+ name = DEFAULT_WORKSPACE;
112
+ }
113
+ if (options.noApp) {
114
+ createApp = false;
115
+ }
116
+ assertTargetDirectoryFree(name);
117
+ const cwd = process.cwd();
118
+ const targetPath = resolve(cwd, name);
119
+ const created = !existsSync(targetPath);
120
+ let appPackageName;
121
+ let appRel;
122
+ if (createApp) {
123
+ assertAppName(appName);
124
+ appPackageName = resolvePackageName(appName);
125
+ assertAppName(appPackageName);
126
+ appRel = `packages/${appPackageName}`;
127
+ }
128
+ try {
129
+ const rootRender = renderTemplateDir({
130
+ sourceDir: createTemplateDir(),
131
+ targetDir: targetPath,
132
+ variables: {
133
+ ...catalogVariables(),
134
+ title: name,
135
+ ...rootTemplateVariables(createApp, appRel)
136
+ }
137
+ });
138
+ if (rootRender.unreplacedPlaceholders.length > 0) {
139
+ throw new Error(`根模板未替换: ${rootRender.unreplacedPlaceholders.map((p) => p.placeholder).join(', ')}`);
140
+ }
141
+ if (createApp && appRel && appPackageName) {
142
+ generateApp({
143
+ name: join(name, appRel).replace(/\\/g, '/'),
144
+ packageName: appPackageName,
145
+ type: 'app',
146
+ platform: 'web',
147
+ format: 'es',
148
+ hints: false
149
+ });
150
+ const appGitlab = join(targetPath, appRel, '.gitlab-ci.yml');
151
+ if (existsSync(appGitlab)) {
152
+ unlinkSync(appGitlab);
153
+ }
154
+ const appPkgPath = join(targetPath, appRel, 'package.json');
155
+ const appPkg = JSON.parse(readFileSync(appPkgPath, 'utf8'));
156
+ applyCatalogDeps(appPkg);
157
+ writeFileSync(appPkgPath, JSON.stringify(appPkg, null, 2) + '\n');
158
+ }
159
+ else {
160
+ mkdirSync(join(targetPath, 'packages'), { recursive: true });
161
+ }
162
+ if (options.install) {
163
+ const { runPnpmInstall } = await import('./workspace/create.js');
164
+ const result = await runPnpmInstall(targetPath, isJson);
165
+ if (!result.success) {
166
+ throw new CreateAppError(result.error || 'pnpm install 失败');
167
+ }
168
+ }
169
+ if (!isJson) {
170
+ logInfo(`cd ${name}`);
171
+ logInfo('pnpm install');
172
+ if (createApp) {
173
+ logInfo('pnpm dev');
174
+ }
175
+ }
176
+ else {
177
+ sendJson({
178
+ command: 'create',
179
+ ok: true,
180
+ name,
181
+ createdApp: createApp,
182
+ ...(createApp ? { packageName: appPackageName, appDir: appRel } : {}),
183
+ target: targetPath
184
+ });
185
+ }
186
+ }
187
+ catch (inner) {
188
+ if (created && existsSync(targetPath)) {
189
+ rmSync(targetPath, { recursive: true, force: true });
190
+ }
191
+ throw inner;
192
+ }
193
+ }
194
+ catch (error) {
195
+ if (isJson) {
196
+ const message = error instanceof Error ? error.message : String(error);
197
+ const exitCode = error instanceof CreateAppError ? error.exitCode : ExitCode.GENERAL_ERROR;
198
+ fail({ command: 'create', error: message, exitCode });
199
+ }
200
+ throw error;
201
+ }
202
+ }
203
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { DEFAULT_CATALOG_VERSIONS } from './constant.js';
2
+ export function applyCatalogDeps(pkg) {
3
+ const keys = Object.keys(DEFAULT_CATALOG_VERSIONS).filter((key) => key !== 'pnpm');
4
+ for (const section of ['dependencies', 'devDependencies']) {
5
+ const block = pkg[section];
6
+ if (!block || typeof block !== 'object') {
7
+ continue;
8
+ }
9
+ for (const key of keys) {
10
+ if (block[key] !== undefined) {
11
+ block[key] = 'catalog:';
12
+ }
13
+ }
14
+ }
15
+ }
16
+ //# sourceMappingURL=apply-catalog-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-catalog-deps.js","sourceRoot":"","sources":["../../src/common/apply-catalog-deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,UAAU,gBAAgB,CAAC,GAAwB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;IACnF,KAAK,MAAM,OAAO,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAU,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { isAbsolute, relative, resolve } from 'node:path';
2
+ import { ExitCode } from './constant.js';
3
+ export class CreateAppError extends Error {
4
+ constructor(message, exitCode = ExitCode.GENERAL_ERROR) {
5
+ super(message);
6
+ this.name = 'CreateAppError';
7
+ this.exitCode = exitCode;
8
+ }
9
+ }
10
+ export function isValidPackageName(name) {
11
+ return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(name);
12
+ }
13
+ export function toValidPackageName(name) {
14
+ return name
15
+ .trim()
16
+ .toLowerCase()
17
+ .replace(/\s+/g, '-')
18
+ .replace(/^[._]/, '')
19
+ .replace(/[^a-z0-9-~]+/g, '-')
20
+ .replace(/^-+|-+$/g, '');
21
+ }
22
+ export function resolvePackageName(name) {
23
+ const trimmed = name.trim();
24
+ if (isValidPackageName(trimmed)) {
25
+ return trimmed;
26
+ }
27
+ const derived = toValidPackageName(trimmed);
28
+ if (!derived || !isValidPackageName(derived)) {
29
+ throw new CreateAppError(`无法从目标名推导合法包名: ${name}`);
30
+ }
31
+ return derived;
32
+ }
33
+ export function assertTargetInsideCwd(name, cwd = process.cwd()) {
34
+ const trimmed = name.trim();
35
+ if (!trimmed || trimmed === '.' || trimmed === './') {
36
+ throw new CreateAppError('目标目录不能是当前目录');
37
+ }
38
+ if (trimmed.includes('\0')) {
39
+ throw new CreateAppError('目标路径包含非法字符');
40
+ }
41
+ const resolved = resolve(cwd, trimmed);
42
+ const rel = relative(cwd, resolved);
43
+ if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {
44
+ throw new CreateAppError(`目标目录必须位于当前工作目录内: ${name}`);
45
+ }
46
+ }
47
+ //# sourceMappingURL=create-app-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-app-target.js","sourceRoot":"","sources":["../../src/common/create-app-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGvC,YAAY,OAAe,EAAE,WAAqB,QAAQ,CAAC,aAAa;QACtE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,cAAc,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,cAAc,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -1,8 +1,10 @@
1
- import { cpSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
1
+ import { cpSync, existsSync, readdirSync, readFileSync, rmSync, rmdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, isAbsolute, relative, resolve } from 'node:path';
3
3
  import { getVersion } from './get-version.js';
4
+ import { logInfo } from './output.js';
4
5
  import { toProjectPackageName } from './project-package-name.js';
5
6
  import { getTemplateDir, resolveTemplate } from './template-manifest.js';
7
+ import { assertTargetInsideCwd, resolvePackageName } from './create-app-target.js';
6
8
  export function toLibName(name) {
7
9
  const unscoped = name.replace(/^@[^/]+\//, '');
8
10
  return unscoped
@@ -25,30 +27,60 @@ function replaceContent(filePath, args) {
25
27
  });
26
28
  writeFileSync(filePath, content);
27
29
  }
30
+ function rollbackCreatedTarget(targetPath, cwd) {
31
+ if (existsSync(targetPath)) {
32
+ rmSync(targetPath, { recursive: true, force: true });
33
+ }
34
+ let parent = dirname(targetPath);
35
+ while (parent !== cwd) {
36
+ const rel = relative(cwd, parent);
37
+ if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {
38
+ break;
39
+ }
40
+ if (!existsSync(parent) || readdirSync(parent).length > 0) {
41
+ break;
42
+ }
43
+ rmdirSync(parent);
44
+ parent = dirname(parent);
45
+ }
46
+ }
28
47
  export const generateApp = (options) => {
29
48
  const { name, type, formats, format = '', platform } = options;
49
+ const packageName = options.packageName ?? resolvePackageName(name);
30
50
  const manifest = resolveTemplate({
31
51
  type: type,
32
52
  platform: platform
33
53
  });
34
54
  const templatePath = getTemplateDir(manifest.id);
35
55
  const cwd = process.cwd();
56
+ assertTargetInsideCwd(name, cwd);
36
57
  const targetPath = resolve(cwd, name);
37
- cpSync(templatePath, targetPath, { recursive: true });
38
- const cliVersion = getVersion();
39
- const args = {
40
- name,
41
- formats: formatsLiteral(formats),
42
- format,
43
- platform: platform ?? '',
44
- cliVersion,
45
- libName: toLibName(name),
46
- projectPackageName: toProjectPackageName(name)
47
- };
48
- manifest.replaceFiles.forEach((replaceFile) => {
49
- replaceContent(resolve(cwd, name, replaceFile), args);
50
- });
51
- console.log(`cd ${name}`);
52
- console.log(`npm install or yarn`);
58
+ const created = !existsSync(targetPath);
59
+ try {
60
+ cpSync(templatePath, targetPath, { recursive: true });
61
+ const cliVersion = getVersion();
62
+ const args = {
63
+ name: packageName,
64
+ formats: formatsLiteral(formats),
65
+ format,
66
+ platform: platform ?? '',
67
+ cliVersion,
68
+ libName: toLibName(packageName),
69
+ projectPackageName: toProjectPackageName(packageName)
70
+ };
71
+ manifest.replaceFiles.forEach((replaceFile) => {
72
+ replaceContent(resolve(targetPath, replaceFile), args);
73
+ });
74
+ if (options.hints !== false) {
75
+ logInfo(`cd ${name}`);
76
+ logInfo(`npm install or yarn`);
77
+ }
78
+ }
79
+ catch (error) {
80
+ if (created) {
81
+ rollbackCreatedTarget(targetPath, cwd);
82
+ }
83
+ throw error;
84
+ }
53
85
  };
54
86
  //# sourceMappingURL=generate-app.js.map