@nocobase/cli-v1 2.2.0-beta.1 → 2.2.0-beta.11
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/package.json +5 -5
- package/src/__tests__/app-dev-utils.test.js +1 -0
- package/src/__tests__/dev-command.test.js +34 -0
- package/src/__tests__/util.test.js +33 -0
- package/src/commands/app-dev-utils.js +1 -1
- package/src/commands/dev.js +25 -7
- package/src/commands/update-deps.js +8 -0
- package/src/util.js +30 -5
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/cli-v1",
|
|
3
|
-
"version": "2.2.0-beta.
|
|
3
|
+
"version": "2.2.0-beta.11",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./src/index.js",
|
|
7
7
|
"bin": {
|
|
8
|
+
"nocobase": "./bin/index.js",
|
|
8
9
|
"nocobase-v1": "./bin/index.js"
|
|
9
10
|
},
|
|
10
11
|
"dependencies": {
|
|
11
|
-
"@nocobase/cli": "2.2.0-beta.
|
|
12
|
+
"@nocobase/cli": "2.2.0-beta.11",
|
|
12
13
|
"@nocobase/license-kit": "^0.3.8",
|
|
13
|
-
"@nocobase/utils": "2.2.0-beta.
|
|
14
|
+
"@nocobase/utils": "2.2.0-beta.11",
|
|
14
15
|
"chalk": "^4.1.1",
|
|
15
16
|
"commander": "^9.2.0",
|
|
16
17
|
"deepmerge": "^4.3.1",
|
|
@@ -25,7 +26,6 @@
|
|
|
25
26
|
"tree-kill": "^1.2.2"
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|
|
28
|
-
"@nocobase/devtools": "2.2.0-beta.1",
|
|
29
29
|
"@types/fs-extra": "^11.0.1"
|
|
30
30
|
},
|
|
31
31
|
"repository": {
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"url": "git+https://github.com/nocobase/nocobase.git",
|
|
34
34
|
"directory": "packages/core/cli"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "8dab25af2bb83a81da68158d0dcf836f96103d61"
|
|
37
37
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* eslint-env jest */
|
|
11
|
+
|
|
12
|
+
const { buildAppDevForwardArgs, forwardDevToAppDev } = require('../commands/dev')._test;
|
|
13
|
+
|
|
14
|
+
describe('cli-v1 dev command', () => {
|
|
15
|
+
test('buildAppDevForwardArgs rewrites dev argv to app-dev while preserving extra args', () => {
|
|
16
|
+
expect(
|
|
17
|
+
buildAppDevForwardArgs(['node', 'nocobase-v1', 'dev', '--rsbuild', '--port', '13000', '--inspect=9229']),
|
|
18
|
+
).toEqual(['app-dev', '--rsbuild', '--port', '13000', '--inspect=9229']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('forwardDevToAppDev delegates to nocobase-v1 app-dev for create-app projects', async () => {
|
|
22
|
+
const calls = [];
|
|
23
|
+
const runCommand = async (...args) => {
|
|
24
|
+
calls.push(args);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
await forwardDevToAppDev({
|
|
28
|
+
argv: ['node', 'nocobase-v1', 'dev', '--port', '13000', '--db-sync'],
|
|
29
|
+
runCommand,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(calls).toEqual([['nocobase-v1', ['app-dev', '--port', '13000', '--db-sync']]]);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* eslint-env jest */
|
|
11
|
+
|
|
12
|
+
const { colorizedDevLogEnv, createRunWithPrefixLabel } = require('../util')._test;
|
|
13
|
+
|
|
14
|
+
describe('cli-v1 util helpers', () => {
|
|
15
|
+
test('colorizedDevLogEnv enables color for dev child output by default', () => {
|
|
16
|
+
expect(colorizedDevLogEnv({})).toEqual({ FORCE_COLOR: '1' });
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('colorizedDevLogEnv keeps explicit FORCE_COLOR', () => {
|
|
20
|
+
expect(colorizedDevLogEnv({ FORCE_COLOR: '3' })).toEqual({ FORCE_COLOR: '3' });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('colorizedDevLogEnv removes inherited NO_COLOR so dev logs stay colored', () => {
|
|
24
|
+
expect(colorizedDevLogEnv({ NO_COLOR: '1', TERM: 'dumb' })).toEqual({
|
|
25
|
+
FORCE_COLOR: '1',
|
|
26
|
+
TERM: 'dumb',
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('createRunWithPrefixLabel colorizes prefixed output even when the parent disables colors', () => {
|
|
31
|
+
expect(createRunWithPrefixLabel('client', 'cyan')).toBe('\u001b[36m[client]\u001b[39m');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -150,7 +150,7 @@ function buildAppDevServerArgs({
|
|
|
150
150
|
argv = process.argv,
|
|
151
151
|
serverTsconfigPath = process.env.SERVER_TSCONFIG_PATH,
|
|
152
152
|
} = {}) {
|
|
153
|
-
const args = ['watch', `--ignore=${resolvePluginStoragePath()}/**`];
|
|
153
|
+
const args = ['watch', '--clear-screen=false', `--ignore=${resolvePluginStoragePath()}/**`];
|
|
154
154
|
|
|
155
155
|
if (serverTsconfigPath) {
|
|
156
156
|
args.push('--tsconfig', serverTsconfigPath);
|
package/src/commands/dev.js
CHANGED
|
@@ -10,8 +10,10 @@ const _ = require('lodash');
|
|
|
10
10
|
const { Command } = require('commander');
|
|
11
11
|
const {
|
|
12
12
|
generatePlugins,
|
|
13
|
+
hasCorePackages,
|
|
13
14
|
run,
|
|
14
15
|
runWithPrefix,
|
|
16
|
+
colorizedDevLogEnv,
|
|
15
17
|
postCheck,
|
|
16
18
|
nodeCheck,
|
|
17
19
|
promptForTs,
|
|
@@ -41,6 +43,14 @@ async function buildBundleStatusHtml() {
|
|
|
41
43
|
);
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
function buildAppDevForwardArgs(argv = process.argv) {
|
|
47
|
+
return ['app-dev', ...argv.slice(3)];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function forwardDevToAppDev({ argv = process.argv, runCommand = run } = {}) {
|
|
51
|
+
await runCommand('nocobase-v1', buildAppDevForwardArgs(argv));
|
|
52
|
+
}
|
|
53
|
+
|
|
44
54
|
/**
|
|
45
55
|
*
|
|
46
56
|
* @param {Command} cli
|
|
@@ -58,6 +68,11 @@ module.exports = (cli) => {
|
|
|
58
68
|
.option('-i, --inspect [port]')
|
|
59
69
|
.allowUnknownOption()
|
|
60
70
|
.action(async (opts) => {
|
|
71
|
+
if (!hasCorePackages()) {
|
|
72
|
+
await forwardDevToAppDev();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
61
76
|
checkDBDialect();
|
|
62
77
|
await buildBundleStatusHtml();
|
|
63
78
|
|
|
@@ -184,16 +199,13 @@ module.exports = (cli) => {
|
|
|
184
199
|
}
|
|
185
200
|
subprocessRef.cancel();
|
|
186
201
|
let i = 0;
|
|
187
|
-
while (
|
|
202
|
+
while (i <= 10) {
|
|
188
203
|
++i;
|
|
189
204
|
const result = await isPortReachable(port);
|
|
190
205
|
if (!result) {
|
|
191
206
|
break;
|
|
192
207
|
}
|
|
193
208
|
await sleep(500);
|
|
194
|
-
if (i > 10) {
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
209
|
}
|
|
198
210
|
start();
|
|
199
211
|
};
|
|
@@ -202,7 +214,7 @@ module.exports = (cli) => {
|
|
|
202
214
|
const storagePluginPath = resolvePluginStoragePath();
|
|
203
215
|
const watcher = chokidar.watch(`${storagePluginPath}/**/*`, {
|
|
204
216
|
cwd: process.cwd(),
|
|
205
|
-
ignored: /(^|[
|
|
217
|
+
ignored: /(^|[/\\])\../, // 忽略隐藏文件
|
|
206
218
|
persistent: true,
|
|
207
219
|
depth: 1, // 只监听第一层目录
|
|
208
220
|
});
|
|
@@ -246,6 +258,7 @@ module.exports = (cli) => {
|
|
|
246
258
|
|
|
247
259
|
const argv = [
|
|
248
260
|
'watch',
|
|
261
|
+
'--clear-screen=false',
|
|
249
262
|
...(inspect ? [`--inspect=${inspect === true ? 9229 : inspect}`] : []),
|
|
250
263
|
`--ignore=${resolvePluginStoragePath()}/**`,
|
|
251
264
|
'--tsconfig',
|
|
@@ -264,9 +277,9 @@ module.exports = (cli) => {
|
|
|
264
277
|
|
|
265
278
|
const runDevServer = () => {
|
|
266
279
|
run('tsx', argv, {
|
|
267
|
-
env: {
|
|
280
|
+
env: colorizedDevLogEnv(process.env, {
|
|
268
281
|
APP_PORT: serverPort,
|
|
269
|
-
},
|
|
282
|
+
}),
|
|
270
283
|
}).catch((err) => {
|
|
271
284
|
if (err.exitCode == 100) {
|
|
272
285
|
console.log('Restarting server...');
|
|
@@ -289,3 +302,8 @@ module.exports = (cli) => {
|
|
|
289
302
|
}
|
|
290
303
|
});
|
|
291
304
|
};
|
|
305
|
+
|
|
306
|
+
module.exports._test = {
|
|
307
|
+
buildAppDevForwardArgs,
|
|
308
|
+
forwardDevToAppDev,
|
|
309
|
+
};
|
|
@@ -68,6 +68,14 @@ module.exports = (cli) => {
|
|
|
68
68
|
if (descJson['dependencies']?.['@nocobase/app']) {
|
|
69
69
|
descJson['dependencies']['@nocobase/app'] = stdout;
|
|
70
70
|
}
|
|
71
|
+
descJson['scripts']['dev'] = 'nocobase app-dev';
|
|
72
|
+
if (descJson['dependencies']?.['@nocobase/cli']) {
|
|
73
|
+
descJson['dependencies']['@nocobase/app'] = stdout;
|
|
74
|
+
console.log(
|
|
75
|
+
chalk.yellow('The @nocobase/cli package is no longer needed, it will be removed from dependencies.'),
|
|
76
|
+
);
|
|
77
|
+
delete descJson['dependencies']['@nocobase/cli'];
|
|
78
|
+
}
|
|
71
79
|
if (descJson['devDependencies']?.['@nocobase/devtools']) {
|
|
72
80
|
descJson['devDependencies']['@nocobase/devtools'] = stdout;
|
|
73
81
|
}
|
package/src/util.js
CHANGED
|
@@ -84,6 +84,24 @@ exports.run = (command, args, options = {}) => {
|
|
|
84
84
|
});
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
+
function colorizedDevLogEnv(env = process.env, overrides = {}) {
|
|
88
|
+
const nextEnv = {
|
|
89
|
+
...env,
|
|
90
|
+
...overrides,
|
|
91
|
+
};
|
|
92
|
+
delete nextEnv.NO_COLOR;
|
|
93
|
+
if (!nextEnv.FORCE_COLOR) {
|
|
94
|
+
nextEnv.FORCE_COLOR = '1';
|
|
95
|
+
}
|
|
96
|
+
return nextEnv;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function createRunWithPrefixLabel(prefix, color) {
|
|
100
|
+
const forcedChalk = new chalk.Instance({ level: 1 });
|
|
101
|
+
const colorize = forcedChalk[color] || forcedChalk.cyan;
|
|
102
|
+
return colorize(`[${prefix}]`);
|
|
103
|
+
}
|
|
104
|
+
|
|
87
105
|
exports.runWithPrefix = (command, args, options = {}) => {
|
|
88
106
|
if (command === 'tsx') {
|
|
89
107
|
command = 'node';
|
|
@@ -92,15 +110,12 @@ exports.runWithPrefix = (command, args, options = {}) => {
|
|
|
92
110
|
|
|
93
111
|
const prefix = options.prefix || 'process';
|
|
94
112
|
const color = options.color || 'cyan';
|
|
95
|
-
const label =
|
|
113
|
+
const label = createRunWithPrefixLabel(prefix, color);
|
|
96
114
|
const subprocess = execa(command, args, {
|
|
97
115
|
shell: true,
|
|
98
116
|
stdio: 'pipe',
|
|
99
117
|
...options,
|
|
100
|
-
env:
|
|
101
|
-
...process.env,
|
|
102
|
-
...options.env,
|
|
103
|
-
},
|
|
118
|
+
env: colorizedDevLogEnv(process.env, options.env),
|
|
104
119
|
});
|
|
105
120
|
|
|
106
121
|
const writePrefixed = (chunk, writer) => {
|
|
@@ -122,6 +137,13 @@ exports.runWithPrefix = (command, args, options = {}) => {
|
|
|
122
137
|
return subprocess;
|
|
123
138
|
};
|
|
124
139
|
|
|
140
|
+
exports._test = {
|
|
141
|
+
createRunWithPrefixLabel,
|
|
142
|
+
colorizedDevLogEnv,
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
exports.colorizedDevLogEnv = colorizedDevLogEnv;
|
|
146
|
+
|
|
125
147
|
exports.isPortReachable = async (port, { timeout = 1000, host } = {}) => {
|
|
126
148
|
const promise = new Promise((resolve, reject) => {
|
|
127
149
|
const socket = new net.Socket();
|
|
@@ -434,6 +456,9 @@ function isAppDevHtml() {
|
|
|
434
456
|
}
|
|
435
457
|
|
|
436
458
|
function buildIndexHtml(force = false) {
|
|
459
|
+
if (process.env.NOCOBASE_EXTRACT_CLIENT_ASSETS === 'true') {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
437
462
|
const file = `${process.env.APP_PACKAGE_ROOT}/dist/client/index.html`;
|
|
438
463
|
if (!fs.existsSync(file)) {
|
|
439
464
|
return;
|