@nocobase/cli 1.5.0-alpha.5 → 1.5.0-beta.10

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/nocobase.conf.tpl CHANGED
@@ -70,6 +70,7 @@ server {
70
70
  proxy_http_version 1.1;
71
71
  proxy_set_header Upgrade $http_upgrade;
72
72
  proxy_set_header Connection 'upgrade';
73
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
73
74
  proxy_set_header Host $host;
74
75
  add_header Cache-Control 'no-cache, no-store';
75
76
  proxy_cache_bypass $http_upgrade;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/cli",
3
- "version": "1.5.0-alpha.5",
3
+ "version": "1.5.0-beta.10",
4
4
  "description": "",
5
5
  "license": "AGPL-3.0",
6
6
  "main": "./src/index.js",
@@ -8,7 +8,7 @@
8
8
  "nocobase": "./bin/index.js"
9
9
  },
10
10
  "dependencies": {
11
- "@nocobase/app": "1.5.0-alpha.5",
11
+ "@nocobase/app": "1.5.0-beta.10",
12
12
  "@types/fs-extra": "^11.0.1",
13
13
  "@umijs/utils": "3.5.20",
14
14
  "chalk": "^4.1.1",
@@ -25,12 +25,12 @@
25
25
  "tsx": "^4.19.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@nocobase/devtools": "1.5.0-alpha.5"
28
+ "@nocobase/devtools": "1.5.0-beta.10"
29
29
  },
30
30
  "repository": {
31
31
  "type": "git",
32
32
  "url": "git+https://github.com/nocobase/nocobase.git",
33
33
  "directory": "packages/core/cli"
34
34
  },
35
- "gitHead": "8d24e8d2c0f3f57ceaa271438fd93db2b4150011"
35
+ "gitHead": "379133b1104f8c609d7c5ac5bee23f9ba93934d5"
36
36
  }
@@ -6,16 +6,21 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
-
10
- const chalk = require('chalk');
9
+ const _ = require('lodash');
11
10
  const { Command } = require('commander');
12
- const { generatePlugins, run, postCheck, nodeCheck, promptForTs } = require('../util');
11
+ const { generatePlugins, run, postCheck, nodeCheck, promptForTs, isPortReachable } = require('../util');
13
12
  const { getPortPromise } = require('portfinder');
14
13
  const chokidar = require('chokidar');
15
14
  const { uid } = require('@formily/shared');
16
15
  const path = require('path');
17
16
  const fs = require('fs');
18
17
 
18
+ function sleep(ms = 1000) {
19
+ return new Promise((resolve) => {
20
+ setTimeout(resolve, ms);
21
+ });
22
+ }
23
+
19
24
  /**
20
25
  *
21
26
  * @param {Command} cli
@@ -25,12 +30,30 @@ module.exports = (cli) => {
25
30
  cli
26
31
  .command('dev')
27
32
  .option('-p, --port [port]')
28
- .option('--client')
29
- .option('--server')
33
+ .option('-c, --client')
34
+ .option('-s, --server')
30
35
  .option('--db-sync')
31
- .option('--inspect [port]')
36
+ .option('-i, --inspect [port]')
32
37
  .allowUnknownOption()
33
38
  .action(async (opts) => {
39
+ let subprocess;
40
+ const runDevClient = () => {
41
+ console.log('starting client', 1 * clientPort);
42
+ subprocess = run('umi', ['dev'], {
43
+ env: {
44
+ ...process.env,
45
+ stdio: 'inherit',
46
+ shell: true,
47
+ PORT: clientPort,
48
+ APP_ROOT: `${APP_PACKAGE_ROOT}/client`,
49
+ WEBSOCKET_URL:
50
+ process.env.WEBSOCKET_URL ||
51
+ (serverPort ? `ws://localhost:${serverPort}${process.env.WS_PATH}` : undefined),
52
+ PROXY_TARGET_URL:
53
+ process.env.PROXY_TARGET_URL || (serverPort ? `http://127.0.0.1:${serverPort}` : undefined),
54
+ },
55
+ });
56
+ };
34
57
  const watcher = chokidar.watch('./storage/plugins/**/*', {
35
58
  cwd: process.cwd(),
36
59
  ignored: /(^|[\/\\])\../, // 忽略隐藏文件
@@ -39,15 +62,42 @@ module.exports = (cli) => {
39
62
  });
40
63
 
41
64
  await fs.promises.mkdir(path.dirname(process.env.WATCH_FILE), { recursive: true });
