@nocobase/cli 2.0.0-alpha.51 → 2.0.0-alpha.53
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 +3 -0
- package/package.json +5 -5
- package/src/commands/instance-id.js +5 -4
- package/src/commands/pkg.js +19 -13
- package/src/commands/start.js +25 -23
- package/src/license.js +75 -0
- package/src/logger.js +75 -0
- package/src/util.js +0 -88
package/nocobase.conf.tpl
CHANGED
|
@@ -73,7 +73,10 @@ server {
|
|
|
73
73
|
proxy_set_header Upgrade $http_upgrade;
|
|
74
74
|
proxy_set_header Connection 'upgrade';
|
|
75
75
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
76
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
76
77
|
proxy_set_header Host $host;
|
|
78
|
+
proxy_set_header Referer $http_referer;
|
|
79
|
+
proxy_set_header User-Agent $http_user_agent;
|
|
77
80
|
add_header Cache-Control 'no-cache, no-store';
|
|
78
81
|
proxy_cache_bypass $http_upgrade;
|
|
79
82
|
proxy_connect_timeout 600;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/cli",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.53",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"nocobase": "./bin/index.js"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@nocobase/app": "2.0.0-alpha.
|
|
12
|
-
"@nocobase/license-kit": "^0.2
|
|
11
|
+
"@nocobase/app": "2.0.0-alpha.53",
|
|
12
|
+
"@nocobase/license-kit": "^0.3.2",
|
|
13
13
|
"@types/fs-extra": "^11.0.1",
|
|
14
14
|
"@umijs/utils": "3.5.20",
|
|
15
15
|
"chalk": "^4.1.1",
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
"tsx": "^4.19.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@nocobase/devtools": "2.0.0-alpha.
|
|
30
|
+
"@nocobase/devtools": "2.0.0-alpha.53"
|
|
31
31
|
},
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
34
|
"url": "git+https://github.com/nocobase/nocobase.git",
|
|
35
35
|
"directory": "packages/core/cli"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "ff30cf8261f5a97b3f24c3752af5bbc564167b37"
|
|
38
38
|
}
|
|
@@ -13,6 +13,7 @@ const { run, isDev } = require('../util');
|
|
|
13
13
|
const { getInstanceIdAsync } = require('@nocobase/license-kit');
|
|
14
14
|
const path = require('path');
|
|
15
15
|
const fs = require('fs');
|
|
16
|
+
const { logger } = require('../logger');
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
*
|
|
@@ -24,11 +25,11 @@ module.exports = (cli) => {
|
|
|
24
25
|
.description('Generate InstanceID')
|
|
25
26
|
.option('--force', 'Force generate InstanceID')
|
|
26
27
|
.action(async (options) => {
|
|
27
|
-
|
|
28
|
+
logger.info('Generating InstanceID...');
|
|
28
29
|
const dir = path.resolve(process.cwd(), 'storage/.license');
|
|
29
30
|
const filePath = path.resolve(dir, 'instance-id');
|
|
30
31
|
if (fs.existsSync(filePath) && !options.force) {
|
|
31
|
-
|
|
32
|
+
logger.info('InstanceID already exists at ' + filePath);
|
|
32
33
|
return;
|
|
33
34
|
} else {
|
|
34
35
|
if (!fs.existsSync(dir)) {
|
|
@@ -37,9 +38,9 @@ module.exports = (cli) => {
|
|
|
37
38
|
try {
|
|
38
39
|
const instanceId = await getInstanceIdAsync();
|
|
39
40
|
fs.writeFileSync(filePath, instanceId + '\n');
|
|
40
|
-
|
|
41
|
+
logger.info(`InstanceID saved to ${filePath}`);
|
|
41
42
|
} catch (e) {
|
|
42
|
-
|
|
43
|
+
logger.error('Failed to generate InstanceID', e.message || e);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
});
|
package/src/commands/pkg.js
CHANGED
|
@@ -14,8 +14,8 @@ const zlib = require('zlib');
|
|
|
14
14
|
const tar = require('tar');
|
|
15
15
|
const path = require('path');
|
|
16
16
|
const { createStoragePluginsSymlink } = require('@nocobase/utils/plugin-symlink');
|
|
17
|
-
const
|
|
18
|
-
const {
|
|
17
|
+
const { getAccessKeyPair, showLicenseInfo, LicenseKeyError } = require('../license');
|
|
18
|
+
const { logger } = require('../logger');
|
|
19
19
|
|
|
20
20
|
class Package {
|
|
21
21
|
data;
|
|
@@ -78,7 +78,7 @@ class Package {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
if (!this.data.versions[version]) {
|
|
81
|
-
|
|
81
|
+
logger.error(`Download failed: ${this.packageName}@${version} package does not exist`);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
return [version, this.data.versions[version].dist.tarball];
|
|
@@ -122,11 +122,11 @@ class Package {
|
|
|
122
122
|
|
|
123
123
|
async download(options = {}) {
|
|
124
124
|
if (await this.isDevPackage()) {
|
|
125
|
-
|
|
125
|
+
logger.info(`Skipped: ${this.packageName} is dev package`);
|
|
126
126
|
return;
|
|
127
127
|
}
|
|
128
128
|
if (await this.isDepPackage()) {
|
|
129
|
-
|
|
129
|
+
logger.info(`Skipped: ${this.packageName} is dependency package`);
|
|
130
130
|
return;
|
|
131
131
|
}
|
|
132
132
|
if (await this.isDownloaded(options.version)) {
|
|
@@ -134,7 +134,7 @@ class Package {
|
|
|
134
134
|
}
|
|
135
135
|
await this.getInfo();
|
|
136
136
|
if (!this.data) {
|
|
137
|
-
|
|
137
|
+
logger.error(`Download failed: ${this.packageName} package does not exist`);
|
|
138
138
|
return;
|
|
139
139
|
}
|
|
140
140
|
try {
|
|
@@ -158,7 +158,7 @@ class Package {
|
|
|
158
158
|
.on('finish', resolve)
|
|
159
159
|
.on('error', reject);
|
|
160
160
|
});
|
|
161
|
-
|
|
161
|
+
logger.info(`Downloaded: ${this.packageName}@${version}`);
|
|
162
162
|
} catch (error) {
|
|
163
163
|
if (error?.response?.data && typeof error?.response?.data?.pipe === 'function') {
|
|
164
164
|
let errorMessageBuffer = '';
|
|
@@ -167,11 +167,11 @@ class Package {
|
|
|
167
167
|
});
|
|
168
168
|
error.response.data.on?.('end', () => {
|
|
169
169
|
if (error.response.status === 403) {
|
|
170
|
-
|
|
170
|
+
logger.error('You do not have permission to download this package version.');
|
|
171
171
|
}
|
|
172
172
|
});
|
|
173
173
|
}
|
|
174
|
-
|
|
174
|
+
logger.error(`Download failed: ${this.packageName}`);
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
}
|
|
@@ -206,8 +206,8 @@ class PackageManager {
|
|
|
206
206
|
if (error?.response?.data?.error === 'license not valid') {
|
|
207
207
|
showLicenseInfo(LicenseKeyError.notValid);
|
|
208
208
|
}
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
logger.error(`Login failed: ${this.baseURL}`);
|
|
210
|
+
logger.error(error?.message || error);
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -244,7 +244,7 @@ class PackageManager {
|
|
|
244
244
|
const dir = path.resolve(process.env.PLUGIN_STORAGE_PATH, packageName);
|
|
245
245
|
const r = await fs.exists(dir);
|
|
246
246
|
if (r) {
|
|
247
|
-
|
|
247
|
+
logger.info(`Removed: ${packageName}`);
|
|
248
248
|
await fs.rm(dir, { force: true, recursive: true });
|
|
249
249
|
}
|
|
250
250
|
}
|
|
@@ -286,8 +286,14 @@ module.exports = (cli) => {
|
|
|
286
286
|
try {
|
|
287
287
|
({ accessKeyId, accessKeySecret } = await getAccessKeyPair());
|
|
288
288
|
} catch (e) {
|
|
289
|
+
// logger.error('Get AccessKey Pair error', e);
|
|
289
290
|
return;
|
|
290
291
|
}
|
|
292
|
+
if (NOCOBASE_PKG_USERNAME && NOCOBASE_PKG_PASSWORD && !accessKeyId && !accessKeySecret) {
|
|
293
|
+
logger.warn(
|
|
294
|
+
'NOCOBASE_PKG_USERNAME and NOCOBASE_PKG_PASSWORD will be deprecated in future versions. Please log in to NocoBase Service and refer to the documentation to learn how to install and upgrade commercial plugins.\n',
|
|
295
|
+
);
|
|
296
|
+
}
|
|
291
297
|
if (!(NOCOBASE_PKG_USERNAME && NOCOBASE_PKG_PASSWORD) && !(accessKeyId && accessKeySecret)) {
|
|
292
298
|
return;
|
|
293
299
|
}
|
|
@@ -302,6 +308,6 @@ module.exports = (cli) => {
|
|
|
302
308
|
await createStoragePluginsSymlink();
|
|
303
309
|
});
|
|
304
310
|
pkg.command('export-all').action(async () => {
|
|
305
|
-
|
|
311
|
+
logger.info('Todo...');
|
|
306
312
|
});
|
|
307
313
|
};
|
package/src/commands/start.js
CHANGED
|
@@ -56,32 +56,34 @@ module.exports = (cli) => {
|
|
|
56
56
|
await downloadPro();
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
depth: 1, // 只监听第一层目录
|
|
65
|
-
});
|
|
59
|
+
if (process.env.NO_WATCH_PLUGINS === true || process.env.NO_WATCH_PLUGINS === 'true') {
|
|
60
|
+
const restart = _.debounce(async () => {
|
|
61
|
+
console.log('restarting...');
|
|
62
|
+
await run('yarn', ['nocobase', 'pm2-restart']);
|
|
63
|
+
}, 500);
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.on('ready', () => {
|
|
74
|
-
isReady = true;
|
|
75
|
-
})
|
|
76
|
-
.on('addDir', async (pathname) => {
|
|
77
|
-
if (!isReady) return;
|
|
78
|
-
restart();
|
|
79
|
-
})
|
|
80
|
-
.on('unlinkDir', async (pathname) => {
|
|
81
|
-
if (!isReady) return;
|
|
82
|
-
restart();
|
|
65
|
+
const watcher = chokidar.watch('./storage/plugins/**/*', {
|
|
66
|
+
cwd: process.cwd(),
|
|
67
|
+
ignoreInitial: true,
|
|
68
|
+
ignored: /(^|[\/\\])\../, // 忽略隐藏文件
|
|
69
|
+
persistent: true,
|
|
70
|
+
depth: 1, // 只监听第一层目录
|
|
83
71
|
});
|
|
84
72
|
|
|
73
|
+
watcher
|
|
74
|
+
.on('ready', () => {
|
|
75
|
+
isReady = true;
|
|
76
|
+
})
|
|
77
|
+
.on('addDir', async (pathname) => {
|
|
78
|
+
if (!isReady) return;
|
|
79
|
+
restart();
|
|
80
|
+
})
|
|
81
|
+
.on('unlinkDir', async (pathname) => {
|
|
82
|
+
if (!isReady) return;
|
|
83
|
+
restart();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
85
87
|
if (opts.port) {
|
|
86
88
|
process.env.APP_PORT = opts.port;
|
|
87
89
|
}
|
package/src/license.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
const chalk = require('chalk');
|
|
11
|
+
const { resolve } = require('path');
|
|
12
|
+
const fs = require('fs-extra');
|
|
13
|
+
const { keyDecrypt, getEnvAsync } = require('@nocobase/license-kit');
|
|
14
|
+
const { isEnvMatch } = require('@nocobase/plugin-license/utils/env');
|
|
15
|
+
const { logger } = require('./logger');
|
|
16
|
+
const { pick } = require('lodash');
|
|
17
|
+
|
|
18
|
+
exports.getAccessKeyPair = async function () {
|
|
19
|
+
const keyFile = resolve(process.cwd(), 'storage/.license/license-key');
|
|
20
|
+
if (!fs.existsSync(keyFile)) {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let keyData = {};
|
|
25
|
+
try {
|
|
26
|
+
const str = fs.readFileSync(keyFile, 'utf-8');
|
|
27
|
+
const keyDataStr = keyDecrypt(str);
|
|
28
|
+
keyData = JSON.parse(keyDataStr);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
showLicenseInfo(LicenseKeyError.parseFailed);
|
|
31
|
+
throw new Error(LicenseKeyError.parseFailed.title);
|
|
32
|
+
}
|
|
33
|
+
const env = await getEnvAsync();
|
|
34
|
+
const isEnvMatched = await isEnvMatch(env, keyData);
|
|
35
|
+
if (!isEnvMatched) {
|
|
36
|
+
showLicenseInfo({
|
|
37
|
+
...LicenseKeyError.notMatch,
|
|
38
|
+
env,
|
|
39
|
+
});
|
|
40
|
+
throw new Error(LicenseKeyError.notMatch.title);
|
|
41
|
+
}
|
|
42
|
+
const { accessKeyId, accessKeySecret } = keyData;
|
|
43
|
+
return { accessKeyId, accessKeySecret };
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const LicenseKeyError = {
|
|
47
|
+
notExist: {
|
|
48
|
+
title: 'License key not found',
|
|
49
|
+
content:
|
|
50
|
+
'Please go to the license settings page to obtain the Instance ID for the current environment, and then generate the license key on the service platform.',
|
|
51
|
+
},
|
|
52
|
+
parseFailed: {
|
|
53
|
+
title: 'Invalid license key format',
|
|
54
|
+
content: 'Please check your license key, or regenerate the license key on the service platform.',
|
|
55
|
+
},
|
|
56
|
+
notMatch: {
|
|
57
|
+
title: 'License key not match current environment',
|
|
58
|
+
content:
|
|
59
|
+
'Please go to the license settings page to obtain the Instance ID for the current environment, and then regenerate the license key on the service platform.',
|
|
60
|
+
},
|
|
61
|
+
notValid: {
|
|
62
|
+
title: 'Invalid license key',
|
|
63
|
+
content:
|
|
64
|
+
'Please go to the license settings page to obtain the Instance ID for the current environment, and then regenerate the license key on the service platform.',
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
exports.LicenseKeyError = LicenseKeyError;
|
|
69
|
+
|
|
70
|
+
function showLicenseInfo({ title, content, env }) {
|
|
71
|
+
logger.error(title + '. ' + content);
|
|
72
|
+
logger.error('Current environment', pick(env, ['sys', 'osVer', 'db']));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
exports.showLicenseInfo = showLicenseInfo;
|
package/src/logger.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const winston = require('winston');
|
|
13
|
+
require('winston-daily-rotate-file');
|
|
14
|
+
|
|
15
|
+
function ensureDir(dir) {
|
|
16
|
+
if (!fs.existsSync(dir)) {
|
|
17
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function createSystemLogger({ dirname, filename, defaultMeta = {} }) {
|
|
22
|
+
ensureDir(dirname);
|
|
23
|
+
|
|
24
|
+
const commonFormat = winston.format.combine(
|
|
25
|
+
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
|
|
26
|
+
winston.format.printf((info) => {
|
|
27
|
+
const meta = info.meta ? JSON.stringify(info.meta) : '';
|
|
28
|
+
return `${info.timestamp} [${info.level}] ${info.message} ${meta}`;
|
|
29
|
+
}),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const consoleFormat = winston.format.combine(winston.format.colorize(), commonFormat);
|
|
33
|
+
|
|
34
|
+
const fileTransport = new winston.transports.DailyRotateFile({
|
|
35
|
+
dirname,
|
|
36
|
+
filename: `${filename}_%DATE%.log`,
|
|
37
|
+
datePattern: 'YYYY-MM-DD',
|
|
38
|
+
zippedArchive: false,
|
|
39
|
+
format: commonFormat,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const consoleTransport = new winston.transports.Console({
|
|
43
|
+
format: consoleFormat,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const logger = winston.createLogger({
|
|
47
|
+
level: 'info',
|
|
48
|
+
transports: [consoleTransport, fileTransport],
|
|
49
|
+
defaultMeta,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const wrap = (level) => (message, meta) => {
|
|
53
|
+
logger.log({ level, message, meta });
|
|
54
|
+
return logger;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
info: wrap('info'),
|
|
59
|
+
warn: wrap('warn'),
|
|
60
|
+
error: wrap('error'),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const getLoggerFilePath = (...paths) => {
|
|
65
|
+
return path.resolve(process.env.LOGGER_BASE_PATH || path.resolve(process.cwd(), 'storage', 'logs'), ...paths);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const logger = createSystemLogger({
|
|
69
|
+
dirname: getLoggerFilePath('main'),
|
|
70
|
+
filename: 'system',
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
module.exports = {
|
|
74
|
+
logger,
|
|
75
|
+
};
|
package/src/util.js
CHANGED
|
@@ -18,8 +18,6 @@ const dotenv = require('dotenv');
|
|
|
18
18
|
const fs = require('fs-extra');
|
|
19
19
|
const os = require('os');
|
|
20
20
|
const moment = require('moment-timezone');
|
|
21
|
-
const { keyDecrypt, getEnvAsync } = require('@nocobase/license-kit');
|
|
22
|
-
const omit = require('lodash/omit');
|
|
23
21
|
|
|
24
22
|
exports.isPackageValid = (pkg) => {
|
|
25
23
|
try {
|
|
@@ -490,89 +488,3 @@ exports.generatePlugins = function () {
|
|
|
490
488
|
return;
|
|
491
489
|
}
|
|
492
490
|
};
|
|
493
|
-
|
|
494
|
-
async function isEnvMatch(keyData) {
|
|
495
|
-
const env = await getEnvAsync();
|
|
496
|
-
if (env?.container?.id && keyData?.instanceData?.container?.id) {
|
|
497
|
-
return (
|
|
498
|
-
JSON.stringify(omit(env, ['timestamp', 'container', 'hostname', 'mac'])) ===
|
|
499
|
-
JSON.stringify(omit(keyData?.instanceData, ['timestamp', 'container', 'hostname', 'mac']))
|
|
500
|
-
);
|
|
501
|
-
}
|
|
502
|
-
return (
|
|
503
|
-
JSON.stringify(omit(env, ['timestamp', 'mac'])) ===
|
|
504
|
-
JSON.stringify(omit(keyData?.instanceData, ['timestamp', 'mac']))
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
exports.getAccessKeyPair = async function () {
|
|
509
|
-
const keyFile = resolve(process.cwd(), 'storage/.license/license-key');
|
|
510
|
-
if (!fs.existsSync(keyFile)) {
|
|
511
|
-
return {};
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
let keyData = {};
|
|
515
|
-
try {
|
|
516
|
-
const str = fs.readFileSync(keyFile, 'utf-8');
|
|
517
|
-
const keyDataStr = keyDecrypt(str);
|
|
518
|
-
keyData = JSON.parse(keyDataStr);
|
|
519
|
-
} catch (error) {
|
|
520
|
-
showLicenseInfo(LicenseKeyError.parseFailed);
|
|
521
|
-
throw new Error(LicenseKeyError.parseFailed.title);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
const isEnvMatched = await isEnvMatch(keyData);
|
|
525
|
-
if (!isEnvMatched) {
|
|
526
|
-
showLicenseInfo(LicenseKeyError.notMatch);
|
|
527
|
-
throw new Error(LicenseKeyError.notMatch.title);
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
const { accessKeyId, accessKeySecret } = keyData;
|
|
531
|
-
return { accessKeyId, accessKeySecret };
|
|
532
|
-
};
|
|
533
|
-
|
|
534
|
-
const LicenseKeyError = {
|
|
535
|
-
notExist: {
|
|
536
|
-
title: 'License key not found',
|
|
537
|
-
content:
|
|
538
|
-
'Please go to the license settings page to obtain the Instance ID for the current environment, and then generate the license key on the service platform.',
|
|
539
|
-
},
|
|
540
|
-
parseFailed: {
|
|
541
|
-
title: 'Invalid license key format',
|
|
542
|
-
content: 'Please check your license key, or regenerate the license key on the service platform.',
|
|
543
|
-
},
|
|
544
|
-
notMatch: {
|
|
545
|
-
title: 'License key mismatch',
|
|
546
|
-
content:
|
|
547
|
-
'Please go to the license settings page to obtain the Instance ID for the current environment, and then regenerate the license key on the service platform.',
|
|
548
|
-
},
|
|
549
|
-
notValid: {
|
|
550
|
-
title: 'Invalid license key',
|
|
551
|
-
content:
|
|
552
|
-
'Please go to the license settings page to obtain the Instance ID for the current environment, and then regenerate the license key on the service platform.',
|
|
553
|
-
},
|
|
554
|
-
};
|
|
555
|
-
|
|
556
|
-
exports.LicenseKeyError = LicenseKeyError;
|
|
557
|
-
|
|
558
|
-
function showLicenseInfo({ title, content }) {
|
|
559
|
-
const rows = [];
|
|
560
|
-
const length = 80;
|
|
561
|
-
let row = '';
|
|
562
|
-
content.split(' ').forEach((word) => {
|
|
563
|
-
if (row.length + word.length > length) {
|
|
564
|
-
rows.push(row);
|
|
565
|
-
row = '';
|
|
566
|
-
}
|
|
567
|
-
row += word + ' ';
|
|
568
|
-
});
|
|
569
|
-
if (row) {
|
|
570
|
-
rows.push(row);
|
|
571
|
-
}
|
|
572
|
-
console.log(Array(length).fill('-').join(''));
|
|
573
|
-
console.log(chalk.yellow(title));
|
|
574
|
-
console.log(chalk.yellow(rows.join('\n')));
|
|
575
|
-
console.log(Array(length).fill('-').join(''));
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
exports.showLicenseInfo = showLicenseInfo;
|