@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.
- package/lib/commands/build-components.js +3 -1
- package/lib/commands/build-components.js.map +1 -1
- package/lib/commands/create-app-options.js +12 -10
- package/lib/commands/create-app-options.js.map +1 -1
- package/lib/commands/create-app.js +53 -12
- package/lib/commands/create-app.js.map +1 -1
- package/lib/commands/create-options.js +30 -0
- package/lib/commands/create-options.js.map +1 -0
- package/lib/commands/create.js +203 -0
- package/lib/commands/create.js.map +1 -0
- package/lib/common/apply-catalog-deps.js +16 -0
- package/lib/common/apply-catalog-deps.js.map +1 -0
- package/lib/common/create-app-target.js +47 -0
- package/lib/common/create-app-target.js.map +1 -0
- package/lib/common/generate-app.js +50 -18
- package/lib/common/generate-app.js.map +1 -1
- package/lib/common/lib-package-exports.js +10 -6
- package/lib/common/lib-package-exports.js.map +1 -1
- package/lib/index.js +22 -1
- package/lib/index.js.map +1 -1
- package/lib/plugins/create-package-json.js +5 -5
- package/lib/plugins/create-package-json.js.map +1 -1
- package/package.json +8 -3
- package/templates/create/.gitlab-ci.yml +58 -0
- package/templates/create/README.md +9 -0
- package/templates/create/package.json +13 -0
- package/templates/create/pnpm-workspace.yaml +12 -0
- package/templates/lib/.gitlab-ci.yml +31 -31
- package/templates/lib/README.md +1 -1
- package/templates/lib/components/button/button.spec.ts +4 -2
- package/templates/lib/farris.config.mjs +6 -1
- package/templates/lib/package.json +4 -2
- package/templates/lib/src/main.ts +2 -0
- package/templates/lib/vitest.config.ts +1 -0
- package/templates/mobile/.gitlab-ci.yml +31 -29
- package/templates/mobile/package.json +2 -2
- package/templates/web/.gitlab-ci.yml +31 -29
- 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
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAsB,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA2B;IAC/D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,sBAAsB,CAAC;IACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
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 {
|
|
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: [
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
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
|
-
|
|
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":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAA2B,MAAM,2BAA2B,CAAC;AACjF,OAAO,EACL,yBAAyB,
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|