65
+ let isReady = false;
66
+
67
+ const restartClient = _.debounce(async () => {
68
+ if (!isReady) return;
69
+ generatePlugins();
70
+ if (subprocess) {
71
+ console.log('client restarting...');
72
+ subprocess.cancel();
73
+ let i = 0;
74
+ while (true) {
75
+ ++i;
76
+ const result = await isPortReachable(clientPort);
77
+ if (!result) {
78
+ break;
79
+ }
80
+ await sleep(500);
81
+ if (i > 10) {
82
+ break;
83
+ }
84
+ }
85
+ runDevClient();
86
+ await fs.promises.writeFile(process.env.WATCH_FILE, `export const watchId = '${uid()}';`, 'utf-8');
87
+ }
88
+ }, 500);
42
89
 
43
90
  watcher
91
+ .on('ready', () => {
92
+ isReady = true;
93
+ })
44
94
  .on('addDir', async (pathname) => {
45
- generatePlugins();
46
- await fs.promises.writeFile(process.env.WATCH_FILE, `export const watchId = '${uid()}';`, 'utf-8');
95
+ if (!isReady) return;
96
+ restartClient();
47
97
  })
48
98
  .on('unlinkDir', async (pathname) => {
49
- generatePlugins();
50
- await fs.promises.writeFile(process.env.WATCH_FILE, `export const watchId = '${uid()}';`, 'utf-8');
99
+ if (!isReady) return;
100
+ restartClient();
51
101
  });
52
102
 
53
103
  promptForTs();
@@ -133,18 +183,7 @@ module.exports = (cli) => {
133
183
  }
134
184
 
135
185
  if (client || !server) {
136
- console.log('starting client', 1 * clientPort);
137
- run('umi', ['dev'], {
138
- env: {
139
- PORT: clientPort,
140
- APP_ROOT: `${APP_PACKAGE_ROOT}/client`,
141
- WEBSOCKET_URL:
142
- process.env.WEBSOCKET_URL ||
143
- (serverPort ? `ws://localhost:${serverPort}${process.env.WS_PATH}` : undefined),
144
- PROXY_TARGET_URL:
145
- process.env.PROXY_TARGET_URL || (serverPort ? `http://127.0.0.1:${serverPort}` : undefined),
146
- },
147
- });
186
+ runDevClient();
148
187
  }
149
188
  });
150
189
  };
@@ -58,14 +58,16 @@ class Package {
58
58
  return [version, this.data.versions[version].dist.tarball];
59
59
  }
60
60
 
