@mpis/run 0.0.1
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 +21 -0
- package/README.md +102 -0
- package/commands.schema.json +114 -0
- package/config/rig.json +5 -0
- package/lib/autoindex.d.ts +7 -0
- package/lib/autoindex.d.ts.map +1 -0
- package/lib/autoindex.js +14 -0
- package/lib/autoindex.js.map +1 -0
- package/lib/bin.d.ts +2 -0
- package/lib/bin.d.ts.map +1 -0
- package/lib/bin.js +231 -0
- package/lib/bin.js.map +1 -0
- package/lib/common/args.d.ts +12 -0
- package/lib/common/args.d.ts.map +1 -0
- package/lib/common/args.js +55 -0
- package/lib/common/args.js.map +1 -0
- package/lib/common/config-file.d.ts +14 -0
- package/lib/common/config-file.d.ts.map +1 -0
- package/lib/common/config-file.js +144 -0
- package/lib/common/config-file.js.map +1 -0
- package/lib/common/paths.d.ts +3 -0
- package/lib/common/paths.d.ts.map +1 -0
- package/lib/common/paths.js +13 -0
- package/lib/common/paths.js.map +1 -0
- package/lib/common/stdin.d.ts +9 -0
- package/lib/common/stdin.d.ts.map +1 -0
- package/lib/common/stdin.js +53 -0
- package/lib/common/stdin.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/loader/bin.devel.js +8 -0
- package/loader/bin.js +8 -0
- package/package.json +40 -0
- package/src/autoindex.ts +18 -0
- package/src/bin.ts +268 -0
- package/src/common/args.ts +67 -0
- package/src/common/config-file.ts +198 -0
- package/src/common/paths.ts +15 -0
- package/src/common/stdin.ts +65 -0
- package/src/tsconfig.json +9 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 GongT<admin@gongt.me>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 究极简单的分步构建器
|
|
2
|
+
|
|
3
|
+
简单地按顺序执行一系列外部命令,最终完成项目的构建过程
|
|
4
|
+
|
|
5
|
+
为实现watch,所有命令需要支持 [构建协议](../shared)
|
|
6
|
+
|
|
7
|
+
对于不支持的命令,可以使用 [标准输出监视器 或 客户端API](../client) 快速实现
|
|
8
|
+
|
|
9
|
+
Path中添加`当前包`和`rig包`的`node_modules/.bin`目录
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### 配置: 创建文件`config/commands.json`,内容如下:
|
|
13
|
+
|
|
14
|
+
```jsonc
|
|
15
|
+
{
|
|
16
|
+
/**
|
|
17
|
+
* 示例文件
|
|
18
|
+
*
|
|
19
|
+
* 文件里可以写注释
|
|
20
|
+
*/
|
|
21
|
+
"$schema": "../node_modules/@mpis/run/commands.schema.json",
|
|
22
|
+
"build": [
|
|
23
|
+
{
|
|
24
|
+
// 也可以写成字符串,但强烈不建议,无法正确处理空格和特殊字符,且额外增加一层shell
|
|
25
|
+
"command": ["codegen", "src"]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"title": "autoindex",
|
|
29
|
+
"command": {
|
|
30
|
+
// 运行指定包里的指定bin,不会自动安装此包,它必须存在于当前包或rig包的依赖中,此binary必须是js文件
|
|
31
|
+
"package": "@build-script/autoindex",
|
|
32
|
+
// 要执行的bin名字,必须设置。但如果此包的bin字段是字符串,则必须不设置。
|
|
33
|
+
"binary": "autoindex",
|
|
34
|
+
"arguments": ["src"]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
// 可以从 commands 中引用
|
|
38
|
+
"some-common-command",
|
|
39
|
+
{
|
|
40
|
+
// 可选,默认为command的第一个单词,仅用于显示
|
|
41
|
+
"title": "typescript",
|
|
42
|
+
"command": ["mpis-tsc", "-p", "src"],
|
|
43
|
+
// 可选,当调用watch时默认添加 -w 可以换成其他参数代替 -w
|
|
44
|
+
"watch": ["--watch" ]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"title": "esbuild",
|
|
48
|
+
// 当command第一个元素是 xxx.ts,可以直接执行它,此文件相对于package.json所在路径,同时也会在rig/profile和rig根目录中寻找同名文件
|
|
49
|
+
"command": ["scripts/esbuild.config.ts"],
|
|
50
|
+
// 此命令的工作目录,相对于package.json所在目录
|
|
51
|
+
"cwd": "."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"title": "esbuild",
|
|
55
|
+
"command": [
|
|
56
|
+
"build-protocol-client",
|
|
57
|
+
"--start=Starting compilation",
|
|
58
|
+
"--finish=Finished compilation",
|
|
59
|
+
"--success=Successfully .*",
|
|
60
|
+
"--error=Failed to .*",
|
|
61
|
+
"--",
|
|
62
|
+
"some-other-command",
|
|
63
|
+
"--some-arg=some-value",
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
"commands": {
|
|
68
|
+
// 可以在此处定义一些常用的命令,供其他命令引用
|
|
69
|
+
"some-common-command": {
|
|
70
|
+
"title": "common command",
|
|
71
|
+
"command": ["some-command", "--arg=value"]
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"clean": [
|
|
75
|
+
"dist",
|
|
76
|
+
"lib",
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 运行
|
|
82
|
+
|
|
83
|
+
* 此处的`run`就是本包安装的bin文件名,如果有冲突,也可以用`mpis-run`代替
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
pnpm exec run build
|
|
87
|
+
pnpm exec run watch
|
|
88
|
+
pnpm exec run clean
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"name": "my-project",
|
|
94
|
+
"version": "1.0.0",
|
|
95
|
+
"scripts": {
|
|
96
|
+
"prepack": "mpis-run build --clean",
|
|
97
|
+
"build": "mpis-run build",
|
|
98
|
+
"watch": "mpis-run watch",
|
|
99
|
+
"clean": "mpis-run clean"
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Run Commands Schema",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"allowTrailingCommas": true,
|
|
6
|
+
"required": ["$schema", "build", "clean"],
|
|
7
|
+
"definitions": {
|
|
8
|
+
"CommandSpecifier": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"description": "A single command to execute",
|
|
12
|
+
"required": ["command"],
|
|
13
|
+
"minLength": 1,
|
|
14
|
+
"properties": {
|
|
15
|
+
"title": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "A debug title for the command",
|
|
18
|
+
"minLength": 1
|
|
19
|
+
},
|
|
20
|
+
"command": {
|
|
21
|
+
"type": ["string", "array", "object"],
|
|
22
|
+
"description": "The command to run",
|
|
23
|
+
"items": { "type": "string", "minLength": 1 },
|
|
24
|
+
"required": ["package"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"package": { "type": "string" },
|
|
27
|
+
"binary": { "type": "string" },
|
|
28
|
+
"arguments": { "type": "array", "items": { "type": "string" } }
|
|
29
|
+
},
|
|
30
|
+
"minLength": 1
|
|
31
|
+
},
|
|
32
|
+
"watch": {
|
|
33
|
+
"type": ["string", "array"],
|
|
34
|
+
"description": "additional arguments to pass to the command when watching",
|
|
35
|
+
"default": ["-w"],
|
|
36
|
+
"items": { "type": "string", "minLength": 1 }
|
|
37
|
+
},
|
|
38
|
+
"cwd": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "working directory (relative to the package.json directory)",
|
|
41
|
+
"default": ".",
|
|
42
|
+
"minLength": 1
|
|
43
|
+
},
|
|
44
|
+
"env": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"description": "additional environment variables (key-value pairs) for the command",
|
|
47
|
+
"additionalProperties": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"errorMessage": { "not": "Can not have both 'command' and 'watch' but different type." },
|
|
53
|
+
"not": {
|
|
54
|
+
"anyOf": [
|
|
55
|
+
{
|
|
56
|
+
"required": ["command", "watch"],
|
|
57
|
+
"properties": {
|
|
58
|
+
"command": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
},
|
|
61
|
+
"watch": {
|
|
62
|
+
"type": "array"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"required": ["command", "watch"],
|
|
68
|
+
"properties": {
|
|
69
|
+
"command": {
|
|
70
|
+
"type": "array"
|
|
71
|
+
},
|
|
72
|
+
"watch": {
|
|
73
|
+
"type": "string"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"properties": {
|
|
82
|
+
"$schema": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "The JSON schema link"
|
|
85
|
+
},
|
|
86
|
+
"build": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"description": "List of commands to run",
|
|
89
|
+
"items": {
|
|
90
|
+
"anyOf": [
|
|
91
|
+
{ "$ref": "#/definitions/CommandSpecifier" },
|
|
92
|
+
{
|
|
93
|
+
"type": "string",
|
|
94
|
+
"description": "title in commands"
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"commands": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"additionalProperties": {
|
|
102
|
+
"$ref": "#/definitions/CommandSpecifier"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"clean": {
|
|
106
|
+
"type": "array",
|
|
107
|
+
"description": "List of file globs to clean up",
|
|
108
|
+
"items": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "A single glob pattern"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
package/config/rig.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { printUsage } from "./common/args.js";
|
|
2
|
+
export { projectRoot } from "./common/paths.js";
|
|
3
|
+
export { selfRoot } from "./common/paths.js";
|
|
4
|
+
export type { ICommand } from "./common/config-file.js";
|
|
5
|
+
export type { IConfigFile } from "./common/config-file.js";
|
|
6
|
+
export { loadConfigFile } from "./common/config-file.js";
|
|
7
|
+
//# sourceMappingURL=autoindex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoindex.d.ts","sourceRoot":"","sources":["../src/autoindex.ts"],"names":[],"mappings":"AAMC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
|
package/lib/autoindex.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// DO NOT EDIT THIS FILE
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
/* common/args.ts */
|
|
5
|
+
// Identifiers
|
|
6
|
+
export { printUsage } from "./common/args.js";
|
|
7
|
+
/* common/paths.ts */
|
|
8
|
+
// Identifiers
|
|
9
|
+
export { projectRoot } from "./common/paths.js";
|
|
10
|
+
export { selfRoot } from "./common/paths.js";
|
|
11
|
+
export { loadConfigFile } from "./common/config-file.js";
|
|
12
|
+
/* bin.ts */
|
|
13
|
+
// Identifiers
|
|
14
|
+
//# sourceMappingURL=autoindex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoindex.js","sourceRoot":"","sources":["../src/autoindex.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,aAAa;AACb,oBAAoB;AAEpB,oBAAoB;AACnB,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/C,qBAAqB;AACpB,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY;AACX,cAAc"}
|
package/lib/bin.d.ts
ADDED
package/lib/bin.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/lib/bin.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { humanDate, prettyFormatError, registerGlobalLifecycle, toDisposable } from '@idlebox/common';
|
|
2
|
+
import { logger } from '@idlebox/logger';
|
|
3
|
+
import { registerNodejsExitHandler } from '@idlebox/node';
|
|
4
|
+
import { channelClient } from '@mpis/client';
|
|
5
|
+
import { CompileError, ModeKind, ProcessIPCClient, WorkersManager } from '@mpis/server';
|
|
6
|
+
import { rmSync } from 'node:fs';
|
|
7
|
+
import { context, parseCliArgs } from './common/args.js';
|
|
8
|
+
import { loadConfigFile } from './common/config-file.js';
|
|
9
|
+
import { projectRoot } from './common/paths.js';
|
|
10
|
+
import { initializeStdin, registerCommand } from './common/stdin.js';
|
|
11
|
+
registerNodejsExitHandler();
|
|
12
|
+
parseCliArgs();
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
registerGlobalLifecycle(toDisposable(() => {
|
|
15
|
+
logger.info `Operation completed in ${humanDate.delta(Date.now() - start)} (${process.exitCode ? 'failed' : 'success'}).`;
|
|
16
|
+
}));
|
|
17
|
+
registerCommand({
|
|
18
|
+
name: ['status', 's'],
|
|
19
|
+
description: '显示当前状态',
|
|
20
|
+
callback: () => reprintWatchModeError(),
|
|
21
|
+
});
|
|
22
|
+
process.title = `MpisRun`;
|
|
23
|
+
logger.info `Running command "${context.command}" in ${projectRoot}`;
|
|
24
|
+
const defaultNoClear = logger.debug.isEnabled;
|
|
25
|
+
let workersManager;
|
|
26
|
+
const config = loadConfigFile(context.watchMode);
|
|
27
|
+
logger.verbose `loaded config file: ${config}`;
|
|
28
|
+
const errors = new Map();
|
|
29
|
+
switch (context.command) {
|
|
30
|
+
case 'clean':
|
|
31
|
+
executeClean();
|
|
32
|
+
break;
|
|
33
|
+
case 'build':
|
|
34
|
+
{
|
|
35
|
+
if (context.withCleanup)
|
|
36
|
+
executeClean();
|
|
37
|
+
await executeBuild();
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
case 'watch':
|
|
41
|
+
initializeStdin();
|
|
42
|
+
await executeBuild();
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
// channelClient.displayName = `MpisRun`;
|
|
46
|
+
async function executeBuild() {
|
|
47
|
+
workersManager = new WorkersManager(context.watchMode ? ModeKind.Watch : ModeKind.Build);
|
|
48
|
+
initializeWorkers();
|
|
49
|
+
workersManager.onTerminate((w) => {
|
|
50
|
+
if (!ProcessIPCClient.is(w)) {
|
|
51
|
+
logger.fatal `worker "${w._id}" is not a ProcessIPCClient, this is a bug.`;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const times = `(+${humanDate.delta(w.time.executeEnd - w.time.executeStart)})`;
|
|
55
|
+
if (context.watchMode) {
|
|
56
|
+
printFailedRunError(w, `unexpected exit in watch mode ${times}`);
|
|
57
|
+
}
|
|
58
|
+
else if (!w.isSuccess) {
|
|
59
|
+
printFailedRunError(w, `failed to execute ${times}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
logger.success `"${w._id}" successfully finished ${times}.`;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
workersManager.finalize();
|
|
66
|
+
channelClient.start();
|
|
67
|
+
if (context.breakMode) {
|
|
68
|
+
logger.warn `Break mode enabled, waiting for input command...`;
|
|
69
|
+
addDebugCommand();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
logger.verbose `Workers initialized, starting execution...`;
|
|
73
|
+
await workersManager.startup();
|
|
74
|
+
reprintWatchModeError();
|
|
75
|
+
}
|
|
76
|
+
function executeClean() {
|
|
77
|
+
for (const folder of config.clean) {
|
|
78
|
+
logger.log ` * removing folder: ${folder}`;
|
|
79
|
+
rmSync(folder, { recursive: true, force: true });
|
|
80
|
+
}
|
|
81
|
+
logger.success `Cleaned up ${config.clean.length} folders.`;
|
|
82
|
+
}
|
|
83
|
+
function initializeWorkers() {
|
|
84
|
+
let last;
|
|
85
|
+
for (const title of config.buildTitles) {
|
|
86
|
+
const cmds = config.build.get(title);
|
|
87
|
+
if (!cmds)
|
|
88
|
+
throw logger.fatal `program state error, no build command "${title}"`;
|
|
89
|
+
if (!cmds.env['DEBUG'])
|
|
90
|
+
cmds.env['DEBUG'] = '';
|
|
91
|
+
if (!cmds.env['DEBUG_LEVEL'])
|
|
92
|
+
cmds.env['DEBUG_LEVEL'] = '';
|
|
93
|
+
const worker = new ProcessIPCClient(title.replace(/\s+/g, ''), cmds.command, cmds.cwd, cmds.env);
|
|
94
|
+
for (const path of config.additionalPaths) {
|
|
95
|
+
worker.pathvar.add(path);
|
|
96
|
+
}
|
|
97
|
+
const cmd0 = typeof cmds.command === 'string' ? cmds.command.split(' ')[0] : cmds.command[0];
|
|
98
|
+
worker.displayTitle = `run:${cmd0}`;
|
|
99
|
+
workersManager.addWorker(worker, last ? [last._id] : []);
|
|
100
|
+
let nodeFirstTime = true;
|
|
101
|
+
worker.onFailure((e) => {
|
|
102
|
+
errors.set(worker, e);
|
|
103
|
+
reprintWatchModeError(nodeFirstTime);
|
|
104
|
+
nodeFirstTime = false;
|
|
105
|
+
sendStatus();
|
|
106
|
+
});
|
|
107
|
+
worker.onSuccess(() => {
|
|
108
|
+
errors.set(worker, null);
|
|
109
|
+
if (nodeFirstTime) {
|
|
110
|
+
nodeFirstTime = false;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
reprintWatchModeError();
|
|
114
|
+
}
|
|
115
|
+
sendStatus();
|
|
116
|
+
});
|
|
117
|
+
last = worker;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function printFailedRunError(worker, message) {
|
|
121
|
+
if (context.watchMode)
|
|
122
|
+
process.stderr.write('\x1Bc');
|
|
123
|
+
const text = worker.outputStream.toString().trimEnd();
|
|
124
|
+
if (text) {
|
|
125
|
+
console.error('\n\x1B[48;5;1m%s\r \x1B[0;38;5;9;1m %s \x1B[0m', ' '.repeat(process.stderr.columns || 80), `below is output of ${worker._id}`);
|
|
126
|
+
console.error(text);
|
|
127
|
+
console.error('\x1B[48;5;1m%s\r \x1B[0;38;5;9;1m %s \x1B[0m\n', ' '.repeat(process.stderr.columns || 80), `ending output of ${worker._id}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.error('\n\x1B[48;5;1m%s\r \x1B[0;38;5;9;1m %s \x1B[0m', ' '.repeat(process.stderr.columns || 80), `no output from ${worker._id}`);
|
|
131
|
+
}
|
|
132
|
+
console.error(workersManager.formatDebugGraph());
|
|
133
|
+
logger.fatal `"${worker._id}" ${message}`;
|
|
134
|
+
}
|
|
135
|
+
function reprintWatchModeError(noClear) {
|
|
136
|
+
if (context.watchMode) {
|
|
137
|
+
if (!noClear && !defaultNoClear)
|
|
138
|
+
process.stderr.write('\x1Bc');
|
|
139
|
+
}
|
|
140
|
+
console.error(workersManager.formatDebugList());
|
|
141
|
+
printAllErrors();
|
|
142
|
+
}
|
|
143
|
+
function addDebugCommand() {
|
|
144
|
+
registerCommand({
|
|
145
|
+
name: ['continue', 'c'],
|
|
146
|
+
description: '开始执行',
|
|
147
|
+
callback: () => {
|
|
148
|
+
workersManager.startup();
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
registerCommand({
|
|
152
|
+
name: ['debug'],
|
|
153
|
+
description: '切换调试模式(仅在启动前有效)',
|
|
154
|
+
callback: (text) => {
|
|
155
|
+
const [_, index, on_off] = text.split(/\s+/);
|
|
156
|
+
const list = workersManager.allWorkers;
|
|
157
|
+
const worker = list[Number(index)];
|
|
158
|
+
if (!worker) {
|
|
159
|
+
logger.error `worker index out of range: ${index}`;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (on_off === 'on') {
|
|
163
|
+
worker.env['DEBUG'] = '*,-executer:*,-dispose:*';
|
|
164
|
+
worker.env['DEBUG_LEVEL'] = 'verbose';
|
|
165
|
+
logger.success `debug mode enabled for worker "${worker._id}"`;
|
|
166
|
+
}
|
|
167
|
+
else if (on_off === 'off') {
|
|
168
|
+
worker.env['DEBUG'] = '';
|
|
169
|
+
worker.env['DEBUG_LEVEL'] = '';
|
|
170
|
+
logger.success `debug mode disabled for worker "${worker._id}"`;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
logger.error `invalid argument: ${text}`;
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
// registerCommand({
|
|
178
|
+
// name: ['print', 'p'],
|
|
179
|
+
// description: '显示命令执行输出',
|
|
180
|
+
// callback: () => {
|
|
181
|
+
// },
|
|
182
|
+
// });
|
|
183
|
+
}
|
|
184
|
+
function sendStatus() {
|
|
185
|
+
const noError = errors.values().every((e) => !e);
|
|
186
|
+
if (noError) {
|
|
187
|
+
channelClient.success(`All workers completed successfully.`);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const errorCnt = errors.values().filter((e) => !!e);
|
|
191
|
+
channelClient.failed(`${errorCnt} (of ${workersManager.size}) workers error.`, formatAllErrors());
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function formatAllErrors() {
|
|
195
|
+
const lines = [];
|
|
196
|
+
const colorEnabled = logger.colorEnabled;
|
|
197
|
+
let index = 0;
|
|
198
|
+
for (const [worker, error] of errors) {
|
|
199
|
+
if (error === null)
|
|
200
|
+
continue;
|
|
201
|
+
index++;
|
|
202
|
+
let tag = '';
|
|
203
|
+
if (error.name !== 'Error') {
|
|
204
|
+
tag = ` (${error.name})`;
|
|
205
|
+
}
|
|
206
|
+
const banner = colorEnabled ? `\x1B[48;5;9m ERROR ${index} \x1B[0m` : `ERROR ${index}`;
|
|
207
|
+
lines.push(`\n${banner}${tag} ${worker._id}`);
|
|
208
|
+
if (error instanceof CompileError) {
|
|
209
|
+
lines.push(error.toString());
|
|
210
|
+
}
|
|
211
|
+
else if (error instanceof Error) {
|
|
212
|
+
lines.push(prettyFormatError(error));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
lines.push(`can not handle error: ${error}`);
|
|
216
|
+
}
|
|
217
|
+
lines.push(`\n${banner} ${worker._id}`);
|
|
218
|
+
}
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
function printAllErrors() {
|
|
222
|
+
const numFailed = [...errors.values().filter((e) => !!e)].length;
|
|
223
|
+
if (numFailed !== 0) {
|
|
224
|
+
console.error(formatAllErrors());
|
|
225
|
+
logger.error(`💥 ${numFailed} of ${workersManager.size} worker failed`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
logger.success(`✅ no error in ${workersManager.size} workers`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=bin.js.map
|
package/lib/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function printUsage(): void;
|
|
2
|
+
export declare function parseCliArgs(): {
|
|
3
|
+
command: "build" | "watch" | "clean" | "init";
|
|
4
|
+
debugMode: boolean;
|
|
5
|
+
verboseMode: boolean;
|
|
6
|
+
watchMode: boolean;
|
|
7
|
+
buildMode: boolean;
|
|
8
|
+
breakMode: boolean;
|
|
9
|
+
withCleanup: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare let context: Readonly<ReturnType<typeof parseCliArgs>>;
|
|
12
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/common/args.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,SAQzB;AAED,wBAAgB,YAAY;;;;;;;;EAmD3B;AAED,eAAO,IAAI,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { argv } from '@idlebox/args/default';
|
|
2
|
+
import { createRootLogger, EnableLogLevel, logger } from '@idlebox/logger';
|
|
3
|
+
export function printUsage() {
|
|
4
|
+
console.log('Usage: my-cli <command>');
|
|
5
|
+
console.log();
|
|
6
|
+
console.log('Commands:');
|
|
7
|
+
console.log(' build run build');
|
|
8
|
+
console.log(' watch start watch mode');
|
|
9
|
+
console.log(' clean cleanup the project');
|
|
10
|
+
console.log(' init create config/commands.json');
|
|
11
|
+
}
|
|
12
|
+
export function parseCliArgs() {
|
|
13
|
+
const debugLevel = argv.flag(['-d', '--debug']);
|
|
14
|
+
const debugMode = debugLevel > 0;
|
|
15
|
+
const verboseMode = debugLevel > 1;
|
|
16
|
+
let level = EnableLogLevel.log;
|
|
17
|
+
if (verboseMode) {
|
|
18
|
+
level = EnableLogLevel.verbose;
|
|
19
|
+
}
|
|
20
|
+
else if (debugMode) {
|
|
21
|
+
level = EnableLogLevel.debug;
|
|
22
|
+
}
|
|
23
|
+
createRootLogger('', level);
|
|
24
|
+
const command = argv.command(['build', 'watch', 'clean', 'init']);
|
|
25
|
+
if (!command) {
|
|
26
|
+
printUsage();
|
|
27
|
+
throw logger.fatal `No command provided. Please specify a command to run.`;
|
|
28
|
+
}
|
|
29
|
+
const watchMode = command.value === 'watch';
|
|
30
|
+
const buildMode = command.value === 'build';
|
|
31
|
+
let breakMode = false;
|
|
32
|
+
if (watchMode) {
|
|
33
|
+
breakMode = argv.flag('--break') > 0;
|
|
34
|
+
}
|
|
35
|
+
let withCleanup = false;
|
|
36
|
+
if (buildMode) {
|
|
37
|
+
withCleanup = argv.flag('--clean') > 0;
|
|
38
|
+
}
|
|
39
|
+
if (argv.unused().length > 0) {
|
|
40
|
+
throw logger.fatal `Unknown arguments: ${argv.unused().join(' ')}`;
|
|
41
|
+
}
|
|
42
|
+
const r = {
|
|
43
|
+
command: command.value,
|
|
44
|
+
debugMode,
|
|
45
|
+
verboseMode,
|
|
46
|
+
watchMode,
|
|
47
|
+
buildMode,
|
|
48
|
+
breakMode,
|
|
49
|
+
withCleanup,
|
|
50
|
+
};
|
|
51
|
+
context = r;
|
|
52
|
+
return r;
|
|
53
|
+
}
|
|
54
|
+
export let context;
|
|
55
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/common/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE3E,MAAM,UAAU,UAAU;IACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC;IAEnC,IAAI,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC;IAC/B,IAAI,WAAW,EAAE,CAAC;QACjB,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACtB,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,UAAU,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,KAAK,CAAA,uDAAuD,CAAC;IAC3E,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC;IAE5C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,SAAS,EAAE,CAAC;QACf,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,CAAC,KAAK,CAAA,sBAAsB,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,GAAG;QACT,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,SAAS;QACT,WAAW;QACX,SAAS;QACT,SAAS;QACT,SAAS;QACT,WAAW;KACX,CAAC;IAEF,OAAO,GAAG,CAAC,CAAC;IAEZ,OAAO,CAAC,CAAC;AACV,CAAC;AAED,MAAM,CAAC,IAAI,OAAkD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ICommand {
|
|
2
|
+
title: string;
|
|
3
|
+
command: string | readonly string[];
|
|
4
|
+
cwd: string;
|
|
5
|
+
env: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface IConfigFile {
|
|
8
|
+
buildTitles: readonly string[];
|
|
9
|
+
build: ReadonlyMap<string, ICommand>;
|
|
10
|
+
clean: readonly string[];
|
|
11
|
+
additionalPaths: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function loadConfigFile(watchMode: boolean): IConfigFile;
|
|
14
|
+
//# sourceMappingURL=config-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.d.ts","sourceRoot":"","sources":["../../src/common/config-file.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AACD,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAsBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,GAAG,WAAW,CA2E9D"}
|