@eggjs/scripts 4.0.0 → 5.0.0-beta.27
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/README.md +2 -6
- package/bin/dev.js +0 -0
- package/dist/baseCommand.d.ts +28 -0
- package/dist/baseCommand.js +47 -0
- package/dist/commands/start.d.ts +39 -0
- package/dist/commands/start.js +277 -0
- package/dist/commands/stop.d.ts +21 -0
- package/dist/commands/stop.js +68 -0
- package/dist/helper.d.ts +11 -0
- package/dist/helper.js +35 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/{src/types.ts → dist/types.d.ts} +4 -1
- package/dist/types.js +1 -0
- package/package.json +66 -86
- package/scripts/start-cluster.cjs +11 -4
- package/scripts/start-cluster.mjs +6 -2
- package/dist/commonjs/baseCommand.d.ts +0 -25
- package/dist/commonjs/baseCommand.js +0 -62
- package/dist/commonjs/commands/start.d.ts +0 -34
- package/dist/commonjs/commands/start.js +0 -350
- package/dist/commonjs/commands/stop.d.ts +0 -16
- package/dist/commonjs/commands/stop.js +0 -95
- package/dist/commonjs/helper.d.ts +0 -10
- package/dist/commonjs/helper.js +0 -61
- package/dist/commonjs/index.d.ts +0 -3
- package/dist/commonjs/index.js +0 -26
- package/dist/commonjs/package.json +0 -3
- package/dist/commonjs/types.d.ts +0 -9
- package/dist/commonjs/types.js +0 -3
- package/dist/esm/baseCommand.d.ts +0 -25
- package/dist/esm/baseCommand.js +0 -55
- package/dist/esm/commands/start.d.ts +0 -34
- package/dist/esm/commands/start.js +0 -344
- package/dist/esm/commands/stop.d.ts +0 -16
- package/dist/esm/commands/stop.js +0 -92
- package/dist/esm/helper.d.ts +0 -10
- package/dist/esm/helper.js +0 -51
- package/dist/esm/index.d.ts +0 -3
- package/dist/esm/index.js +0 -5
- package/dist/esm/package.json +0 -3
- package/dist/esm/types.d.ts +0 -9
- package/dist/esm/types.js +0 -2
- package/dist/package.json +0 -4
- package/src/baseCommand.ts +0 -68
- package/src/commands/start.ts +0 -384
- package/src/commands/stop.ts +0 -105
- package/src/helper.ts +0 -62
- package/src/index.ts +0 -8
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const node_util_1 = require("node:util");
|
|
7
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
-
const promises_1 = require("node:timers/promises");
|
|
9
|
-
const node_child_process_1 = require("node:child_process");
|
|
10
|
-
const promises_2 = require("node:fs/promises");
|
|
11
|
-
const node_homedir_1 = require("node-homedir");
|
|
12
|
-
const core_1 = require("@oclif/core");
|
|
13
|
-
const utils_1 = require("@eggjs/utils");
|
|
14
|
-
const utility_1 = require("utility");
|
|
15
|
-
const baseCommand_js_1 = require("../baseCommand.js");
|
|
16
|
-
const helper_js_1 = require("../helper.js");
|
|
17
|
-
const debug = (0, node_util_1.debuglog)('@eggjs/scripts/commands/start');
|
|
18
|
-
const execFile = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
19
|
-
class Start extends baseCommand_js_1.BaseCommand {
|
|
20
|
-
static description = 'Start server at prod mode';
|
|
21
|
-
static examples = [
|
|
22
|
-
'<%= config.bin %> <%= command.id %>',
|
|
23
|
-
];
|
|
24
|
-
static args = {
|
|
25
|
-
baseDir: core_1.Args.string({
|
|
26
|
-
description: 'directory of application',
|
|
27
|
-
required: false,
|
|
28
|
-
}),
|
|
29
|
-
};
|
|
30
|
-
static flags = {
|
|
31
|
-
title: core_1.Flags.string({
|
|
32
|
-
description: 'process title description, use for kill grep, default to `egg-server-${APP_NAME}`',
|
|
33
|
-
}),
|
|
34
|
-
framework: core_1.Flags.string({
|
|
35
|
-
description: 'specify framework that can be absolute path or npm package',
|
|
36
|
-
}),
|
|
37
|
-
port: core_1.Flags.integer({
|
|
38
|
-
description: 'listening port, default to `process.env.PORT`',
|
|
39
|
-
char: 'p',
|
|
40
|
-
}),
|
|
41
|
-
workers: core_1.Flags.integer({
|
|
42
|
-
char: 'c',
|
|
43
|
-
aliases: ['cluster'],
|
|
44
|
-
description: 'numbers of app workers, default to `process.env.EGG_WORKERS` or `os.cpus().length`',
|
|
45
|
-
}),
|
|
46
|
-
env: core_1.Flags.string({
|
|
47
|
-
description: 'server env, default to `process.env.EGG_SERVER_ENV`',
|
|
48
|
-
default: process.env.EGG_SERVER_ENV,
|
|
49
|
-
}),
|
|
50
|
-
daemon: core_1.Flags.boolean({
|
|
51
|
-
description: 'whether run at background daemon mode',
|
|
52
|
-
}),
|
|
53
|
-
stdout: core_1.Flags.string({
|
|
54
|
-
description: 'customize stdout file',
|
|
55
|
-
}),
|
|
56
|
-
stderr: core_1.Flags.string({
|
|
57
|
-
description: 'customize stderr file',
|
|
58
|
-
}),
|
|
59
|
-
timeout: core_1.Flags.integer({
|
|
60
|
-
description: 'the maximum timeout(ms) when app starts',
|
|
61
|
-
default: 300 * 1000,
|
|
62
|
-
}),
|
|
63
|
-
'ignore-stderr': core_1.Flags.boolean({
|
|
64
|
-
description: 'whether ignore stderr when app starts',
|
|
65
|
-
}),
|
|
66
|
-
node: core_1.Flags.string({
|
|
67
|
-
description: 'customize node command path',
|
|
68
|
-
default: 'node',
|
|
69
|
-
}),
|
|
70
|
-
require: core_1.Flags.string({
|
|
71
|
-
summary: 'require the given module',
|
|
72
|
-
char: 'r',
|
|
73
|
-
multiple: true,
|
|
74
|
-
}),
|
|
75
|
-
sourcemap: core_1.Flags.boolean({
|
|
76
|
-
summary: 'whether enable sourcemap support, will load `source-map-support` etc',
|
|
77
|
-
aliases: ['ts', 'typescript'],
|
|
78
|
-
}),
|
|
79
|
-
};
|
|
80
|
-
isReady = false;
|
|
81
|
-
#child;
|
|
82
|
-
async getFrameworkPath(options) {
|
|
83
|
-
return (0, utils_1.getFrameworkPath)(options);
|
|
84
|
-
}
|
|
85
|
-
async getFrameworkName(frameworkPath) {
|
|
86
|
-
const pkgPath = node_path_1.default.join(frameworkPath, 'package.json');
|
|
87
|
-
let name = 'egg';
|
|
88
|
-
try {
|
|
89
|
-
const pkg = await (0, utility_1.readJSON)(pkgPath);
|
|
90
|
-
if (pkg.name) {
|
|
91
|
-
name = pkg.name;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
// ignore
|
|
96
|
-
}
|
|
97
|
-
return name;
|
|
98
|
-
}
|
|
99
|
-
async getServerBin() {
|
|
100
|
-
const serverBinName = this.isESM ? 'start-cluster.mjs' : 'start-cluster.cjs';
|
|
101
|
-
// for src paths, `./src/commands/start.js`
|
|
102
|
-
let serverBin = node_path_1.default.join((0, helper_js_1.getSourceDirname)(), '../scripts', serverBinName);
|
|
103
|
-
if (!(await (0, utility_1.exists)(serverBin))) {
|
|
104
|
-
// for dist paths, `./dist/esm/commands/start.js`
|
|
105
|
-
serverBin = node_path_1.default.join((0, helper_js_1.getSourceDirname)(), '../../scripts', serverBinName);
|
|
106
|
-
}
|
|
107
|
-
return serverBin;
|
|
108
|
-
}
|
|
109
|
-
async run() {
|
|
110
|
-
const { args, flags } = this;
|
|
111
|
-
// context.execArgvObj = context.execArgvObj || {};
|
|
112
|
-
// const { argv, env, cwd, execArgvObj } = context;
|
|
113
|
-
const HOME = (0, node_homedir_1.homedir)();
|
|
114
|
-
const logDir = node_path_1.default.join(HOME, 'logs');
|
|
115
|
-
// eggctl start
|
|
116
|
-
// eggctl start ./server
|
|
117
|
-
// eggctl start /opt/app
|
|
118
|
-
const cwd = process.cwd();
|
|
119
|
-
let baseDir = args.baseDir || cwd;
|
|
120
|
-
if (!node_path_1.default.isAbsolute(baseDir)) {
|
|
121
|
-
baseDir = node_path_1.default.join(cwd, baseDir);
|
|
122
|
-
}
|
|
123
|
-
await this.initBaseInfo(baseDir);
|
|
124
|
-
flags.framework = await this.getFrameworkPath({
|
|
125
|
-
framework: flags.framework,
|
|
126
|
-
baseDir,
|
|
127
|
-
});
|
|
128
|
-
const frameworkName = await this.getFrameworkName(flags.framework);
|
|
129
|
-
flags.title = flags.title || `egg-server-${this.pkg.name}`;
|
|
130
|
-
flags.stdout = flags.stdout || node_path_1.default.join(logDir, 'master-stdout.log');
|
|
131
|
-
flags.stderr = flags.stderr || node_path_1.default.join(logDir, 'master-stderr.log');
|
|
132
|
-
if (flags.workers === undefined && process.env.EGG_WORKERS) {
|
|
133
|
-
flags.workers = Number(process.env.EGG_WORKERS);
|
|
134
|
-
}
|
|
135
|
-
// normalize env
|
|
136
|
-
this.env.HOME = HOME;
|
|
137
|
-
this.env.NODE_ENV = 'production';
|
|
138
|
-
// it makes env big but more robust
|
|
139
|
-
this.env.PATH = this.env.Path = [
|
|
140
|
-
// for nodeinstall
|
|
141
|
-
node_path_1.default.join(baseDir, 'node_modules/.bin'),
|
|
142
|
-
// support `.node/bin`, due to npm5 will remove `node_modules/.bin`
|
|
143
|
-
node_path_1.default.join(baseDir, '.node/bin'),
|
|
144
|
-
// adjust env for win
|
|
145
|
-
this.env.PATH || this.env.Path,
|
|
146
|
-
].filter(x => !!x).join(node_path_1.default.delimiter);
|
|
147
|
-
// for alinode
|
|
148
|
-
this.env.ENABLE_NODE_LOG = 'YES';
|
|
149
|
-
this.env.NODE_LOG_DIR = this.env.NODE_LOG_DIR || node_path_1.default.join(logDir, 'alinode');
|
|
150
|
-
await (0, promises_2.mkdir)(this.env.NODE_LOG_DIR, { recursive: true });
|
|
151
|
-
// cli argv -> process.env.EGG_SERVER_ENV -> `undefined` then egg will use `prod`
|
|
152
|
-
if (flags.env) {
|
|
153
|
-
// if undefined, should not pass key due to `spawn`, https://github.com/nodejs/node/blob/master/lib/child_process.js#L470
|
|
154
|
-
this.env.EGG_SERVER_ENV = flags.env;
|
|
155
|
-
}
|
|
156
|
-
// additional execArgv
|
|
157
|
-
const execArgv = [
|
|
158
|
-
'--no-deprecation',
|
|
159
|
-
'--trace-warnings',
|
|
160
|
-
];
|
|
161
|
-
if (this.pkgEgg.revert) {
|
|
162
|
-
const reverts = Array.isArray(this.pkgEgg.revert) ? this.pkgEgg.revert : [this.pkgEgg.revert];
|
|
163
|
-
for (const revert of reverts) {
|
|
164
|
-
execArgv.push(`--security-revert=${revert}`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// pkg.eggScriptsConfig.require
|
|
168
|
-
const scriptsConfig = this.pkg.eggScriptsConfig;
|
|
169
|
-
if (scriptsConfig?.require) {
|
|
170
|
-
scriptsConfig.require = Array.isArray(scriptsConfig.require) ? scriptsConfig.require : [scriptsConfig.require];
|
|
171
|
-
flags.require = [...scriptsConfig.require, ...(flags.require ?? [])];
|
|
172
|
-
}
|
|
173
|
-
// read argv from eggScriptsConfig in package.json
|
|
174
|
-
if (scriptsConfig) {
|
|
175
|
-
for (const key in scriptsConfig) {
|
|
176
|
-
const v = scriptsConfig[key];
|
|
177
|
-
if (key.startsWith('node-options--')) {
|
|
178
|
-
const newKey = key.replace('node-options--', '');
|
|
179
|
-
if (v === true) {
|
|
180
|
-
// "node-options--allow-wasi": true
|
|
181
|
-
// => --allow-wasi
|
|
182
|
-
execArgv.push(`--${newKey}`);
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
// "node-options--max-http-header-size": "20000"
|
|
186
|
-
// => --max-http-header-size=20000
|
|
187
|
-
execArgv.push(`--${newKey}=${v}`);
|
|
188
|
-
}
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
const existsValue = Reflect.get(flags, key);
|
|
192
|
-
if (existsValue === undefined) {
|
|
193
|
-
// only set if key is not pass from command line
|
|
194
|
-
Reflect.set(flags, key, v);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
// read `egg.typescript` from package.json
|
|
199
|
-
if (this.pkgEgg.typescript && flags.sourcemap === undefined) {
|
|
200
|
-
flags.sourcemap = true;
|
|
201
|
-
}
|
|
202
|
-
if (flags.sourcemap) {
|
|
203
|
-
const sourceMapSupport = (0, utils_1.importResolve)('source-map-support/register.js', {
|
|
204
|
-
paths: [(0, helper_js_1.getSourceDirname)()],
|
|
205
|
-
});
|
|
206
|
-
if (this.isESM) {
|
|
207
|
-
execArgv.push('--import', sourceMapSupport);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
execArgv.push('--require', sourceMapSupport);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
if (flags.port === undefined && process.env.PORT) {
|
|
214
|
-
flags.port = parseInt(process.env.PORT);
|
|
215
|
-
}
|
|
216
|
-
debug('flags: %o, framework: %o, baseDir: %o, execArgv: %o', flags, frameworkName, baseDir, execArgv);
|
|
217
|
-
const command = flags.node;
|
|
218
|
-
const options = {
|
|
219
|
-
env: this.env,
|
|
220
|
-
stdio: 'inherit',
|
|
221
|
-
detached: false,
|
|
222
|
-
cwd: baseDir,
|
|
223
|
-
};
|
|
224
|
-
this.log('Starting %s application at %s', frameworkName, baseDir);
|
|
225
|
-
// remove unused properties from stringify, alias had been remove by `removeAlias`
|
|
226
|
-
const ignoreKeys = ['env', 'daemon', 'stdout', 'stderr', 'timeout', 'ignore-stderr', 'node'];
|
|
227
|
-
const clusterOptions = stringify({
|
|
228
|
-
...flags,
|
|
229
|
-
baseDir,
|
|
230
|
-
}, ignoreKeys);
|
|
231
|
-
// Note: `spawn` is not like `fork`, had to pass `execArgv` yourself
|
|
232
|
-
const serverBin = await this.getServerBin();
|
|
233
|
-
const eggArgs = [...execArgv, serverBin, clusterOptions, `--title=${flags.title}`];
|
|
234
|
-
const spawnScript = `${command} ${eggArgs.map(a => `'${a}'`).join(' ')}`;
|
|
235
|
-
this.log('Spawn %o', spawnScript);
|
|
236
|
-
// whether run in the background.
|
|
237
|
-
if (flags.daemon) {
|
|
238
|
-
this.log(`Save log file to ${logDir}`);
|
|
239
|
-
const [stdout, stderr] = await Promise.all([
|
|
240
|
-
getRotateLog(flags.stdout),
|
|
241
|
-
getRotateLog(flags.stderr),
|
|
242
|
-
]);
|
|
243
|
-
options.stdio = ['ignore', stdout, stderr, 'ipc'];
|
|
244
|
-
options.detached = true;
|
|
245
|
-
const child = this.#child = (0, node_child_process_1.spawn)(command, eggArgs, options);
|
|
246
|
-
this.isReady = false;
|
|
247
|
-
child.on('message', (msg) => {
|
|
248
|
-
// https://github.com/eggjs/cluster/blob/master/src/master.ts#L119
|
|
249
|
-
if (msg && msg.action === 'egg-ready') {
|
|
250
|
-
this.isReady = true;
|
|
251
|
-
this.log('%s started on %s', frameworkName, msg.data.address);
|
|
252
|
-
child.unref();
|
|
253
|
-
child.disconnect();
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
// check start status
|
|
257
|
-
await this.checkStatus();
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
options.stdio = ['inherit', 'inherit', 'inherit', 'ipc'];
|
|
261
|
-
const child = this.#child = (0, node_child_process_1.spawn)(command, eggArgs, options);
|
|
262
|
-
child.once('exit', code => {
|
|
263
|
-
if (!code)
|
|
264
|
-
return;
|
|
265
|
-
// command should exit after child process exit
|
|
266
|
-
this.exit(code);
|
|
267
|
-
});
|
|
268
|
-
// attach master signal to child
|
|
269
|
-
let signal;
|
|
270
|
-
const signals = ['SIGINT', 'SIGQUIT', 'SIGTERM'];
|
|
271
|
-
signals.forEach(event => {
|
|
272
|
-
process.once(event, () => {
|
|
273
|
-
debug('Kill child %s with %s', child.pid, signal);
|
|
274
|
-
child.kill(event);
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
async checkStatus() {
|
|
280
|
-
let count = 0;
|
|
281
|
-
let hasError = false;
|
|
282
|
-
let isSuccess = true;
|
|
283
|
-
const timeout = this.flags.timeout / 1000;
|
|
284
|
-
const stderrFile = this.flags.stderr;
|
|
285
|
-
while (!this.isReady) {
|
|
286
|
-
try {
|
|
287
|
-
const stats = await (0, promises_2.stat)(stderrFile);
|
|
288
|
-
if (stats && stats.size > 0) {
|
|
289
|
-
hasError = true;
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
catch (_) {
|
|
294
|
-
// nothing
|
|
295
|
-
}
|
|
296
|
-
if (count >= timeout) {
|
|
297
|
-
this.logToStderr('Start failed, %ds timeout', timeout);
|
|
298
|
-
isSuccess = false;
|
|
299
|
-
break;
|
|
300
|
-
}
|
|
301
|
-
await promises_1.scheduler.wait(1000);
|
|
302
|
-
this.log('Wait Start: %d...', ++count);
|
|
303
|
-
}
|
|
304
|
-
if (hasError) {
|
|
305
|
-
try {
|
|
306
|
-
const args = ['-n', '100', stderrFile];
|
|
307
|
-
this.logToStderr('tail %s', args.join(' '));
|
|
308
|
-
const { stdout: headStdout } = await execFile('head', args);
|
|
309
|
-
const { stdout: tailStdout } = await execFile('tail', args);
|
|
310
|
-
this.logToStderr('Got error when startup: ');
|
|
311
|
-
this.logToStderr(headStdout);
|
|
312
|
-
this.logToStderr('...');
|
|
313
|
-
this.logToStderr(tailStdout);
|
|
314
|
-
}
|
|
315
|
-
catch (err) {
|
|
316
|
-
this.logToStderr('ignore tail error: %s', err);
|
|
317
|
-
}
|
|
318
|
-
isSuccess = this.flags['ignore-stderr'];
|
|
319
|
-
this.logToStderr('Start got error, see %o', stderrFile);
|
|
320
|
-
this.logToStderr('Or use `--ignore-stderr` to ignore stderr at startup.');
|
|
321
|
-
}
|
|
322
|
-
if (!isSuccess) {
|
|
323
|
-
this.#child.kill('SIGTERM');
|
|
324
|
-
await promises_1.scheduler.wait(1000);
|
|
325
|
-
this.exit(1);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
exports.default = Start;
|
|
330
|
-
function stringify(obj, ignore) {
|
|
331
|
-
const result = {};
|
|
332
|
-
Object.keys(obj).forEach(key => {
|
|
333
|
-
if (!ignore.includes(key)) {
|
|
334
|
-
result[key] = obj[key];
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
return JSON.stringify(result);
|
|
338
|
-
}
|
|
339
|
-
async function getRotateLog(logFile) {
|
|
340
|
-
await (0, promises_2.mkdir)(node_path_1.default.dirname(logFile), { recursive: true });
|
|
341
|
-
if (await (0, utility_1.exists)(logFile)) {
|
|
342
|
-
// format style: .20150602.193100
|
|
343
|
-
const [YYYY, MM, DD, HH, mm, ss] = (0, utility_1.getDateStringParts)();
|
|
344
|
-
const timestamp = `.${YYYY}${MM}${DD}.${HH}${mm}${ss}`;
|
|
345
|
-
// Note: rename last log to next start time, not when last log file created
|
|
346
|
-
await (0, promises_2.rename)(logFile, logFile + timestamp);
|
|
347
|
-
}
|
|
348
|
-
return (await (0, promises_2.open)(logFile, 'a')).fd;
|
|
349
|
-
}
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBZ0Q7QUFDaEQsMERBQTZCO0FBQzdCLG1EQUFpRDtBQUNqRCwyREFBOEY7QUFDOUYsK0NBQTZEO0FBQzdELCtDQUF1QztBQUN2QyxzQ0FBMEM7QUFDMUMsd0NBQStEO0FBQy9ELHFDQUErRDtBQUMvRCxzREFBZ0Q7QUFDaEQsNENBQWdEO0FBRWhELE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO0FBRXhELE1BQU0sUUFBUSxHQUFHLElBQUEscUJBQVMsRUFBQyw2QkFBUyxDQUFDLENBQUM7QUFPdEMsTUFBcUIsS0FBOEIsU0FBUSw0QkFBYztJQUN2RSxNQUFNLENBQVUsV0FBVyxHQUFHLDJCQUEyQixDQUFDO0lBRTFELE1BQU0sQ0FBVSxRQUFRLEdBQUc7UUFDekIscUNBQXFDO0tBQ3RDLENBQUM7SUFFRixNQUFNLENBQVUsSUFBSSxHQUFHO1FBQ3JCLE9BQU8sRUFBRSxXQUFJLENBQUMsTUFBTSxDQUFDO1lBQ25CLFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQVUsS0FBSyxHQUFHO1FBQ3RCLEtBQUssRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2xCLFdBQVcsRUFBRSxtRkFBbUY7U0FDakcsQ0FBQztRQUNGLFNBQVMsRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFdBQVcsRUFBRSw0REFBNEQ7U0FDMUUsQ0FBQztRQUNGLElBQUksRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2xCLFdBQVcsRUFBRSwrQ0FBK0M7WUFDNUQsSUFBSSxFQUFFLEdBQUc7U0FDVixDQUFDO1FBQ0YsT0FBTyxFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7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
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from '../baseCommand.js';
|
|
2
|
-
import { NodeProcess } from '../helper.js';
|
|
3
|
-
export default class Stop<T extends typeof Stop> extends BaseCommand<T> {
|
|
4
|
-
static description: string;
|
|
5
|
-
static examples: string[];
|
|
6
|
-
static args: {
|
|
7
|
-
baseDir: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
-
};
|
|
9
|
-
static flags: {
|
|
10
|
-
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
};
|
|
13
|
-
run(): Promise<void>;
|
|
14
|
-
protected findNodeProcesses(filter: (item: NodeProcess) => boolean): Promise<NodeProcess[]>;
|
|
15
|
-
protected killProcesses(pids: number[], signal?: NodeJS.Signals): void;
|
|
16
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const node_util_1 = require("node:util");
|
|
4
|
-
const promises_1 = require("node:timers/promises");
|
|
5
|
-
const core_1 = require("@oclif/core");
|
|
6
|
-
const baseCommand_js_1 = require("../baseCommand.js");
|
|
7
|
-
const helper_js_1 = require("../helper.js");
|
|
8
|
-
const debug = (0, node_util_1.debuglog)('@eggjs/scripts/commands/stop');
|
|
9
|
-
const osRelated = {
|
|
10
|
-
titleTemplate: helper_js_1.isWindows ? '\\"title\\":\\"%s\\"' : '"title":"%s"',
|
|
11
|
-
// node_modules/@eggjs/cluster/dist/commonjs/app_worker.js
|
|
12
|
-
// node_modules/@eggjs/cluster/dist/esm/app_worker.js
|
|
13
|
-
appWorkerPath: /@eggjs[\/\\]cluster[\/\\]dist[\/\\](commonjs|esm)[\/\\]app_worker\.js/i,
|
|
14
|
-
// node_modules/@eggjs/cluster/dist/commonjs/agent_worker.js
|
|
15
|
-
// node_modules/@eggjs/cluster/dist/esm/agent_worker.js
|
|
16
|
-
agentWorkerPath: /@eggjs[\/\\]cluster[\/\\]dist[\/\\](commonjs|esm)[\/\\]agent_worker\.js/i,
|
|
17
|
-
};
|
|
18
|
-
class Stop extends baseCommand_js_1.BaseCommand {
|
|
19
|
-
static description = 'Stop server';
|
|
20
|
-
static examples = [
|
|
21
|
-
'<%= config.bin %> <%= command.id %>',
|
|
22
|
-
];
|
|
23
|
-
static args = {
|
|
24
|
-
baseDir: core_1.Args.string({
|
|
25
|
-
description: 'directory of application',
|
|
26
|
-
required: false,
|
|
27
|
-
}),
|
|
28
|
-
};
|
|
29
|
-
static flags = {
|
|
30
|
-
title: core_1.Flags.string({
|
|
31
|
-
description: 'process title description, use for kill grep',
|
|
32
|
-
}),
|
|
33
|
-
timeout: core_1.Flags.integer({
|
|
34
|
-
description: 'the maximum timeout(ms) when app stop',
|
|
35
|
-
default: 5000,
|
|
36
|
-
}),
|
|
37
|
-
};
|
|
38
|
-
async run() {
|
|
39
|
-
const { flags } = this;
|
|
40
|
-
this.log(`stopping egg application${flags.title ? ` with --title=${flags.title}` : ''}`);
|
|
41
|
-
// node ~/eggjs/scripts/scripts/start-cluster.cjs {"title":"egg-server","workers":4,"port":7001,"baseDir":"~/eggjs/test/showcase","framework":"~/eggjs/test/showcase/node_modules/egg"}
|
|
42
|
-
let processList = await this.findNodeProcesses(item => {
|
|
43
|
-
const cmd = item.cmd;
|
|
44
|
-
const matched = flags.title ?
|
|
45
|
-
cmd.includes('start-cluster') && cmd.includes((0, node_util_1.format)(osRelated.titleTemplate, flags.title)) :
|
|
46
|
-
cmd.includes('start-cluster');
|
|
47
|
-
if (matched) {
|
|
48
|
-
debug('find master process: %o', item);
|
|
49
|
-
}
|
|
50
|
-
return matched;
|
|
51
|
-
});
|
|
52
|
-
let pids = processList.map(x => x.pid);
|
|
53
|
-
if (pids.length) {
|
|
54
|
-
this.log('got master pid %j, list:', pids);
|
|
55
|
-
this.log('');
|
|
56
|
-
for (const item of processList) {
|
|
57
|
-
this.log('- %s: %o', item.pid, item.cmd);
|
|
58
|
-
}
|
|
59
|
-
this.log('');
|
|
60
|
-
this.killProcesses(pids);
|
|
61
|
-
// wait for 5s to confirm whether any worker process did not kill by master
|
|
62
|
-
await promises_1.scheduler.wait(flags.timeout);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
this.logToStderr('can\'t detect any running egg process');
|
|
66
|
-
}
|
|
67
|
-
// node --debug-port=5856 /Users/tz/Workspaces/eggjs/test/showcase/node_modules/_egg-cluster@1.8.0@egg-cluster/lib/agent_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
|
|
68
|
-
// node /Users/tz/Workspaces/eggjs/test/showcase/node_modules/_egg-cluster@1.8.0@egg-cluster/lib/app_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
|
|
69
|
-
// ~/bin/node --no-deprecation --trace-warnings ~/eggjs/examples/helloworld/node_modules/@eggjs/cluster/dist/commonjs/agent_worker.js {"baseDir":"~/eggjs/examples/helloworld","startMode":"process","framework":"~/eggjs/examples/helloworld/node_modules/egg","title":"egg-server-helloworld","workers":10,"clusterPort":58977}
|
|
70
|
-
processList = await this.findNodeProcesses(item => {
|
|
71
|
-
const cmd = item.cmd;
|
|
72
|
-
const matched = flags.title ?
|
|
73
|
-
(osRelated.appWorkerPath.test(cmd) || osRelated.agentWorkerPath.test(cmd)) && cmd.includes((0, node_util_1.format)(osRelated.titleTemplate, flags.title)) :
|
|
74
|
-
(osRelated.appWorkerPath.test(cmd) || osRelated.agentWorkerPath.test(cmd));
|
|
75
|
-
if (matched) {
|
|
76
|
-
debug('find app/agent worker process: %o', item);
|
|
77
|
-
}
|
|
78
|
-
return matched;
|
|
79
|
-
});
|
|
80
|
-
pids = processList.map(x => x.pid);
|
|
81
|
-
if (pids.length) {
|
|
82
|
-
this.log('got worker/agent pids %j that is not killed by master', pids);
|
|
83
|
-
this.killProcesses(pids);
|
|
84
|
-
}
|
|
85
|
-
this.log('stopped');
|
|
86
|
-
}
|
|
87
|
-
async findNodeProcesses(filter) {
|
|
88
|
-
return (0, helper_js_1.findNodeProcess)(filter);
|
|
89
|
-
}
|
|
90
|
-
killProcesses(pids, signal = 'SIGTERM') {
|
|
91
|
-
(0, helper_js_1.kill)(pids, signal);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
exports.default = Stop;
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zdG9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQTZDO0FBQzdDLG1EQUFpRDtBQUNqRCxzQ0FBMEM7QUFDMUMsc0RBQWdEO0FBQ2hELDRDQUE2RTtBQUU3RSxNQUFNLEtBQUssR0FBRyxJQUFBLG9CQUFRLEVBQUMsOEJBQThCLENBQUMsQ0FBQztBQUV2RCxNQUFNLFNBQVMsR0FBRztJQUNoQixhQUFhLEVBQUUscUJBQVMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFDbEUsMERBQTBEO0lBQzFELHFEQUFxRDtJQUNyRCxhQUFhLEVBQUUsd0VBQXdFO0lBQ3ZGLDREQUE0RDtJQUM1RCx1REFBdUQ7SUFDdkQsZUFBZSxFQUFFLDBFQUEwRTtDQUM1RixDQUFDO0FBRUYsTUFBcUIsSUFBNEIsU0FBUSw0QkFBYztJQUNyRSxNQUFNLENBQVUsV0FBVyxHQUFHLGFBQWEsQ0FBQztJQUU1QyxNQUFNLENBQVUsUUFBUSxHQUFHO1FBQ3pCLHFDQUFxQztLQUN0QyxDQUFDO0lBRUYsTUFBTSxDQUFVLElBQUksR0FBRztRQUNyQixPQUFPLEVBQUUsV0FBSSxDQUFDLE1BQU0sQ0FBQztZQUNuQixXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFVLEtBQUssR0FBRztRQUN0QixLQUFLLEVBQUUsWUFBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixXQUFXLEVBQUUsOENBQThDO1NBQzVELENBQUM7UUFDRixPQUFPLEVBQUUsWUFBSyxDQUFDLE9BQU8sQ0FBQztZQUNyQixXQUFXLEVBQUUsdUNBQXVDO1lBQ3BELE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztLQUNILENBQUM7SUFFSyxLQUFLLENBQUMsR0FBRztRQUNkLE1BQU0sRUFBRSxLQUFL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
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const isWindows: boolean;
|
|
2
|
-
export interface NodeProcess {
|
|
3
|
-
pid: number;
|
|
4
|
-
cmd: string;
|
|
5
|
-
}
|
|
6
|
-
export type FilterFunction = (item: NodeProcess) => boolean;
|
|
7
|
-
export declare function findNodeProcess(filterFn?: FilterFunction): Promise<NodeProcess[]>;
|
|
8
|
-
export declare function kill(pids: number[], signal?: string | number): void;
|
|
9
|
-
export declare function getSourceDirname(): string;
|
|
10
|
-
export declare function getSourceFilename(filename: string): string;
|
package/dist/commonjs/helper.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isWindows = void 0;
|
|
7
|
-
exports.findNodeProcess = findNodeProcess;
|
|
8
|
-
exports.kill = kill;
|
|
9
|
-
exports.getSourceDirname = getSourceDirname;
|
|
10
|
-
exports.getSourceFilename = getSourceFilename;
|
|
11
|
-
const runscript_1 = require("runscript");
|
|
12
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
-
const node_url_1 = require("node:url");
|
|
14
|
-
exports.isWindows = process.platform === 'win32';
|
|
15
|
-
const REGEX = exports.isWindows ? /^(.*)\s+(\d+)\s*$/ : /^\s*(\d+)\s+(.*)/;
|
|
16
|
-
async function findNodeProcess(filterFn) {
|
|
17
|
-
const command = exports.isWindows ?
|
|
18
|
-
'wmic Path win32_process Where "Name = \'node.exe\'" Get CommandLine,ProcessId' :
|
|
19
|
-
// command, cmd are alias of args, not POSIX standard, so we use args
|
|
20
|
-
'ps -wweo "pid,args"';
|
|
21
|
-
const stdio = await (0, runscript_1.runScript)(command, { stdio: 'pipe' });
|
|
22
|
-
const processList = stdio.stdout.toString().split('\n')
|
|
23
|
-
.reduce((arr, line) => {
|
|
24
|
-
if (!!line && !line.includes('/bin/sh') && line.includes('node')) {
|
|
25
|
-
const m = line.match(REGEX);
|
|
26
|
-
if (m) {
|
|
27
|
-
const item = exports.isWindows ? { pid: parseInt(m[2]), cmd: m[1] } : { pid: parseInt(m[1]), cmd: m[2] };
|
|
28
|
-
if (filterFn?.(item)) {
|
|
29
|
-
arr.push(item);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return arr;
|
|
34
|
-
}, []);
|
|
35
|
-
return processList;
|
|
36
|
-
}
|
|
37
|
-
function kill(pids, signal) {
|
|
38
|
-
pids.forEach(pid => {
|
|
39
|
-
try {
|
|
40
|
-
process.kill(pid, signal);
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
if (err.code !== 'ESRCH') {
|
|
44
|
-
throw err;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
function getSourceDirname() {
|
|
50
|
-
if (typeof __dirname === 'string') {
|
|
51
|
-
return __dirname;
|
|
52
|
-
}
|
|
53
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
54
|
-
// @ts-ignore
|
|
55
|
-
const __filename = (0, node_url_1.fileURLToPath)('import_meta_url_placeholder_by_tshy_after');
|
|
56
|
-
return node_path_1.default.dirname(__filename);
|
|
57
|
-
}
|
|
58
|
-
function getSourceFilename(filename) {
|
|
59
|
-
return node_path_1.default.join(getSourceDirname(), filename);
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFlQSwwQ0FvQkM7QUFFRCxvQkFVQztBQUVELDRDQVFDO0FBRUQsOENBRUM7QUE3REQseUNBQXNDO0FBQ3RDLDBEQUE2QjtBQUM3Qix1Q0FBeUM7QUFFNUIsUUFBQSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7QUFFdEQsTUFBTSxLQUFLLEdBQUcsaUJBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0FBUzVELEtBQUssVUFBVSxlQUFlLENBQUMsUUFBeUI7SUFDN0QsTUFBTSxPQUFPLEdBQUcsaUJBQVMsQ0FBQyxDQUFDO1FBQ3pCLCtFQUErRSxDQUFDLENBQUM7UUFDakYscUVBQXFFO1FBQ3JFLHFCQUFxQixDQUFDO0lBQ3hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBQSxxQkFBUyxFQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNyRCxNQUFNLENBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDTixNQUFNLElBQUksR0FBZ0IsaUJBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNQLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFnQixJQUFJLENBQUMsSUFBYyxFQUFFLE1BQXdCO0lBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCO0lBQzlCLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxhQUFhO0lBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBQSx3QkFBYSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsT0FBTyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsUUFBZ0I7SUFDaEQsT0FBTyxtQkFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pELENBQUMifQ==
|
package/dist/commonjs/index.d.ts
DELETED
package/dist/commonjs/index.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.StartCommand = exports.Start = void 0;
|
|
21
|
-
const start_js_1 = __importDefault(require("./commands/start.js"));
|
|
22
|
-
exports.Start = start_js_1.default;
|
|
23
|
-
exports.StartCommand = start_js_1.default;
|
|
24
|
-
// exports.StopCommand = require('./lib/cmd/stop');
|
|
25
|
-
__exportStar(require("./baseCommand.js"), exports);
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtRUFBd0M7QUFNdEMsZ0JBTkssa0JBQUssQ0FNTDtBQUFXLHVCQU5YLGtCQUFLLENBTWtCO0FBSjlCLG1EQUFtRDtBQUVuRCxtREFBaUMifQ==
|
package/dist/commonjs/types.d.ts
DELETED
package/dist/commonjs/types.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Command, Flags, Interfaces } from '@oclif/core';
|
|
2
|
-
import { PackageEgg } from './types.js';
|
|
3
|
-
type Flags<T extends typeof Command> = Interfaces.InferredFlags<typeof BaseCommand['baseFlags'] & T['flags']>;
|
|
4
|
-
type Args<T extends typeof Command> = Interfaces.InferredArgs<T['args']>;
|
|
5
|
-
export declare abstract class BaseCommand<T extends typeof Command> extends Command {
|
|
6
|
-
static enableJsonFlag: boolean;
|
|
7
|
-
static baseFlags: {};
|
|
8
|
-
protected flags: Flags<T>;
|
|
9
|
-
protected args: Args<T>;
|
|
10
|
-
protected env: {
|
|
11
|
-
[x: string]: string | undefined;
|
|
12
|
-
TZ?: string;
|
|
13
|
-
};
|
|
14
|
-
protected pkg: Record<string, any>;
|
|
15
|
-
protected isESM: boolean;
|
|
16
|
-
protected pkgEgg: PackageEgg;
|
|
17
|
-
protected globalExecArgv: string[];
|
|
18
|
-
init(): Promise<void>;
|
|
19
|
-
protected initBaseInfo(baseDir: string): Promise<void>;
|
|
20
|
-
protected catch(err: Error & {
|
|
21
|
-
exitCode?: number;
|
|
22
|
-
}): Promise<any>;
|
|
23
|
-
protected finally(_: Error | undefined): Promise<any>;
|
|
24
|
-
}
|
|
25
|
-
export {};
|