jimeng-cli 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,11 +25,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  // src/cli/app.ts
26
26
  var import_node_process = __toESM(require("process"), 1);
27
27
 
28
- // src/lib/configs/service-config.ts
29
- var import_path3 = __toESM(require("path"), 1);
30
- var import_fs_extra3 = __toESM(require("fs-extra"), 1);
28
+ // src/lib/configs/system-config.ts
29
+ var import_path2 = __toESM(require("path"), 1);
30
+ var import_fs_extra2 = __toESM(require("fs-extra"), 1);
31
31
  var import_yaml = __toESM(require("yaml"), 1);
32
- var import_lodash3 = __toESM(require("lodash"), 1);
32
+ var import_lodash2 = __toESM(require("lodash"), 1);
33
33
 
34
34
  // src/lib/environment.ts
35
35
  var import_path = __toESM(require("path"), 1);
@@ -45,12 +45,6 @@ var Environment = class {
45
45
  envVars;
46
46
  /** 环境名称 */
47
47
  env;
48
- /** 服务名称 */
49
- name;
50
- /** 服务地址 */
51
- host;
52
- /** 服务端口 */
53
- port;
54
48
  /** 包参数 */
55
49
  package;
56
50
  constructor(options = {}) {
@@ -58,9 +52,6 @@ var Environment = class {
58
52
  this.cmdArgs = cmdArgs2;
59
53
  this.envVars = envVars2;
60
54
  this.env = import_lodash.default.defaultTo(cmdArgs2.env || envVars2.SERVER_ENV, "dev");
61
- this.name = cmdArgs2.name || envVars2.SERVER_NAME || void 0;
62
- this.host = cmdArgs2.host || envVars2.SERVER_HOST || void 0;
63
- this.port = Number(cmdArgs2.port || envVars2.SERVER_PORT) ? Number(cmdArgs2.port || envVars2.SERVER_PORT) : void 0;
64
55
  this.package = _package;
65
56
  }
66
57
  };
@@ -70,20 +61,98 @@ var environment_default = new Environment({
70
61
  package: JSON.parse(import_fs_extra.default.readFileSync(import_path.default.join(import_path.default.resolve(), "package.json")).toString())
71
62
  });
72
63
 
64
+ // src/lib/configs/system-config.ts
65
+ var CONFIG_PATH = import_path2.default.join(import_path2.default.resolve(), "configs/", environment_default.env, "/system.yml");
66
+ var SystemConfig = class _SystemConfig {
67
+ /** 是否开启请求日志 */
68
+ requestLog;
69
+ /** 临时目录路径 */
70
+ tmpDir;
71
+ /** 日志目录路径 */
72
+ logDir;
73
+ /** 日志写入间隔(毫秒) */
74
+ logWriteInterval;
75
+ /** 日志文件有效期(毫秒) */
76
+ logFileExpires;
77
+ /** 临时文件有效期(毫秒) */
78
+ tmpFileExpires;
79
+ /** 请求体配置 */
80
+ requestBody;
81
+ /** 是否调试模式 */
82
+ debug;
83
+ /** 日志级别 */
84
+ log_level;
85
+ constructor(options) {
86
+ const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
87
+ this.requestLog = import_lodash2.default.defaultTo(requestLog, false);
88
+ this.tmpDir = import_lodash2.default.defaultTo(tmpDir, "./tmp");
89
+ this.logDir = import_lodash2.default.defaultTo(logDir, "./logs");
90
+ this.logWriteInterval = import_lodash2.default.defaultTo(logWriteInterval, 200);
91
+ this.logFileExpires = import_lodash2.default.defaultTo(logFileExpires, 262656e4);
92
+ this.tmpFileExpires = import_lodash2.default.defaultTo(tmpFileExpires, 864e5);
93
+ this.requestBody = Object.assign(requestBody || {}, {
94
+ enableTypes: ["form", "text", "xml"],
95
+ // 移除 json,由自定义中间件处理
96
+ encoding: "utf-8",
97
+ formLimit: "100mb",
98
+ jsonLimit: "100mb",
99
+ textLimit: "100mb",
100
+ xmlLimit: "100mb",
101
+ formidable: {
102
+ maxFileSize: "100mb"
103
+ },
104
+ multipart: true,
105
+ parsedMethods: ["POST", "PUT", "PATCH"]
106
+ });
107
+ this.debug = import_lodash2.default.defaultTo(debug, true);
108
+ this.log_level = import_lodash2.default.defaultTo(log_level, "info");
109
+ }
110
+ get rootDirPath() {
111
+ return import_path2.default.resolve();
112
+ }
113
+ get tmpDirPath() {
114
+ return import_path2.default.resolve(this.tmpDir);
115
+ }
116
+ get logDirPath() {
117
+ return import_path2.default.resolve(this.logDir);
118
+ }
119
+ static load() {
120
+ if (!import_fs_extra2.default.pathExistsSync(CONFIG_PATH)) return new _SystemConfig();
121
+ const data = import_yaml.default.parse(import_fs_extra2.default.readFileSync(CONFIG_PATH).toString());
122
+ return new _SystemConfig(data);
123
+ }
124
+ };
125
+ var system_config_default = SystemConfig.load();
126
+
127
+ // src/lib/config.ts
128
+ var Config = class {
129
+ /** 系统配置 */
130
+ system = system_config_default;
131
+ };
132
+ var config_default = new Config();
133
+
134
+ // src/lib/logger.ts
135
+ var import_path4 = __toESM(require("path"), 1);
136
+ var import_util = __toESM(require("util"), 1);
137
+ var import_colors2 = require("colors");
138
+ var import_lodash4 = __toESM(require("lodash"), 1);
139
+ var import_fs_extra4 = __toESM(require("fs-extra"), 1);
140
+ var import_date_fns2 = require("date-fns");
141
+
73
142
  // src/lib/util.ts
74
143
  var import_os = __toESM(require("os"), 1);
75
- var import_path2 = __toESM(require("path"), 1);
144
+ var import_path3 = __toESM(require("path"), 1);
76
145
  var import_crypto = __toESM(require("crypto"), 1);
77
146
  var import_stream = require("stream");
78
147
  var import_colors = require("colors");
79
148
  var import_mime = __toESM(require("mime"), 1);
80
149
  var import_axios = __toESM(require("axios"), 1);
81
- var import_fs_extra2 = __toESM(require("fs-extra"), 1);
150
+ var import_fs_extra3 = __toESM(require("fs-extra"), 1);
82
151
  var import_uuid = require("uuid");
83
152
  var import_date_fns = require("date-fns");
84
153
  var import_crc_32 = __toESM(require("crc-32"), 1);
85
154
  var import_randomstring = __toESM(require("randomstring"), 1);
86
- var import_lodash2 = __toESM(require("lodash"), 1);
155
+ var import_lodash3 = __toESM(require("lodash"), 1);
87
156
  var import_cron = require("cron");
88
157
 
89
158
  // src/lib/http-status-codes.ts
@@ -200,7 +269,7 @@ var http_status_codes_default = {
200
269
  var autoIdMap = /* @__PURE__ */ new Map();
201
270
  var util = {
202
271
  is2DArrays(value) {
203
- return import_lodash2.default.isArray(value) && (!value[0] || import_lodash2.default.isArray(value[0]) && import_lodash2.default.isArray(value[value.length - 1]));
272
+ return import_lodash3.default.isArray(value) && (!value[0] || import_lodash3.default.isArray(value[0]) && import_lodash3.default.isArray(value[value.length - 1]));
204
273
  },
205
274
  uuid: (separator = true) => separator ? (0, import_uuid.v4)() : (0, import_uuid.v4)().replace(/\-/g, ""),
206
275
  autoId: (prefix = "") => {
@@ -210,8 +279,8 @@ var util = {
210
279
  return `${prefix}${index || 1}`;
211
280
  },
212
281
  ignoreJSONParse(value) {
213
- const result = import_lodash2.default.attempt(() => JSON.parse(value));
214
- if (import_lodash2.default.isError(result)) return null;
282
+ const result = import_lodash3.default.attempt(() => JSON.parse(value));
283
+ if (import_lodash3.default.isError(result)) return null;
215
284
  return result;
216
285
  },
217
286
  generateRandomString(options) {
@@ -226,11 +295,11 @@ var util = {
226
295
  return extension;
227
296
  },
228
297
  extractURLExtension(value) {
229
- const extname = import_path2.default.extname(new URL(value).pathname);
298
+ const extname = import_path3.default.extname(new URL(value).pathname);
230
299
  return extname.substring(1).toLowerCase();
231
300
  },
232
301
  createCronJob(cronPatterns, callback) {
233
- if (!import_lodash2.default.isFunction(callback))
302
+ if (!import_lodash3.default.isFunction(callback))
234
303
  throw new Error("callback must be an Function");
235
304
  return new import_cron.CronJob(
236
305
  cronPatterns,
@@ -283,14 +352,14 @@ retry: ${retry || 3e3}
283
352
  return import_os.default.platform() !== "win32";
284
353
  },
285
354
  isIPAddress(value) {
286
- return import_lodash2.default.isString(value) && (/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test(
355
+ return import_lodash3.default.isString(value) && (/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test(
287
356
  value
288
357
  ) || /\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*/.test(
289
358
  value
290
359
  ));
291
360
  },
292
361
  isPort(value) {
293
- return import_lodash2.default.isNumber(value) && value > 0 && value < 65536;
362
+ return import_lodash3.default.isNumber(value) && value > 0 && value < 65536;
294
363
  },
295
364
  isReadStream(value) {
296
365
  return value && (value instanceof import_stream.Readable || "readable" in value || value.readable);
@@ -299,16 +368,16 @@ retry: ${retry || 3e3}
299
368
  return value && (value instanceof import_stream.Writable || "writable" in value || value.writable);
300
369
  },
301
370
  isHttpStatusCode(value) {
302
- return import_lodash2.default.isNumber(value) && Object.values(http_status_codes_default).includes(value);
371
+ return import_lodash3.default.isNumber(value) && Object.values(http_status_codes_default).includes(value);
303
372
  },
304
373
  isURL(value) {
305
- return !import_lodash2.default.isUndefined(value) && /^(http|https)/.test(value);
374
+ return !import_lodash3.default.isUndefined(value) && /^(http|https)/.test(value);
306
375
  },
307
376
  isSrc(value) {
308
- return !import_lodash2.default.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value);
377
+ return !import_lodash3.default.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value);
309
378
  },
310
379
  isBASE64(value) {
311
- return !import_lodash2.default.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
380
+ return !import_lodash3.default.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
312
381
  },
313
382
  isBASE64Data(value) {
314
383
  return /^data:/.test(value);
@@ -325,7 +394,7 @@ retry: ${retry || 3e3}
325
394
  return /^(base64|json):/.test(value);
326
395
  },
327
396
  isStringNumber(value) {
328
- return import_lodash2.default.isFinite(Number(value));
397
+ return import_lodash3.default.isFinite(Number(value));
329
398
  },
330
399
  isUnixTimestamp(value) {
331
400
  return /^[0-9]{10}$/.test(`${value}`);
@@ -343,7 +412,7 @@ retry: ${retry || 3e3}
343
412
  },
344
413
  async isAPNG(filePath) {
345
414
  let head;
346
- const readStream = import_fs_extra2.default.createReadStream(filePath, { start: 37, end: 40 });
415
+ const readStream = import_fs_extra3.default.createReadStream(filePath, { start: 37, end: 40 });
347
416
  const readPromise = new Promise((resolve, reject) => {
348
417
  readStream.once("end", resolve);
349
418
  readStream.once("error", reject);
@@ -365,7 +434,7 @@ retry: ${retry || 3e3}
365
434
  return url;
366
435
  },
367
436
  millisecondsToHmss(milliseconds) {
368
- if (import_lodash2.default.isString(milliseconds)) return milliseconds;
437
+ if (import_lodash3.default.isString(milliseconds)) return milliseconds;
369
438
  milliseconds = parseInt(milliseconds);
370
439
  const sec = Math.floor(milliseconds / 1e3);
371
440
  const hours = Math.floor(sec / 3600);
@@ -393,10 +462,10 @@ retry: ${retry || 3e3}
393
462
  return import_crypto.default.createHash("md5").update(value).digest("hex");
394
463
  },
395
464
  crc32(value) {
396
- return import_lodash2.default.isBuffer(value) ? import_crc_32.default.buf(value) : import_crc_32.default.str(value);
465
+ return import_lodash3.default.isBuffer(value) ? import_crc_32.default.buf(value) : import_crc_32.default.str(value);
397
466
  },
398
467
  arrayParse(value) {
399
- return import_lodash2.default.isArray(value) ? value : [value];
468
+ return import_lodash3.default.isArray(value) ? value : [value];
400
469
  },
401
470
  booleanParse(value) {
402
471
  return value === "true" || value === true ? true : false;
@@ -437,141 +506,14 @@ retry: ${retry || 3e3}
437
506
  };
438
507
  var util_default = util;
439
508
 
440
- // src/lib/configs/service-config.ts
441
- var CONFIG_PATH = import_path3.default.join(import_path3.default.resolve(), "configs/", environment_default.env, "/service.yml");
442
- var ServiceConfig = class _ServiceConfig {
443
- /** 服务名称 */
444
- name;
445
- /** @type {string} 服务绑定主机地址 */
446
- host;
447
- /** @type {number} 服务绑定端口 */
448
- port;
449
- /** @type {string} 服务路由前缀 */
450
- urlPrefix;
451
- /** @type {string} 服务绑定地址(外部访问地址) */
452
- bindAddress;
453
- constructor(options) {
454
- const { name, host, port, urlPrefix, bindAddress } = options || {};
455
- this.name = import_lodash3.default.defaultTo(name, "jimeng-cli");
456
- this.host = import_lodash3.default.defaultTo(host, "0.0.0.0");
457
- this.port = import_lodash3.default.defaultTo(port, 5566);
458
- this.urlPrefix = import_lodash3.default.defaultTo(urlPrefix, "");
459
- this.bindAddress = bindAddress;
460
- }
461
- get addressHost() {
462
- if (this.bindAddress) return this.bindAddress;
463
- const ipAddresses = util_default.getIPAddressesByIPv4();
464
- for (let ipAddress of ipAddresses) {
465
- if (ipAddress === this.host)
466
- return ipAddress;
467
- }
468
- return ipAddresses[0] || "127.0.0.1";
469
- }
470
- get address() {
471
- return `${this.addressHost}:${this.port}`;
472
- }
473
- get pageDirUrl() {
474
- return `http://127.0.0.1:${this.port}/page`;
475
- }
476
- static load() {
477
- const external = import_lodash3.default.pickBy(environment_default, (v, k) => ["name", "host", "port"].includes(k) && !import_lodash3.default.isUndefined(v));
478
- if (!import_fs_extra3.default.pathExistsSync(CONFIG_PATH)) return new _ServiceConfig(external);
479
- const data = import_yaml.default.parse(import_fs_extra3.default.readFileSync(CONFIG_PATH).toString());
480
- return new _ServiceConfig({ ...data, ...external });
481
- }
482
- };
483
- var service_config_default = ServiceConfig.load();
484
-
485
- // src/lib/configs/system-config.ts
486
- var import_path4 = __toESM(require("path"), 1);
487
- var import_fs_extra4 = __toESM(require("fs-extra"), 1);
488
- var import_yaml2 = __toESM(require("yaml"), 1);
489
- var import_lodash4 = __toESM(require("lodash"), 1);
490
- var CONFIG_PATH2 = import_path4.default.join(import_path4.default.resolve(), "configs/", environment_default.env, "/system.yml");
491
- var SystemConfig = class _SystemConfig {
492
- /** 是否开启请求日志 */
493
- requestLog;
494
- /** 临时目录路径 */
495
- tmpDir;
496
- /** 日志目录路径 */
497
- logDir;
498
- /** 日志写入间隔(毫秒) */
499
- logWriteInterval;
500
- /** 日志文件有效期(毫秒) */
501
- logFileExpires;
502
- /** 临时文件有效期(毫秒) */
503
- tmpFileExpires;
504
- /** 请求体配置 */
505
- requestBody;
506
- /** 是否调试模式 */
507
- debug;
508
- /** 日志级别 */
509
- log_level;
510
- constructor(options) {
511
- const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
512
- this.requestLog = import_lodash4.default.defaultTo(requestLog, false);
513
- this.tmpDir = import_lodash4.default.defaultTo(tmpDir, "./tmp");
514
- this.logDir = import_lodash4.default.defaultTo(logDir, "./logs");
515
- this.logWriteInterval = import_lodash4.default.defaultTo(logWriteInterval, 200);
516
- this.logFileExpires = import_lodash4.default.defaultTo(logFileExpires, 262656e4);
517
- this.tmpFileExpires = import_lodash4.default.defaultTo(tmpFileExpires, 864e5);
518
- this.requestBody = Object.assign(requestBody || {}, {
519
- enableTypes: ["form", "text", "xml"],
520
- // 移除 json,由自定义中间件处理
521
- encoding: "utf-8",
522
- formLimit: "100mb",
523
- jsonLimit: "100mb",
524
- textLimit: "100mb",
525
- xmlLimit: "100mb",
526
- formidable: {
527
- maxFileSize: "100mb"
528
- },
529
- multipart: true,
530
- parsedMethods: ["POST", "PUT", "PATCH"]
531
- });
532
- this.debug = import_lodash4.default.defaultTo(debug, true);
533
- this.log_level = import_lodash4.default.defaultTo(log_level, "info");
534
- }
535
- get rootDirPath() {
536
- return import_path4.default.resolve();
537
- }
538
- get tmpDirPath() {
539
- return import_path4.default.resolve(this.tmpDir);
540
- }
541
- get logDirPath() {
542
- return import_path4.default.resolve(this.logDir);
543
- }
544
- static load() {
545
- if (!import_fs_extra4.default.pathExistsSync(CONFIG_PATH2)) return new _SystemConfig();
546
- const data = import_yaml2.default.parse(import_fs_extra4.default.readFileSync(CONFIG_PATH2).toString());
547
- return new _SystemConfig(data);
548
- }
549
- };
550
- var system_config_default = SystemConfig.load();
551
-
552
- // src/lib/config.ts
553
- var Config = class {
554
- /** 服务配置 */
555
- service = service_config_default;
556
- /** 系统配置 */
557
- system = system_config_default;
558
- };
559
- var config_default = new Config();
560
-
561
509
  // src/lib/logger.ts
562
- var import_path5 = __toESM(require("path"), 1);
563
- var import_util2 = __toESM(require("util"), 1);
564
- var import_colors2 = require("colors");
565
- var import_lodash5 = __toESM(require("lodash"), 1);
566
- var import_fs_extra5 = __toESM(require("fs-extra"), 1);
567
- var import_date_fns2 = require("date-fns");
568
510
  var isVercelEnv = process.env.VERCEL;
569
511
  var isCliSilentLogs = () => process.env.JIMENG_CLI_SILENT_LOGS === "true";
570
512
  var LogWriter = class {
571
513
  #buffers = [];
572
514
  #timer = null;
573
515
  constructor() {
574
- !isVercelEnv && import_fs_extra5.default.ensureDirSync(config_default.system.logDirPath);
516
+ !isVercelEnv && import_fs_extra4.default.ensureDirSync(config_default.system.logDirPath);
575
517
  !isVercelEnv && this.work();
576
518
  }
577
519
  push(content) {
@@ -579,14 +521,14 @@ var LogWriter = class {
579
521
  this.#buffers.push(buffer);
580
522
  }
581
523
  writeSync(buffer) {
582
- !isVercelEnv && import_fs_extra5.default.appendFileSync(import_path5.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
524
+ !isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
583
525
  }
584
526
  async write(buffer) {
585
- !isVercelEnv && await import_fs_extra5.default.appendFile(import_path5.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
527
+ !isVercelEnv && await import_fs_extra4.default.appendFile(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
586
528
  }
587
529
  flush() {
588
530
  if (!this.#buffers.length) return;
589
- !isVercelEnv && import_fs_extra5.default.appendFileSync(import_path5.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), Buffer.concat(this.#buffers));
531
+ !isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), Buffer.concat(this.#buffers));
590
532
  this.#buffers = [];
591
533
  }
592
534
  destroy() {
@@ -615,7 +557,7 @@ var LogText = class {
615
557
  time = /* @__PURE__ */ new Date();
616
558
  constructor(level, ...params) {
617
559
  this.level = level;
618
- this.text = import_util2.default.format.apply(null, params);
560
+ this.text = import_util.default.format.apply(null, params);
619
561
  this.source = this.#getStackTopCodeInfo();
620
562
  }
621
563
  #getStackTopCodeInfo() {
@@ -625,7 +567,7 @@ var LogText = class {
625
567
  if (!text)
626
568
  return unknownInfo;
627
569
  const match = text.match(/at (.+) \((.+)\)/) || text.match(/at (.+)/);
628
- if (!match || !import_lodash5.default.isString(match[2] || match[1]))
570
+ if (!match || !import_lodash4.default.isString(match[2] || match[1]))
629
571
  return unknownInfo;
630
572
  const temp = match[2] || match[1];
631
573
  const _match = temp.match(/([a-zA-Z0-9_\-\.]+)\:(\d+)\:(\d+)$/);
@@ -728,14 +670,14 @@ var Logger = class _Logger {
728
670
  var logger_default = new Logger();
729
671
 
730
672
  // src/lib/session-pool.ts
731
- var import_path6 = __toESM(require("path"), 1);
732
- var import_fs_extra6 = __toESM(require("fs-extra"), 1);
733
- var import_lodash8 = __toESM(require("lodash"), 1);
673
+ var import_path5 = __toESM(require("path"), 1);
674
+ var import_fs_extra5 = __toESM(require("fs-extra"), 1);
675
+ var import_lodash7 = __toESM(require("lodash"), 1);
734
676
 
735
677
  // src/api/controllers/core.ts
736
678
  var import_node_net = __toESM(require("net"), 1);
737
679
  var import_promises = __toESM(require("dns/promises"), 1);
738
- var import_lodash7 = __toESM(require("lodash"), 1);
680
+ var import_lodash6 = __toESM(require("lodash"), 1);
739
681
  var import_mime2 = __toESM(require("mime"), 1);
740
682
  var import_axios2 = __toESM(require("axios"), 1);
741
683
  var import_https_proxy_agent = require("https-proxy-agent");
@@ -743,7 +685,7 @@ var import_socks_proxy_agent = require("socks-proxy-agent");
743
685
 
744
686
  // src/lib/exceptions/Exception.ts
745
687
  var import_assert = __toESM(require("assert"), 1);
746
- var import_lodash6 = __toESM(require("lodash"), 1);
688
+ var import_lodash5 = __toESM(require("lodash"), 1);
747
689
  var Exception = class extends Error {
748
690
  /** 错误码 */
749
691
  errcode;
@@ -760,10 +702,10 @@ var Exception = class extends Error {
760
702
  * @param _errmsg 异常消息
761
703
  */
762
704
  constructor(exception, _errmsg) {
763
- (0, import_assert.default)(import_lodash6.default.isArray(exception), "Exception must be Array");
705
+ (0, import_assert.default)(import_lodash5.default.isArray(exception), "Exception must be Array");
764
706
  const [errcode, errmsg] = exception;
765
- (0, import_assert.default)(import_lodash6.default.isFinite(errcode), "Exception errcode invalid");
766
- (0, import_assert.default)(import_lodash6.default.isString(errmsg), "Exception errmsg invalid");
707
+ (0, import_assert.default)(import_lodash5.default.isFinite(errcode), "Exception errcode invalid");
708
+ (0, import_assert.default)(import_lodash5.default.isString(errmsg), "Exception errmsg invalid");
767
709
  super(_errmsg || errmsg);
768
710
  this.errcode = errcode;
769
711
  this.errmsg = _errmsg || errmsg;
@@ -777,7 +719,7 @@ var Exception = class extends Error {
777
719
  return this;
778
720
  }
779
721
  setData(value) {
780
- this.data = import_lodash6.default.defaultTo(value, null);
722
+ this.data = import_lodash5.default.defaultTo(value, null);
781
723
  return this;
782
724
  }
783
725
  };
@@ -1168,7 +1110,7 @@ async function acquireToken(refreshToken) {
1168
1110
  }
1169
1111
  var REGION_PREFIX_PATTERN = /^(us|hk|jp|sg)-/i;
1170
1112
  function parseRegionCode(value) {
1171
- if (!import_lodash7.default.isString(value)) return null;
1113
+ if (!import_lodash6.default.isString(value)) return null;
1172
1114
  const normalized = value.trim().toLowerCase();
1173
1115
  if (normalized === "cn" || normalized === "us" || normalized === "hk" || normalized === "jp" || normalized === "sg") {
1174
1116
  return normalized;
@@ -1369,7 +1311,7 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
1369
1311
  // 增加超时时间到45秒
1370
1312
  validateStatus: () => true,
1371
1313
  // 允许任何状态码
1372
- ...import_lodash7.default.omit(options, "params", "headers"),
1314
+ ...import_lodash6.default.omit(options, "params", "headers"),
1373
1315
  ...proxyAgent ? { httpAgent: proxyAgent, httpsAgent: proxyAgent, proxy: false } : {}
1374
1316
  });
1375
1317
  logger_default.info(`\u54CD\u5E94\u72B6\u6001: ${response.status} ${response.statusText}`);
@@ -1456,7 +1398,7 @@ async function checkImageContent(imageUri, refreshToken, regionInfo) {
1456
1398
  }
1457
1399
  function checkResult(result) {
1458
1400
  const { ret, errmsg, data } = result.data;
1459
- if (!import_lodash7.default.isFinite(Number(ret))) return result.data;
1401
+ if (!import_lodash6.default.isFinite(Number(ret))) return result.data;
1460
1402
  if (ret === "0") return data;
1461
1403
  JimengErrorHandler.handleApiResponse(result.data, {
1462
1404
  context: "\u5373\u68A6API\u8BF7\u6C42",
@@ -1502,7 +1444,7 @@ var TokenPool = class {
1502
1444
  roundRobinCursor = 0;
1503
1445
  constructor() {
1504
1446
  this.enabled = process.env.TOKEN_POOL_ENABLED !== "false";
1505
- this.filePath = import_path6.default.resolve(
1447
+ this.filePath = import_path5.default.resolve(
1506
1448
  process.env.TOKEN_POOL_FILE || "configs/token-pool.json"
1507
1449
  );
1508
1450
  this.healthCheckIntervalMs = Number(
@@ -1574,7 +1516,7 @@ var TokenPool = class {
1574
1516
  return this.pickTokenFromAuthorizationDetailed(authorization).token;
1575
1517
  }
1576
1518
  pickTokenFromAuthorizationDetailed(authorization) {
1577
- if (import_lodash8.default.isString(authorization)) {
1519
+ if (import_lodash7.default.isString(authorization)) {
1578
1520
  if (authorization.trim().length === 0) return { token: this.pickToken(), error: null };
1579
1521
  if (!/^Bearer\s+/i.test(authorization)) {
1580
1522
  return { token: null, error: "invalid_authorization_format" };
@@ -1583,7 +1525,7 @@ var TokenPool = class {
1583
1525
  if (tokens.length === 0) {
1584
1526
  return { token: null, error: "empty_authorization_tokens" };
1585
1527
  }
1586
- return { token: import_lodash8.default.sample(tokens) || null, error: null };
1528
+ return { token: import_lodash7.default.sample(tokens) || null, error: null };
1587
1529
  }
1588
1530
  return { token: this.pickToken(), error: null };
1589
1531
  }
@@ -1596,7 +1538,7 @@ var TokenPool = class {
1596
1538
  this.roundRobinCursor++;
1597
1539
  return token;
1598
1540
  }
1599
- return import_lodash8.default.sample(tokens) || null;
1541
+ return import_lodash7.default.sample(tokens) || null;
1600
1542
  }
1601
1543
  pickTokenForRequest({
1602
1544
  authorization,
@@ -1606,7 +1548,7 @@ var TokenPool = class {
1606
1548
  xRegion
1607
1549
  }) {
1608
1550
  const xRegionCode = parseRegionCode(xRegion);
1609
- if (import_lodash8.default.isString(xRegion) && xRegion.trim().length > 0 && !xRegionCode) {
1551
+ if (import_lodash7.default.isString(xRegion) && xRegion.trim().length > 0 && !xRegionCode) {
1610
1552
  return { token: null, region: null, error: "unsupported_region", reason: "X-Region \u4EC5\u652F\u6301 cn/us/hk/jp/sg" };
1611
1553
  }
1612
1554
  const authParseResult = this.parseAuthorizationTokens(authorization);
@@ -1803,14 +1745,14 @@ var TokenPool = class {
1803
1745
  if (typeof this.healthCheckTimer.unref === "function") this.healthCheckTimer.unref();
1804
1746
  }
1805
1747
  async loadFromDisk() {
1806
- await import_fs_extra6.default.ensureDir(import_path6.default.dirname(this.filePath));
1807
- if (!await import_fs_extra6.default.pathExists(this.filePath)) {
1748
+ await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
1749
+ if (!await import_fs_extra5.default.pathExists(this.filePath)) {
1808
1750
  await this.persistToDisk();
1809
1751
  return;
1810
1752
  }
1811
1753
  let data = null;
1812
1754
  try {
1813
- data = await import_fs_extra6.default.readJson(this.filePath);
1755
+ data = await import_fs_extra5.default.readJson(this.filePath);
1814
1756
  } catch (err) {
1815
1757
  logger_default.warn(`Token pool file parse failed, fallback to empty: ${(err == null ? void 0 : err.message) || String(err)}`);
1816
1758
  data = null;
@@ -1825,10 +1767,10 @@ var TokenPool = class {
1825
1767
  token,
1826
1768
  region: parsedRegion || void 0,
1827
1769
  enabled: raw.enabled !== false,
1828
- live: import_lodash8.default.isBoolean(raw.live) ? raw.live : void 0,
1829
- lastCheckedAt: import_lodash8.default.isFinite(Number(raw.lastCheckedAt)) ? Number(raw.lastCheckedAt) : void 0,
1830
- lastError: import_lodash8.default.isString(raw.lastError) ? raw.lastError : void 0,
1831
- lastCredit: import_lodash8.default.isFinite(Number(raw.lastCredit)) ? Number(raw.lastCredit) : void 0,
1770
+ live: import_lodash7.default.isBoolean(raw.live) ? raw.live : void 0,
1771
+ lastCheckedAt: import_lodash7.default.isFinite(Number(raw.lastCheckedAt)) ? Number(raw.lastCheckedAt) : void 0,
1772
+ lastError: import_lodash7.default.isString(raw.lastError) ? raw.lastError : void 0,
1773
+ lastCredit: import_lodash7.default.isFinite(Number(raw.lastCredit)) ? Number(raw.lastCredit) : void 0,
1832
1774
  consecutiveFailures: Math.max(0, Number(raw.consecutiveFailures) || 0),
1833
1775
  allowedModels: this.normalizeStringArray(raw.allowedModels),
1834
1776
  capabilityTags: this.normalizeStringArray(raw.capabilityTags),
@@ -1839,19 +1781,19 @@ var TokenPool = class {
1839
1781
  for (const [token, item] of nextMap.entries()) this.entryMap.set(token, item);
1840
1782
  }
1841
1783
  async persistToDisk() {
1842
- await import_fs_extra6.default.ensureDir(import_path6.default.dirname(this.filePath));
1784
+ await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
1843
1785
  const payload = {
1844
1786
  updatedAt: Date.now(),
1845
1787
  tokens: this.getEntries(false)
1846
1788
  };
1847
- await import_fs_extra6.default.writeJson(this.filePath, payload, { spaces: 2 });
1789
+ await import_fs_extra5.default.writeJson(this.filePath, payload, { spaces: 2 });
1848
1790
  }
1849
1791
  maskToken(token) {
1850
1792
  if (token.length <= 10) return "***";
1851
1793
  return `${token.slice(0, 4)}...${token.slice(-4)}`;
1852
1794
  }
1853
1795
  parseAuthorizationTokens(authorization) {
1854
- if (!import_lodash8.default.isString(authorization) || authorization.trim().length === 0) {
1796
+ if (!import_lodash7.default.isString(authorization) || authorization.trim().length === 0) {
1855
1797
  return { tokens: [], error: null };
1856
1798
  }
1857
1799
  if (!/^Bearer\s+/i.test(authorization)) {
@@ -1864,7 +1806,7 @@ var TokenPool = class {
1864
1806
  normalizeAddTokens(rawTokens, defaultRegion) {
1865
1807
  const normalized = [];
1866
1808
  for (const item of rawTokens) {
1867
- if (import_lodash8.default.isString(item)) {
1809
+ if (import_lodash7.default.isString(item)) {
1868
1810
  const token2 = item.trim();
1869
1811
  if (!token2) continue;
1870
1812
  if (!defaultRegion) {
@@ -1902,7 +1844,7 @@ var TokenPool = class {
1902
1844
  imageModels: this.normalizeStringArray(data.imageModels),
1903
1845
  videoModels: this.normalizeStringArray(data.videoModels),
1904
1846
  capabilityTags: this.normalizeStringArray(data.capabilityTags),
1905
- updatedAt: import_lodash8.default.isFinite(Number(data.updatedAt)) ? Number(data.updatedAt) : void 0
1847
+ updatedAt: import_lodash7.default.isFinite(Number(data.updatedAt)) ? Number(data.updatedAt) : void 0
1906
1848
  };
1907
1849
  if (!dynamic.imageModels && !dynamic.videoModels && !dynamic.capabilityTags && !dynamic.updatedAt) {
1908
1850
  return void 0;
@@ -1947,7 +1889,7 @@ var TokenPool = class {
1947
1889
  this.roundRobinCursor++;
1948
1890
  return item;
1949
1891
  }
1950
- return import_lodash8.default.sample(candidates) || candidates[0];
1892
+ return import_lodash7.default.sample(candidates) || candidates[0];
1951
1893
  }
1952
1894
  matchesModelAndCapabilities(candidate, requestedModel, taskType, requiredCapabilityTags) {
1953
1895
  var _a, _b, _c, _d;
@@ -3284,9 +3226,9 @@ var RegionUtils = class {
3284
3226
  /**
3285
3227
  * 获取Referer路径
3286
3228
  */
3287
- static getRefererPath(regionInfo, path10 = "/ai-tool/generate") {
3229
+ static getRefererPath(regionInfo, path9 = "/ai-tool/generate") {
3288
3230
  const origin = this.getOrigin(regionInfo);
3289
- return `${origin}${path10}`;
3231
+ return `${origin}${path9}`;
3290
3232
  }
3291
3233
  };
3292
3234
 
@@ -3829,7 +3771,7 @@ function buildBlendAbilityList(uploadedImageIds, strength) {
3829
3771
  }));
3830
3772
  }
3831
3773
  function buildPromptPlaceholderList(count) {
3832
- return Array.from({ length: count }, (_9, index) => ({
3774
+ return Array.from({ length: count }, (_8, index) => ({
3833
3775
  type: "",
3834
3776
  id: util_default.uuid(),
3835
3777
  ability_index: index
@@ -4329,7 +4271,7 @@ async function generateJimeng4xMultiImages(_model, prompt, {
4329
4271
  }
4330
4272
 
4331
4273
  // src/api/controllers/videos.ts
4332
- var import_fs_extra7 = __toESM(require("fs-extra"), 1);
4274
+ var import_fs_extra6 = __toESM(require("fs-extra"), 1);
4333
4275
  var import_axios5 = __toESM(require("axios"), 1);
4334
4276
 
4335
4277
  // src/lib/video-uploader.ts
@@ -4621,7 +4563,7 @@ function getVideoBenefitType(model) {
4621
4563
  async function uploadImageFromFile(file, refreshToken, regionInfo) {
4622
4564
  try {
4623
4565
  logger_default.info(`\u5F00\u59CB\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247: ${file.originalFilename} (\u8DEF\u5F84: ${file.filepath})`);
4624
- const imageBuffer = await import_fs_extra7.default.readFile(file.filepath);
4566
+ const imageBuffer = await import_fs_extra6.default.readFile(file.filepath);
4625
4567
  return await uploadImageBuffer(imageBuffer, refreshToken, regionInfo);
4626
4568
  } catch (error) {
4627
4569
  logger_default.error(`\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247\u5931\u8D25: ${error.message}`);
@@ -4832,7 +4774,7 @@ async function generateVideo(_model, prompt, {
4832
4774
  throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
4833
4775
  }
4834
4776
  if (imageFile) {
4835
- const buf = await import_fs_extra7.default.readFile(imageFile.filepath);
4777
+ const buf = await import_fs_extra6.default.readFile(imageFile.filepath);
4836
4778
  imgResult = await uploadImageBuffer(buf, refreshToken, regionInfo);
4837
4779
  await checkImageContent(imgResult.uri, refreshToken, regionInfo);
4838
4780
  const entry = {
@@ -4909,7 +4851,7 @@ async function generateVideo(_model, prompt, {
4909
4851
  throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
4910
4852
  }
4911
4853
  if (videoFile) {
4912
- const buf = await import_fs_extra7.default.readFile(videoFile.filepath);
4854
+ const buf = await import_fs_extra6.default.readFile(videoFile.filepath);
4913
4855
  vResult = await uploadVideoBuffer(buf, refreshToken, regionInfo);
4914
4856
  totalVideoDuration += vResult.videoMeta.duration;
4915
4857
  const entry = {
@@ -5412,8 +5354,8 @@ async function generateVideo(_model, prompt, {
5412
5354
 
5413
5355
  // src/cli/video-input.ts
5414
5356
  var import_node_path2 = __toESM(require("path"), 1);
5415
- var VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (_9, i) => `image-file-${i + 1}`);
5416
- var VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (_9, i) => `video-file-${i + 1}`);
5357
+ var VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (_8, i) => `image-file-${i + 1}`);
5358
+ var VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (_8, i) => `video-file-${i + 1}`);
5417
5359
  var VIDEO_SUPPORTED_MODES = [
5418
5360
  "text_to_video",
5419
5361
  "image_to_video",