61
- if (version.includes('beta')) {
62
- version = version.split('beta')[0] + 'beta';
63
- } else if (version.includes('alpha')) {
64
- const prefix = (version = version.split('alpha')[0]);
65
- version = Object.keys(this.data.versions)
66
- .filter((ver) => ver.startsWith(`${prefix}alpha`))
67
- .sort()
68
- .pop();
61
+ const keys = version.split('.');
62
+ const length = keys.length;
63
+
64
+ if (version.includes('rc')) {
65
+ version = version.split('-').shift();
66
+ }
67
+
68
+ if (length === 5) {
69
+ keys.pop();
70
+ version = keys.join('.');
69
71
  }
70
72
 
71
73
  if (version === 'latest') {
@@ -93,11 +95,25 @@ class Package {
93
95
  return false;
94
96
  }
95
97
 
98
+ async isDownloaded(version) {
99
+ const packageFile = path.resolve(process.env.PLUGIN_STORAGE_PATH, this.packageName, 'package.json');
100
+ if (await fs.exists(packageFile)) {
101
+ const json = await fs.readJson(packageFile);
102
+ if (json.version === version) {
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ }
108
+
96
109
  async download(options = {}) {
97
110
  if (await this.isDevPackage()) {
98
111
  console.log(chalk.yellowBright(`Skipped: ${this.packageName} is dev package`));
99
112
  return;
100
113
  }
114
+ if (await this.isDownloaded(options.version)) {
115
+ return;
116
+ }
101
117
  await this.getInfo();
102
118
  if (!this.data) {
103
119
  console.log(chalk.redBright(`Download failed: ${this.packageName} package does not exist`));
@@ -105,6 +121,9 @@ class Package {
105
121
  }
106
122
  try {
107
123
  const [version, url] = this.getTarball(options.version);
124
+ if (await this.isDownloaded(version)) {
125
+ return;
126
+ }
108
127
  const response = await axios({
109
128
  url,
110
129
  responseType: 'stream',
@@ -200,8 +219,12 @@ module.exports = (cli) => {
200
219
  .command('download-pro')
201
220
  .option('-V, --version [version]')
202
221
  .action(async () => {
203
- const { NOCOBASE_PKG_URL, NOCOBASE_PKG_USERNAME, NOCOBASE_PKG_PASSWORD } = process.env;
204
- if (!(NOCOBASE_PKG_URL && NOCOBASE_PKG_USERNAME && NOCOBASE_PKG_PASSWORD)) {
222
+ const {
223
+ NOCOBASE_PKG_URL = 'https://pkg.nocobase.com/',
224
+ NOCOBASE_PKG_USERNAME,
225
+ NOCOBASE_PKG_PASSWORD,
226
+ } = process.env;
227
+ if (!(NOCOBASE_PKG_USERNAME && NOCOBASE_PKG_PASSWORD)) {
205
228
  return;
206
229
  }
207
230
  const credentials = { username: NOCOBASE_PKG_USERNAME, password: NOCOBASE_PKG_PASSWORD };
@@ -6,7 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
-
9
+ const _ = require('lodash');
10
10
  const { Command } = require('commander');
11
11
  const { isDev, run, postCheck, downloadPro, promptForTs } = require('../util');
12
12
  const { existsSync, rmSync } = require('fs');
@@ -51,10 +51,23 @@ module.exports = (cli) => {
51
51
  depth: 1, // 只监听第一层目录
52
52
  });
53
53
 
54
- watcher.on('addDir', async (pathname) => {
55
- console.log('pathname', pathname);
54
+ const restart = _.debounce(async () => {
55
+ console.log('restarting...');
56
56
  await run('yarn', ['nocobase', 'pm2-restart']);
57
- });
57
+ }, 500);
58
+
59
+ watcher
60
+ .on('ready', () => {
61
+ isReady = true;
62
+ })
63
+ .on('addDir', async (pathname) => {
64
+ if (!isReady) return;
65
+ restart();
66
+ })
67
+ .on('unlinkDir', async (pathname) => {
68
+ if (!isReady) return;
69
+ restart();
70
+ });
58
71
 
59
72
  if (opts.port) {
60
73
  process.env.APP_PORT = opts.port;
@@ -79,11 +92,20 @@ module.exports = (cli) => {
79
92
  return;
80
93
  }
81
94
  await postCheck(opts);
82
- deleteSockFiles();
95
+ if (!opts.daemon) {
96
+ deleteSockFiles();
97
+ }
83
98
  const instances = opts.instances || process.env.CLUSTER_MODE;
84
99
  const instancesArgs = instances ? ['-i', instances] : [];
85
100
  if (opts.daemon) {
86
- run('pm2', ['start', ...instancesArgs, `${APP_PACKAGE_ROOT}/lib/index.js`, '--', ...process.argv.slice(2)]);
101
+ await run('pm2', [
102
+ 'start',
103
+ ...instancesArgs,
104
+ `${APP_PACKAGE_ROOT}/lib/index.js`,
105
+ '--',
106
+ ...process.argv.slice(2),
107
+ ]);
108
+ process.exit();
87
109
  } else {
88
110
  run(
89
111
  'pm2-runtime',
package/src/util.js CHANGED
@@ -337,6 +337,7 @@ exports.initEnv = function initEnv() {
337
337
  LOCAL_STORAGE_DEST: 'storage/uploads',
338
338
  PLUGIN_STORAGE_PATH: resolve(process.cwd(), 'storage/plugins'),
339
339
  MFSU_AD: 'none',
340
+ MAKO_AD: 'none',
340
341
  WS_PATH: '/ws',
341
342
  SOCKET_PATH: 'storage/gateway.sock',
342
343
  NODE_MODULES_PATH: resolve(process.cwd(), 'node_modules'),
@@ -346,6 +347,7 @@ exports.initEnv = function initEnv() {
346
347
  PLAYWRIGHT_AUTH_FILE: resolve(process.cwd(), 'storage/playwright/.auth/admin.json'),
347
348
  CACHE_DEFAULT_STORE: 'memory',
348
349
  CACHE_MEMORY_MAX: 2000,
350
+ BROWSERSLIST_IGNORE_OLD_DATA: true,
349
351
  PLUGIN_STATICS_PATH: '/static/plugins/',
350
352
  LOGGER_BASE_PATH: 'storage/logs',
351
353
  APP_SERVER_BASE_URL: '',