neex 0.7.44 → 0.8.3
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 +50 -326
- package/bin/neex +31 -0
- package/install.js +94 -0
- package/package.json +30 -63
- package/dist/bin/neex.d.ts +0 -26
- package/dist/bin/neex.d.ts.map +0 -1
- package/dist/bin/neex.js +0 -8
- package/dist/src/build-manager.d.ts +0 -41
- package/dist/src/build-manager.d.ts.map +0 -1
- package/dist/src/build-manager.js +0 -369
- package/dist/src/cli.d.ts +0 -2
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -67
- package/dist/src/commands/add-commands.d.ts +0 -4
- package/dist/src/commands/add-commands.d.ts.map +0 -1
- package/dist/src/commands/add-commands.js +0 -83
- package/dist/src/commands/build-commands.d.ts +0 -5
- package/dist/src/commands/build-commands.d.ts.map +0 -1
- package/dist/src/commands/build-commands.js +0 -123
- package/dist/src/commands/dev-commands.d.ts +0 -5
- package/dist/src/commands/dev-commands.d.ts.map +0 -1
- package/dist/src/commands/dev-commands.js +0 -198
- package/dist/src/commands/index.d.ts +0 -8
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js +0 -27
- package/dist/src/commands/init-commands.d.ts +0 -2
- package/dist/src/commands/init-commands.d.ts.map +0 -1
- package/dist/src/commands/init-commands.js +0 -20
- package/dist/src/commands/run-commands.d.ts +0 -3
- package/dist/src/commands/run-commands.d.ts.map +0 -1
- package/dist/src/commands/run-commands.js +0 -93
- package/dist/src/commands/server-commands.d.ts +0 -3
- package/dist/src/commands/server-commands.d.ts.map +0 -1
- package/dist/src/commands/server-commands.js +0 -51
- package/dist/src/commands/start-commands.d.ts +0 -5
- package/dist/src/commands/start-commands.d.ts.map +0 -1
- package/dist/src/commands/start-commands.js +0 -162
- package/dist/src/dev-manager.d.ts +0 -51
- package/dist/src/dev-manager.d.ts.map +0 -1
- package/dist/src/dev-manager.js +0 -471
- package/dist/src/index.d.ts +0 -41
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -70
- package/dist/src/logger-manager.d.ts +0 -4
- package/dist/src/logger-manager.d.ts.map +0 -1
- package/dist/src/logger-manager.js +0 -17
- package/dist/src/logger.d.ts +0 -34
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -279
- package/dist/src/runner.d.ts +0 -21
- package/dist/src/runner.d.ts.map +0 -1
- package/dist/src/runner.js +0 -414
- package/dist/src/start-manager.d.ts +0 -49
- package/dist/src/start-manager.d.ts.map +0 -1
- package/dist/src/start-manager.js +0 -484
- package/dist/src/types.d.ts +0 -41
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/utils.d.ts +0 -2
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -9
package/dist/src/runner.js
DELETED
|
@@ -1,414 +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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.Runner = void 0;
|
|
40
|
-
// src/runner.ts - Fixed version
|
|
41
|
-
const child_process_1 = require("child_process");
|
|
42
|
-
const fsPromises = __importStar(require("fs/promises"));
|
|
43
|
-
const path = __importStar(require("path"));
|
|
44
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
-
const logger_1 = __importDefault(require("./logger"));
|
|
46
|
-
const p_map_1 = __importDefault(require("p-map"));
|
|
47
|
-
const npm_run_path_1 = require("npm-run-path");
|
|
48
|
-
const fs = __importStar(require("fs"));
|
|
49
|
-
class Runner {
|
|
50
|
-
options;
|
|
51
|
-
activeProcesses = new Map();
|
|
52
|
-
serverInfo = new Map();
|
|
53
|
-
portRegex = /listening on (?:port |http:\/\/localhost:|https:\/\/localhost:)(\d+)/i;
|
|
54
|
-
urlRegex = /(https?:\/\/localhost:[0-9]+(?:\/[^\s]*)?)/i;
|
|
55
|
-
isCleaningUp = false;
|
|
56
|
-
constructor(options) {
|
|
57
|
-
this.options = options;
|
|
58
|
-
this.activeProcesses = new Map();
|
|
59
|
-
this.setupSignalHandlers();
|
|
60
|
-
}
|
|
61
|
-
setupSignalHandlers() {
|
|
62
|
-
const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT'];
|
|
63
|
-
signals.forEach(signal => {
|
|
64
|
-
process.on(signal, () => {
|
|
65
|
-
if (!this.isCleaningUp) {
|
|
66
|
-
this.isCleaningUp = true;
|
|
67
|
-
logger_1.default.printLine(`\nReceived ${signal}. Cleaning up...`, 'warn');
|
|
68
|
-
this.cleanup(signal);
|
|
69
|
-
process.exit(0);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
// Handle unexpected exits
|
|
74
|
-
process.on('beforeExit', () => {
|
|
75
|
-
if (!this.isCleaningUp) {
|
|
76
|
-
this.cleanup();
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
async expandWildcardCommands(commands) {
|
|
81
|
-
const expandedCommands = [];
|
|
82
|
-
let packageJson;
|
|
83
|
-
try {
|
|
84
|
-
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
85
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
86
|
-
const packageJsonContent = await fsPromises.readFile(packageJsonPath, 'utf-8');
|
|
87
|
-
packageJson = JSON.parse(packageJsonContent);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
logger_1.default.printLine(`Could not read or parse package.json: ${error.message}`, 'warn');
|
|
92
|
-
packageJson = { scripts: {} };
|
|
93
|
-
}
|
|
94
|
-
for (const command of commands) {
|
|
95
|
-
if (command.includes('*') && packageJson && packageJson.scripts) {
|
|
96
|
-
const pattern = new RegExp(`^${command.replace(/\*/g, '.*')}$`);
|
|
97
|
-
let foundMatch = false;
|
|
98
|
-
for (const scriptName in packageJson.scripts) {
|
|
99
|
-
if (pattern.test(scriptName)) {
|
|
100
|
-
expandedCommands.push(scriptName);
|
|
101
|
-
foundMatch = true;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (!foundMatch) {
|
|
105
|
-
logger_1.default.printLine(`No scripts found in package.json matching wildcard: ${command}`, 'warn');
|
|
106
|
-
expandedCommands.push(command);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
expandedCommands.push(command);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return expandedCommands;
|
|
114
|
-
}
|
|
115
|
-
async resolveScriptAndCwd(scriptNameOrCommand, baseDir) {
|
|
116
|
-
try {
|
|
117
|
-
const packageJsonPath = path.join(baseDir, 'package.json');
|
|
118
|
-
const packageJsonContent = await fsPromises.readFile(packageJsonPath, 'utf-8');
|
|
119
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
120
|
-
if (packageJson.scripts && packageJson.scripts[scriptNameOrCommand]) {
|
|
121
|
-
const scriptValue = packageJson.scripts[scriptNameOrCommand];
|
|
122
|
-
const cdMatch = scriptValue.match(/^cd\s+([^&]+)\s+&&\s+(.*)$/);
|
|
123
|
-
if (cdMatch) {
|
|
124
|
-
const dir = cdMatch[1];
|
|
125
|
-
const commandToExecute = cdMatch[2];
|
|
126
|
-
const targetCwd = path.resolve(baseDir, dir);
|
|
127
|
-
return {
|
|
128
|
-
executableCommand: commandToExecute,
|
|
129
|
-
executionCwd: targetCwd,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
return { executableCommand: scriptValue, executionCwd: baseDir };
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
// Will treat as direct command
|
|
139
|
-
}
|
|
140
|
-
return { executableCommand: scriptNameOrCommand, executionCwd: undefined };
|
|
141
|
-
}
|
|
142
|
-
detectServerInfo(command, data) {
|
|
143
|
-
if (!this.options.isServerMode)
|
|
144
|
-
return;
|
|
145
|
-
let serverInfo = this.serverInfo.get(command);
|
|
146
|
-
if (!serverInfo) {
|
|
147
|
-
serverInfo = {
|
|
148
|
-
name: command,
|
|
149
|
-
status: 'starting',
|
|
150
|
-
};
|
|
151
|
-
this.serverInfo.set(command, serverInfo);
|
|
152
|
-
}
|
|
153
|
-
const portMatch = data.match(this.portRegex);
|
|
154
|
-
if (portMatch && portMatch[1]) {
|
|
155
|
-
serverInfo.port = parseInt(portMatch[1], 10);
|
|
156
|
-
serverInfo.status = 'running';
|
|
157
|
-
if (!serverInfo.url) {
|
|
158
|
-
logger_1.default.printLine(`Server ${command} running on port ${serverInfo.port}`, 'info');
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
const urlMatch = data.match(this.urlRegex);
|
|
162
|
-
if (urlMatch && urlMatch[1]) {
|
|
163
|
-
serverInfo.url = urlMatch[1];
|
|
164
|
-
serverInfo.status = 'running';
|
|
165
|
-
logger_1.default.printLine(`Server ${command} available at ${chalk_1.default.cyan(serverInfo.url)}`, 'info');
|
|
166
|
-
}
|
|
167
|
-
this.serverInfo.set(command, serverInfo);
|
|
168
|
-
}
|
|
169
|
-
async runCommand(originalCommand, currentRetry = 0) {
|
|
170
|
-
const { executableCommand: command, executionCwd: cwd } = await this.resolveScriptAndCwd(originalCommand, process.cwd());
|
|
171
|
-
const startTime = new Date();
|
|
172
|
-
const result = {
|
|
173
|
-
command: originalCommand,
|
|
174
|
-
success: false,
|
|
175
|
-
code: null,
|
|
176
|
-
startTime,
|
|
177
|
-
endTime: null,
|
|
178
|
-
output: [],
|
|
179
|
-
stderr: [],
|
|
180
|
-
};
|
|
181
|
-
if (this.options.printOutput) {
|
|
182
|
-
logger_1.default.printStart(originalCommand);
|
|
183
|
-
}
|
|
184
|
-
return new Promise(async (resolve) => {
|
|
185
|
-
const [cmd, ...args] = command.split(' ');
|
|
186
|
-
const env = {
|
|
187
|
-
...process.env,
|
|
188
|
-
...(0, npm_run_path_1.npmRunPathEnv)(),
|
|
189
|
-
FORCE_COLOR: this.options.color ? '1' : '0',
|
|
190
|
-
};
|
|
191
|
-
// Fix: Remove detached and handle process groups properly
|
|
192
|
-
const proc = (0, child_process_1.spawn)(cmd, args, {
|
|
193
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
194
|
-
shell: true,
|
|
195
|
-
env,
|
|
196
|
-
cwd,
|
|
197
|
-
});
|
|
198
|
-
this.activeProcesses.set(originalCommand, proc);
|
|
199
|
-
if (this.options.isServerMode) {
|
|
200
|
-
this.serverInfo.set(originalCommand, {
|
|
201
|
-
name: originalCommand,
|
|
202
|
-
status: 'starting',
|
|
203
|
-
pid: proc.pid,
|
|
204
|
-
startTime: new Date(),
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
proc.stdout?.on('data', data => {
|
|
208
|
-
const output = {
|
|
209
|
-
command: originalCommand,
|
|
210
|
-
type: 'stdout',
|
|
211
|
-
data: data.toString(),
|
|
212
|
-
timestamp: new Date(),
|
|
213
|
-
};
|
|
214
|
-
if (this.options.isServerMode)
|
|
215
|
-
this.detectServerInfo(originalCommand, data.toString());
|
|
216
|
-
if (result.output)
|
|
217
|
-
result.output.push(output);
|
|
218
|
-
logger_1.default.bufferOutput(output);
|
|
219
|
-
if (!this.options.groupOutput && this.options.printOutput)
|
|
220
|
-
logger_1.default.printBuffer(originalCommand);
|
|
221
|
-
});
|
|
222
|
-
proc.stderr?.on('data', data => {
|
|
223
|
-
const output = {
|
|
224
|
-
command: originalCommand,
|
|
225
|
-
type: 'stderr',
|
|
226
|
-
data: data.toString(),
|
|
227
|
-
timestamp: new Date(),
|
|
228
|
-
};
|
|
229
|
-
if (result.output)
|
|
230
|
-
result.output.push(output);
|
|
231
|
-
logger_1.default.bufferOutput(output);
|
|
232
|
-
if (!this.options.groupOutput && this.options.printOutput)
|
|
233
|
-
logger_1.default.printBuffer(originalCommand);
|
|
234
|
-
});
|
|
235
|
-
proc.on('error', async (err) => {
|
|
236
|
-
result.endTime = new Date();
|
|
237
|
-
result.error = err;
|
|
238
|
-
result.success = false;
|
|
239
|
-
result.duration = result.endTime.getTime() - startTime.getTime();
|
|
240
|
-
this.activeProcesses.delete(originalCommand);
|
|
241
|
-
if (this.options.isServerMode) {
|
|
242
|
-
const serverInfo = this.serverInfo.get(originalCommand);
|
|
243
|
-
if (serverInfo) {
|
|
244
|
-
serverInfo.status = 'error';
|
|
245
|
-
this.serverInfo.set(originalCommand, serverInfo);
|
|
246
|
-
}
|
|
247
|
-
logger_1.default.printLine(`Command "${originalCommand}" failed to start: ${err.message}`, 'error');
|
|
248
|
-
}
|
|
249
|
-
logger_1.default.printBuffer(originalCommand);
|
|
250
|
-
if (this.options.printOutput)
|
|
251
|
-
logger_1.default.printEnd(result, this.options.minimalOutput);
|
|
252
|
-
if (this.options.retry &&
|
|
253
|
-
this.options.retry > 0 &&
|
|
254
|
-
currentRetry < this.options.retry) {
|
|
255
|
-
logger_1.default.printLine(`Command "${originalCommand}" failed with error. Retrying (${currentRetry + 1}/${this.options.retry})...`, 'warn');
|
|
256
|
-
if (this.options.retryDelay && this.options.retryDelay > 0) {
|
|
257
|
-
await new Promise(res => setTimeout(res, this.options.retryDelay));
|
|
258
|
-
}
|
|
259
|
-
logger_1.default.clearBuffer(originalCommand);
|
|
260
|
-
resolve(this.runCommand(originalCommand, currentRetry + 1));
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
resolve(result);
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
proc.on('close', async (code) => {
|
|
267
|
-
result.code = code;
|
|
268
|
-
result.success = code === 0;
|
|
269
|
-
result.endTime = new Date();
|
|
270
|
-
result.duration = result.endTime.getTime() - startTime.getTime();
|
|
271
|
-
this.activeProcesses.delete(originalCommand);
|
|
272
|
-
if (this.options.isServerMode) {
|
|
273
|
-
const serverInfo = this.serverInfo.get(originalCommand);
|
|
274
|
-
if (serverInfo) {
|
|
275
|
-
serverInfo.status = code === 0 ? 'stopped' : 'error';
|
|
276
|
-
this.serverInfo.set(originalCommand, serverInfo);
|
|
277
|
-
}
|
|
278
|
-
if (code !== 0) {
|
|
279
|
-
logger_1.default.printLine(`Server "${originalCommand}" exited with code ${code}`, 'error');
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
logger_1.default.printBuffer(originalCommand);
|
|
283
|
-
if (this.options.printOutput)
|
|
284
|
-
logger_1.default.printEnd(result, this.options.minimalOutput);
|
|
285
|
-
if (!result.success &&
|
|
286
|
-
this.options.retry &&
|
|
287
|
-
this.options.retry > 0 &&
|
|
288
|
-
currentRetry < this.options.retry) {
|
|
289
|
-
logger_1.default.printLine(`Command "${originalCommand}" failed with code ${code}. Retrying (${currentRetry + 1}/${this.options.retry})...`, 'warn');
|
|
290
|
-
if (this.options.retryDelay && this.options.retryDelay > 0) {
|
|
291
|
-
await new Promise(res => setTimeout(res, this.options.retryDelay));
|
|
292
|
-
}
|
|
293
|
-
logger_1.default.clearBuffer(originalCommand);
|
|
294
|
-
resolve(this.runCommand(originalCommand, currentRetry + 1));
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
resolve(result);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
async runSequential(commands) {
|
|
303
|
-
const results = [];
|
|
304
|
-
for (const cmd of commands) {
|
|
305
|
-
const result = await this.runCommand(cmd);
|
|
306
|
-
results.push(result);
|
|
307
|
-
if (!result.success && this.options.stopOnError) {
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return results;
|
|
312
|
-
}
|
|
313
|
-
async runParallel(commands) {
|
|
314
|
-
const concurrency = this.options.maxParallel || commands.length;
|
|
315
|
-
const mapper = async (cmd) => {
|
|
316
|
-
return this.runCommand(cmd);
|
|
317
|
-
};
|
|
318
|
-
try {
|
|
319
|
-
return await (0, p_map_1.default)(commands, mapper, {
|
|
320
|
-
concurrency,
|
|
321
|
-
stopOnError: this.options.stopOnError,
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
catch (error) {
|
|
325
|
-
if (this.options.isServerMode) {
|
|
326
|
-
logger_1.default.printLine('One or more servers failed to start. Stopping all servers.', 'error');
|
|
327
|
-
}
|
|
328
|
-
return [];
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
async run(initialCommands) {
|
|
332
|
-
const commands = await this.expandWildcardCommands(initialCommands);
|
|
333
|
-
if (commands.length === 0) {
|
|
334
|
-
logger_1.default.printLine('No commands to run after wildcard expansion.', 'warn');
|
|
335
|
-
return [];
|
|
336
|
-
}
|
|
337
|
-
logger_1.default.setCommands(commands);
|
|
338
|
-
if (this.options.parallel) {
|
|
339
|
-
if (this.options.isServerMode) {
|
|
340
|
-
logger_1.default.printLine('Starting servers in parallel mode', 'info');
|
|
341
|
-
}
|
|
342
|
-
return this.runParallel(commands);
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
if (this.options.isServerMode) {
|
|
346
|
-
logger_1.default.printLine('Starting servers in sequential mode', 'info');
|
|
347
|
-
}
|
|
348
|
-
return this.runSequential(commands);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
cleanup(signal = 'SIGTERM') {
|
|
352
|
-
if (this.isCleaningUp)
|
|
353
|
-
return;
|
|
354
|
-
this.isCleaningUp = true;
|
|
355
|
-
logger_1.default.printLine('Cleaning up child processes...', 'warn');
|
|
356
|
-
const promises = [];
|
|
357
|
-
this.activeProcesses.forEach((proc, command) => {
|
|
358
|
-
if (proc.pid && !proc.killed) {
|
|
359
|
-
promises.push(this.killProcess(proc, command, signal));
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
// Wait for all processes to be killed
|
|
363
|
-
Promise.all(promises)
|
|
364
|
-
.then(() => {
|
|
365
|
-
this.activeProcesses.clear();
|
|
366
|
-
if (this.options.isServerMode && this.serverInfo.size > 0) {
|
|
367
|
-
logger_1.default.printLine('Server shutdown summary:', 'info');
|
|
368
|
-
this.serverInfo.forEach((info, command) => {
|
|
369
|
-
const statusColor = info.status === 'running'
|
|
370
|
-
? chalk_1.default.green
|
|
371
|
-
: info.status === 'error'
|
|
372
|
-
? chalk_1.default.red
|
|
373
|
-
: chalk_1.default.yellow;
|
|
374
|
-
logger_1.default.printLine(` ${command}: ${statusColor(info.status)}`, 'info');
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
})
|
|
378
|
-
.catch(error => {
|
|
379
|
-
logger_1.default.printLine(`Error during cleanup: ${error.message}`, 'error');
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
async killProcess(proc, command, signal) {
|
|
383
|
-
return new Promise(resolve => {
|
|
384
|
-
const timeout = setTimeout(() => {
|
|
385
|
-
if (proc.pid && !proc.killed) {
|
|
386
|
-
try {
|
|
387
|
-
proc.kill('SIGKILL');
|
|
388
|
-
logger_1.default.printLine(`Force killed process ${proc.pid} (${command}) with SIGKILL`, 'warn');
|
|
389
|
-
}
|
|
390
|
-
catch (error) {
|
|
391
|
-
logger_1.default.printLine(`Failed to force kill process ${proc.pid} (${command}): ${error.message}`, 'error');
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
resolve();
|
|
395
|
-
}, 5000); // 5 second timeout
|
|
396
|
-
proc.on('exit', () => {
|
|
397
|
-
clearTimeout(timeout);
|
|
398
|
-
logger_1.default.printLine(`Process ${proc.pid} (${command}) exited gracefully`, 'info');
|
|
399
|
-
resolve();
|
|
400
|
-
});
|
|
401
|
-
try {
|
|
402
|
-
// Try to kill the process gracefully first
|
|
403
|
-
proc.kill(signal);
|
|
404
|
-
logger_1.default.printLine(`Sent ${signal} to process ${proc.pid} (${command})`, 'info');
|
|
405
|
-
}
|
|
406
|
-
catch (error) {
|
|
407
|
-
logger_1.default.printLine(`Failed to send ${signal} to process ${proc.pid} (${command}): ${error.message}`, 'error');
|
|
408
|
-
clearTimeout(timeout);
|
|
409
|
-
resolve();
|
|
410
|
-
}
|
|
411
|
-
});
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
exports.Runner = Runner;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
export interface StartOptions {
|
|
2
|
-
file: string;
|
|
3
|
-
workingDir: string;
|
|
4
|
-
envFile: string;
|
|
5
|
-
port?: number;
|
|
6
|
-
workers: number;
|
|
7
|
-
memoryLimit?: string;
|
|
8
|
-
logLevel: string;
|
|
9
|
-
color: boolean;
|
|
10
|
-
verbose: boolean;
|
|
11
|
-
watch: boolean;
|
|
12
|
-
maxMemory?: string;
|
|
13
|
-
maxCrashes: number;
|
|
14
|
-
restartDelay: number;
|
|
15
|
-
healthCheck: boolean;
|
|
16
|
-
healthPort: number;
|
|
17
|
-
gracefulTimeout: number;
|
|
18
|
-
inspect: boolean;
|
|
19
|
-
inspectBrk: boolean;
|
|
20
|
-
nodeArgs?: string;
|
|
21
|
-
}
|
|
22
|
-
export declare class StartManager {
|
|
23
|
-
private options;
|
|
24
|
-
private workers;
|
|
25
|
-
private watcher;
|
|
26
|
-
private healthServer;
|
|
27
|
-
private isShuttingDown;
|
|
28
|
-
private debouncedRestart;
|
|
29
|
-
private startTime;
|
|
30
|
-
private totalRestarts;
|
|
31
|
-
private envLoaded;
|
|
32
|
-
private masterProcess;
|
|
33
|
-
constructor(options: StartOptions);
|
|
34
|
-
private log;
|
|
35
|
-
private loadEnvFile;
|
|
36
|
-
private parseMemoryLimit;
|
|
37
|
-
private getNodeArgs;
|
|
38
|
-
private startSingleProcess;
|
|
39
|
-
private startWorker;
|
|
40
|
-
private restartWorker;
|
|
41
|
-
private waitForProcessExit;
|
|
42
|
-
private startCluster;
|
|
43
|
-
private setupHealthCheck;
|
|
44
|
-
private setupWatcher;
|
|
45
|
-
private restartAll;
|
|
46
|
-
start(): Promise<void>;
|
|
47
|
-
stop(): Promise<void>;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=start-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start-manager.d.ts","sourceRoot":"","sources":["../../src/start-manager.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAWD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,EAAE,YAAY;IASjC,OAAO,CAAC,GAAG;IAOX,OAAO,CAAC,WAAW;IA0CnB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,WAAW;YA0BL,kBAAkB;IA4EhC,OAAO,CAAC,WAAW;YAiHL,aAAa;YAiCb,kBAAkB;YAqBlB,YAAY;IAoC1B,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,YAAY;YAqCN,UAAU;IA0CX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiDnC"}
|