@eggjs/bin 7.0.0-beta.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 +21 -0
- package/README.md +227 -0
- package/dist/esm/bin/cli.d.ts +2 -0
- package/dist/esm/bin/cli.js +30 -0
- package/dist/esm/cmd/base.d.ts +12 -0
- package/dist/esm/cmd/base.js +135 -0
- package/dist/esm/cmd/cov.d.ts +8 -0
- package/dist/esm/cmd/cov.js +103 -0
- package/dist/esm/cmd/debug.d.ts +5 -0
- package/dist/esm/cmd/debug.js +28 -0
- package/dist/esm/cmd/dev.d.ts +17 -0
- package/dist/esm/cmd/dev.js +118 -0
- package/dist/esm/cmd/test.d.ts +15 -0
- package/dist/esm/cmd/test.js +237 -0
- package/dist/esm/config/framework.d.ts +4 -0
- package/dist/esm/config/framework.js +4 -0
- package/dist/esm/config/plugin.d.ts +11 -0
- package/dist/esm/config/plugin.js +11 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/middleware/global_options.d.ts +5 -0
- package/dist/esm/middleware/global_options.js +182 -0
- package/dist/esm/middleware/handle_error.d.ts +5 -0
- package/dist/esm/middleware/handle_error.js +47 -0
- package/dist/esm/middleware/inspect.d.ts +5 -0
- package/dist/esm/middleware/inspect.js +69 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/utils.d.ts +5 -0
- package/dist/esm/utils.js +46 -0
- package/dist/package.json +4 -0
- package/dist/scripts/postinstall.mjs +59 -0
- package/dist/scripts/start-cluster.mjs +14 -0
- package/package.json +123 -0
- package/scripts/postinstall.mjs +59 -0
- package/scripts/start-cluster.mjs +14 -0
- package/src/bin/cli.ts +33 -0
- package/src/cmd/base.ts +133 -0
- package/src/cmd/cov.ts +89 -0
- package/src/cmd/debug.ts +14 -0
- package/src/cmd/dev.ts +102 -0
- package/src/cmd/test.ts +219 -0
- package/src/config/framework.ts +3 -0
- package/src/config/plugin.ts +10 -0
- package/src/index.ts +5 -0
- package/src/middleware/global_options.ts +169 -0
- package/src/middleware/handle_error.ts +30 -0
- package/src/middleware/inspect.ts +54 -0
- package/src/utils.ts +47 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { debuglog } from 'node:util';
|
|
11
|
+
import { Inject, LifecycleHook, LifecycleHookUnit, Program, ArtusCliError, } from '@artus-cli/artus-cli';
|
|
12
|
+
const debug = debuglog('@eggjs/bin/middleware/handle_error');
|
|
13
|
+
let default_1 = class {
|
|
14
|
+
program;
|
|
15
|
+
async configDidLoad() {
|
|
16
|
+
this.program.use(async (_, next) => {
|
|
17
|
+
debug('enter next');
|
|
18
|
+
try {
|
|
19
|
+
await next();
|
|
20
|
+
debug('after next');
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
debug('next error: %o', err);
|
|
24
|
+
// let artus cli to handle it
|
|
25
|
+
if (err instanceof ArtusCliError)
|
|
26
|
+
throw err;
|
|
27
|
+
console.error(err);
|
|
28
|
+
process.exit(typeof err.code === 'number' ? err.code : 1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
__decorate([
|
|
34
|
+
Inject(),
|
|
35
|
+
__metadata("design:type", Program)
|
|
36
|
+
], default_1.prototype, "program", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
LifecycleHook(),
|
|
39
|
+
__metadata("design:type", Function),
|
|
40
|
+
__metadata("design:paramtypes", []),
|
|
41
|
+
__metadata("design:returntype", Promise)
|
|
42
|
+
], default_1.prototype, "configDidLoad", null);
|
|
43
|
+
default_1 = __decorate([
|
|
44
|
+
LifecycleHookUnit()
|
|
45
|
+
], default_1);
|
|
46
|
+
export default default_1;
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlX2Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21pZGRsZXdhcmUvaGFuZGxlX2Vycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUNMLE1BQU0sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFDdkUsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFHOUMsZ0JBQUE7SUFFSSxPQUFPLENBQVU7SUFHNUIsQUFBTixLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2pDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDN0IsNkJBQTZCO2dCQUM3QixJQUFJLEdBQUcsWUFBWSxhQUFhO29CQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBO0FBbEJrQjtJQURoQixNQUFNLEVBQUU7OEJBQ2lCLE9BQU87MENBQUM7QUFHNUI7SUFETCxhQUFhLEVBQUU7Ozs7OENBZWY7QUFuQlk7SUFEZCxpQkFBaUIsRUFBRTthQXFCbkIifQ==
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { debuglog } from 'node:util';
|
|
11
|
+
import { Inject, LifecycleHook, LifecycleHookUnit, Program, } from '@artus-cli/artus-cli';
|
|
12
|
+
import { addNodeOptionsToEnv } from '../utils.js';
|
|
13
|
+
const debug = debuglog('@eggjs/bin/middleware/inspect');
|
|
14
|
+
let default_1 = class {
|
|
15
|
+
program;
|
|
16
|
+
async configDidLoad() {
|
|
17
|
+
// add global options
|
|
18
|
+
// https://nodejs.org/dist/latest-v18.x/docs/api/cli.html#--inspect-brkhostport
|
|
19
|
+
this.program.option({
|
|
20
|
+
'inspect-brk': {
|
|
21
|
+
description: 'Activate inspector and break at start of user script',
|
|
22
|
+
type: 'boolean',
|
|
23
|
+
},
|
|
24
|
+
inspect: {
|
|
25
|
+
description: 'Activate inspector',
|
|
26
|
+
type: 'boolean',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
this.program.use(async (ctx, next) => {
|
|
30
|
+
debug('before next');
|
|
31
|
+
let hasInspectOption = false;
|
|
32
|
+
if (ctx.args.inspect === true) {
|
|
33
|
+
addNodeOptionsToEnv('--inspect', ctx.env);
|
|
34
|
+
hasInspectOption = true;
|
|
35
|
+
}
|
|
36
|
+
if (ctx.args['inspect-brk'] === true) {
|
|
37
|
+
addNodeOptionsToEnv('--inspect-brk', ctx.env);
|
|
38
|
+
hasInspectOption = true;
|
|
39
|
+
}
|
|
40
|
+
if (hasInspectOption) {
|
|
41
|
+
ctx.args.timeout = false;
|
|
42
|
+
debug('set timeout = false when inspect enable, set env.NODE_OPTIONS=%o', ctx.env.NODE_OPTIONS);
|
|
43
|
+
}
|
|
44
|
+
else if (process.env.JB_DEBUG_FILE) {
|
|
45
|
+
// others like WebStorm 2019 will pass NODE_OPTIONS, and egg-bin itself will be debug, so could detect `process.env.JB_DEBUG_FILE`.
|
|
46
|
+
ctx.args.timeout = false;
|
|
47
|
+
debug('set timeout = false when process.env.JB_DEBUG_FILE=%o', process.env.JB_DEBUG_FILE);
|
|
48
|
+
}
|
|
49
|
+
debug('enter next');
|
|
50
|
+
await next();
|
|
51
|
+
debug('after next');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
__decorate([
|
|
56
|
+
Inject(),
|
|
57
|
+
__metadata("design:type", Program)
|
|
58
|
+
], default_1.prototype, "program", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
LifecycleHook(),
|
|
61
|
+
__metadata("design:type", Function),
|
|
62
|
+
__metadata("design:paramtypes", []),
|
|
63
|
+
__metadata("design:returntype", Promise)
|
|
64
|
+
], default_1.prototype, "configDidLoad", null);
|
|
65
|
+
default_1 = __decorate([
|
|
66
|
+
LifecycleHookUnit()
|
|
67
|
+
], default_1);
|
|
68
|
+
export default default_1;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9taWRkbGV3YXJlL2luc3BlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsTUFBTSxFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQzlELE9BQU8sR0FDUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUd6QyxnQkFBQTtJQUVJLE9BQU8sQ0FBVTtJQUc1QixBQUFOLEtBQUssQ0FBQyxhQUFhO1FBQ2pCLHFCQUFxQjtRQUNyQiwrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDbEIsYUFBYSxFQUFFO2dCQUNiLFdBQVcsRUFBRSxzREFBc0Q7Z0JBQ25FLElBQUksRUFBRSxTQUFTO2FBQ2hCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLFdBQVcsRUFBRSxvQkFBb0I7Z0JBQ2pDLElBQUksRUFBRSxTQUFTO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQW1CLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbkQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JCLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzlCLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztZQUNELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixLQUFLLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRyxDQUFDO2lCQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckMsbUlBQW1JO2dCQUNuSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyx1REFBdUQsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFDRCxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEIsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBO0FBekNrQjtJQURoQixNQUFNLEVBQUU7OEJBQ2lCLE9BQU87MENBQUM7QUFHNUI7SUFETCxhQUFhLEVBQUU7Ozs7OENBc0NmO0FBMUNZO0lBRGQsaUJBQWlCLEVBQUU7YUE0Q25CIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function addNodeOptionsToEnv(options: string, env: Record<string, any>): void;
|
|
2
|
+
export declare function readPackageJSON(baseDir: string): Promise<any>;
|
|
3
|
+
export declare function hasTsConfig(baseDir: string): Promise<boolean>;
|
|
4
|
+
export declare function getSourceDirname(): string;
|
|
5
|
+
export declare function getSourceFilename(filename: string): string;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
export function addNodeOptionsToEnv(options, env) {
|
|
5
|
+
if (env.NODE_OPTIONS) {
|
|
6
|
+
if (!env.NODE_OPTIONS.includes(options)) {
|
|
7
|
+
env.NODE_OPTIONS = `${env.NODE_OPTIONS} ${options}`;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
env.NODE_OPTIONS = options;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function readPackageJSON(baseDir) {
|
|
15
|
+
const pkgFile = path.join(baseDir, 'package.json');
|
|
16
|
+
try {
|
|
17
|
+
const pkgJSON = await fs.readFile(pkgFile, 'utf8');
|
|
18
|
+
return JSON.parse(pkgJSON);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function hasTsConfig(baseDir) {
|
|
25
|
+
const pkgFile = path.join(baseDir, 'tsconfig.json');
|
|
26
|
+
try {
|
|
27
|
+
await fs.access(pkgFile);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function getSourceDirname() {
|
|
35
|
+
if (typeof __dirname === 'string') {
|
|
36
|
+
return __dirname;
|
|
37
|
+
}
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
41
|
+
return path.dirname(__filename);
|
|
42
|
+
}
|
|
43
|
+
export function getSourceFilename(filename) {
|
|
44
|
+
return path.join(getSourceDirname(), filename);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxHQUF3QjtJQUMzRSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixHQUFHLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUM3QixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQWU7SUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUFlO0lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsYUFBYTtJQUNiLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQWdCO0lBQ2hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELENBQUMifQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { runScript } from 'runscript';
|
|
5
|
+
import { readJSON, exists } from 'utility';
|
|
6
|
+
import { importResolve } from '@eggjs/utils';
|
|
7
|
+
|
|
8
|
+
const debug = debuglog('@eggjs/bin/scripts/postinstall');
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
|
|
13
|
+
async function main() {
|
|
14
|
+
// node postintall.js </path/to/egg-ts-helper/dist/bin> <framework-package-name>
|
|
15
|
+
const etsBinFile = process.argv[2] || importResolve('egg-ts-helper/dist/bin', {
|
|
16
|
+
paths: [ __dirname ],
|
|
17
|
+
});
|
|
18
|
+
const frameworkPackageName = process.argv[3] || 'egg';
|
|
19
|
+
|
|
20
|
+
// try to use INIT_CWD env https://docs.npmjs.com/cli/v9/commands/npm-run-script
|
|
21
|
+
// npm_rootpath is npminstall
|
|
22
|
+
const npmRunRoot = process.env.INIT_CWD || process.env.npm_rootpath;
|
|
23
|
+
|
|
24
|
+
debug('process.argv: %o', process.argv);
|
|
25
|
+
debug('process.env.INIT_CWD: %o', process.env.INIT_CWD);
|
|
26
|
+
debug('process.env.npm_rootpath: %o', process.env.npm_rootpath);
|
|
27
|
+
debug('etsBinFile: %o', etsBinFile);
|
|
28
|
+
debug('frameworkPackageName: %o', frameworkPackageName);
|
|
29
|
+
debug('npmRunRoot: %o', npmRunRoot);
|
|
30
|
+
|
|
31
|
+
if (npmRunRoot) {
|
|
32
|
+
const pkgFile = path.join(npmRunRoot, 'package.json');
|
|
33
|
+
const pkgFileExists = await exists(pkgFile);
|
|
34
|
+
debug('pkgFile: %o exists: %o', pkgFile, pkgFileExists);
|
|
35
|
+
if (pkgFileExists) {
|
|
36
|
+
const pkg = await readJSON(pkgFile);
|
|
37
|
+
// should set pkg.egg.declarations = true or pkg.egg.typescript = true
|
|
38
|
+
if (!pkg.egg?.typescript && !pkg.egg?.declarations) return;
|
|
39
|
+
// ignore eggModule and framework
|
|
40
|
+
// framework package.json:
|
|
41
|
+
// "egg": {
|
|
42
|
+
// "isFramework": true,
|
|
43
|
+
// "typescript": true
|
|
44
|
+
// }
|
|
45
|
+
if (pkg.eggModule) return;
|
|
46
|
+
if (pkg.egg.isFramework) return;
|
|
47
|
+
// ignore when the current app don't has a framework dependencies
|
|
48
|
+
if (!pkg.dependencies || !pkg.dependencies[frameworkPackageName]) return;
|
|
49
|
+
// set ETS_CWD
|
|
50
|
+
process.env.ETS_CWD = npmRunRoot;
|
|
51
|
+
// https://github.com/eggjs/egg-ts-helper/pull/104
|
|
52
|
+
process.env.ETS_SCRIPT_FRAMEWORK = frameworkPackageName;
|
|
53
|
+
console.log('[@eggjs/bin/postinstall] run %s on %s', etsBinFile, npmRunRoot);
|
|
54
|
+
runScript(`node ${etsBinFile}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
main();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import { importModule } from '@eggjs/utils';
|
|
3
|
+
|
|
4
|
+
const debug = debuglog('@eggjs/bin/scripts/start-cluster');
|
|
5
|
+
|
|
6
|
+
async function main() {
|
|
7
|
+
debug('argv: %o', process.argv);
|
|
8
|
+
const options = JSON.parse(process.argv[2]);
|
|
9
|
+
debug('start cluster options: %o', options);
|
|
10
|
+
const { startCluster } = await importModule(options.framework);
|
|
11
|
+
await startCluster(options);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eggjs/bin",
|
|
3
|
+
"version": "7.0.0-beta.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "egg developer tool",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git@github.com:eggjs/bin.git"
|
|
11
|
+
},
|
|
12
|
+
"bug": {
|
|
13
|
+
"url": "https://github.com/eggjs/egg/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/eggjs/bin",
|
|
16
|
+
"author": "fengmk2 <fengmk2@gmail.com> (https://github.com/fengmk2)",
|
|
17
|
+
"scripts2": {
|
|
18
|
+
"postinstall": "node scripts/postinstall.js",
|
|
19
|
+
"lint": "eslint . --cache --ext ts",
|
|
20
|
+
"test": "npm run lint -- --fix && npm run test-local",
|
|
21
|
+
"test-local": "npm run tsc && node dist/bin/cli.js test",
|
|
22
|
+
"test-local-with-ts-node-transpile-only": "node -r ts-node/register/transpile-only src/bin/cli.ts test",
|
|
23
|
+
"test-local-with-swc": "node -r @swc-node/register src/bin/cli.ts test",
|
|
24
|
+
"test-local-with-esbuild": "node -r esbuild-register src/bin/cli.ts test",
|
|
25
|
+
"test-tsc": "npm run clean && npm run tsc && node dist/bin/cli.js && node dist/bin/cli.js test --base test/fixtures/example-ts && node dist/bin/cli.js dev --base test/fixtures/example-ts",
|
|
26
|
+
"cov": "c8 -r lcov -r text-summary -x 'test/**' npm run test-local -- --timeout 120000",
|
|
27
|
+
"ci": "npm run lint && npm run test-local && npm run test-tsc",
|
|
28
|
+
"prepublishOnly": "npm run clean && npm run tsc",
|
|
29
|
+
"tsc": "tsc",
|
|
30
|
+
"clean": "rm -rf dist"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">= 18.19.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@artus-cli/artus-cli": "^1.0.1",
|
|
37
|
+
"@artus-cli/plugin-autocomplete": "^0.1.1",
|
|
38
|
+
"@artus-cli/plugin-version": "^1.0.2",
|
|
39
|
+
"@eggjs/utils": "^4.1.2",
|
|
40
|
+
"c8": "^10.0.0",
|
|
41
|
+
"detect-port": "^2.0.0",
|
|
42
|
+
"egg-ts-helper": "^2.1.0",
|
|
43
|
+
"globby": "^11.1.0",
|
|
44
|
+
"jest-changed-files": "^29.4.2",
|
|
45
|
+
"mocha": "^10.2.0",
|
|
46
|
+
"mochawesome-with-mocha": "^7.1.3",
|
|
47
|
+
"runscript": "^2.0.0",
|
|
48
|
+
"ts-node": "^10.9.2",
|
|
49
|
+
"tsconfig-paths": "^4.1.2",
|
|
50
|
+
"utility": "^2.4.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"@eggjs/mock": "beta"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"@eggjs/mock": {
|
|
57
|
+
"optional": true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@arethetypeswrong/cli": "^0.17.1",
|
|
62
|
+
"@eggjs/mock": "beta",
|
|
63
|
+
"@eggjs/tsconfig": "1",
|
|
64
|
+
"@swc-node/register": "^1.6.1",
|
|
65
|
+
"@swc/core": "^1.3.35",
|
|
66
|
+
"@types/mocha": "10",
|
|
67
|
+
"@types/node": "22",
|
|
68
|
+
"cpy": "^8.1.2",
|
|
69
|
+
"cpy-cli": "^5.0.0",
|
|
70
|
+
"egg": "beta",
|
|
71
|
+
"egg-bin": "6",
|
|
72
|
+
"esbuild": "^0.17.7",
|
|
73
|
+
"esbuild-register": "^3.4.2",
|
|
74
|
+
"eslint": "8",
|
|
75
|
+
"eslint-config-egg": "14",
|
|
76
|
+
"rimraf": "6",
|
|
77
|
+
"tshy": "3",
|
|
78
|
+
"tshy-after": "1",
|
|
79
|
+
"typescript": "5"
|
|
80
|
+
},
|
|
81
|
+
"scripts": {
|
|
82
|
+
"postinstall": "node scripts/postinstall.mjs",
|
|
83
|
+
"lint": "eslint --cache src test --ext .ts",
|
|
84
|
+
"pretest": "npm run clean && npm run lint -- --fix",
|
|
85
|
+
"test": "egg-bin test",
|
|
86
|
+
"preci": "npm run clean && npm run lint",
|
|
87
|
+
"ci": "egg-bin cov && npm run prepublishOnly",
|
|
88
|
+
"clean": "rimraf dist",
|
|
89
|
+
"copyScripts": "rimraf dist/scripts && cpy scripts dist",
|
|
90
|
+
"prepublishOnly": "tshy && tshy-after && attw --pack && rimraf dist/commonjs && npm run copyScripts"
|
|
91
|
+
},
|
|
92
|
+
"type": "module",
|
|
93
|
+
"tshy": {
|
|
94
|
+
"exports": {
|
|
95
|
+
".": "./src/index.ts",
|
|
96
|
+
"./package.json": "./package.json"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"exports": {
|
|
100
|
+
".": {
|
|
101
|
+
"import": {
|
|
102
|
+
"types": "./dist/esm/index.d.ts",
|
|
103
|
+
"default": "./dist/esm/index.js"
|
|
104
|
+
},
|
|
105
|
+
"require": {
|
|
106
|
+
"types": "./dist/commonjs/index.d.ts",
|
|
107
|
+
"default": "./dist/commonjs/index.js"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"./package.json": "./package.json"
|
|
111
|
+
},
|
|
112
|
+
"files": [
|
|
113
|
+
"dist",
|
|
114
|
+
"src",
|
|
115
|
+
"scripts"
|
|
116
|
+
],
|
|
117
|
+
"bin": {
|
|
118
|
+
"egg-bin": "./dist/esm/bin/cli.js"
|
|
119
|
+
},
|
|
120
|
+
"types": "./dist/commonjs/index.d.ts",
|
|
121
|
+
"main": "./dist/commonjs/index.js",
|
|
122
|
+
"module": "./dist/esm/index.js"
|
|
123
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { runScript } from 'runscript';
|
|
5
|
+
import { readJSON, exists } from 'utility';
|
|
6
|
+
import { importResolve } from '@eggjs/utils';
|
|
7
|
+
|
|
8
|
+
const debug = debuglog('@eggjs/bin/scripts/postinstall');
|
|
9
|
+
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
|
|
13
|
+
async function main() {
|
|
14
|
+
// node postintall.js </path/to/egg-ts-helper/dist/bin> <framework-package-name>
|
|
15
|
+
const etsBinFile = process.argv[2] || importResolve('egg-ts-helper/dist/bin', {
|
|
16
|
+
paths: [ __dirname ],
|
|
17
|
+
});
|
|
18
|
+
const frameworkPackageName = process.argv[3] || 'egg';
|
|
19
|
+
|
|
20
|
+
// try to use INIT_CWD env https://docs.npmjs.com/cli/v9/commands/npm-run-script
|
|
21
|
+
// npm_rootpath is npminstall
|
|
22
|
+
const npmRunRoot = process.env.INIT_CWD || process.env.npm_rootpath;
|
|
23
|
+
|
|
24
|
+
debug('process.argv: %o', process.argv);
|
|
25
|
+
debug('process.env.INIT_CWD: %o', process.env.INIT_CWD);
|
|
26
|
+
debug('process.env.npm_rootpath: %o', process.env.npm_rootpath);
|
|
27
|
+
debug('etsBinFile: %o', etsBinFile);
|
|
28
|
+
debug('frameworkPackageName: %o', frameworkPackageName);
|
|
29
|
+
debug('npmRunRoot: %o', npmRunRoot);
|
|
30
|
+
|
|
31
|
+
if (npmRunRoot) {
|
|
32
|
+
const pkgFile = path.join(npmRunRoot, 'package.json');
|
|
33
|
+
const pkgFileExists = await exists(pkgFile);
|
|
34
|
+
debug('pkgFile: %o exists: %o', pkgFile, pkgFileExists);
|
|
35
|
+
if (pkgFileExists) {
|
|
36
|
+
const pkg = await readJSON(pkgFile);
|
|
37
|
+
// should set pkg.egg.declarations = true or pkg.egg.typescript = true
|
|
38
|
+
if (!pkg.egg?.typescript && !pkg.egg?.declarations) return;
|
|
39
|
+
// ignore eggModule and framework
|
|
40
|
+
// framework package.json:
|
|
41
|
+
// "egg": {
|
|
42
|
+
// "isFramework": true,
|
|
43
|
+
// "typescript": true
|
|
44
|
+
// }
|
|
45
|
+
if (pkg.eggModule) return;
|
|
46
|
+
if (pkg.egg.isFramework) return;
|
|
47
|
+
// ignore when the current app don't has a framework dependencies
|
|
48
|
+
if (!pkg.dependencies || !pkg.dependencies[frameworkPackageName]) return;
|
|
49
|
+
// set ETS_CWD
|
|
50
|
+
process.env.ETS_CWD = npmRunRoot;
|
|
51
|
+
// https://github.com/eggjs/egg-ts-helper/pull/104
|
|
52
|
+
process.env.ETS_SCRIPT_FRAMEWORK = frameworkPackageName;
|
|
53
|
+
console.log('[@eggjs/bin/postinstall] run %s on %s', etsBinFile, npmRunRoot);
|
|
54
|
+
runScript(`node ${etsBinFile}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
main();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import { importModule } from '@eggjs/utils';
|
|
3
|
+
|
|
4
|
+
const debug = debuglog('@eggjs/bin/scripts/start-cluster');
|
|
5
|
+
|
|
6
|
+
async function main() {
|
|
7
|
+
debug('argv: %o', process.argv);
|
|
8
|
+
const options = JSON.parse(process.argv[2]);
|
|
9
|
+
debug('start cluster options: %o', options);
|
|
10
|
+
const { startCluster } = await importModule(options.framework);
|
|
11
|
+
await startCluster(options);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
main();
|
package/src/bin/cli.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { start } from '@artus-cli/artus-cli';
|
|
6
|
+
|
|
7
|
+
function getCurrentFilename() {
|
|
8
|
+
if (typeof __filename === 'string') {
|
|
9
|
+
return __filename;
|
|
10
|
+
}
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
return fileURLToPath(import.meta.url);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function main() {
|
|
17
|
+
const currentFilename = getCurrentFilename();
|
|
18
|
+
// src/bin/cli.ts => src/
|
|
19
|
+
let baseDir = path.dirname(path.dirname(currentFilename));
|
|
20
|
+
const isBuildJavascriptFile = getCurrentFilename().endsWith('.js');
|
|
21
|
+
const exclude = [ 'scripts', 'bin', 'test', 'coverage' ];
|
|
22
|
+
if (isBuildJavascriptFile) {
|
|
23
|
+
// dist/esm/bin/cli.js => dist/
|
|
24
|
+
baseDir = path.dirname(baseDir);
|
|
25
|
+
exclude.push('*.ts');
|
|
26
|
+
} else {
|
|
27
|
+
exclude.push('dist');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
start({ exclude, baseDir });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
main();
|
package/src/cmd/base.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { debuglog } from 'node:util';
|
|
2
|
+
import { fork, ForkOptions, ChildProcess } from 'node:child_process';
|
|
3
|
+
import {
|
|
4
|
+
DefineCommand,
|
|
5
|
+
Option, Command,
|
|
6
|
+
CommandContext,
|
|
7
|
+
Inject,
|
|
8
|
+
Utils,
|
|
9
|
+
} from '@artus-cli/artus-cli';
|
|
10
|
+
|
|
11
|
+
const debug = debuglog('@eggjs/bin/base');
|
|
12
|
+
|
|
13
|
+
// only hook once and only when ever start any child.
|
|
14
|
+
const children = new Set<ChildProcess>();
|
|
15
|
+
let hadHook = false;
|
|
16
|
+
function graceful(proc: ChildProcess) {
|
|
17
|
+
// save child ref
|
|
18
|
+
children.add(proc);
|
|
19
|
+
|
|
20
|
+
// only hook once
|
|
21
|
+
/* c8 ignore else */
|
|
22
|
+
if (!hadHook) {
|
|
23
|
+
hadHook = true;
|
|
24
|
+
let signal: NodeJS.Signals;
|
|
25
|
+
[ 'SIGINT', 'SIGQUIT', 'SIGTERM' ].forEach(event => {
|
|
26
|
+
process.once(event, () => {
|
|
27
|
+
signal = event as NodeJS.Signals;
|
|
28
|
+
process.exit(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
process.once('exit', (code: number) => {
|
|
33
|
+
for (const child of children) {
|
|
34
|
+
debug('process exit code: %o, kill child %o with %o', code, child.pid, signal);
|
|
35
|
+
child.kill(signal);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
class ForkError extends Error {
|
|
42
|
+
code: number | null;
|
|
43
|
+
constructor(message: string, code: number | null) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.code = code;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@DefineCommand()
|
|
50
|
+
export abstract class BaseCommand extends Command {
|
|
51
|
+
@Option({
|
|
52
|
+
description: 'whether show full command script only, default is false',
|
|
53
|
+
alias: 'd',
|
|
54
|
+
type: 'boolean',
|
|
55
|
+
default: false,
|
|
56
|
+
})
|
|
57
|
+
dryRun: boolean;
|
|
58
|
+
|
|
59
|
+
@Option({
|
|
60
|
+
description: 'require the given module',
|
|
61
|
+
alias: 'r',
|
|
62
|
+
array: true,
|
|
63
|
+
default: [],
|
|
64
|
+
})
|
|
65
|
+
require: string[];
|
|
66
|
+
|
|
67
|
+
@Inject()
|
|
68
|
+
ctx: CommandContext;
|
|
69
|
+
|
|
70
|
+
@Inject()
|
|
71
|
+
utils: Utils;
|
|
72
|
+
|
|
73
|
+
// FIXME: should has a better way to init global args default value
|
|
74
|
+
protected get base() {
|
|
75
|
+
return this.ctx.args.base;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async run() {
|
|
79
|
+
await this.utils.redirect([ '--help' ]);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
protected async formatRequires() {
|
|
83
|
+
const requires = this.require ?? [];
|
|
84
|
+
const eggRequire = this.ctx.args.pkgEgg.require;
|
|
85
|
+
if (Array.isArray(eggRequire)) {
|
|
86
|
+
for (const r of eggRequire) {
|
|
87
|
+
requires.push(r);
|
|
88
|
+
}
|
|
89
|
+
} else if (typeof eggRequire === 'string' && eggRequire) {
|
|
90
|
+
requires.push(eggRequire);
|
|
91
|
+
}
|
|
92
|
+
return requires;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected async forkNode(modulePath: string, args: string[], options: ForkOptions = {}) {
|
|
96
|
+
if (this.dryRun) {
|
|
97
|
+
console.log('dry run: $ %o', `${process.execPath} ${modulePath} ${args.join(' ')}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const forkExecArgv = [
|
|
101
|
+
...this.ctx.args.execArgv || [],
|
|
102
|
+
...options.execArgv || [],
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
options = {
|
|
106
|
+
stdio: 'inherit',
|
|
107
|
+
env: this.ctx.env,
|
|
108
|
+
cwd: this.base,
|
|
109
|
+
...options,
|
|
110
|
+
execArgv: forkExecArgv,
|
|
111
|
+
};
|
|
112
|
+
const proc = fork(modulePath, args, options);
|
|
113
|
+
debug('Run fork pid: %o\n\n$ %s%s %s %s\n\n',
|
|
114
|
+
proc.pid,
|
|
115
|
+
options.env?.NODE_OPTIONS ? `NODE_OPTIONS='${options.env.NODE_OPTIONS}' ` : '',
|
|
116
|
+
process.execPath,
|
|
117
|
+
modulePath, args.map(a => `'${a}'`).join(' '));
|
|
118
|
+
graceful(proc);
|
|
119
|
+
|
|
120
|
+
return new Promise<void>((resolve, reject) => {
|
|
121
|
+
proc.once('exit', code => {
|
|
122
|
+
debug('fork pid: %o exit code %o', proc.pid, code);
|
|
123
|
+
children.delete(proc);
|
|
124
|
+
if (code !== 0) {
|
|
125
|
+
const err = new ForkError(modulePath + ' ' + args.join(' ') + ' exit with code ' + code, code);
|
|
126
|
+
reject(err);
|
|
127
|
+
} else {
|
|
128
|
+
resolve();
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|