@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 CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@nocobase/cli-v1",
3
- "version": "2.2.0-beta.1",
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.1",
12
+ "@nocobase/cli": "2.2.0-beta.11",
12
13
  "@nocobase/license-kit": "^0.3.8",
13
- "@nocobase/utils": "2.2.0-beta.1",
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": "f82fa9d0c3aa8e00e53dd94e404a312483b4866b"
36
+ "gitHead": "8dab25af2bb83a81da68158d0dcf836f96103d61"
37
37
  }
@@ -82,6 +82,7 @@ describe('cli-v1 app-dev utils', () => {
82
82
  }),
83
83
  ).toEqual([
84
84
  'watch',
85
+ '--clear-screen=false',
85
86
  `--ignore=${path.resolve(process.cwd(), 'storage/plugins')}/**`,
86
87
  '--tsconfig',
87
88
  './tsconfig.server.json',
@@ -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);
@@ -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 (true) {
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 = chalk[color](`[${prefix}]`);
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;