coda-cli 1.0.0
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/LICENSE.md +9 -0
- package/README.md +76 -0
- package/package.json +45 -0
- package/src/bin/index.js +4 -0
- package/src/bin/index.ts +2 -0
- package/src/cli-api/cmd.js +86 -0
- package/src/cli-api/cmd.ts +104 -0
- package/src/cli-api/data.js +135 -0
- package/src/cli-api/data.ts +146 -0
- package/src/cli-api/date.js +23 -0
- package/src/cli-api/date.ts +22 -0
- package/src/cli-api/event.js +6 -0
- package/src/cli-api/event.ts +6 -0
- package/src/cli-api/fs.js +236 -0
- package/src/cli-api/fs.ts +213 -0
- package/src/cli-api/git.js +328 -0
- package/src/cli-api/git.ts +397 -0
- package/src/cli-api/index.js +22 -0
- package/src/cli-api/index.ts +10 -0
- package/src/cli-api/packages.js +69 -0
- package/src/cli-api/packages.ts +73 -0
- package/src/cli-api/request.js +55 -0
- package/src/cli-api/request.ts +67 -0
- package/src/cli-core/cli.js +135 -0
- package/src/cli-core/cli.ts +145 -0
- package/src/cli-core/index.js +51 -0
- package/src/cli-core/index.ts +58 -0
- package/src/cli-core/queue.js +60 -0
- package/src/cli-core/queue.ts +68 -0
- package/src/cli-core/watcher.js +31 -0
- package/src/cli-core/watcher.ts +31 -0
- package/src/config/commands.json +20 -0
- package/src/generator/cmd-create/index.js +170 -0
- package/src/generator/cmd-create/index.ts +164 -0
- package/src/generator/cmd-create/tmpl/index.js +39 -0
- package/src/generator/cmd-create/tmpl/index.ts +46 -0
- package/src/generator/cmd-delete/index.js +129 -0
- package/src/generator/cmd-delete/index.ts +122 -0
- package/src/generator/startup.js +253 -0
- package/src/generator/startup.ts +225 -0
- package/src/service/lang.js +73 -0
- package/src/service/lang.ts +71 -0
- package/src/service/util.js +120 -0
- package/src/service/util.ts +91 -0
- package/src/types/index.js +2 -0
- package/src/types/index.ts +29 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const cli_core_1 = require("../../cli-core/index.js");
|
|
40
|
+
const API = __importStar(require("../../cli-api/index.js"));
|
|
41
|
+
const util_1 = require("../../service/util.js");
|
|
42
|
+
const lang_1 = require("../../service/lang.js");
|
|
43
|
+
const commands_json_1 = __importDefault(require("../../config/commands.json"));
|
|
44
|
+
// 导入的 JSON 默认是只读的,通过深拷贝一份可修改的配置对象
|
|
45
|
+
const CLIConfig = JSON.parse(JSON.stringify(commands_json_1.default));
|
|
46
|
+
let args = process.argv.slice(2);
|
|
47
|
+
const npmRootPath = args[0];
|
|
48
|
+
cli_core_1.Base.extends({
|
|
49
|
+
init() {
|
|
50
|
+
cli_core_1.Base.state = {
|
|
51
|
+
folderName: '',
|
|
52
|
+
canDelete: false,
|
|
53
|
+
deleteFolder: '',
|
|
54
|
+
};
|
|
55
|
+
cli_core_1.Wait.next();
|
|
56
|
+
},
|
|
57
|
+
async prompt() {
|
|
58
|
+
const questions = [
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'folderName',
|
|
62
|
+
message: lang_1.Lang.BUILDIN.CMD_NAME,
|
|
63
|
+
default: cli_core_1.Base.state.folderName,
|
|
64
|
+
validate: (input) => {
|
|
65
|
+
let commonValidate = util_1.Util.volidateFileName(input);
|
|
66
|
+
if (commonValidate === true) {
|
|
67
|
+
let tempPath = API.fs.join(npmRootPath, CLIConfig.packageName, 'src', 'extensions', input);
|
|
68
|
+
if (API.fs.hasPath(tempPath)) {
|
|
69
|
+
cli_core_1.Base.state.canDelete = true;
|
|
70
|
+
cli_core_1.Base.state.deleteFolder = tempPath;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return commonValidate;
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
const answers = await cli_core_1.CLI.addQuestions(questions);
|
|
82
|
+
cli_core_1.Base.state.folderName = answers.folderName;
|
|
83
|
+
cli_core_1.Wait.next();
|
|
84
|
+
},
|
|
85
|
+
writing() {
|
|
86
|
+
if (cli_core_1.Base.state.canDelete) {
|
|
87
|
+
cli_core_1.CLI.loading.start(lang_1.Lang.BUILDIN.DELETE_COMMAND_TIPS);
|
|
88
|
+
API.fs.deleteFolder(cli_core_1.Base.state.deleteFolder, true);
|
|
89
|
+
const commands = CLIConfig.commands;
|
|
90
|
+
const inAnyPath = CLIConfig.inAnyPath;
|
|
91
|
+
let newCommands = [];
|
|
92
|
+
let newInAnyPath = [];
|
|
93
|
+
let cmdName = cli_core_1.Base.state.folderName.split('-').join(' ');
|
|
94
|
+
commands.forEach(item => {
|
|
95
|
+
if (item.command !== cmdName) {
|
|
96
|
+
newCommands.push(item);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
inAnyPath.forEach(item => {
|
|
100
|
+
if (item !== cmdName) {
|
|
101
|
+
newInAnyPath.push(item);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
CLIConfig.commands = newCommands;
|
|
105
|
+
CLIConfig.inAnyPath = newInAnyPath;
|
|
106
|
+
const CLIConfigPath = API.fs.join(npmRootPath, CLIConfig.packageName, 'src', 'config', 'commands.json');
|
|
107
|
+
API.fs.writeFile(CLIConfigPath, CLIConfig, true);
|
|
108
|
+
const pkgPath = API.fs.join(npmRootPath, CLIConfig.packageName, 'package.json');
|
|
109
|
+
let pkgConfig = API.fs.readFile(pkgPath, true);
|
|
110
|
+
const scripts = pkgConfig.scripts || {};
|
|
111
|
+
let debugName = `debug_${cli_core_1.Base.state.folderName}`;
|
|
112
|
+
if (debugName in scripts) {
|
|
113
|
+
delete scripts[debugName];
|
|
114
|
+
}
|
|
115
|
+
API.fs.writeFile(pkgPath, pkgConfig, true);
|
|
116
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.DELETE_COMMAND_SUCCESS);
|
|
117
|
+
}
|
|
118
|
+
cli_core_1.Wait.next();
|
|
119
|
+
},
|
|
120
|
+
end() {
|
|
121
|
+
if (!cli_core_1.Base.state.canDelete) {
|
|
122
|
+
cli_core_1.CLI.log.error(lang_1.Lang.BUILDIN.NO_THIS_FOLDER);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
cli_core_1.CLI.log.success(lang_1.Lang.MSG_SUCCESS, lang_1.Lang.BUILDIN.DELETE_COMMAND_FLOW_SUCCESS);
|
|
126
|
+
}
|
|
127
|
+
cli_core_1.Wait.next();
|
|
128
|
+
},
|
|
129
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {Base, Wait, CLI} from '@/cli-core';
|
|
2
|
+
import * as API from '@/cli-api';
|
|
3
|
+
import {Util} from '@/service/util';
|
|
4
|
+
import {Lang} from '@/service/lang';
|
|
5
|
+
import CLIConfigData from '@/config/commands.json';
|
|
6
|
+
import {CLIConfigType, CommandItem} from '@/types';
|
|
7
|
+
|
|
8
|
+
// 导入的 JSON 默认是只读的,通过深拷贝一份可修改的配置对象
|
|
9
|
+
const CLIConfig: CLIConfigType = JSON.parse(JSON.stringify(CLIConfigData));
|
|
10
|
+
|
|
11
|
+
let args = process.argv.slice(2);
|
|
12
|
+
const npmRootPath = args[0];
|
|
13
|
+
|
|
14
|
+
Base.extends({
|
|
15
|
+
init(): void {
|
|
16
|
+
Base.state = {
|
|
17
|
+
folderName: '',
|
|
18
|
+
canDelete: false,
|
|
19
|
+
deleteFolder: '',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
Wait.next();
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async prompt(): Promise<void> {
|
|
26
|
+
const questions: any[] = [
|
|
27
|
+
{
|
|
28
|
+
type: 'input',
|
|
29
|
+
name: 'folderName',
|
|
30
|
+
message: Lang.BUILDIN.CMD_NAME,
|
|
31
|
+
default: Base.state.folderName,
|
|
32
|
+
validate: (input: string) => {
|
|
33
|
+
let commonValidate = Util.volidateFileName(input);
|
|
34
|
+
|
|
35
|
+
if (commonValidate === true) {
|
|
36
|
+
let tempPath = API.fs.join(
|
|
37
|
+
npmRootPath,
|
|
38
|
+
CLIConfig.packageName,
|
|
39
|
+
'src',
|
|
40
|
+
'extensions',
|
|
41
|
+
input,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
if (API.fs.hasPath(tempPath)) {
|
|
45
|
+
Base.state.canDelete = true;
|
|
46
|
+
Base.state.deleteFolder = tempPath;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return true;
|
|
51
|
+
} else {
|
|
52
|
+
return commonValidate;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const answers = await CLI.addQuestions(questions);
|
|
59
|
+
Base.state.folderName = answers.folderName;
|
|
60
|
+
Wait.next();
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
writing(): void {
|
|
64
|
+
if (Base.state.canDelete) {
|
|
65
|
+
CLI.loading.start(Lang.BUILDIN.DELETE_COMMAND_TIPS);
|
|
66
|
+
API.fs.deleteFolder(Base.state.deleteFolder, true);
|
|
67
|
+
|
|
68
|
+
const commands = CLIConfig.commands;
|
|
69
|
+
const inAnyPath = CLIConfig.inAnyPath;
|
|
70
|
+
let newCommands: CommandItem[] = [];
|
|
71
|
+
let newInAnyPath: string[] = [];
|
|
72
|
+
let cmdName = Base.state.folderName.split('-').join(' ');
|
|
73
|
+
|
|
74
|
+
commands.forEach(item => {
|
|
75
|
+
if (item.command !== cmdName) {
|
|
76
|
+
newCommands.push(item);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
inAnyPath.forEach(item => {
|
|
81
|
+
if (item !== cmdName) {
|
|
82
|
+
newInAnyPath.push(item);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
CLIConfig.commands = newCommands;
|
|
87
|
+
CLIConfig.inAnyPath = newInAnyPath;
|
|
88
|
+
|
|
89
|
+
const CLIConfigPath = API.fs.join(
|
|
90
|
+
npmRootPath,
|
|
91
|
+
CLIConfig.packageName,
|
|
92
|
+
'src',
|
|
93
|
+
'config',
|
|
94
|
+
'commands.json',
|
|
95
|
+
);
|
|
96
|
+
API.fs.writeFile(CLIConfigPath, CLIConfig, true);
|
|
97
|
+
|
|
98
|
+
const pkgPath = API.fs.join(npmRootPath, CLIConfig.packageName, 'package.json');
|
|
99
|
+
let pkgConfig = API.fs.readFile(pkgPath, true);
|
|
100
|
+
const scripts = pkgConfig.scripts || {};
|
|
101
|
+
let debugName = `debug_${Base.state.folderName}`;
|
|
102
|
+
|
|
103
|
+
if (debugName in scripts) {
|
|
104
|
+
delete scripts[debugName];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
API.fs.writeFile(pkgPath, pkgConfig, true);
|
|
108
|
+
CLI.loading.succeed(Lang.BUILDIN.DELETE_COMMAND_SUCCESS);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
Wait.next();
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
end(): void {
|
|
115
|
+
if (!Base.state.canDelete) {
|
|
116
|
+
CLI.log.error(Lang.BUILDIN.NO_THIS_FOLDER);
|
|
117
|
+
} else {
|
|
118
|
+
CLI.log.success(Lang.MSG_SUCCESS, Lang.BUILDIN.DELETE_COMMAND_FLOW_SUCCESS);
|
|
119
|
+
}
|
|
120
|
+
Wait.next();
|
|
121
|
+
},
|
|
122
|
+
});
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const cli_core_1 = require("../cli-core/index.js");
|
|
42
|
+
const cli_api_1 = require("../cli-api/index.js");
|
|
43
|
+
const lang_1 = require("../service/lang.js");
|
|
44
|
+
const commands_json_1 = __importDefault(require("../config/commands.json"));
|
|
45
|
+
const CLIConfig = commands_json_1.default;
|
|
46
|
+
cli_core_1.CLI.loading.start(lang_1.Lang.BUILDIN.CORE_STRTUP_READY);
|
|
47
|
+
// let npmRootPath = ChildProcess.syncCmdExecuteResult('npm root -g');
|
|
48
|
+
// let cliRoootPath = path.join(npmRootPath, CLIConfig.packageName);
|
|
49
|
+
// 判断是否为 VS Code 本地调试环境
|
|
50
|
+
const isDebug = process.env.DEBUG_ENV === 'true';
|
|
51
|
+
const globalNpmRoot = cli_core_1.ChildProcess.syncCmdExecuteResult('npm root -g');
|
|
52
|
+
// 如果是本地调试,根目录指向当前项目根目录;否则指向全局包目录
|
|
53
|
+
let currentProjectRoot = isDebug
|
|
54
|
+
? path.resolve(__dirname, '../../') // 从 src/bin 往上两级到达项目根目录
|
|
55
|
+
: path.join(globalNpmRoot, CLIConfig.packageName);
|
|
56
|
+
let npmRootPath = isDebug ? currentProjectRoot : globalNpmRoot;
|
|
57
|
+
let cliRoootPath = currentProjectRoot;
|
|
58
|
+
/**
|
|
59
|
+
* 获取 CLI 配置对象
|
|
60
|
+
*/
|
|
61
|
+
function getCLIConfig() {
|
|
62
|
+
return {
|
|
63
|
+
packageName: commands_json_1.default.packageName,
|
|
64
|
+
wordsLen: commands_json_1.default.wordsLen,
|
|
65
|
+
name: commands_json_1.default.name,
|
|
66
|
+
commands: commands_json_1.default.commands,
|
|
67
|
+
inAnyPath: commands_json_1.default.inAnyPath,
|
|
68
|
+
buildIn: commands_json_1.default.buildIn,
|
|
69
|
+
store: commands_json_1.default.store,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 显示帮助信息
|
|
74
|
+
* @param name CLI 名称
|
|
75
|
+
* @param commands 命令列表
|
|
76
|
+
*/
|
|
77
|
+
function showHelp(name, commands) {
|
|
78
|
+
let helpList = [];
|
|
79
|
+
commands.forEach(cmd => {
|
|
80
|
+
helpList.push(`${name} ${cmd.command} : ${cmd.description}`);
|
|
81
|
+
});
|
|
82
|
+
helpList.push(name + ' ' + lang_1.Lang.HELP_MESSAGE);
|
|
83
|
+
const helps = `Usage: ${name} [command] \nCommands:\n\t${helpList.join('\n\t')}`;
|
|
84
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_HAS_READY);
|
|
85
|
+
cli_core_1.CLI.log.info(helps);
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 检查是否存在相似或匹配的命令
|
|
90
|
+
* @param input 输入的命令
|
|
91
|
+
* @param commands 命令列表
|
|
92
|
+
*/
|
|
93
|
+
function hasLikeCommand(input, commands) {
|
|
94
|
+
let exsited = false;
|
|
95
|
+
let likeList = commands.filter(cmd => {
|
|
96
|
+
if (cmd['command'] === input) {
|
|
97
|
+
exsited = true;
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
let temp = input.split(' ');
|
|
102
|
+
if (cmd['command'].includes(temp[0])) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
exsited,
|
|
110
|
+
likeList,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 验证命令合法性
|
|
115
|
+
* @param option 选项/输入内容
|
|
116
|
+
* @param name CLI 名称
|
|
117
|
+
* @param commands 命令列表
|
|
118
|
+
*/
|
|
119
|
+
function validateCommand(option, name, commands) {
|
|
120
|
+
const { exsited, likeList } = hasLikeCommand(option, commands);
|
|
121
|
+
if (!exsited) {
|
|
122
|
+
let formatVal = option.toLowerCase();
|
|
123
|
+
switch (formatVal) {
|
|
124
|
+
case '--h':
|
|
125
|
+
showHelp(name, commands);
|
|
126
|
+
break;
|
|
127
|
+
default:
|
|
128
|
+
if (likeList.length !== 0) {
|
|
129
|
+
let likes = [];
|
|
130
|
+
likeList.forEach(cmd => {
|
|
131
|
+
likes.push(`${name} ${cmd.command}`);
|
|
132
|
+
});
|
|
133
|
+
if (likes.length !== 0) {
|
|
134
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_HAS_READY);
|
|
135
|
+
cli_core_1.CLI.log.error(lang_1.Lang.MSG_ERROR, `${lang_1.Lang.BUILDIN.NO_COMMAND} "${name} ${option}"`, `${lang_1.Lang.BUILDIN.MEAN_SUCH}\n\t${likes.join('\n\t')}`);
|
|
136
|
+
process.exit();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_HAS_READY);
|
|
141
|
+
cli_core_1.CLI.log.error(lang_1.Lang.MSG_ERROR, `${lang_1.Lang.BUILDIN.NO_COMMAND} "${name} ${option}".`);
|
|
142
|
+
process.exit();
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
exsited,
|
|
149
|
+
likeList,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 检查并自动更新 CLI 或相关依赖
|
|
154
|
+
*/
|
|
155
|
+
async function autoUpdate() {
|
|
156
|
+
let pkg = path.join(cliRoootPath, 'package.json'); // 找到 CLI 自身的 PKG,真实位置在 NPM 全局安装目录下
|
|
157
|
+
cli_core_1.CLI.loading.start(lang_1.Lang.BUILDIN.CORE_CHECKING_UPDATE);
|
|
158
|
+
let pkgJSON = require('../package.json');
|
|
159
|
+
let storeUrl = CLIConfig.store;
|
|
160
|
+
let url = path.join(storeUrl, CLIConfig.packageName);
|
|
161
|
+
let cliVersion = await cli_api_1.packages.checkVersion(url, pkgJSON.version);
|
|
162
|
+
if (JSON.stringify(cliVersion) === '{}') {
|
|
163
|
+
cli_core_1.CLI.loading.info(lang_1.Lang.BUILDIN.CORE_LATEST_VERSION);
|
|
164
|
+
/** 以下是检测 code-agent 依赖包版本的预留逻辑 */
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
cli_core_1.CLI.loading.info(lang_1.Lang.BUILDIN.CORE_UPDATE_READY); // 升级 CLI 需要切换目录到 NPM 全局安装目录
|
|
168
|
+
cli_core_1.CLI.log.printObject(cliVersion);
|
|
169
|
+
const task = 'npm install -g code-agent --loglevel info --timing';
|
|
170
|
+
if (process.platform === 'win32') {
|
|
171
|
+
cli_core_1.ChildProcess.taskInNewWindow(task, npmRootPath, true);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
cli_core_1.CLI.log.warn(lang_1.Lang.BUILDIN.CORE_LINUX_INPUT_ROOT_USER_PASSWORD);
|
|
175
|
+
cli_core_1.ChildProcess.taskInNewWindow(`sudo ${task}`, npmRootPath, true);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 引导和执行命令的主逻辑
|
|
181
|
+
*/
|
|
182
|
+
async function guideCommand() {
|
|
183
|
+
const { wordsLen, name, commands, inAnyPath, buildIn } = getCLIConfig();
|
|
184
|
+
const currArgs = process.argv.slice(2);
|
|
185
|
+
const cmdLen = currArgs.length;
|
|
186
|
+
if (cmdLen === 0) {
|
|
187
|
+
showHelp(name, commands);
|
|
188
|
+
}
|
|
189
|
+
if (cmdLen <= wordsLen) {
|
|
190
|
+
let cmdOptions = currArgs.join(' ');
|
|
191
|
+
let main = `${path.join('extensions', currArgs.join('-'), 'index.js')}`;
|
|
192
|
+
if (buildIn.indexOf(cmdOptions) > -1) {
|
|
193
|
+
main = `${path.join('generator', currArgs.join('-'), 'index.js')}`;
|
|
194
|
+
}
|
|
195
|
+
const { exsited } = validateCommand(cmdOptions, name, commands);
|
|
196
|
+
if (exsited) {
|
|
197
|
+
let baseEnvConfig = JSON.stringify({
|
|
198
|
+
input: cmdOptions,
|
|
199
|
+
commands,
|
|
200
|
+
wordsLen,
|
|
201
|
+
name,
|
|
202
|
+
inAnyPath,
|
|
203
|
+
});
|
|
204
|
+
process.env['CLI_ENV'] = baseEnvConfig;
|
|
205
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_VOLIDATE_CMD_SUCCESS);
|
|
206
|
+
const loadProgram = () => {
|
|
207
|
+
// let programPath = path.join(npmRootPath, CLIConfig.packageName, 'src', main); //TS编译后的JS命令实际路径
|
|
208
|
+
// let child = fork(programPath, [npmRootPath], {
|
|
209
|
+
// silent: false,
|
|
210
|
+
// });
|
|
211
|
+
// child.on('error', (error: Error) => {
|
|
212
|
+
// console.clear();
|
|
213
|
+
// CLI.log.error(error.message, error.stack);
|
|
214
|
+
// autoUpdate();
|
|
215
|
+
// });
|
|
216
|
+
// child.on('exit', (code: number | null) => {
|
|
217
|
+
// if (code === 0) {
|
|
218
|
+
// autoUpdate();
|
|
219
|
+
// }
|
|
220
|
+
// });
|
|
221
|
+
// 本地调试直接从当前项目 src 目录读取编译产物,全局则从全局 node_modules 读取
|
|
222
|
+
let programPath = isDebug
|
|
223
|
+
? path.join(currentProjectRoot, 'src', main)
|
|
224
|
+
: path.join(globalNpmRoot, CLIConfig.packageName, 'src', main);
|
|
225
|
+
let child = (0, child_process_1.fork)(programPath, [npmRootPath], {
|
|
226
|
+
silent: false,
|
|
227
|
+
});
|
|
228
|
+
child.on('error', (error) => {
|
|
229
|
+
console.clear();
|
|
230
|
+
cli_core_1.CLI.log.error(error.message, error.stack);
|
|
231
|
+
autoUpdate();
|
|
232
|
+
});
|
|
233
|
+
child.on('exit', (code) => {
|
|
234
|
+
if (code === 0) {
|
|
235
|
+
autoUpdate();
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
loadProgram();
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_HAS_READY);
|
|
243
|
+
cli_core_1.CLI.log.error(lang_1.Lang.MSG_ERROR, `${lang_1.Lang.BUILDIN.NO_COMMAND} "${name} ${currArgs.join(' ')}"`);
|
|
244
|
+
process.exit();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
cli_core_1.CLI.loading.succeed(lang_1.Lang.BUILDIN.CLI_HAS_READY);
|
|
249
|
+
cli_core_1.CLI.log.error(lang_1.Lang.MSG_ERROR, lang_1.Lang.BUILDIN.COMMAND_LENGTH_TOO_LONG);
|
|
250
|
+
process.exit();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
guideCommand();
|