neex 0.6.63 → 0.6.65
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/dist/src/dev-manager.js +50 -105
- package/dist/src/start-manager.js +13 -6
- package/package.json +1 -1
package/dist/src/dev-manager.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
@@ -13,7 +36,19 @@ const figures_1 = __importDefault(require("figures"));
|
|
|
13
36
|
const path_1 = __importDefault(require("path"));
|
|
14
37
|
const fs_1 = __importDefault(require("fs"));
|
|
15
38
|
const lodash_1 = require("lodash");
|
|
16
|
-
|
|
39
|
+
async function isCommandAvailable(command) {
|
|
40
|
+
try {
|
|
41
|
+
const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
exec(`command -v ${command}`, (error) => {
|
|
44
|
+
resolve(!error);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
17
52
|
class DevManager {
|
|
18
53
|
constructor(options) {
|
|
19
54
|
this.process = null;
|
|
@@ -47,109 +82,24 @@ class DevManager {
|
|
|
47
82
|
}
|
|
48
83
|
}
|
|
49
84
|
}
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
(0, child_process_2.execSync)(`command -v ${command}`, { stdio: 'ignore' });
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
catch (_a) {
|
|
56
|
-
try {
|
|
57
|
-
(0, child_process_2.execSync)(`where ${command}`, { stdio: 'ignore' });
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
catch (_b) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
findBestExecutor() {
|
|
66
|
-
const fileExt = path_1.default.extname(this.options.file).toLowerCase();
|
|
67
|
-
const isTypeScript = fileExt === '.ts' || fileExt === '.tsx';
|
|
68
|
-
// اگر کاربر خودش command مشخص کرده
|
|
85
|
+
async getExecuteCommand() {
|
|
69
86
|
if (this.options.execCommand) {
|
|
70
87
|
const parts = this.options.execCommand.split(' ');
|
|
71
|
-
return {
|
|
72
|
-
command: parts[0],
|
|
73
|
-
args: [...parts.slice(1), this.options.file],
|
|
74
|
-
needsRegister: false
|
|
75
|
-
};
|
|
88
|
+
return { command: parts[0], args: [...parts.slice(1), this.options.file] };
|
|
76
89
|
}
|
|
77
|
-
|
|
90
|
+
// Default to tsx for TypeScript files
|
|
91
|
+
const tsxExists = await isCommandAvailable('tsx');
|
|
92
|
+
if (!tsxExists) {
|
|
93
|
+
throw new Error('`tsx` command not found. Please install `tsx`');
|
|
94
|
+
}
|
|
95
|
+
const args = [this.options.file];
|
|
78
96
|
if (this.options.inspect) {
|
|
79
|
-
|
|
97
|
+
args.unshift('--inspect');
|
|
80
98
|
}
|
|
81
99
|
if (this.options.inspectBrk) {
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
// بررسی tsx
|
|
85
|
-
if (this.checkCommandExists('tsx')) {
|
|
86
|
-
if (this.options.verbose) {
|
|
87
|
-
logger_manager_js_1.loggerManager.printLine('Using tsx for execution', 'info');
|
|
88
|
-
}
|
|
89
|
-
return { command: 'tsx', args: baseArgs, needsRegister: false };
|
|
90
|
-
}
|
|
91
|
-
// بررسی ts-node
|
|
92
|
-
if (isTypeScript && this.checkCommandExists('ts-node')) {
|
|
93
|
-
if (this.options.verbose) {
|
|
94
|
-
logger_manager_js_1.loggerManager.printLine('Using ts-node for execution', 'info');
|
|
95
|
-
}
|
|
96
|
-
return { command: 'ts-node', args: baseArgs, needsRegister: false };
|
|
97
|
-
}
|
|
98
|
-
// بررسی bun
|
|
99
|
-
if (this.checkCommandExists('bun')) {
|
|
100
|
-
if (this.options.verbose) {
|
|
101
|
-
logger_manager_js_1.loggerManager.printLine('Using bun for execution', 'info');
|
|
102
|
-
}
|
|
103
|
-
return { command: 'bun', args: baseArgs, needsRegister: false };
|
|
104
|
-
}
|
|
105
|
-
// بررسی deno
|
|
106
|
-
if (this.checkCommandExists('deno')) {
|
|
107
|
-
if (this.options.verbose) {
|
|
108
|
-
logger_manager_js_1.loggerManager.printLine('Using deno for execution', 'info');
|
|
109
|
-
}
|
|
110
|
-
return { command: 'deno', args: ['run', '--allow-all', this.options.file], needsRegister: false };
|
|
111
|
-
}
|
|
112
|
-
// Fallback به node با ts-node/register اگر فایل TypeScript باشه
|
|
113
|
-
if (isTypeScript) {
|
|
114
|
-
// بررسی ts-node/register
|
|
115
|
-
try {
|
|
116
|
-
require.resolve('ts-node/register');
|
|
117
|
-
if (this.options.verbose) {
|
|
118
|
-
logger_manager_js_1.loggerManager.printLine('Using node with ts-node/register', 'info');
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
command: 'node',
|
|
122
|
-
args: ['--require', 'ts-node/register', ...baseArgs],
|
|
123
|
-
needsRegister: true
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
catch (_a) {
|
|
127
|
-
// اگر ts-node نباشه، خطا بده
|
|
128
|
-
throw new Error('TypeScript file detected but no TypeScript executor found. Please install one of:\n' +
|
|
129
|
-
' • tsx: npm install -g tsx\n' +
|
|
130
|
-
' • ts-node: npm install -g ts-node\n' +
|
|
131
|
-
' • bun: curl -fsSL https://bun.sh/install | bash\n' +
|
|
132
|
-
' • Or compile to JavaScript first');
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// برای فایلهای JavaScript از node استفاده کن
|
|
136
|
-
if (this.options.verbose) {
|
|
137
|
-
logger_manager_js_1.loggerManager.printLine('Using node for execution', 'info');
|
|
138
|
-
}
|
|
139
|
-
return { command: 'node', args: baseArgs, needsRegister: false };
|
|
140
|
-
}
|
|
141
|
-
showExecutorInfo(executor) {
|
|
142
|
-
const fileExt = path_1.default.extname(this.options.file).toLowerCase();
|
|
143
|
-
const isTypeScript = fileExt === '.ts' || fileExt === '.tsx';
|
|
144
|
-
if (!this.options.quiet) {
|
|
145
|
-
if (isTypeScript && executor.command === 'node' && executor.needsRegister) {
|
|
146
|
-
logger_manager_js_1.loggerManager.printLine(`${chalk_1.default.yellow(figures_1.default.warning)} TypeScript support via ts-node/register (consider installing tsx for better performance)`, 'warn');
|
|
147
|
-
}
|
|
148
|
-
if (this.options.verbose) {
|
|
149
|
-
logger_manager_js_1.loggerManager.printLine(`Executor: ${executor.command}`, 'info');
|
|
150
|
-
logger_manager_js_1.loggerManager.printLine(`Arguments: ${executor.args.join(' ')}`, 'info');
|
|
151
|
-
}
|
|
100
|
+
args.unshift('--inspect-brk');
|
|
152
101
|
}
|
|
102
|
+
return { command: 'tsx', args };
|
|
153
103
|
}
|
|
154
104
|
clearConsole() {
|
|
155
105
|
if (this.options.clearConsole && process.stdout.isTTY) {
|
|
@@ -162,12 +112,11 @@ class DevManager {
|
|
|
162
112
|
return;
|
|
163
113
|
}
|
|
164
114
|
this.loadEnvFile();
|
|
165
|
-
const
|
|
166
|
-
this.showExecutorInfo(executor);
|
|
115
|
+
const { command, args } = await this.getExecuteCommand();
|
|
167
116
|
if (this.options.verbose) {
|
|
168
|
-
logger_manager_js_1.loggerManager.printLine(`Executing: ${
|
|
117
|
+
logger_manager_js_1.loggerManager.printLine(`Executing: ${command} ${args.join(' ')}`, 'info');
|
|
169
118
|
}
|
|
170
|
-
this.process = (0, child_process_1.spawn)(
|
|
119
|
+
this.process = (0, child_process_1.spawn)(command, args, {
|
|
171
120
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
172
121
|
shell: false,
|
|
173
122
|
env: {
|
|
@@ -195,10 +144,6 @@ class DevManager {
|
|
|
195
144
|
});
|
|
196
145
|
this.process.on('error', (error) => {
|
|
197
146
|
logger_manager_js_1.loggerManager.printLine(`Process error: ${error.message}`, 'error');
|
|
198
|
-
// اگر خطا مربوط به نبود command باشه، راهنمایی بده
|
|
199
|
-
if (error.message.includes('ENOENT')) {
|
|
200
|
-
logger_manager_js_1.loggerManager.printLine('Command not found. Please check if the executor is installed and accessible.', 'error');
|
|
201
|
-
}
|
|
202
147
|
});
|
|
203
148
|
this.process.on('exit', (code, signal) => {
|
|
204
149
|
if (this.process) {
|
|
@@ -190,7 +190,14 @@ class StartManager {
|
|
|
190
190
|
// Handle worker output
|
|
191
191
|
(_a = workerProcess.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
192
192
|
const message = data.toString().trim();
|
|
193
|
-
|
|
193
|
+
// Suppress common startup messages from workers
|
|
194
|
+
if (message &&
|
|
195
|
+
!message.includes('[dotenv@') &&
|
|
196
|
+
!message.includes('injecting env') &&
|
|
197
|
+
!/express/i.test(message) &&
|
|
198
|
+
!/local:/i.test(message) &&
|
|
199
|
+
!/health check:/i.test(message) &&
|
|
200
|
+
!/environment:/i.test(message)) {
|
|
194
201
|
const prefix = this.options.verbose ?
|
|
195
202
|
chalk_1.default.dim(`[Worker ${workerId}] `) : '';
|
|
196
203
|
console.log(prefix + message);
|
|
@@ -290,16 +297,21 @@ class StartManager {
|
|
|
290
297
|
return;
|
|
291
298
|
}
|
|
292
299
|
// Multi-worker mode
|
|
300
|
+
this.log(`${chalk_1.default.blue(figures_1.default.play)} Starting production server (${this.options.workers} workers)`);
|
|
293
301
|
const startPromises = [];
|
|
294
302
|
for (let i = 0; i < this.options.workers; i++) {
|
|
295
303
|
startPromises.push(this.startWorker(i + 1));
|
|
296
304
|
}
|
|
297
305
|
try {
|
|
298
306
|
await Promise.all(startPromises);
|
|
307
|
+
this.log(`${chalk_1.default.green(figures_1.default.tick)} Server ready on port ${this.options.port || 8000} (${this.workers.size} workers)`);
|
|
299
308
|
}
|
|
300
309
|
catch (error) {
|
|
301
310
|
this.log(`Failed to start some workers: ${error.message}`, 'error');
|
|
302
311
|
// Continue with successfully started workers
|
|
312
|
+
if (this.workers.size > 0) {
|
|
313
|
+
this.log(`${chalk_1.default.green(figures_1.default.tick)} Server partially ready on port ${this.options.port || 8000} (${this.workers.size} workers)`);
|
|
314
|
+
}
|
|
303
315
|
}
|
|
304
316
|
}
|
|
305
317
|
setupHealthCheck() {
|
|
@@ -420,11 +432,6 @@ class StartManager {
|
|
|
420
432
|
this.setupWatcher();
|
|
421
433
|
// Start the application
|
|
422
434
|
await this.startCluster();
|
|
423
|
-
// Success message
|
|
424
|
-
const port = this.options.port || 8000;
|
|
425
|
-
const workerInfo = this.options.workers === 1 ?
|
|
426
|
-
'' : ` (${this.workers.size} workers)`;
|
|
427
|
-
logger_manager_js_1.loggerManager.printLine(`${chalk_1.default.green(figures_1.default.tick)} Server ready on port ${port}${workerInfo}`, 'info');
|
|
428
435
|
}
|
|
429
436
|
catch (error) {
|
|
430
437
|
this.log(`Failed to start server: ${error.message}`, 'error');
|