vona-cli-set-api 1.0.402 → 1.0.405
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/cli/templates/create/project/basic/boilerplate/env/.env +1 -1
- package/cli/templates/create/project/basic/boilerplate/env/.env.prod +1 -1
- package/cli/templates/create/project/basic/boilerplate/package.original.json +1 -1
- package/cli/templates/create/project/basic/boilerplate/src/backend/config/config/config.ts +1 -0
- package/cli/templates/tools/crud/snippets/2-meta.index.ts +10 -5
- package/cli/templates/tools/crud/snippets/2-meta.version.ts +11 -9
- package/cli/templates/tools/crud/snippets/3-en-us.ts +1 -1
- package/cli/templates/tools/crud/snippets/4-zh-cn.ts +1 -1
- package/cli/templates/tools/crud/utils.ts +15 -15
- package/dist/index.js +3313 -3
- package/dist/lib/bean/cli.bin.buildGeneral.d.ts +12 -0
- package/dist/lib/beans.d.ts +2 -0
- package/dist/lib/command/bin.buildGeneral.d.ts +19 -0
- package/dist/lib/commands.d.ts +18 -0
- package/package.json +9 -9
- package/dist/lib/bean/cli.bin.build.js +0 -185
- package/dist/lib/bean/cli.bin.buildModule.js +0 -106
- package/dist/lib/bean/cli.bin.dbReset.js +0 -48
- package/dist/lib/bean/cli.bin.dev.js +0 -66
- package/dist/lib/bean/cli.bin.play.js +0 -92
- package/dist/lib/bean/cli.bin.test.js +0 -93
- package/dist/lib/bean/cli.bin.tsc.js +0 -48
- package/dist/lib/bean/cli.create.bean.js +0 -81
- package/dist/lib/bean/cli.create.module.js +0 -73
- package/dist/lib/bean/cli.create.project.js +0 -119
- package/dist/lib/bean/cli.create.suite.js +0 -35
- package/dist/lib/bean/cli.create.test.js +0 -39
- package/dist/lib/bean/cli.default.list.js +0 -93
- package/dist/lib/bean/cli.init.appMonkey.js +0 -24
- package/dist/lib/bean/cli.init.asset.js +0 -28
- package/dist/lib/bean/cli.init.config.js +0 -38
- package/dist/lib/bean/cli.init.constant.js +0 -38
- package/dist/lib/bean/cli.init.error.js +0 -49
- package/dist/lib/bean/cli.init.lib.js +0 -38
- package/dist/lib/bean/cli.init.locale.js +0 -38
- package/dist/lib/bean/cli.init.main.js +0 -38
- package/dist/lib/bean/cli.init.monkey.js +0 -64
- package/dist/lib/bean/cli.init.static.js +0 -38
- package/dist/lib/bean/cli.init.types.js +0 -38
- package/dist/lib/bean/cli.tools.crud.js +0 -46
- package/dist/lib/bean/cli.tools.deps.js +0 -42
- package/dist/lib/bean/cli.tools.metadata.js +0 -234
- package/dist/lib/bean/toolsBin/configUtils.js +0 -56
- package/dist/lib/bean/toolsBin/dbReset.js +0 -8
- package/dist/lib/bean/toolsBin/generateEntryFiles.js +0 -90
- package/dist/lib/bean/toolsBin/generateVonaMeta.js +0 -17
- package/dist/lib/bean/toolsBin/generateZod.js +0 -48
- package/dist/lib/bean/toolsBin/play.js +0 -59
- package/dist/lib/bean/toolsBin/test.js +0 -137
- package/dist/lib/bean/toolsBin/types.js +0 -1
- package/dist/lib/bean/toolsMetadata/generateBeanGenerals.js +0 -33
- package/dist/lib/bean/toolsMetadata/generateConfig.js +0 -62
- package/dist/lib/bean/toolsMetadata/generateMetadataCustom.js +0 -23
- package/dist/lib/bean/toolsMetadata/generateMonkey.js +0 -24
- package/dist/lib/bean/toolsMetadata/generateOnions.js +0 -112
- package/dist/lib/bean/toolsMetadata/generateScope.js +0 -83
- package/dist/lib/bean/toolsMetadata/generateScopeResources.js +0 -33
- package/dist/lib/bean/toolsMetadata/generateScopeResourcesMeta.js +0 -13
- package/dist/lib/bean/toolsMetadata/utils.js +0 -84
- package/dist/lib/beans.js +0 -56
- package/dist/lib/command/bin.build.js +0 -18
- package/dist/lib/command/bin.buildModule.js +0 -18
- package/dist/lib/command/bin.dbReset.js +0 -14
- package/dist/lib/command/bin.dev.js +0 -18
- package/dist/lib/command/bin.play.js +0 -27
- package/dist/lib/command/bin.test.js +0 -18
- package/dist/lib/command/bin.tsc.js +0 -14
- package/dist/lib/command/create.bean.js +0 -46
- package/dist/lib/command/create.module.js +0 -36
- package/dist/lib/command/create.project.js +0 -43
- package/dist/lib/command/create.suite.js +0 -23
- package/dist/lib/command/create.test.js +0 -33
- package/dist/lib/command/default.list.js +0 -18
- package/dist/lib/command/init.appMonkey.js +0 -10
- package/dist/lib/command/init.asset.js +0 -33
- package/dist/lib/command/init.config.js +0 -10
- package/dist/lib/command/init.constant.js +0 -10
- package/dist/lib/command/init.error.js +0 -10
- package/dist/lib/command/init.lib.js +0 -10
- package/dist/lib/command/init.locale.js +0 -10
- package/dist/lib/command/init.main.js +0 -10
- package/dist/lib/command/init.monkey.js +0 -10
- package/dist/lib/command/init.static.js +0 -10
- package/dist/lib/command/init.types.js +0 -10
- package/dist/lib/command/tools.crud.js +0 -33
- package/dist/lib/command/tools.deps.js +0 -9
- package/dist/lib/command/tools.metadata.js +0 -14
- package/dist/lib/commands.js +0 -67
- package/dist/lib/this.js +0 -1
- package/dist/lib/utils.js +0 -80
- package/dist/typings.js +0 -1
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
3
|
-
import { catchError } from '@cabloy/utils';
|
|
4
|
-
import fse from 'fs-extra';
|
|
5
|
-
import { rimraf } from 'rimraf';
|
|
6
|
-
import { getAbsolutePathOfModule, getImportEsm } from "../utils.js";
|
|
7
|
-
import { generateVonaMeta } from "./toolsBin/generateVonaMeta.js";
|
|
8
|
-
export class CliBinTest extends BeanCliBase {
|
|
9
|
-
async execute() {
|
|
10
|
-
const { argv } = this.context;
|
|
11
|
-
// super
|
|
12
|
-
await super.execute();
|
|
13
|
-
const projectPath = argv.projectPath;
|
|
14
|
-
// test
|
|
15
|
-
await this._test(projectPath);
|
|
16
|
-
}
|
|
17
|
-
async _test(projectPath) {
|
|
18
|
-
const { argv } = this.context;
|
|
19
|
-
const mode = 'test';
|
|
20
|
-
const flavor = argv.flavor || 'normal';
|
|
21
|
-
const configMeta = { flavor, mode };
|
|
22
|
-
const configOptions = {
|
|
23
|
-
appDir: projectPath,
|
|
24
|
-
runtimeDir: '.vona',
|
|
25
|
-
workers: 1,
|
|
26
|
-
};
|
|
27
|
-
const { modulesMeta } = await generateVonaMeta(configMeta, configOptions);
|
|
28
|
-
await this._run(projectPath, modulesMeta);
|
|
29
|
-
if (argv.coverage && !argv.ci) {
|
|
30
|
-
await this._outputCoverageReportViewer(projectPath);
|
|
31
|
-
}
|
|
32
|
-
await rimraf(path.join(projectPath, '.vona'));
|
|
33
|
-
}
|
|
34
|
-
async _run(projectPath, modulesMeta) {
|
|
35
|
-
const { argv } = this.context;
|
|
36
|
-
// globs
|
|
37
|
-
const patterns = this._combineTestPatterns(projectPath, modulesMeta);
|
|
38
|
-
// testFile
|
|
39
|
-
let testFile = path.join(import.meta.dirname, './toolsBin/test.ts');
|
|
40
|
-
if (!fse.existsSync(testFile)) {
|
|
41
|
-
testFile = path.join(import.meta.dirname, './toolsBin/test.js');
|
|
42
|
-
}
|
|
43
|
-
// run
|
|
44
|
-
let args = [];
|
|
45
|
-
if (argv.coverage) {
|
|
46
|
-
args.push('--experimental-test-coverage');
|
|
47
|
-
}
|
|
48
|
-
if (process.env.TEST_WHYISNODERUNNING === 'true') {
|
|
49
|
-
args.push('--import=why-is-node-running/include');
|
|
50
|
-
}
|
|
51
|
-
args = args.concat([getImportEsm(), testFile, projectPath, (!!argv.coverage).toString(), patterns.join(',')]);
|
|
52
|
-
// args = args.concat(['--experimental-transform-types', getImportEsm(), testFile, projectPath, (!!argv.coverage).toString(), patterns.join(',')]);
|
|
53
|
-
// ignore error special in windows
|
|
54
|
-
await catchError(() => {
|
|
55
|
-
return this.helper.spawnExe({
|
|
56
|
-
cmd: 'node',
|
|
57
|
-
args,
|
|
58
|
-
options: {
|
|
59
|
-
cwd: projectPath,
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
async _outputCoverageReportViewer(projectPath) {
|
|
65
|
-
// lcovCliFile
|
|
66
|
-
const lcovCliFile = getAbsolutePathOfModule('@lcov-viewer/cli/lib/index.js', '');
|
|
67
|
-
// run
|
|
68
|
-
const args = [lcovCliFile, 'lcov', '-o', './coverage/report', './coverage/lcov.info'];
|
|
69
|
-
await catchError(() => {
|
|
70
|
-
return this.helper.spawnExe({
|
|
71
|
-
cmd: 'node',
|
|
72
|
-
args,
|
|
73
|
-
options: {
|
|
74
|
-
cwd: projectPath,
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
_combineTestPatterns(projectPath, modulesMeta) {
|
|
80
|
-
const patterns = [];
|
|
81
|
-
for (const moduleName in modulesMeta.modules) {
|
|
82
|
-
const module = modulesMeta.modules[moduleName];
|
|
83
|
-
if (module.info.node_modules)
|
|
84
|
-
continue;
|
|
85
|
-
const testDir = path.join(module.root, 'test');
|
|
86
|
-
if (fse.existsSync(testDir)) {
|
|
87
|
-
const relativePath = path.relative(projectPath, module.root).replaceAll('\\', '/');
|
|
88
|
-
patterns.push(`${relativePath}/test/**/*.ts`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return patterns;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
2
|
-
export class CliBinTsc extends BeanCliBase {
|
|
3
|
-
async execute() {
|
|
4
|
-
const { argv } = this.context;
|
|
5
|
-
// super
|
|
6
|
-
await super.execute();
|
|
7
|
-
const projectPath = argv.projectPath;
|
|
8
|
-
const force = argv.force;
|
|
9
|
-
await this._tsc(projectPath, force);
|
|
10
|
-
}
|
|
11
|
-
async _tsc(projectPath, force) {
|
|
12
|
-
const suiteNames = Object.keys(this.modulesMeta.suites).filter(suiteName => !this.modulesMeta.suites[suiteName].info.node_modules);
|
|
13
|
-
const modulesArray = this.modulesMeta.modulesArray.filter(item => !item.suite && !item.info.node_modules);
|
|
14
|
-
// count
|
|
15
|
-
const count = 1 + suiteNames.length + modulesArray.length;
|
|
16
|
-
// begin
|
|
17
|
-
let counter = 0;
|
|
18
|
-
const timeBegin = new Date();
|
|
19
|
-
// eslint-disable-next-line
|
|
20
|
-
console.log('===> build begin');
|
|
21
|
-
// args
|
|
22
|
-
const tscArgs = ['-b'];
|
|
23
|
-
if (force) {
|
|
24
|
-
tscArgs.push('--force');
|
|
25
|
-
}
|
|
26
|
-
// tsc: project
|
|
27
|
-
// eslint-disable-next-line
|
|
28
|
-
console.log(`===> ${++counter}/${count} project`);
|
|
29
|
-
await this.helper.processHelper.tsc(tscArgs, { cwd: projectPath });
|
|
30
|
-
// suites
|
|
31
|
-
for (const key of suiteNames) {
|
|
32
|
-
const suite = this.modulesMeta.suites[key];
|
|
33
|
-
// eslint-disable-next-line
|
|
34
|
-
console.log(`===> ${++counter}/${count} suite: ${suite.info.originalName}`);
|
|
35
|
-
await this.helper.processHelper.tsc(tscArgs, { cwd: suite.root });
|
|
36
|
-
}
|
|
37
|
-
// modules
|
|
38
|
-
for (const module of modulesArray) {
|
|
39
|
-
// eslint-disable-next-line
|
|
40
|
-
console.log(`===> ${++counter}/${count} module: ${module.info.originalName}`);
|
|
41
|
-
await this.helper.processHelper.tsc(tscArgs, { cwd: module.root });
|
|
42
|
-
}
|
|
43
|
-
// end
|
|
44
|
-
const timeEnd = new Date();
|
|
45
|
-
// eslint-disable-next-line
|
|
46
|
-
console.log(`===> build end: ${(timeEnd.valueOf() - timeBegin.valueOf()) / 1000}s`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
4
|
-
import { getOnionMetasMeta, getOnionScenesMeta } from '@cabloy/module-info';
|
|
5
|
-
import { toUpperCaseFirstChar } from '@cabloy/word-utils';
|
|
6
|
-
import { __ThisSetName__ } from "../this.js";
|
|
7
|
-
export class CliCreateBean extends BeanCliBase {
|
|
8
|
-
async execute() {
|
|
9
|
-
const { argv } = this.context;
|
|
10
|
-
// super
|
|
11
|
-
await super.execute();
|
|
12
|
-
// module name/info
|
|
13
|
-
const moduleName = argv.module;
|
|
14
|
-
argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
|
|
15
|
-
// check if exists
|
|
16
|
-
const _module = this.helper.findModule(moduleName);
|
|
17
|
-
if (!_module) {
|
|
18
|
-
throw new Error(`module does not exist: ${moduleName}`);
|
|
19
|
-
}
|
|
20
|
-
// target dir
|
|
21
|
-
const targetDir = await this.helper.ensureDir(_module.root);
|
|
22
|
-
// scene name
|
|
23
|
-
const sceneName = argv.sceneName;
|
|
24
|
-
argv.sceneNameCapitalize = this.helper.firstCharToUpperCase(sceneName);
|
|
25
|
-
// scene meta
|
|
26
|
-
// onionScenesMeta
|
|
27
|
-
const onionScenesMeta = getOnionScenesMeta(this.modulesMeta.modules);
|
|
28
|
-
const onionSceneMeta = onionScenesMeta[sceneName];
|
|
29
|
-
// bean name
|
|
30
|
-
const beanName = argv.beanName;
|
|
31
|
-
argv.beanNameCapitalize = this.helper.firstCharToUpperCase(beanName);
|
|
32
|
-
// moduleResourceName
|
|
33
|
-
argv.moduleResourceName = this.helper.combineModuleNameAndResource(argv.moduleInfo.relativeName, argv.beanName);
|
|
34
|
-
// directory
|
|
35
|
-
const beanDir = path.join(targetDir, onionSceneMeta.sceneIsolate ? `src/${sceneName}` : 'src/bean');
|
|
36
|
-
const beanFile = path.join(beanDir, onionSceneMeta.sceneIsolate ? `${beanName}.ts` : `${sceneName}.${beanName}.ts`);
|
|
37
|
-
if (fs.existsSync(beanFile)) {
|
|
38
|
-
throw new Error(`${sceneName} bean exists: ${beanName}`);
|
|
39
|
-
}
|
|
40
|
-
await this.helper.ensureDir(beanDir);
|
|
41
|
-
// snippets/boilerplate
|
|
42
|
-
const snippets = this._getBoilerplatesOrSnippets('snippets');
|
|
43
|
-
const boilerplates = this._getBoilerplatesOrSnippets('boilerplate', argv.boilerplate);
|
|
44
|
-
const snippetsName = snippets[`${sceneName}:${argv.beanName}`] || snippets[sceneName];
|
|
45
|
-
const boilerplateName = boilerplates[`${sceneName}:${argv.beanName}`] || boilerplates[sceneName];
|
|
46
|
-
// render
|
|
47
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
48
|
-
targetDir: beanDir,
|
|
49
|
-
setName: __ThisSetName__,
|
|
50
|
-
snippetsPath: snippetsName,
|
|
51
|
-
boilerplatePath: boilerplateName,
|
|
52
|
-
});
|
|
53
|
-
// tools.metadata
|
|
54
|
-
if (!argv.nometadata) {
|
|
55
|
-
await this.helper.invokeCli([':tools:metadata', moduleName], { cwd: argv.projectPath });
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
_getBoilerplatesOrSnippets(type, custom) {
|
|
59
|
-
const type2 = custom ? `${type}${toUpperCaseFirstChar(custom)}` : type;
|
|
60
|
-
const result = {};
|
|
61
|
-
// scenes
|
|
62
|
-
const onionScenesMeta = getOnionScenesMeta(this.modulesMeta.modules);
|
|
63
|
-
for (const sceneName in onionScenesMeta) {
|
|
64
|
-
const onionSceneMeta = onionScenesMeta[sceneName];
|
|
65
|
-
const scenePath = onionSceneMeta[type2];
|
|
66
|
-
if (scenePath) {
|
|
67
|
-
result[sceneName] = path.join(onionSceneMeta.module.root, scenePath);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// metas
|
|
71
|
-
const onionMetasMeta = getOnionMetasMeta(this.modulesMeta.modules);
|
|
72
|
-
for (const sceneName in onionMetasMeta) {
|
|
73
|
-
const onionMetaMeta = onionMetasMeta[sceneName];
|
|
74
|
-
const scenePath = onionMetaMeta[type2];
|
|
75
|
-
if (scenePath) {
|
|
76
|
-
result[`meta:${sceneName}`] = path.join(onionMetaMeta.module.root, scenePath);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
4
|
-
import { __ThisSetName__ } from "../this.js";
|
|
5
|
-
export class CliCreateModule extends BeanCliBase {
|
|
6
|
-
async execute() {
|
|
7
|
-
const { argv } = this.context;
|
|
8
|
-
// super
|
|
9
|
-
await super.execute();
|
|
10
|
-
// noformat
|
|
11
|
-
argv.noformat = true;
|
|
12
|
-
// suite name/info
|
|
13
|
-
const suiteName = argv.suite;
|
|
14
|
-
if (suiteName) {
|
|
15
|
-
argv.suiteInfo = this.helper.parseSuiteInfo(suiteName);
|
|
16
|
-
// check if exists
|
|
17
|
-
argv._suite = this.helper.findSuite(suiteName);
|
|
18
|
-
if (!argv._suite) {
|
|
19
|
-
throw new Error(`suite does not exist: ${suiteName}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// nameMeta
|
|
23
|
-
const nameMeta = this.helper.parseNameMeta(argv.name);
|
|
24
|
-
const moduleDir = nameMeta.directory || 'module';
|
|
25
|
-
argv.name = nameMeta.short;
|
|
26
|
-
// module name/info
|
|
27
|
-
const moduleName = argv.name;
|
|
28
|
-
argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
|
|
29
|
-
argv.relativeNameCapitalize = this.helper.stringToCapitalize(argv.moduleInfo.relativeName, '-');
|
|
30
|
-
// check if exists
|
|
31
|
-
const _module = this.helper.findModule(moduleName);
|
|
32
|
-
if (!argv.force && _module) {
|
|
33
|
-
throw new Error(`module exists: ${moduleName}`);
|
|
34
|
-
}
|
|
35
|
-
// target dir
|
|
36
|
-
let targetDir;
|
|
37
|
-
if (suiteName) {
|
|
38
|
-
targetDir = path.join(argv._suite.root, 'modules', moduleName);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
targetDir = path.join(argv.projectPath, `src/${moduleDir}`, moduleName);
|
|
42
|
-
}
|
|
43
|
-
if (!argv.force && fs.existsSync(targetDir)) {
|
|
44
|
-
throw new Error(`module exists: ${moduleName}`);
|
|
45
|
-
}
|
|
46
|
-
// render module snippets for suite
|
|
47
|
-
if (suiteName) {
|
|
48
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
49
|
-
targetDir: argv._suite.root,
|
|
50
|
-
setName: __ThisSetName__,
|
|
51
|
-
snippetsPath: 'create/module/snippets',
|
|
52
|
-
boilerplatePath: null,
|
|
53
|
-
});
|
|
54
|
-
await this.helper.removeGitkeep(path.join(argv._suite.root, 'modules'));
|
|
55
|
-
}
|
|
56
|
-
// render module boilerplate
|
|
57
|
-
targetDir = await this.helper.ensureDir(targetDir);
|
|
58
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
59
|
-
targetDir,
|
|
60
|
-
setName: __ThisSetName__,
|
|
61
|
-
snippetsPath: null,
|
|
62
|
-
boilerplatePath: 'create/module/boilerplate',
|
|
63
|
-
});
|
|
64
|
-
// tools.deps
|
|
65
|
-
if (!argv.vscode) {
|
|
66
|
-
await this.helper.invokeCli([':tools:deps'], { cwd: argv.projectPath });
|
|
67
|
-
}
|
|
68
|
-
// pnpm install
|
|
69
|
-
if (!argv.vscode && !argv.ci) {
|
|
70
|
-
await this.helper.pnpmInstall();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
6
|
-
import compressing from 'compressing';
|
|
7
|
-
import fse from 'fs-extra';
|
|
8
|
-
import randomize from 'randomatic';
|
|
9
|
-
import { rimraf } from 'rimraf';
|
|
10
|
-
import urllib from 'urllib';
|
|
11
|
-
import * as uuid from 'uuid';
|
|
12
|
-
import { __ThisSetName__ } from "../this.js";
|
|
13
|
-
export class CliCreateProject extends BeanCliBase {
|
|
14
|
-
httpClient;
|
|
15
|
-
constructor(options) {
|
|
16
|
-
super(options);
|
|
17
|
-
this.httpClient = urllib;
|
|
18
|
-
}
|
|
19
|
-
async execute() {
|
|
20
|
-
const { argv } = this.context;
|
|
21
|
-
// super
|
|
22
|
-
await super.execute();
|
|
23
|
-
// noformat
|
|
24
|
-
argv.noformat = true;
|
|
25
|
-
// project name
|
|
26
|
-
const projectName = argv.name;
|
|
27
|
-
// target dir
|
|
28
|
-
const targetDir = path.join(argv.projectPath, projectName);
|
|
29
|
-
if (!argv.force && fs.existsSync(targetDir)) {
|
|
30
|
-
throw new Error(`project exists: ${projectName}`);
|
|
31
|
-
}
|
|
32
|
-
fse.ensureDirSync(targetDir);
|
|
33
|
-
// vars
|
|
34
|
-
argv.SERVER_KEYS = `vona_${uuid.v4()}_${Date.now()}_${random(100, 10000)}`;
|
|
35
|
-
argv.SERVER_KEYS_PROD = `vona_${uuid.v4()}_${Date.now()}_${random(100, 10000)}`;
|
|
36
|
-
argv.DATABASE_CLIENT_MYSQL_USER = 'web_user';
|
|
37
|
-
argv.DATABASE_CLIENT_MYSQL_PASSWORD = randomize('*', 16, { exclude: '\\\'"$' });
|
|
38
|
-
argv.DATABASE_CLIENT_MYSQL_PASSWORD_ROOT = randomize('*', 16, { exclude: '\\\'"$' });
|
|
39
|
-
argv.DATABASE_CLIENT_PG_USER = 'postgres';
|
|
40
|
-
argv.DATABASE_CLIENT_PG_PASSWORD = randomize('*', 16, { exclude: '\\\'"$' });
|
|
41
|
-
argv.DATABASE_CLIENT_PG_PASSWORD_ROOT = randomize('*', 16, { exclude: '\\\'"$' });
|
|
42
|
-
// template
|
|
43
|
-
const template = argv.template;
|
|
44
|
-
// render project boilerplate
|
|
45
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
46
|
-
targetDir,
|
|
47
|
-
setName: __ThisSetName__,
|
|
48
|
-
snippetsPath: null,
|
|
49
|
-
boilerplatePath: `create/project/${template}/boilerplate`,
|
|
50
|
-
});
|
|
51
|
-
// create docker-compose/data/pg
|
|
52
|
-
fse.ensureDirSync(path.join(targetDir, 'docker-compose/data/pg'));
|
|
53
|
-
// copy package.json
|
|
54
|
-
fse.copyFileSync(path.join(targetDir, 'package.original.json'), path.join(targetDir, 'package.json'));
|
|
55
|
-
// npm run init
|
|
56
|
-
await this.helper.spawnCmd({
|
|
57
|
-
cmd: 'npm',
|
|
58
|
-
args: ['run', 'init'],
|
|
59
|
-
options: { cwd: targetDir },
|
|
60
|
-
});
|
|
61
|
-
// done
|
|
62
|
-
await this.printUsage(targetDir);
|
|
63
|
-
}
|
|
64
|
-
async printUsage(targetDir) {
|
|
65
|
-
await this.console.log(`usage:
|
|
66
|
-
- cd ${targetDir}
|
|
67
|
-
- pnpm install
|
|
68
|
-
- npm run dev
|
|
69
|
-
- npm run test
|
|
70
|
-
- npm run build
|
|
71
|
-
- npm run start
|
|
72
|
-
`);
|
|
73
|
-
}
|
|
74
|
-
async downloadBoilerplate(packageName) {
|
|
75
|
-
const result = await this.getPackageInfo(packageName, false);
|
|
76
|
-
const tgzUrl = result.dist.tarball;
|
|
77
|
-
await this.console.log(`downloading ${tgzUrl}`);
|
|
78
|
-
const saveDir = path.join(os.tmpdir(), 'zova-project-boilerplate');
|
|
79
|
-
await rimraf(saveDir);
|
|
80
|
-
const response = await this.curl(tgzUrl, { streaming: true, followRedirect: true });
|
|
81
|
-
await compressing.tgz.uncompress(response.res, saveDir);
|
|
82
|
-
await this.console.log(`extract to ${saveDir}`);
|
|
83
|
-
return path.join(saveDir, '/package');
|
|
84
|
-
}
|
|
85
|
-
async getPackageInfo(packageName, withFallback) {
|
|
86
|
-
await this.console.log(`fetching npm info of ${packageName}`);
|
|
87
|
-
try {
|
|
88
|
-
const registry = await this.helper.getRegistry();
|
|
89
|
-
const result = await this.curl(`${registry}${packageName}/latest`, {
|
|
90
|
-
dataType: 'json',
|
|
91
|
-
followRedirect: true,
|
|
92
|
-
maxRedirects: 5,
|
|
93
|
-
});
|
|
94
|
-
if (result.status !== 200) {
|
|
95
|
-
const message = `npm info ${packageName} got error: ${result.status}, ${result.data.reason}`;
|
|
96
|
-
throw new Error(message);
|
|
97
|
-
}
|
|
98
|
-
return result.data;
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
if (withFallback) {
|
|
102
|
-
await this.console.log(`use fallback from ${packageName}`);
|
|
103
|
-
const require = createRequire(import.meta.url);
|
|
104
|
-
return require(`${packageName}/package.json`);
|
|
105
|
-
}
|
|
106
|
-
throw err;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
async curl(url, options) {
|
|
110
|
-
options = options || {};
|
|
111
|
-
if (!options.timeout) {
|
|
112
|
-
options.timeout = 30000;
|
|
113
|
-
}
|
|
114
|
-
return await this.httpClient.request(url, options);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
function random(start, end) {
|
|
118
|
-
return Math.floor(Math.random() * (end - start) + start);
|
|
119
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
4
|
-
import { __ThisSetName__ } from "../this.js";
|
|
5
|
-
export class CliCreateSuite extends BeanCliBase {
|
|
6
|
-
async execute() {
|
|
7
|
-
const { argv } = this.context;
|
|
8
|
-
// super
|
|
9
|
-
await super.execute();
|
|
10
|
-
// noformat
|
|
11
|
-
argv.noformat = true;
|
|
12
|
-
// nameMeta
|
|
13
|
-
const nameMeta = this.helper.parseNameMeta(argv.name);
|
|
14
|
-
const suiteDir = nameMeta.directory || 'suite';
|
|
15
|
-
argv.name = nameMeta.short;
|
|
16
|
-
// suite name/info
|
|
17
|
-
const suiteName = argv.name;
|
|
18
|
-
argv.suiteInfo = this.helper.parseSuiteInfo(suiteName);
|
|
19
|
-
// check if exists
|
|
20
|
-
const _suite = this.helper.findSuite(suiteName);
|
|
21
|
-
if (_suite) {
|
|
22
|
-
throw new Error(`suite exists: ${suiteName}`);
|
|
23
|
-
}
|
|
24
|
-
// target dir
|
|
25
|
-
let targetDir = path.join(argv.projectPath, `src/${suiteDir}`, suiteName);
|
|
26
|
-
if (fs.existsSync(targetDir)) {
|
|
27
|
-
throw new Error(`suite exists: ${suiteName}`);
|
|
28
|
-
}
|
|
29
|
-
targetDir = await this.helper.ensureDir(targetDir);
|
|
30
|
-
// templateDir
|
|
31
|
-
const templateDir = this.template.resolveTemplatePath(__ThisSetName__, 'create/suite');
|
|
32
|
-
// render
|
|
33
|
-
await this.template.renderDir(targetDir, templateDir);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
4
|
-
import { __ThisSetName__ } from "../this.js";
|
|
5
|
-
export class CliCreateTest extends BeanCliBase {
|
|
6
|
-
async execute() {
|
|
7
|
-
const { argv } = this.context;
|
|
8
|
-
// super
|
|
9
|
-
await super.execute();
|
|
10
|
-
// module name/info
|
|
11
|
-
const moduleName = argv.module;
|
|
12
|
-
argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
|
|
13
|
-
// check if exists
|
|
14
|
-
const _module = this.helper.findModule(moduleName);
|
|
15
|
-
if (!_module) {
|
|
16
|
-
throw new Error(`module does not exist: ${moduleName}`);
|
|
17
|
-
}
|
|
18
|
-
// target dir
|
|
19
|
-
const targetDir = await this.helper.ensureDir(_module.root);
|
|
20
|
-
// name
|
|
21
|
-
argv.nameCapitalize = this.helper.firstCharToUpperCase(argv.name);
|
|
22
|
-
// nameMeta
|
|
23
|
-
argv.nameMeta = this.helper.parseNameMeta(argv.name, ['test']);
|
|
24
|
-
// directory
|
|
25
|
-
const testDir = path.join(targetDir, 'test');
|
|
26
|
-
const testFile = path.join(testDir, `${argv.name}.test.ts`);
|
|
27
|
-
if (fs.existsSync(testFile)) {
|
|
28
|
-
throw new Error(`test exists: ${testFile}`);
|
|
29
|
-
}
|
|
30
|
-
await this.helper.ensureDir(testDir);
|
|
31
|
-
// render boilerplate
|
|
32
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
33
|
-
targetDir: testDir,
|
|
34
|
-
setName: __ThisSetName__,
|
|
35
|
-
snippetsPath: null,
|
|
36
|
-
boilerplatePath: 'create/test/boilerplate',
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { BeanCliBase, getCommandsMeta } from '@cabloy/cli';
|
|
2
|
-
export class CliDefaultList extends BeanCliBase {
|
|
3
|
-
async execute() {
|
|
4
|
-
const { argv } = this.context;
|
|
5
|
-
// super
|
|
6
|
-
await super.execute();
|
|
7
|
-
// set/group
|
|
8
|
-
const setWant = argv.set;
|
|
9
|
-
let groupWant = argv.group;
|
|
10
|
-
if (!setWant)
|
|
11
|
-
groupWant = undefined;
|
|
12
|
-
// commandsAll
|
|
13
|
-
const commandsAll = (await getCommandsMeta()).all;
|
|
14
|
-
// setsShow
|
|
15
|
-
let setsShow;
|
|
16
|
-
if (setWant) {
|
|
17
|
-
if (!commandsAll[setWant])
|
|
18
|
-
throw new Error(`cli set not found: ${setWant}`);
|
|
19
|
-
setsShow = [setWant];
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
setsShow = Object.keys(commandsAll);
|
|
23
|
-
}
|
|
24
|
-
// loop
|
|
25
|
-
const total = setsShow.length;
|
|
26
|
-
for (let index = 0; index < total; index++) {
|
|
27
|
-
const setShow = setsShow[index];
|
|
28
|
-
// log
|
|
29
|
-
await this.console.log({
|
|
30
|
-
total,
|
|
31
|
-
progress: index,
|
|
32
|
-
text: setShow,
|
|
33
|
-
});
|
|
34
|
-
// show
|
|
35
|
-
await this._setShow({ setShow, groupWant, commandsAll });
|
|
36
|
-
}
|
|
37
|
-
// await this.console.log({ text: JSON.stringify(modulesWant) });
|
|
38
|
-
}
|
|
39
|
-
async _setShow({ setShow, groupWant, commandsAll }) {
|
|
40
|
-
// _set
|
|
41
|
-
const _set = commandsAll[setShow];
|
|
42
|
-
// groupsShow
|
|
43
|
-
let groupsShow;
|
|
44
|
-
if (groupWant) {
|
|
45
|
-
if (!_set[groupWant])
|
|
46
|
-
throw new Error(`cli set group not found: ${setShow}:${groupWant}`);
|
|
47
|
-
groupsShow = [groupWant];
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
groupsShow = Object.keys(_set);
|
|
51
|
-
}
|
|
52
|
-
// table
|
|
53
|
-
const table = this.helper.newTable({
|
|
54
|
-
head: ['Command', 'Version', 'Description'],
|
|
55
|
-
colWidths: [30, 10, 40],
|
|
56
|
-
});
|
|
57
|
-
// group
|
|
58
|
-
const groupCount = groupsShow.length;
|
|
59
|
-
for (let index = 0; index < groupCount; index++) {
|
|
60
|
-
const groupShow = groupsShow[index];
|
|
61
|
-
const _group = _set[groupShow];
|
|
62
|
-
for (const commandName in _group) {
|
|
63
|
-
const _command = _group[commandName].command;
|
|
64
|
-
const cliFullName = this._combineCliFullName({ setShow, groupShow, commandName });
|
|
65
|
-
const version = _command.info.version;
|
|
66
|
-
const description = _command.info.description || _command.info.title;
|
|
67
|
-
table.push([cliFullName, version, description]);
|
|
68
|
-
}
|
|
69
|
-
if (index < groupCount - 1) {
|
|
70
|
-
table.push([]);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// log
|
|
74
|
-
await this.console.log({ text: table.toString() });
|
|
75
|
-
}
|
|
76
|
-
_combineCliFullName({ setShow, groupShow, commandName }) {
|
|
77
|
-
const parts = [];
|
|
78
|
-
if (setShow === 'api') {
|
|
79
|
-
parts.push('');
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
parts.push(setShow);
|
|
83
|
-
}
|
|
84
|
-
if (groupShow === 'default') {
|
|
85
|
-
parts.push('');
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
parts.push(groupShow);
|
|
89
|
-
}
|
|
90
|
-
parts.push(commandName);
|
|
91
|
-
return parts.join(':');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
3
|
-
import fse from 'fs-extra';
|
|
4
|
-
import { __ThisSetName__ } from "../this.js";
|
|
5
|
-
export class CliInitAppMonkey extends BeanCliBase {
|
|
6
|
-
async execute() {
|
|
7
|
-
const { argv } = this.context;
|
|
8
|
-
// super
|
|
9
|
-
await super.execute();
|
|
10
|
-
// target dir
|
|
11
|
-
const targetDir = path.join(argv.projectPath, 'src/backend/config');
|
|
12
|
-
const monkeyFile = path.join(targetDir, 'monkey.ts');
|
|
13
|
-
if (fse.existsSync(monkeyFile)) {
|
|
14
|
-
throw new Error('app monkey exists');
|
|
15
|
-
}
|
|
16
|
-
// render boilerplate
|
|
17
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
18
|
-
targetDir,
|
|
19
|
-
setName: __ThisSetName__,
|
|
20
|
-
snippetsPath: null,
|
|
21
|
-
boilerplatePath: 'init/appMonkey/boilerplate',
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
3
|
-
import fse from 'fs-extra';
|
|
4
|
-
export class CliInitAsset extends BeanCliBase {
|
|
5
|
-
async execute() {
|
|
6
|
-
const { argv } = this.context;
|
|
7
|
-
// super
|
|
8
|
-
await super.execute();
|
|
9
|
-
// module name/info
|
|
10
|
-
const moduleName = argv.module;
|
|
11
|
-
argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
|
|
12
|
-
// check if exists
|
|
13
|
-
const _module = this.helper.findModule(moduleName);
|
|
14
|
-
if (!_module) {
|
|
15
|
-
throw new Error(`module does not exist: ${moduleName}`);
|
|
16
|
-
}
|
|
17
|
-
// target dir
|
|
18
|
-
const targetDir = await this.helper.ensureDir(_module.root);
|
|
19
|
-
// scene
|
|
20
|
-
const scene = argv.scene;
|
|
21
|
-
// directory
|
|
22
|
-
const assetDir = path.join(targetDir, 'assets', scene);
|
|
23
|
-
if (fse.existsSync(assetDir)) {
|
|
24
|
-
throw new Error(`asset exists: ${moduleName}/assets/${scene}`);
|
|
25
|
-
}
|
|
26
|
-
await this.helper.ensureDir(assetDir);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { BeanCliBase } from '@cabloy/cli';
|
|
3
|
-
import fse from 'fs-extra';
|
|
4
|
-
import { __ThisSetName__ } from "../this.js";
|
|
5
|
-
export class CliInitConfig extends BeanCliBase {
|
|
6
|
-
async execute() {
|
|
7
|
-
const { argv } = this.context;
|
|
8
|
-
// super
|
|
9
|
-
await super.execute();
|
|
10
|
-
// module name/info
|
|
11
|
-
const moduleName = argv._[0];
|
|
12
|
-
if (!moduleName)
|
|
13
|
-
return;
|
|
14
|
-
argv.moduleInfo = this.helper.parseModuleInfo(moduleName);
|
|
15
|
-
// check if exists
|
|
16
|
-
const _module = this.helper.findModule(moduleName);
|
|
17
|
-
if (!_module) {
|
|
18
|
-
throw new Error(`module does not exist: ${moduleName}`);
|
|
19
|
-
}
|
|
20
|
-
// target dir
|
|
21
|
-
const targetDir = await this.helper.ensureDir(_module.root);
|
|
22
|
-
const configFile = path.join(targetDir, 'src/config/config.ts');
|
|
23
|
-
if (fse.existsSync(configFile)) {
|
|
24
|
-
throw new Error(`config exists: ${moduleName}`);
|
|
25
|
-
}
|
|
26
|
-
// render boilerplate
|
|
27
|
-
await this.template.renderBoilerplateAndSnippets({
|
|
28
|
-
targetDir: path.join(targetDir, 'src'),
|
|
29
|
-
setName: __ThisSetName__,
|
|
30
|
-
snippetsPath: null,
|
|
31
|
-
boilerplatePath: 'init/config/boilerplate',
|
|
32
|
-
});
|
|
33
|
-
// tools.metadata
|
|
34
|
-
if (!argv.nometadata) {
|
|
35
|
-
await this.helper.invokeCli([':tools:metadata', moduleName], { cwd: argv.projectPath });
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|