jinbi-utils 1.0.26 → 1.0.28

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/index.esm.js CHANGED
@@ -1,6 +1,124 @@
1
1
  import axios from 'axios';
2
- import { spawn } from 'child_process';
3
2
  import { defineStore } from 'pinia';
3
+ import Decimal from 'decimal.js';
4
+ export { default as Decimal } from 'decimal.js';
5
+ import REGION_DATA from 'china-area-data';
6
+ import { cloneDeep } from 'lodash-es';
7
+ import mitt from 'mitt';
8
+ import { sm3 as sm3$1 } from 'sm-crypto';
9
+
10
+ /*! *****************************************************************************
11
+ Copyright (c) Microsoft Corporation.
12
+
13
+ Permission to use, copy, modify, and/or distribute this software for any
14
+ purpose with or without fee is hereby granted.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
17
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
19
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
20
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
21
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
+ PERFORMANCE OF THIS SOFTWARE.
23
+ ***************************************************************************** */
24
+ /* global Reflect, Promise */
25
+
26
+ var extendStatics = function(d, b) {
27
+ extendStatics = Object.setPrototypeOf ||
28
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
29
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
30
+ return extendStatics(d, b);
31
+ };
32
+
33
+ function __extends(d, b) {
34
+ extendStatics(d, b);
35
+ function __() { this.constructor = d; }
36
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
37
+ }
38
+
39
+ var __assign = function() {
40
+ __assign = Object.assign || function __assign(t) {
41
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
42
+ s = arguments[i];
43
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
44
+ }
45
+ return t;
46
+ };
47
+ return __assign.apply(this, arguments);
48
+ };
49
+
50
+ function __awaiter(thisArg, _arguments, P, generator) {
51
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
52
+ return new (P || (P = Promise))(function (resolve, reject) {
53
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
54
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
55
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
56
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
57
+ });
58
+ }
59
+
60
+ function __generator(thisArg, body) {
61
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
62
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
63
+ function verb(n) { return function (v) { return step([n, v]); }; }
64
+ function step(op) {
65
+ if (f) throw new TypeError("Generator is already executing.");
66
+ while (_) try {
67
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
68
+ if (y = 0, t) op = [op[0] & 2, t.value];
69
+ switch (op[0]) {
70
+ case 0: case 1: t = op; break;
71
+ case 4: _.label++; return { value: op[1], done: false };
72
+ case 5: _.label++; y = op[1]; op = [0]; continue;
73
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
74
+ default:
75
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
76
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
77
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
78
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
79
+ if (t[2]) _.ops.pop();
80
+ _.trys.pop(); continue;
81
+ }
82
+ op = body.call(thisArg, _);
83
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
84
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
85
+ }
86
+ }
87
+
88
+ function __values(o) {
89
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
90
+ if (m) return m.call(o);
91
+ if (o && typeof o.length === "number") return {
92
+ next: function () {
93
+ if (o && i >= o.length) o = void 0;
94
+ return { value: o && o[i++], done: !o };
95
+ }
96
+ };
97
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
98
+ }
99
+
100
+ function __read(o, n) {
101
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
102
+ if (!m) return o;
103
+ var i = m.call(o), r, ar = [], e;
104
+ try {
105
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
106
+ }
107
+ catch (error) { e = { error: error }; }
108
+ finally {
109
+ try {
110
+ if (r && !r.done && (m = i["return"])) m.call(i);
111
+ }
112
+ finally { if (e) throw e.error; }
113
+ }
114
+ return ar;
115
+ }
116
+
117
+ function __spread() {
118
+ for (var ar = [], i = 0; i < arguments.length; i++)
119
+ ar = ar.concat(__read(arguments[i]));
120
+ return ar;
121
+ }
4
122
 
5
123
  var fromTypeMap = {
6
124
  isWxWork: 'wecom',
@@ -265,7 +383,7 @@ var isImage = function (type) {
265
383
  };
266
384
  // 获取文件数据
267
385
  var getFileData = function (optionName) {
268
- var _a = optionName.split(','), _b = _a[0], name = _b === void 0 ? '' : _b, _c = _a[1], url = _c === void 0 ? '' : _c;
386
+ var _a = __read(optionName.split(','), 2), _b = _a[0], name = _b === void 0 ? '' : _b, _c = _a[1], url = _c === void 0 ? '' : _c;
269
387
  return {
270
388
  name: decodeURIComponent(name),
271
389
  url: decodeURIComponent(url)
@@ -469,92 +587,6 @@ function addDays(date, days, fmt) {
469
587
  }
470
588
  // 获取当前时间月份
471
589
 
472
- /*! *****************************************************************************
473
- Copyright (c) Microsoft Corporation.
474
-
475
- Permission to use, copy, modify, and/or distribute this software for any
476
- purpose with or without fee is hereby granted.
477
-
478
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
479
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
480
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
481
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
482
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
483
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
484
- PERFORMANCE OF THIS SOFTWARE.
485
- ***************************************************************************** */
486
- /* global Reflect, Promise */
487
-
488
- var extendStatics = function(d, b) {
489
- extendStatics = Object.setPrototypeOf ||
490
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
491
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
492
- return extendStatics(d, b);
493
- };
494
-
495
- function __extends(d, b) {
496
- extendStatics(d, b);
497
- function __() { this.constructor = d; }
498
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
499
- }
500
-
501
- var __assign = function() {
502
- __assign = Object.assign || function __assign(t) {
503
- for (var s, i = 1, n = arguments.length; i < n; i++) {
504
- s = arguments[i];
505
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
506
- }
507
- return t;
508
- };
509
- return __assign.apply(this, arguments);
510
- };
511
-
512
- function __awaiter(thisArg, _arguments, P, generator) {
513
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
514
- return new (P || (P = Promise))(function (resolve, reject) {
515
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
516
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
517
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
518
- step((generator = generator.apply(thisArg, _arguments || [])).next());
519
- });
520
- }
521
-
522
- function __generator(thisArg, body) {
523
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
524
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
525
- function verb(n) { return function (v) { return step([n, v]); }; }
526
- function step(op) {
527
- if (f) throw new TypeError("Generator is already executing.");
528
- while (_) try {
529
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
530
- if (y = 0, t) op = [op[0] & 2, t.value];
531
- switch (op[0]) {
532
- case 0: case 1: t = op; break;
533
- case 4: _.label++; return { value: op[1], done: false };
534
- case 5: _.label++; y = op[1]; op = [0]; continue;
535
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
536
- default:
537
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
538
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
539
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
540
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
541
- if (t[2]) _.ops.pop();
542
- _.trys.pop(); continue;
543
- }
544
- op = body.call(thisArg, _);
545
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
546
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
547
- }
548
- }
549
-
550
- function __spreadArrays() {
551
- for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
552
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
553
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
554
- r[k] = a[j];
555
- return r;
556
- }
557
-
558
590
  /**
559
591
  * number处理相关
560
592
  * @packageDocumentation
@@ -1240,12 +1272,6 @@ function isUrl(value) {
1240
1272
  return new RegExp(pattern, 'i').test(value);
1241
1273
  }
1242
1274
 
1243
- /**
1244
- * string处理相关
1245
- * @packageDocumentation
1246
- * @module String
1247
- * @preferred
1248
- */
1249
1275
  /**
1250
1276
  * 空值处理
1251
1277
  */
@@ -1367,6 +1393,7 @@ function subBefore(str, delimiter) {
1367
1393
  * @returns 查询参数对象
1368
1394
  */
1369
1395
  function getQueryMap(url) {
1396
+ var e_1, _a;
1370
1397
  var pattern = /^(?:(https?|ftp|rtsp|mms|ws|wss):\/\/)?/i;
1371
1398
  if (!pattern.test(url)) {
1372
1399
  console.error(url + "\u4E0D\u7B26\u5408\u8D85\u94FE\u63A5\u89C4\u8303");
@@ -1378,12 +1405,21 @@ function getQueryMap(url) {
1378
1405
  var queryString = url.slice(queryIndex + 1);
1379
1406
  var params = queryString.split('&');
1380
1407
  var result = {};
1381
- for (var _i = 0, params_1 = params; _i < params_1.length; _i++) {
1382
- var param = params_1[_i];
1383
- var _a = param.split('='), key = _a[0], value = _a[1];
1384
- if (key) {
1385
- result[key] = value || '';
1408
+ try {
1409
+ for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
1410
+ var param = params_1_1.value;
1411
+ var _b = __read(param.split('='), 2), key = _b[0], value = _b[1];
1412
+ if (key) {
1413
+ result[key] = value || '';
1414
+ }
1415
+ }
1416
+ }
1417
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1418
+ finally {
1419
+ try {
1420
+ if (params_1_1 && !params_1_1.done && (_a = params_1.return)) _a.call(params_1);
1386
1421
  }
1422
+ finally { if (e_1) throw e_1.error; }
1387
1423
  }
1388
1424
  return result;
1389
1425
  }
@@ -1395,6 +1431,7 @@ function getQueryMap(url) {
1395
1431
  * @returns 处理后的字符串
1396
1432
  */
1397
1433
  function hideTextAtIndex(text, indexes, mask) {
1434
+ var e_2, _a;
1398
1435
  if (mask === void 0) { mask = '*'; }
1399
1436
  if (typeof text === 'number') {
1400
1437
  text = text.toString();
@@ -1403,20 +1440,29 @@ function hideTextAtIndex(text, indexes, mask) {
1403
1440
  indexes = [indexes];
1404
1441
  }
1405
1442
  var chars = text.split('');
1406
- for (var _i = 0, indexes_1 = indexes; _i < indexes_1.length; _i++) {
1407
- var index = indexes_1[_i];
1408
- if (typeof index === 'object' && !Array.isArray(index)) {
1409
- var start = index.start, end = index.end;
1410
- if (start >= 0 && start < end && end < chars.length) {
1411
- chars.fill(mask, start, end + 1);
1443
+ try {
1444
+ for (var indexes_1 = __values(indexes), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
1445
+ var index = indexes_1_1.value;
1446
+ if (typeof index === 'object' && !Array.isArray(index)) {
1447
+ var start = index.start, end = index.end;
1448
+ if (start >= 0 && start < end && end < chars.length) {
1449
+ chars.fill(mask, start, end + 1);
1450
+ }
1412
1451
  }
1413
- }
1414
- else if (typeof index === 'number' && Number.isInteger(index) && index >= 0) {
1415
- if (index < chars.length) {
1416
- chars[index] = mask;
1452
+ else if (typeof index === 'number' && Number.isInteger(index) && index >= 0) {
1453
+ if (index < chars.length) {
1454
+ chars[index] = mask;
1455
+ }
1417
1456
  }
1418
1457
  }
1419
1458
  }
1459
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
1460
+ finally {
1461
+ try {
1462
+ if (indexes_1_1 && !indexes_1_1.done && (_a = indexes_1.return)) _a.call(indexes_1);
1463
+ }
1464
+ finally { if (e_2) throw e_2.error; }
1465
+ }
1420
1466
  return chars.join('');
1421
1467
  }
1422
1468
 
@@ -1626,7 +1672,7 @@ var NestedQueryBuilder = /** @class */ (function () {
1626
1672
  // 对象形式: where({ user_id: 10086, status: 1 })
1627
1673
  if (typeof fieldOrConditions === 'object') {
1628
1674
  Object.entries(fieldOrConditions).forEach(function (_a) {
1629
- var field = _a[0], val = _a[1];
1675
+ var _b = __read(_a, 2), field = _b[0], val = _b[1];
1630
1676
  _this.nestedFilters.filters.push({ field: field, op: '=', value: val });
1631
1677
  });
1632
1678
  return this;
@@ -1689,7 +1735,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1689
1735
  // 对象形式: where({ user_id: 10086, status: 1 })
1690
1736
  if (typeof fieldOrConditions === 'object') {
1691
1737
  Object.entries(fieldOrConditions).forEach(function (_a) {
1692
- var field = _a[0], val = _a[1];
1738
+ var _b = __read(_a, 2), field = _b[0], val = _b[1];
1693
1739
  _this.params.filters.filters.push({ field: field, op: '=', value: val });
1694
1740
  });
1695
1741
  return this;
@@ -1728,7 +1774,7 @@ var QueryBuilder = /** @class */ (function (_super) {
1728
1774
  // 对象形式: orWhere({ user_id: 10086, status: 1 })
1729
1775
  if (typeof fieldOrConditions === 'object') {
1730
1776
  Object.entries(fieldOrConditions).forEach(function (_a) {
1731
- var field = _a[0], val = _a[1];
1777
+ var _b = __read(_a, 2), field = _b[0], val = _b[1];
1732
1778
  orGroup.filters.push({ field: field, op: '=', value: val });
1733
1779
  });
1734
1780
  }
@@ -1742,14 +1788,14 @@ var QueryBuilder = /** @class */ (function (_super) {
1742
1788
  }
1743
1789
  // 如果当前 filters 为空或者已经是 OR 逻辑,则直接添加
1744
1790
  if (this.params.filters.filters.length === 0 || this.params.filters.logic === 'or') {
1745
- (_a = this.params.filters.filters).push.apply(_a, orGroup.filters);
1791
+ (_a = this.params.filters.filters).push.apply(_a, __spread(orGroup.filters));
1746
1792
  this.params.filters.logic = 'or';
1747
1793
  }
1748
1794
  else {
1749
1795
  // 否则将当前所有条件包装成一个 AND 组,然后与新的 OR 组一起放在顶层
1750
1796
  var andGroup = {
1751
1797
  logic: 'and',
1752
- filters: __spreadArrays(this.params.filters.filters)
1798
+ filters: __spread(this.params.filters.filters)
1753
1799
  };
1754
1800
  this.params.filters.filters = [andGroup, orGroup];
1755
1801
  this.params.filters.logic = 'and';
@@ -1860,7 +1906,7 @@ var InsertBuilder = /** @class */ (function (_super) {
1860
1906
  */
1861
1907
  InsertBuilder.prototype.addBatch = function (dataList) {
1862
1908
  var _a;
1863
- (_a = this.params.insert).push.apply(_a, dataList);
1909
+ (_a = this.params.insert).push.apply(_a, __spread(dataList));
1864
1910
  return this;
1865
1911
  };
1866
1912
  return InsertBuilder;
@@ -1910,7 +1956,7 @@ var UpdateBuilder = /** @class */ (function (_super) {
1910
1956
  */
1911
1957
  UpdateBuilder.prototype.setBatch = function (updates) {
1912
1958
  var _a;
1913
- (_a = this.params.update).push.apply(_a, updates);
1959
+ (_a = this.params.update).push.apply(_a, __spread(updates));
1914
1960
  return this;
1915
1961
  };
1916
1962
  /**
@@ -1926,104 +1972,218 @@ var UpdateBuilder = /** @class */ (function (_super) {
1926
1972
  return UpdateBuilder;
1927
1973
  }(BaseBuilder));
1928
1974
 
1929
- function buildArgs(opts) {
1930
- var args = ['-sS', '-i'];
1975
+ function getGlobal() {
1976
+ if (typeof globalThis !== 'undefined')
1977
+ return globalThis;
1978
+ if (typeof window !== 'undefined')
1979
+ return window;
1980
+ if (typeof global !== 'undefined')
1981
+ return global;
1982
+ return {};
1983
+ }
1984
+ function isNodeRuntime() {
1985
+ var g = getGlobal();
1986
+ var p = g && g.process;
1987
+ return !!(p && p.versions && p.versions.node);
1988
+ }
1989
+ function normalizeHeaders(headers) {
1990
+ return __assign({}, (headers || {}));
1991
+ }
1992
+ function hasHeader(headers, name) {
1993
+ var n = name.toLowerCase();
1994
+ return Object.keys(headers).some(function (k) { return k.toLowerCase() === n; });
1995
+ }
1996
+ function toLowerCaseHeaderRecord(headers) {
1997
+ var e_1, _a;
1998
+ var out = {};
1999
+ try {
2000
+ for (var _b = __values(Object.entries(headers || {})), _c = _b.next(); !_c.done; _c = _b.next()) {
2001
+ var _d = __read(_c.value, 2), k = _d[0], v = _d[1];
2002
+ if (v === undefined || v === null)
2003
+ continue;
2004
+ out[String(k).toLowerCase()] = Array.isArray(v) ? String(v.join(',')) : String(v);
2005
+ }
2006
+ }
2007
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2008
+ finally {
2009
+ try {
2010
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2011
+ }
2012
+ finally { if (e_1) throw e_1.error; }
2013
+ }
2014
+ return out;
2015
+ }
2016
+ function safeJsonParse(text) {
2017
+ try {
2018
+ return JSON.parse(text);
2019
+ }
2020
+ catch (e) {
2021
+ return undefined;
2022
+ }
2023
+ }
2024
+ function hasFetch() {
2025
+ var g = getGlobal();
2026
+ return typeof g.fetch === 'function';
2027
+ }
2028
+ function requestViaFetch(opts) {
2029
+ return __awaiter(this, void 0, void 0, function () {
2030
+ var g, method, timeoutMs, headers, hasBody, body, controller, timeoutId, res, text, resHeaders_1, ct, json;
2031
+ return __generator(this, function (_a) {
2032
+ switch (_a.label) {
2033
+ case 0:
2034
+ g = getGlobal();
2035
+ method = (opts.method || 'GET').toUpperCase();
2036
+ timeoutMs = typeof opts.timeoutMs === 'number' && opts.timeoutMs > 0 ? opts.timeoutMs : 15000;
2037
+ headers = normalizeHeaders(opts.headers);
2038
+ hasBody = opts.data !== undefined && opts.data !== null;
2039
+ body = undefined;
2040
+ if (hasBody) {
2041
+ if (typeof opts.data === 'string')
2042
+ body = opts.data;
2043
+ else if (typeof g.FormData !== 'undefined' && opts.data instanceof g.FormData)
2044
+ body = opts.data;
2045
+ else if (typeof g.Blob !== 'undefined' && opts.data instanceof g.Blob)
2046
+ body = opts.data;
2047
+ else if (typeof g.ArrayBuffer !== 'undefined' && opts.data instanceof g.ArrayBuffer)
2048
+ body = opts.data;
2049
+ else {
2050
+ if (!hasHeader(headers, 'content-type'))
2051
+ headers['Content-Type'] = 'application/json';
2052
+ body = JSON.stringify(opts.data);
2053
+ }
2054
+ }
2055
+ controller = typeof g.AbortController !== 'undefined' ? new g.AbortController() : null;
2056
+ timeoutId = controller ? setTimeout(function () { return controller.abort(); }, timeoutMs) : null;
2057
+ _a.label = 1;
2058
+ case 1:
2059
+ _a.trys.push([1, , 4, 5]);
2060
+ return [4 /*yield*/, g.fetch(opts.url, {
2061
+ method: method,
2062
+ headers: headers,
2063
+ body: body,
2064
+ redirect: opts.followRedirects === false ? 'manual' : 'follow',
2065
+ signal: controller ? controller.signal : undefined,
2066
+ })];
2067
+ case 2:
2068
+ res = _a.sent();
2069
+ return [4 /*yield*/, res.text()];
2070
+ case 3:
2071
+ text = _a.sent();
2072
+ resHeaders_1 = {};
2073
+ try {
2074
+ res.headers.forEach(function (value, key) {
2075
+ resHeaders_1[key.toLowerCase()] = value;
2076
+ });
2077
+ }
2078
+ catch (e) {
2079
+ }
2080
+ ct = resHeaders_1['content-type'] || '';
2081
+ json = ct.includes('application/json') ? safeJsonParse(text) : undefined;
2082
+ return [2 /*return*/, { status: res.status, headers: resHeaders_1, body: text, json: json }];
2083
+ case 4:
2084
+ if (timeoutId)
2085
+ clearTimeout(timeoutId);
2086
+ return [7 /*endfinally*/];
2087
+ case 5: return [2 /*return*/];
2088
+ }
2089
+ });
2090
+ });
2091
+ }
2092
+ function getNodeHttpModules() {
2093
+ var req = (0, eval)('require');
2094
+ return { http: req('http'), https: req('https') };
2095
+ }
2096
+ function resolveRedirectUrl(fromUrl, location) {
2097
+ var g = getGlobal();
2098
+ var URLCtor = g.URL;
2099
+ if (typeof URLCtor === 'function')
2100
+ return new URLCtor(location, fromUrl).toString();
2101
+ return location;
2102
+ }
2103
+ function requestViaNodeHttp(opts, redirectCount) {
2104
+ var _a = getNodeHttpModules(), http = _a.http, https = _a.https;
2105
+ var g = getGlobal();
2106
+ var URLCtor = g.URL;
2107
+ var urlObj = typeof URLCtor === 'function' ? new URLCtor(opts.url) : null;
2108
+ var isHttps = urlObj ? urlObj.protocol === 'https:' : String(opts.url).startsWith('https://');
2109
+ var mod = isHttps ? https : http;
1931
2110
  var method = (opts.method || 'GET').toUpperCase();
1932
- if (method !== 'GET')
1933
- args.push('-X', method);
1934
- var headers = __assign({}, (opts.headers || {}));
1935
- var hasContentType = Object.keys(headers).some(function (k) { return k.toLowerCase() === 'content-type'; });
2111
+ var timeoutMs = typeof opts.timeoutMs === 'number' && opts.timeoutMs > 0 ? opts.timeoutMs : 15000;
2112
+ var headers = normalizeHeaders(opts.headers);
1936
2113
  var hasBody = opts.data !== undefined && opts.data !== null;
1937
- if (hasBody && !hasContentType)
1938
- headers['Content-Type'] = 'application/json';
1939
- for (var _i = 0, _a = Object.keys(headers); _i < _a.length; _i++) {
1940
- var k = _a[_i];
1941
- args.push('-H', k + ": " + headers[k]);
1942
- }
2114
+ var body = undefined;
1943
2115
  if (hasBody) {
1944
- var payload = void 0;
1945
- if (Buffer.isBuffer(opts.data))
1946
- payload = opts.data.toString();
2116
+ var isBuffer = typeof g.Buffer !== 'undefined' &&
2117
+ g.Buffer &&
2118
+ typeof g.Buffer.isBuffer === 'function' &&
2119
+ g.Buffer.isBuffer(opts.data);
2120
+ if (isBuffer)
2121
+ body = opts.data;
1947
2122
  else if (typeof opts.data === 'string')
1948
- payload = opts.data;
1949
- else
1950
- payload = JSON.stringify(opts.data);
1951
- args.push('--data', payload);
1952
- }
1953
- var follow = opts.followRedirects !== false;
1954
- if (follow)
1955
- args.push('-L');
1956
- var timeoutMs = typeof opts.timeoutMs === 'number' && opts.timeoutMs > 0 ? opts.timeoutMs : 15000;
1957
- args.push('--max-time', String(Math.ceil(timeoutMs / 1000)));
1958
- args.push(opts.url);
1959
- return args;
1960
- }
1961
- function parseHeaders(headerText) {
1962
- var headers = {};
1963
- var lines = headerText.split(/\r?\n/);
1964
- for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
1965
- var line = lines_1[_i];
1966
- var idx = line.indexOf(':');
1967
- if (idx > 0) {
1968
- var k = line.substring(0, idx).trim();
1969
- var v = line.substring(idx + 1).trim();
1970
- if (k)
1971
- headers[k.toLowerCase()] = v;
1972
- }
1973
- }
1974
- return headers;
1975
- }
1976
- function parseResponse(raw) {
1977
- var sepIndex = raw.indexOf('\r\n\r\n') >= 0 ? raw.indexOf('\r\n\r\n') : raw.indexOf('\n\n');
1978
- var headerText = sepIndex >= 0 ? raw.substring(0, sepIndex) : '';
1979
- var body = sepIndex >= 0 ? raw.substring(sepIndex + (raw.substr(sepIndex, 4) === '\r\n\r\n' ? 4 : 2)) : raw;
1980
- var headers = parseHeaders(headerText);
1981
- var status = 200;
1982
- var statusLine = headerText.split(/\r?\n/)[0] || '';
1983
- var m = statusLine.match(/HTTP\/[0-9.]+\s+(\d{3})/);
1984
- if (m)
1985
- status = parseInt(m[1], 10);
1986
- var json;
1987
- var ct = headers['content-type'] || '';
1988
- if (ct.includes('application/json')) {
1989
- try {
1990
- json = JSON.parse(body);
2123
+ body = opts.data;
2124
+ else {
2125
+ if (!hasHeader(headers, 'content-type'))
2126
+ headers['Content-Type'] = 'application/json';
2127
+ body = JSON.stringify(opts.data);
2128
+ }
2129
+ if (body !== undefined && body !== null && !hasHeader(headers, 'content-length')) {
2130
+ try {
2131
+ var byteLen = typeof body === 'string' ? g.Buffer.byteLength(body) : body.length;
2132
+ headers['Content-Length'] = String(byteLen);
2133
+ }
2134
+ catch (e) {
2135
+ }
1991
2136
  }
1992
- catch (_a) { }
1993
2137
  }
1994
- return { status: status, headers: headers, body: body, json: json };
2138
+ return new Promise(function (resolve, reject) {
2139
+ var req = mod.request(opts.url, { method: method, headers: headers }, function (res) {
2140
+ var status = Number(res.statusCode || 0);
2141
+ var resHeaders = toLowerCaseHeaderRecord(res.headers || {});
2142
+ var follow = opts.followRedirects !== false;
2143
+ var isRedirect = status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
2144
+ var location = resHeaders['location'];
2145
+ if (follow && isRedirect && location && redirectCount < 5) {
2146
+ res.resume();
2147
+ var nextUrl = resolveRedirectUrl(opts.url, location);
2148
+ var nextMethod = status === 303 ? 'GET' : method;
2149
+ var nextOpts = __assign(__assign({}, opts), { url: nextUrl, method: nextMethod });
2150
+ if (status === 303)
2151
+ nextOpts.data = undefined;
2152
+ requestViaNodeHttp(nextOpts, redirectCount + 1).then(resolve, reject);
2153
+ return;
2154
+ }
2155
+ var chunks = [];
2156
+ res.on('data', function (d) { return chunks.push(d); });
2157
+ res.on('end', function () {
2158
+ var buf = typeof g.Buffer !== 'undefined' && g.Buffer && typeof g.Buffer.concat === 'function'
2159
+ ? g.Buffer.concat(chunks)
2160
+ : chunks.join
2161
+ ? chunks.join('')
2162
+ : '';
2163
+ var text = typeof buf === 'string' ? buf : buf.toString('utf8');
2164
+ var ct = resHeaders['content-type'] || '';
2165
+ var json = ct.includes('application/json') ? safeJsonParse(text) : undefined;
2166
+ resolve({ status: status, headers: resHeaders, body: text, json: json });
2167
+ });
2168
+ });
2169
+ req.on('error', function (e) { return reject(e); });
2170
+ req.setTimeout(timeoutMs, function () { return req.destroy(new Error('Request timeout')); });
2171
+ if (body !== undefined && body !== null)
2172
+ req.write(body);
2173
+ req.end();
2174
+ });
1995
2175
  }
1996
2176
  var CurlClient = /** @class */ (function () {
1997
2177
  function CurlClient() {
1998
2178
  }
1999
2179
  CurlClient.prototype.request = function (opts) {
2000
2180
  return __awaiter(this, void 0, void 0, function () {
2001
- var args, cmd;
2002
2181
  return __generator(this, function (_a) {
2003
- switch (_a.label) {
2004
- case 0:
2005
- args = buildArgs(opts);
2006
- cmd = process.platform === 'win32' ? 'curl.exe' : 'curl';
2007
- return [4 /*yield*/, new Promise(function (resolve, reject) {
2008
- var p = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
2009
- var out = '';
2010
- var err = '';
2011
- p.stdout.on('data', function (d) { out += d.toString(); });
2012
- p.stderr.on('data', function (d) { err += d.toString(); });
2013
- p.on('error', function (e) { return reject(e); });
2014
- p.on('close', function (code) {
2015
- if (code !== 0 && !out)
2016
- return reject(new Error(err || "curl exit " + code));
2017
- try {
2018
- resolve(parseResponse(out));
2019
- }
2020
- catch (e) {
2021
- reject(e);
2022
- }
2023
- });
2024
- })];
2025
- case 1: return [2 /*return*/, _a.sent()];
2026
- }
2182
+ if (hasFetch())
2183
+ return [2 /*return*/, requestViaFetch(opts)];
2184
+ if (isNodeRuntime())
2185
+ return [2 /*return*/, requestViaNodeHttp(opts, 0)];
2186
+ throw new Error('No fetch available in current runtime');
2027
2187
  });
2028
2188
  });
2029
2189
  };
@@ -2081,33 +2241,33 @@ function sendLog(logData) {
2081
2241
  function readHonoRequestBody(c) {
2082
2242
  return __awaiter(this, void 0, void 0, function () {
2083
2243
  var ct, raw, cloned, t;
2084
- return __generator(this, function (_b) {
2085
- switch (_b.label) {
2244
+ return __generator(this, function (_a) {
2245
+ switch (_a.label) {
2086
2246
  case 0:
2087
2247
  ct = c.req.header("content-type") || "";
2088
- _b.label = 1;
2248
+ _a.label = 1;
2089
2249
  case 1:
2090
- _b.trys.push([1, 4, , 5]);
2250
+ _a.trys.push([1, 4, , 5]);
2091
2251
  raw = c.req.raw;
2092
2252
  if (!(raw && typeof raw.clone === "function")) return [3 /*break*/, 3];
2093
2253
  cloned = raw.clone();
2094
2254
  return [4 /*yield*/, cloned.text()];
2095
2255
  case 2:
2096
- t = _b.sent();
2256
+ t = _a.sent();
2097
2257
  if (!t)
2098
2258
  return [2 /*return*/, undefined];
2099
2259
  if (ct.includes("application/json")) {
2100
2260
  try {
2101
2261
  return [2 /*return*/, JSON.parse(t)];
2102
2262
  }
2103
- catch (_c) {
2263
+ catch (_b) {
2104
2264
  return [2 /*return*/, t];
2105
2265
  }
2106
2266
  }
2107
2267
  return [2 /*return*/, t];
2108
2268
  case 3: return [3 /*break*/, 5];
2109
2269
  case 4:
2110
- _b.sent();
2270
+ _a.sent();
2111
2271
  return [3 /*break*/, 5];
2112
2272
  case 5: return [2 /*return*/, undefined];
2113
2273
  }
@@ -2125,7 +2285,8 @@ function readHonoRequestHeaders(c) {
2125
2285
  });
2126
2286
  }
2127
2287
  }
2128
- catch (_a) { }
2288
+ catch (e) {
2289
+ }
2129
2290
  return out;
2130
2291
  }
2131
2292
  function readHonoResponseHeaders(c) {
@@ -2135,7 +2296,8 @@ function readHonoResponseHeaders(c) {
2135
2296
  out[k] = v;
2136
2297
  });
2137
2298
  }
2138
- catch (_a) { }
2299
+ catch (e) {
2300
+ }
2139
2301
  return out;
2140
2302
  }
2141
2303
  function handleHono(c, next, systemName) {
@@ -2183,29 +2345,51 @@ function handleHono(c, next, systemName) {
2183
2345
  }
2184
2346
  // ==================== Koa/Midway 相关处理 ====================
2185
2347
  function readKoaRequestHeaders(ctx) {
2186
- var _a;
2348
+ var e_2, _a;
2349
+ var _b;
2187
2350
  var out = {};
2188
2351
  try {
2189
- var headers = ctx.headers || ((_a = ctx.request) === null || _a === void 0 ? void 0 : _a.headers) || {};
2190
- for (var _i = 0, _b = Object.entries(headers); _i < _b.length; _i++) {
2191
- var _c = _b[_i], k = _c[0], v = _c[1];
2192
- out[k] = String(v);
2352
+ var headers = ctx.headers || ((_b = ctx.request) === null || _b === void 0 ? void 0 : _b.headers) || {};
2353
+ try {
2354
+ for (var _c = __values(Object.entries(headers)), _d = _c.next(); !_d.done; _d = _c.next()) {
2355
+ var _e = __read(_d.value, 2), k = _e[0], v = _e[1];
2356
+ out[k] = String(v);
2357
+ }
2358
+ }
2359
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
2360
+ finally {
2361
+ try {
2362
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
2363
+ }
2364
+ finally { if (e_2) throw e_2.error; }
2193
2365
  }
2194
2366
  }
2195
- catch (_d) { }
2196
- return out;
2367
+ catch (e) {
2368
+ }
2369
+ return out;
2197
2370
  }
2198
2371
  function readKoaResponseHeaders(ctx) {
2199
- var _a;
2372
+ var e_3, _a;
2373
+ var _b;
2200
2374
  var out = {};
2201
2375
  try {
2202
- var headers = ((_a = ctx.response) === null || _a === void 0 ? void 0 : _a.headers) || {};
2203
- for (var _i = 0, _b = Object.entries(headers); _i < _b.length; _i++) {
2204
- var _c = _b[_i], k = _c[0], v = _c[1];
2205
- out[k] = String(v);
2376
+ var headers = ((_b = ctx.response) === null || _b === void 0 ? void 0 : _b.headers) || {};
2377
+ try {
2378
+ for (var _c = __values(Object.entries(headers)), _d = _c.next(); !_d.done; _d = _c.next()) {
2379
+ var _e = __read(_d.value, 2), k = _e[0], v = _e[1];
2380
+ out[k] = String(v);
2381
+ }
2382
+ }
2383
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
2384
+ finally {
2385
+ try {
2386
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
2387
+ }
2388
+ finally { if (e_3) throw e_3.error; }
2206
2389
  }
2207
2390
  }
2208
- catch (_d) { }
2391
+ catch (e) {
2392
+ }
2209
2393
  return out;
2210
2394
  }
2211
2395
  function handleKoa(ctx, next, systemName) {
@@ -2254,30 +2438,52 @@ function handleKoa(ctx, next, systemName) {
2254
2438
  }
2255
2439
  // ==================== Fastify 相关处理 ====================
2256
2440
  function readFastifyRequestHeaders(request) {
2441
+ var e_4, _a;
2257
2442
  var out = {};
2258
2443
  try {
2259
2444
  var headers = request.headers || {};
2260
- for (var _i = 0, _a = Object.entries(headers); _i < _a.length; _i++) {
2261
- var _b = _a[_i], k = _b[0], v = _b[1];
2262
- out[k] = String(v);
2445
+ try {
2446
+ for (var _b = __values(Object.entries(headers)), _c = _b.next(); !_c.done; _c = _b.next()) {
2447
+ var _d = __read(_c.value, 2), k = _d[0], v = _d[1];
2448
+ out[k] = String(v);
2449
+ }
2450
+ }
2451
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
2452
+ finally {
2453
+ try {
2454
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2455
+ }
2456
+ finally { if (e_4) throw e_4.error; }
2263
2457
  }
2264
2458
  }
2265
- catch (_c) { }
2459
+ catch (e) {
2460
+ }
2266
2461
  return out;
2267
2462
  }
2268
2463
  function readFastifyResponseHeaders(reply) {
2269
- var _a;
2464
+ var e_5, _a;
2465
+ var _b;
2270
2466
  var out = {};
2271
2467
  try {
2272
- var headers = ((_a = reply.getHeaders) === null || _a === void 0 ? void 0 : _a.call(reply)) || {};
2273
- for (var _i = 0, _b = Object.entries(headers); _i < _b.length; _i++) {
2274
- var _c = _b[_i], k = _c[0], v = _c[1];
2275
- if (v !== undefined) {
2276
- out[k] = String(v);
2468
+ var headers = ((_b = reply.getHeaders) === null || _b === void 0 ? void 0 : _b.call(reply)) || {};
2469
+ try {
2470
+ for (var _c = __values(Object.entries(headers)), _d = _c.next(); !_d.done; _d = _c.next()) {
2471
+ var _e = __read(_d.value, 2), k = _e[0], v = _e[1];
2472
+ if (v !== undefined) {
2473
+ out[k] = String(v);
2474
+ }
2277
2475
  }
2278
2476
  }
2477
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
2478
+ finally {
2479
+ try {
2480
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
2481
+ }
2482
+ finally { if (e_5) throw e_5.error; }
2483
+ }
2484
+ }
2485
+ catch (e) {
2279
2486
  }
2280
- catch (_d) { }
2281
2487
  return out;
2282
2488
  }
2283
2489
  function handleFastify(request, reply, systemName) {
@@ -2558,14 +2764,24 @@ function lighten(color, level) {
2558
2764
  * @returns 提取的值数组
2559
2765
  */
2560
2766
  function getKeyList(arr, key) {
2767
+ var e_1, _a;
2561
2768
  if (!Array.isArray(arr))
2562
2769
  return [];
2563
2770
  var result = [];
2564
- for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
2565
- var item = arr_1[_i];
2566
- if (item && item[key] !== undefined && item[key] !== null) {
2567
- result.push(item[key]);
2771
+ try {
2772
+ for (var arr_1 = __values(arr), arr_1_1 = arr_1.next(); !arr_1_1.done; arr_1_1 = arr_1.next()) {
2773
+ var item = arr_1_1.value;
2774
+ if (item && item[key] !== undefined && item[key] !== null) {
2775
+ result.push(item[key]);
2776
+ }
2777
+ }
2778
+ }
2779
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2780
+ finally {
2781
+ try {
2782
+ if (arr_1_1 && !arr_1_1.done && (_a = arr_1.return)) _a.call(arr_1);
2568
2783
  }
2784
+ finally { if (e_1) throw e_1.error; }
2569
2785
  }
2570
2786
  return result;
2571
2787
  }
@@ -2985,7 +3201,7 @@ var Emitter = /** @class */ (function () {
2985
3201
  };
2986
3202
  return Emitter;
2987
3203
  }());
2988
- var emitter = new Emitter();
3204
+ var emitter$1 = new Emitter();
2989
3205
 
2990
3206
  var createWebSocketStore = function (storeId) {
2991
3207
  if (storeId === void 0) { storeId = 'websocket'; }
@@ -3022,19 +3238,19 @@ var createWebSocketStore = function (storeId) {
3022
3238
  _this.isConnected = status;
3023
3239
  if (status)
3024
3240
  _this.connectionError = null;
3025
- emitter.emit('websocket-connected', status);
3241
+ emitter$1.emit('websocket-connected', status);
3026
3242
  });
3027
3243
  this.wsManager.on('message', function (data) {
3028
3244
  _this.addMessage(data);
3029
- emitter.emit('websocket-message', data);
3245
+ emitter$1.emit('websocket-message', data);
3030
3246
  });
3031
3247
  this.wsManager.on('error', function (error) {
3032
3248
  _this.connectionError = (error === null || error === void 0 ? void 0 : error.message) || 'WebSocket error';
3033
- emitter.emit('websocket-error', { message: _this.connectionError });
3249
+ emitter$1.emit('websocket-error', { message: _this.connectionError });
3034
3250
  });
3035
3251
  this.wsManager.on('closed', function () {
3036
3252
  _this.isConnected = false;
3037
- emitter.emit('websocket-closed', undefined);
3253
+ emitter$1.emit('websocket-closed', undefined);
3038
3254
  });
3039
3255
  },
3040
3256
  sendMessage: function (data) {
@@ -3066,4 +3282,1625 @@ var createWebSocketStore = function (storeId) {
3066
3282
  });
3067
3283
  };
3068
3284
 
3069
- export { ApiBuilder, InsertBuilder, QueryBuilder, UpdateBuilder, WebsocketManager, addClass, addDays, base64ToBlob, base64ToFile, blobToDataURL, buildUUID, calcFileSize, ceil, clearLoginData, compatibleDate, compressImg, computeMoney, convertBase64UrlToBlob, convertCurrency, copyTextToClipboard, createWebSocketStore, darken, dataURLtoBlob, deepEqual, delay, deviceDetection, emitter, fileSizeFormat, filterRepeat, findNodePath, floor, formatBank, formatBytes, formatCentsToYuan, formatEmptyValue, formatFloat, formatMoney, formatPhone, formatPhoneHide, formatTime, formateTimestamp, fromNow, genExportByBlob, generateEnglishLetters, getCookie, getDeviceType, getEnvironment, getFileData, getFromType, getIsComWx, getIsDevelopment, getKeyList, getQueryMap, getQueryString, getQueryVariable, getSvgInfo, getTicket, getToken, getWecomToken, handleFlatStr, hasClass, hexToRgb, hideTextAtIndex, http, httpEnum, humpTurnDashed, intersection, isAllEmpty, isEmail, isEmpty, isExternal, isImage, isIncludeAllChildren, isMobile, isMobileSimple, isPhone, isQQ, isTelephone, isUrl, lighten, newDate, openLink, randomString, recordLogMiddleware, recordLogMiddlewareFastify, recordLogMiddlewareHono, recordLogMiddlewareKoa, recordLogMiddlewareMidway, removeClass, removeTicket, removeToken, rgbToHex, sendLog, setTicket, subBefore, sum, toThousands, toggleClass, trimVal, uuid, validateTwoDecimal, websocketService };
3285
+ /**
3286
+ * 舍入模式常量
3287
+ */
3288
+ var RoundingMode = {
3289
+ /** 向上舍入(远离零) */
3290
+ UP: Decimal.ROUND_UP,
3291
+ /** 向下舍入(趋向零) */
3292
+ DOWN: Decimal.ROUND_DOWN,
3293
+ /** 向正无穷舍入 */
3294
+ CEIL: Decimal.ROUND_CEIL,
3295
+ /** 向负无穷舍入 */
3296
+ FLOOR: Decimal.ROUND_FLOOR,
3297
+ /** 四舍五入 */
3298
+ HALF_UP: Decimal.ROUND_HALF_UP,
3299
+ /** 五舍六入 */
3300
+ HALF_DOWN: Decimal.ROUND_HALF_DOWN,
3301
+ /** 银行家舍入(四舍六入五取偶) */
3302
+ HALF_EVEN: Decimal.ROUND_HALF_EVEN,
3303
+ /** 向最近舍入,平局时向正无穷 */
3304
+ HALF_CEIL: Decimal.ROUND_HALF_CEIL,
3305
+ /** 向最近舍入,平局时向负无穷 */
3306
+ HALF_FLOOR: Decimal.ROUND_HALF_FLOOR
3307
+ };
3308
+ /**
3309
+ * 默认配置
3310
+ */
3311
+ var DEFAULT_CONFIG$1 = {
3312
+ /** 默认小数位数 */
3313
+ DECIMAL_PLACES: 2,
3314
+ /** 默认货币符号 */
3315
+ CURRENCY_SYMBOL: "¥",
3316
+ /** 默认千分位分隔符 */
3317
+ THOUSANDS_SEPARATOR: ",",
3318
+ /** 默认小数点分隔符 */
3319
+ DECIMAL_SEPARATOR: ".",
3320
+ /** 默认舍入模式 */
3321
+ ROUNDING_MODE: Decimal.ROUND_HALF_UP
3322
+ };
3323
+
3324
+ /**
3325
+ * 金额计算工具类
3326
+ * 基于 decimal.js 实现精确的货币计算,避免 JavaScript 浮点数精度问题
3327
+ *
3328
+ * @example
3329
+ * ```ts
3330
+ * const price = new Money('19.99');
3331
+ * const total = price.multiply(3); // 59.97
3332
+ * const tax = total.multiply('0.13'); // 7.7961
3333
+ * const finalPrice = total.add(tax).round(2); // 67.77
3334
+ * console.log(finalPrice.format()); // "¥67.77"
3335
+ * ```
3336
+ */
3337
+ var Money = /** @class */ (function () {
3338
+ /**
3339
+ * 创建 Money 实例
3340
+ * @param amount - 金额,支持 string | number | Decimal
3341
+ */
3342
+ function Money(amount) {
3343
+ if (amount instanceof Decimal) {
3344
+ this.value = amount;
3345
+ }
3346
+ else {
3347
+ // 统一转换为字符串,避免 number 类型的精度问题
3348
+ this.value = new Decimal(String(amount));
3349
+ }
3350
+ }
3351
+ /**
3352
+ * 加法运算
3353
+ * @param amount - 要相加的金额
3354
+ * @returns 新的 Money 实例
3355
+ */
3356
+ Money.prototype.add = function (amount) {
3357
+ var addend = this.toDecimalValue(amount);
3358
+ return new Money(this.value.plus(addend));
3359
+ };
3360
+ /**
3361
+ * 减法运算
3362
+ * @param amount - 要相减的金额
3363
+ * @returns 新的 Money 实例
3364
+ */
3365
+ Money.prototype.subtract = function (amount) {
3366
+ var subtrahend = this.toDecimalValue(amount);
3367
+ return new Money(this.value.minus(subtrahend));
3368
+ };
3369
+ /**
3370
+ * 乘法运算
3371
+ * @param multiplier - 乘数
3372
+ * @returns 新的 Money 实例
3373
+ */
3374
+ Money.prototype.multiply = function (multiplier) {
3375
+ return new Money(this.value.times(String(multiplier)));
3376
+ };
3377
+ /**
3378
+ * 除法运算
3379
+ * @param divisor - 除数
3380
+ * @returns 新的 Money 实例
3381
+ */
3382
+ Money.prototype.divide = function (divisor) {
3383
+ return new Money(this.value.dividedBy(String(divisor)));
3384
+ };
3385
+ /**
3386
+ * 求余运算
3387
+ * @param divisor - 除数
3388
+ * @returns 新的 Money 实例
3389
+ */
3390
+ Money.prototype.mod = function (divisor) {
3391
+ return new Money(this.value.modulo(String(divisor)));
3392
+ };
3393
+ /**
3394
+ * 绝对值
3395
+ * @returns 新的 Money 实例
3396
+ */
3397
+ Money.prototype.abs = function () {
3398
+ return new Money(this.value.abs());
3399
+ };
3400
+ /**
3401
+ * 取反
3402
+ * @returns 新的 Money 实例
3403
+ */
3404
+ Money.prototype.negate = function () {
3405
+ return new Money(this.value.negated());
3406
+ };
3407
+ /**
3408
+ * 四舍五入到指定小数位
3409
+ * @param decimalPlaces - 小数位数,默认 2
3410
+ * @param roundingMode - 舍入模式,默认 ROUND_HALF_UP(四舍五入)
3411
+ * @returns 新的 Money 实例
3412
+ *
3413
+ * @example
3414
+ * ```ts
3415
+ * new Money('1.125').round(2); // 1.13 (四舍五入)
3416
+ * new Money('1.124').round(2); // 1.12
3417
+ * new Money('1.125').round(2, Decimal.ROUND_DOWN); // 1.12 (向下舍入)
3418
+ * ```
3419
+ */
3420
+ Money.prototype.round = function (decimalPlaces, roundingMode) {
3421
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3422
+ if (roundingMode === void 0) { roundingMode = DEFAULT_CONFIG$1.ROUNDING_MODE; }
3423
+ return new Money(this.value.toDecimalPlaces(decimalPlaces, roundingMode));
3424
+ };
3425
+ /**
3426
+ * 向上取整到指定小数位
3427
+ * @param decimalPlaces - 小数位数,默认 2
3428
+ * @returns 新的 Money 实例
3429
+ *
3430
+ * @example
3431
+ * ```ts
3432
+ * new Money('1.121').ceil(2); // 1.13
3433
+ * new Money('1.129').ceil(2); // 1.13
3434
+ * ```
3435
+ */
3436
+ Money.prototype.ceil = function (decimalPlaces) {
3437
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3438
+ return new Money(this.value.toDecimalPlaces(decimalPlaces, Decimal.ROUND_UP));
3439
+ };
3440
+ /**
3441
+ * 向下取整到指定小数位
3442
+ * @param decimalPlaces - 小数位数,默认 2
3443
+ * @returns 新的 Money 实例
3444
+ *
3445
+ * @example
3446
+ * ```ts
3447
+ * new Money('1.128').floor(2); // 1.12
3448
+ * new Money('1.121').floor(2); // 1.12
3449
+ * ```
3450
+ */
3451
+ Money.prototype.floor = function (decimalPlaces) {
3452
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3453
+ return new Money(this.value.toDecimalPlaces(decimalPlaces, Decimal.ROUND_DOWN));
3454
+ };
3455
+ /**
3456
+ * 截断到指定小数位(直接切割,不进行舍入)
3457
+ * @param decimalPlaces - 小数位数,默认 2
3458
+ * @returns 新的 Money 实例
3459
+ *
3460
+ * @example
3461
+ * ```ts
3462
+ * new Money('1.12999').truncate(2); // 1.12
3463
+ * new Money('1.12111').truncate(2); // 1.12
3464
+ * new Money('1.19999').truncate(2); // 1.19
3465
+ * ```
3466
+ */
3467
+ Money.prototype.truncate = function (decimalPlaces) {
3468
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3469
+ return new Money(this.value.toDecimalPlaces(decimalPlaces, Decimal.ROUND_DOWN));
3470
+ };
3471
+ /**
3472
+ * 比较:是否大于
3473
+ * @param amount - 要比较的金额
3474
+ * @returns boolean
3475
+ */
3476
+ Money.prototype.isGreaterThan = function (amount) {
3477
+ var comparand = this.toDecimalValue(amount);
3478
+ return this.value.greaterThan(comparand);
3479
+ };
3480
+ /**
3481
+ * 比较:是否大于等于
3482
+ * @param amount - 要比较的金额
3483
+ * @returns boolean
3484
+ */
3485
+ Money.prototype.isGreaterThanOrEqualTo = function (amount) {
3486
+ var comparand = this.toDecimalValue(amount);
3487
+ return this.value.greaterThanOrEqualTo(comparand);
3488
+ };
3489
+ /**
3490
+ * 比较:是否小于
3491
+ * @param amount - 要比较的金额
3492
+ * @returns boolean
3493
+ */
3494
+ Money.prototype.isLessThan = function (amount) {
3495
+ var comparand = this.toDecimalValue(amount);
3496
+ return this.value.lessThan(comparand);
3497
+ };
3498
+ /**
3499
+ * 比较:是否小于等于
3500
+ * @param amount - 要比较的金额
3501
+ * @returns boolean
3502
+ */
3503
+ Money.prototype.isLessThanOrEqualTo = function (amount) {
3504
+ var comparand = this.toDecimalValue(amount);
3505
+ return this.value.lessThanOrEqualTo(comparand);
3506
+ };
3507
+ /**
3508
+ * 比较:是否相等
3509
+ * @param amount - 要比较的金额
3510
+ * @returns boolean
3511
+ */
3512
+ Money.prototype.equals = function (amount) {
3513
+ var comparand = this.toDecimalValue(amount);
3514
+ return this.value.equals(comparand);
3515
+ };
3516
+ /**
3517
+ * 是否为零
3518
+ * @returns boolean
3519
+ */
3520
+ Money.prototype.isZero = function () {
3521
+ return this.value.isZero();
3522
+ };
3523
+ /**
3524
+ * 是否为正数
3525
+ * @returns boolean
3526
+ */
3527
+ Money.prototype.isPositive = function () {
3528
+ return this.value.isPositive();
3529
+ };
3530
+ /**
3531
+ * 是否为负数
3532
+ * @returns boolean
3533
+ */
3534
+ Money.prototype.isNegative = function () {
3535
+ return this.value.isNegative();
3536
+ };
3537
+ /**
3538
+ * 转换为字符串(完整精度)
3539
+ * @returns string
3540
+ */
3541
+ Money.prototype.toString = function () {
3542
+ return this.value.toString();
3543
+ };
3544
+ /**
3545
+ * 转换为指定精度的字符串(使用精确切割,不是 toFixed)
3546
+ * @param decimalPlaces - 小数位数,默认 2
3547
+ * @param roundingMode - 舍入模式,默认 ROUND_HALF_UP
3548
+ * @returns string
3549
+ *
3550
+ * @example
3551
+ * ```ts
3552
+ * new Money('1.12999').toFixedString(2); // "1.13"
3553
+ * new Money('1.12999').toFixedString(4); // "1.1300"
3554
+ * ```
3555
+ */
3556
+ Money.prototype.toFixedString = function (decimalPlaces, roundingMode) {
3557
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3558
+ if (roundingMode === void 0) { roundingMode = DEFAULT_CONFIG$1.ROUNDING_MODE; }
3559
+ return this.value
3560
+ .toDecimalPlaces(decimalPlaces, roundingMode)
3561
+ .toFixed(decimalPlaces);
3562
+ };
3563
+ /**
3564
+ * 转换为数字(警告:可能丢失精度,仅用于显示)
3565
+ * @returns number
3566
+ */
3567
+ Money.prototype.toNumber = function () {
3568
+ return this.value.toNumber();
3569
+ };
3570
+ /**
3571
+ * 转换为 Decimal 对象
3572
+ * @returns Decimal
3573
+ */
3574
+ Money.prototype.toDecimal = function () {
3575
+ return this.value;
3576
+ };
3577
+ /**
3578
+ * 格式化为货币字符串
3579
+ * @param options - 格式化选项
3580
+ * @returns string
3581
+ *
3582
+ * @example
3583
+ * ```ts
3584
+ * new Money('1234.56').format(); // "¥1,234.56"
3585
+ * new Money('1234.56').format({ symbol: '$' }); // "$1,234.56"
3586
+ * new Money('1234.56').format({ symbol: '¥', decimalPlaces: 0 }); // "¥1,235"
3587
+ * new Money('1234.56').format({ thousandsSeparator: '' }); // "¥1234.56"
3588
+ * ```
3589
+ */
3590
+ Money.prototype.format = function (options) {
3591
+ var _a = options || {}, _b = _a.symbol, symbol = _b === void 0 ? DEFAULT_CONFIG$1.CURRENCY_SYMBOL : _b, _c = _a.decimalPlaces, decimalPlaces = _c === void 0 ? DEFAULT_CONFIG$1.DECIMAL_PLACES : _c, _d = _a.thousandsSeparator, thousandsSeparator = _d === void 0 ? DEFAULT_CONFIG$1.THOUSANDS_SEPARATOR : _d, _e = _a.decimalSeparator, decimalSeparator = _e === void 0 ? DEFAULT_CONFIG$1.DECIMAL_SEPARATOR : _e, _f = _a.symbolPosition, symbolPosition = _f === void 0 ? "prefix" : _f, _g = _a.roundingMode, roundingMode = _g === void 0 ? DEFAULT_CONFIG$1.ROUNDING_MODE : _g;
3592
+ // 使用 Decimal 的 toDecimalPlaces 进行精确舍入
3593
+ var rounded = this.value.toDecimalPlaces(decimalPlaces, roundingMode);
3594
+ // 分离整数和小数部分
3595
+ var _h = __read(rounded
3596
+ .toFixed(decimalPlaces)
3597
+ .split("."), 2), integerPart = _h[0], _j = _h[1], decimalPart = _j === void 0 ? "" : _j;
3598
+ // 添加千分位分隔符
3599
+ var formattedInteger = thousandsSeparator
3600
+ ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator)
3601
+ : integerPart;
3602
+ // 组合整数和小数部分
3603
+ var formattedNumber = decimalPlaces > 0
3604
+ ? "" + formattedInteger + decimalSeparator + decimalPart
3605
+ : formattedInteger;
3606
+ // 添加货币符号
3607
+ return symbolPosition === "prefix"
3608
+ ? "" + symbol + formattedNumber
3609
+ : "" + formattedNumber + symbol;
3610
+ };
3611
+ /**
3612
+ * 按比例分配金额(解决分账/分摊场景的精度问题)
3613
+ * @param ratios - 分配比例数组
3614
+ * @returns Money[] - 分配后的金额数组
3615
+ *
3616
+ * @example
3617
+ * ```ts
3618
+ * // 100 元按 1:2:3 比例分配
3619
+ * const [a, b, c] = new Money('100').allocate([1, 2, 3]);
3620
+ * // a: 16.67, b: 33.33, c: 50.00 (总和仍为 100.00)
3621
+ *
3622
+ * // 订单 99.99 元,3人平摊
3623
+ * const shares = new Money('99.99').allocate([1, 1, 1]);
3624
+ * // shares: [33.33, 33.33, 33.33] (总和 99.99)
3625
+ * ```
3626
+ */
3627
+ Money.prototype.allocate = function (ratios) {
3628
+ if (ratios.length === 0) {
3629
+ throw new Error("分配比例数组不能为空");
3630
+ }
3631
+ if (ratios.some(function (ratio) { return ratio < 0; })) {
3632
+ throw new Error("分配比例不能为负数");
3633
+ }
3634
+ var total = ratios.reduce(function (sum, ratio) { return sum + ratio; }, 0);
3635
+ if (total === 0) {
3636
+ throw new Error("分配比例总和不能为零");
3637
+ }
3638
+ var results = [];
3639
+ var remainder = this.value;
3640
+ for (var i = 0; i < ratios.length - 1; i++) {
3641
+ var ratio = new Decimal(ratios[i]);
3642
+ var share = this.value
3643
+ .times(ratio)
3644
+ .dividedBy(total)
3645
+ .toDecimalPlaces(DEFAULT_CONFIG$1.DECIMAL_PLACES, Decimal.ROUND_DOWN);
3646
+ results.push(new Money(share));
3647
+ remainder = remainder.minus(share);
3648
+ }
3649
+ // 最后一份取剩余值,确保总和精确
3650
+ results.push(new Money(remainder));
3651
+ return results;
3652
+ };
3653
+ /**
3654
+ * 计算百分比
3655
+ * @param percentage - 百分比值(如:15 表示 15%)
3656
+ * @param decimalPlaces - 结果保留的小数位数,默认 2
3657
+ * @returns Money - 计算结果
3658
+ *
3659
+ * @example
3660
+ * ```ts
3661
+ * new Money('100').percentage(15); // 15.00 (100 的 15%)
3662
+ * new Money('99.99').percentage(8.5); // 8.50 (99.99 的 8.5%)
3663
+ * ```
3664
+ */
3665
+ Money.prototype.percentage = function (percentage, decimalPlaces) {
3666
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3667
+ var result = this.value.times(String(percentage)).dividedBy(100);
3668
+ return new Money(result.toDecimalPlaces(decimalPlaces, Decimal.ROUND_HALF_UP));
3669
+ };
3670
+ /**
3671
+ * 计算折扣后的价格
3672
+ * @param discount - 折扣率(如:0.8 表示 8折,20 表示 8折)
3673
+ * @param isPercentage - discount 是否为百分比形式,默认 false
3674
+ * @param decimalPlaces - 结果保留的小数位数,默认 2
3675
+ * @returns Money - 折扣后的价格
3676
+ *
3677
+ * @example
3678
+ * ```ts
3679
+ * // 方式1:直接传折扣率
3680
+ * new Money('100').applyDiscount(0.8); // 80.00 (8折后)
3681
+ *
3682
+ * // 方式2:传百分比
3683
+ * new Money('100').applyDiscount(20, true); // 80.00 (打8折,折扣20%)
3684
+ * ```
3685
+ */
3686
+ Money.prototype.applyDiscount = function (discount, isPercentage, decimalPlaces) {
3687
+ if (isPercentage === void 0) { isPercentage = false; }
3688
+ if (decimalPlaces === void 0) { decimalPlaces = DEFAULT_CONFIG$1.DECIMAL_PLACES; }
3689
+ var multiplier;
3690
+ if (isPercentage) {
3691
+ // 如果是百分比形式(如:20 表示折扣20%,实际支付80%)
3692
+ multiplier = new Decimal(100).minus(String(discount)).dividedBy(100);
3693
+ }
3694
+ else {
3695
+ // 直接的折扣率(如:0.8 表示8折)
3696
+ multiplier = new Decimal(String(discount));
3697
+ }
3698
+ var result = this.value.times(multiplier);
3699
+ return new Money(result.toDecimalPlaces(decimalPlaces, Decimal.ROUND_HALF_UP));
3700
+ };
3701
+ /**
3702
+ * 内部辅助方法:将 ComparableAmount 转换为 Decimal
3703
+ * @private
3704
+ */
3705
+ Money.prototype.toDecimalValue = function (amount) {
3706
+ if (amount instanceof Money) {
3707
+ return amount.value;
3708
+ }
3709
+ return new Decimal(String(amount));
3710
+ };
3711
+ return Money;
3712
+ }());
3713
+
3714
+ /**
3715
+ * @description 提取菜单树中的每一项uniqueId
3716
+ * @param tree 树
3717
+ * @returns 每一项uniqueId组成的数组
3718
+ */
3719
+ var extractPathList = function (tree) {
3720
+ var e_1, _a;
3721
+ if (!Array.isArray(tree)) {
3722
+ console.warn("tree must be an array");
3723
+ return [];
3724
+ }
3725
+ if (!tree || tree.length === 0)
3726
+ return [];
3727
+ var expandedPaths = [];
3728
+ try {
3729
+ for (var tree_1 = __values(tree), tree_1_1 = tree_1.next(); !tree_1_1.done; tree_1_1 = tree_1.next()) {
3730
+ var node = tree_1_1.value;
3731
+ if (node.children && node.children.length > 0) {
3732
+ extractPathList(node.children);
3733
+ }
3734
+ if (node.uniqueId !== undefined) {
3735
+ expandedPaths.push(node.uniqueId);
3736
+ }
3737
+ }
3738
+ }
3739
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
3740
+ finally {
3741
+ try {
3742
+ if (tree_1_1 && !tree_1_1.done && (_a = tree_1.return)) _a.call(tree_1);
3743
+ }
3744
+ finally { if (e_1) throw e_1.error; }
3745
+ }
3746
+ return expandedPaths;
3747
+ };
3748
+ /**
3749
+ * @description 如果父级下children的length为1,删除children并自动组建唯一uniqueId
3750
+ * @param tree 树
3751
+ * @param pathList 每一项的id组成的数组
3752
+ * @returns 组件唯一uniqueId后的树
3753
+ */
3754
+ var deleteChildren = function (tree, pathList) {
3755
+ if (pathList === void 0) { pathList = []; }
3756
+ if (!Array.isArray(tree)) {
3757
+ console.warn("menuTree must be an array");
3758
+ return [];
3759
+ }
3760
+ if (!tree || tree.length === 0)
3761
+ return [];
3762
+ for (var key = 0; key < tree.length; key++) {
3763
+ var node = tree[key];
3764
+ if (node.children && node.children.length === 1)
3765
+ delete node.children;
3766
+ node.id = key;
3767
+ node.parentId = pathList.length ? pathList[pathList.length - 1] : null;
3768
+ node.pathList = __spread(pathList, [node.id]);
3769
+ node.uniqueId =
3770
+ node.pathList.length > 1 ? node.pathList.join("-") : node.pathList[0];
3771
+ if (node.children && node.children.length > 0) {
3772
+ deleteChildren(node.children, node.pathList);
3773
+ }
3774
+ }
3775
+ return tree;
3776
+ };
3777
+ /**
3778
+ * @description 创建层级关系
3779
+ * @param tree 树
3780
+ * @param pathList 每一项的id组成的数组
3781
+ * @returns 创建层级关系后的树
3782
+ */
3783
+ var buildHierarchyTree = function (tree, pathList) {
3784
+ if (pathList === void 0) { pathList = []; }
3785
+ if (!Array.isArray(tree)) {
3786
+ console.warn("tree must be an array");
3787
+ return [];
3788
+ }
3789
+ if (!tree || tree.length === 0)
3790
+ return [];
3791
+ for (var key = 0; key < tree.length; key++) {
3792
+ var node = tree[key];
3793
+ node.id = key;
3794
+ node.parentId = pathList.length ? pathList[pathList.length - 1] : null;
3795
+ node.pathList = __spread(pathList, [node.id]);
3796
+ if (node.children && node.children.length > 0) {
3797
+ buildHierarchyTree(node.children, node.pathList);
3798
+ }
3799
+ }
3800
+ return tree;
3801
+ };
3802
+ /**
3803
+ * @description 广度优先遍历,根据唯一uniqueId找当前节点信息
3804
+ * @param tree 树
3805
+ * @param uniqueId 唯一uniqueId
3806
+ * @returns 当前节点信息
3807
+ */
3808
+ var getNodeByUniqueId = function (tree, uniqueId) {
3809
+ if (!Array.isArray(tree)) {
3810
+ console.warn("menuTree must be an array");
3811
+ return undefined;
3812
+ }
3813
+ if (!tree || tree.length === 0)
3814
+ return undefined;
3815
+ var item = tree.find(function (node) { return node.uniqueId === uniqueId; });
3816
+ if (item)
3817
+ return item;
3818
+ var childrenList = tree
3819
+ .filter(function (node) { return node.children; })
3820
+ .map(function (i) { return i.children; })
3821
+ .flat(1);
3822
+ return getNodeByUniqueId(childrenList, uniqueId);
3823
+ };
3824
+ /**
3825
+ * @description 向当前唯一uniqueId节点中追加字段
3826
+ * @param tree 树
3827
+ * @param uniqueId 唯一uniqueId
3828
+ * @param fields 需要追加的字段
3829
+ * @returns 追加字段后的树
3830
+ */
3831
+ var appendFieldByUniqueId = function (tree, uniqueId, fields) {
3832
+ var e_2, _a;
3833
+ if (!Array.isArray(tree)) {
3834
+ console.warn("menuTree must be an array");
3835
+ return [];
3836
+ }
3837
+ if (!tree || tree.length === 0)
3838
+ return [];
3839
+ try {
3840
+ for (var tree_2 = __values(tree), tree_2_1 = tree_2.next(); !tree_2_1.done; tree_2_1 = tree_2.next()) {
3841
+ var node = tree_2_1.value;
3842
+ var hasChildren = node.children && node.children.length > 0;
3843
+ if (node.uniqueId === uniqueId &&
3844
+ Object.prototype.toString.call(fields) === "[object Object]")
3845
+ Object.assign(node, fields);
3846
+ if (hasChildren && node.children) {
3847
+ appendFieldByUniqueId(node.children, uniqueId, fields);
3848
+ }
3849
+ }
3850
+ }
3851
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
3852
+ finally {
3853
+ try {
3854
+ if (tree_2_1 && !tree_2_1.done && (_a = tree_2.return)) _a.call(tree_2);
3855
+ }
3856
+ finally { if (e_2) throw e_2.error; }
3857
+ }
3858
+ return tree;
3859
+ };
3860
+ /**
3861
+ * @description 构造树型结构数据
3862
+ * @param data 数据源
3863
+ * @param id id字段 默认id
3864
+ * @param parentId 父节点字段,默认parentId
3865
+ * @param children 子节点字段,默认children
3866
+ * @returns 追加字段后的树
3867
+ */
3868
+ var handleTree = function (data, id, parentId, children) {
3869
+ var e_3, _a, e_4, _b, e_5, _c;
3870
+ var _d, _e, _f;
3871
+ if (!Array.isArray(data)) {
3872
+ console.warn("data must be an array");
3873
+ return [];
3874
+ }
3875
+ var idKey = id || "id";
3876
+ var parentIdKey = parentId || "parentId";
3877
+ var childrenKey = children || "children";
3878
+ var childrenListMap = {};
3879
+ var nodeIds = {};
3880
+ var tree = [];
3881
+ try {
3882
+ for (var data_1 = __values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
3883
+ var d = data_1_1.value;
3884
+ var pId = String((_d = d[parentIdKey]) !== null && _d !== void 0 ? _d : "");
3885
+ var nodeId = String((_e = d[idKey]) !== null && _e !== void 0 ? _e : "");
3886
+ if (childrenListMap[pId] == null) {
3887
+ childrenListMap[pId] = [];
3888
+ }
3889
+ nodeIds[nodeId] = d;
3890
+ childrenListMap[pId].push(d);
3891
+ }
3892
+ }
3893
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
3894
+ finally {
3895
+ try {
3896
+ if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
3897
+ }
3898
+ finally { if (e_3) throw e_3.error; }
3899
+ }
3900
+ try {
3901
+ for (var data_2 = __values(data), data_2_1 = data_2.next(); !data_2_1.done; data_2_1 = data_2.next()) {
3902
+ var d = data_2_1.value;
3903
+ var pId = String((_f = d[parentIdKey]) !== null && _f !== void 0 ? _f : "");
3904
+ if (nodeIds[pId] == null) {
3905
+ tree.push(d);
3906
+ }
3907
+ }
3908
+ }
3909
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
3910
+ finally {
3911
+ try {
3912
+ if (data_2_1 && !data_2_1.done && (_b = data_2.return)) _b.call(data_2);
3913
+ }
3914
+ finally { if (e_4) throw e_4.error; }
3915
+ }
3916
+ try {
3917
+ for (var tree_3 = __values(tree), tree_3_1 = tree_3.next(); !tree_3_1.done; tree_3_1 = tree_3.next()) {
3918
+ var t = tree_3_1.value;
3919
+ adaptToChildrenList(t);
3920
+ }
3921
+ }
3922
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
3923
+ finally {
3924
+ try {
3925
+ if (tree_3_1 && !tree_3_1.done && (_c = tree_3.return)) _c.call(tree_3);
3926
+ }
3927
+ finally { if (e_5) throw e_5.error; }
3928
+ }
3929
+ function adaptToChildrenList(o) {
3930
+ var e_6, _a;
3931
+ var _b;
3932
+ var nodeId = String((_b = o[idKey]) !== null && _b !== void 0 ? _b : "");
3933
+ if (childrenListMap[nodeId] !== null) {
3934
+ o[childrenKey] = childrenListMap[nodeId];
3935
+ }
3936
+ var nodeChildren = o[childrenKey];
3937
+ if (nodeChildren && Array.isArray(nodeChildren)) {
3938
+ try {
3939
+ for (var _c = __values(nodeChildren), _d = _c.next(); !_d.done; _d = _c.next()) {
3940
+ var c = _d.value;
3941
+ adaptToChildrenList(c);
3942
+ }
3943
+ }
3944
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
3945
+ finally {
3946
+ try {
3947
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
3948
+ }
3949
+ finally { if (e_6) throw e_6.error; }
3950
+ }
3951
+ }
3952
+ }
3953
+ return tree;
3954
+ };
3955
+
3956
+ var _a;
3957
+ // code转汉字大对象,例:CodeToText['110000']输出北京市
3958
+ var CodeToText = {};
3959
+ // 汉字转code大对象,例:TextToCode['北京市']['市辖区']['朝阳区'].code输出110105
3960
+ var TextToCode = {};
3961
+ // 省份对象
3962
+ var provinceObject = (_a = REGION_DATA["86"]) !== null && _a !== void 0 ? _a : {};
3963
+ // 省市区三级联动数据(不带"全部"选项)
3964
+ var regionData = [];
3965
+ // 省市二级联动数据(不带"全部"选项)
3966
+ var provinceAndCityData = [];
3967
+ var ALL_TEXT = "全部";
3968
+ CodeToText[""] = ALL_TEXT;
3969
+ // 计算省
3970
+ Object.keys(provinceObject).forEach(function (prop) {
3971
+ var provinceText = provinceObject[prop];
3972
+ regionData.push({
3973
+ value: prop,
3974
+ label: provinceText // 省份汉字
3975
+ });
3976
+ CodeToText[prop] = provinceText;
3977
+ TextToCode[provinceText] = {
3978
+ code: prop
3979
+ };
3980
+ TextToCode[provinceText][ALL_TEXT] = {
3981
+ code: ""
3982
+ };
3983
+ });
3984
+ // 计算市
3985
+ regionData.forEach(function (item) {
3986
+ var _a;
3987
+ var provinceCode = item.value;
3988
+ var provinceText = item.label;
3989
+ var provinceChildren = [];
3990
+ var provinceData = (_a = REGION_DATA[provinceCode]) !== null && _a !== void 0 ? _a : {};
3991
+ Object.keys(provinceData).forEach(function (prop) {
3992
+ provinceChildren.push({
3993
+ value: prop,
3994
+ label: provinceData[prop]
3995
+ });
3996
+ CodeToText[prop] = provinceData[prop];
3997
+ // 为市级数据建立映射
3998
+ var provinceNode = TextToCode[provinceText];
3999
+ provinceNode[provinceData[prop]] = { code: prop };
4000
+ var cityNode = provinceNode[provinceData[prop]];
4001
+ cityNode[ALL_TEXT] = { code: "" };
4002
+ });
4003
+ if (provinceChildren.length) {
4004
+ item.children = provinceChildren;
4005
+ }
4006
+ });
4007
+ provinceAndCityData = cloneDeep(regionData);
4008
+ // 计算区
4009
+ regionData.forEach(function (item) {
4010
+ var province = item.children;
4011
+ var provinceText = item.label;
4012
+ if (province) {
4013
+ province.forEach(function (pItem) {
4014
+ var _a;
4015
+ var cityCode = pItem.value;
4016
+ var cityText = pItem.label;
4017
+ var cityChildren = [];
4018
+ var cityData = (_a = REGION_DATA[cityCode]) !== null && _a !== void 0 ? _a : {};
4019
+ Object.keys(cityData).forEach(function (prop) {
4020
+ cityChildren.push({
4021
+ value: prop,
4022
+ label: cityData[prop]
4023
+ });
4024
+ CodeToText[prop] = cityData[prop];
4025
+ var provinceNode = TextToCode[provinceText];
4026
+ var cityNode = provinceNode === null || provinceNode === void 0 ? void 0 : provinceNode[cityText];
4027
+ if (cityNode) {
4028
+ cityNode[cityData[prop]] = { code: prop };
4029
+ }
4030
+ });
4031
+ if (cityChildren.length) {
4032
+ pItem.children = cityChildren;
4033
+ }
4034
+ });
4035
+ }
4036
+ });
4037
+ // 添加“全部”选项
4038
+ var provinceAndCityDataPlus = cloneDeep(provinceAndCityData);
4039
+ provinceAndCityDataPlus.unshift({
4040
+ value: "",
4041
+ label: ALL_TEXT
4042
+ });
4043
+ provinceAndCityDataPlus.forEach(function (item) {
4044
+ var province = item.children;
4045
+ if (province === null || province === void 0 ? void 0 : province.length) {
4046
+ province.unshift({
4047
+ value: "",
4048
+ label: ALL_TEXT
4049
+ });
4050
+ province.forEach(function (pItem) {
4051
+ var city = pItem.children;
4052
+ if (city === null || city === void 0 ? void 0 : city.length) {
4053
+ city.unshift({
4054
+ value: "",
4055
+ label: ALL_TEXT
4056
+ });
4057
+ }
4058
+ });
4059
+ }
4060
+ });
4061
+ var regionDataPlus = cloneDeep(regionData);
4062
+ regionDataPlus.unshift({
4063
+ value: "",
4064
+ label: ALL_TEXT
4065
+ });
4066
+ regionDataPlus.forEach(function (item) {
4067
+ var province = item.children;
4068
+ if (province === null || province === void 0 ? void 0 : province.length) {
4069
+ province.unshift({
4070
+ value: "",
4071
+ label: ALL_TEXT
4072
+ });
4073
+ province.forEach(function (pItem) {
4074
+ var city = pItem.children;
4075
+ if (city === null || city === void 0 ? void 0 : city.length) {
4076
+ city.unshift({
4077
+ value: "",
4078
+ label: ALL_TEXT
4079
+ });
4080
+ }
4081
+ });
4082
+ }
4083
+ });
4084
+ /**
4085
+ * 汉字转区域码
4086
+ * @param provinceText 省
4087
+ * @param cityText 市
4088
+ * @param regionText 区
4089
+ * @returns
4090
+ */
4091
+ function convertTextToCode(provinceText, cityText, regionText) {
4092
+ var _a, _b, _c;
4093
+ var code = "";
4094
+ if (provinceText && TextToCode[provinceText]) {
4095
+ var province = TextToCode[provinceText];
4096
+ var provinceCode = (_a = province.code) !== null && _a !== void 0 ? _a : "";
4097
+ code = provinceCode;
4098
+ if (cityText && province[cityText]) {
4099
+ var city = province[cityText];
4100
+ var cityCode = (_b = city.code) !== null && _b !== void 0 ? _b : "";
4101
+ code = "" + code + (cityText === ALL_TEXT ? "" : ", ") + cityCode;
4102
+ if (regionText && city[regionText]) {
4103
+ var region = city[regionText];
4104
+ code = "" + code + (regionText === ALL_TEXT ? "" : ", ") + ((_c = region.code) !== null && _c !== void 0 ? _c : "");
4105
+ }
4106
+ }
4107
+ }
4108
+ return code;
4109
+ }
4110
+
4111
+ /**
4112
+ * 菜单树 FieldCatalog 解析工具
4113
+ * @description 从菜单树中提取 fieldCatalog 配置,建立多维度映射
4114
+ * @version 1.0.0
4115
+ *
4116
+ * 设计原则:
4117
+ * 1. 纯函数,无副作用,易于测试和迁移
4118
+ * 2. 支持多维度查询(URL、resourceCode、路由路径)
4119
+ * 3. 后续可直接迁移到组件库
4120
+ */
4121
+ // ==================== 核心解析函数 ====================
4122
+ /**
4123
+ * 从 URL 中提取接口路径
4124
+ * @param url 完整 URL(可能包含微前端前缀和 hash)
4125
+ * @returns 接口路径
4126
+ * @example
4127
+ * '/saas-platform/billing-system#/saas/base/baseProject/getProjectPage'
4128
+ * => '/saas/base/baseProject/getProjectPage'
4129
+ */
4130
+ function extractApiPath(url) {
4131
+ if (!url)
4132
+ return null;
4133
+ // 如果包含 hash,取 hash 后面的部分
4134
+ var hashIndex = url.indexOf("#");
4135
+ if (hashIndex !== -1) {
4136
+ return url.substring(hashIndex + 1);
4137
+ }
4138
+ return url;
4139
+ }
4140
+ /**
4141
+ * 从 URL 中提取页面路由路径
4142
+ * @param url 完整 URL
4143
+ * @returns 页面路由路径
4144
+ * @example
4145
+ * '/saas-platform/billing-system#/project-manage/list'
4146
+ * => '/project-manage/list'
4147
+ */
4148
+ function extractRoutePath(url) {
4149
+ if (!url)
4150
+ return null;
4151
+ var hashIndex = url.indexOf("#");
4152
+ if (hashIndex !== -1) {
4153
+ var path = url.substring(hashIndex + 1);
4154
+ // 如果是 API 路径(以 /saas/ 开头),返回 null
4155
+ if (path.startsWith("/saas/")) {
4156
+ return null;
4157
+ }
4158
+ return path;
4159
+ }
4160
+ return null;
4161
+ }
4162
+ /**
4163
+ * 递归遍历菜单树,提取所有 fieldCatalog
4164
+ * @param nodes 菜单节点数组
4165
+ * @param registry 注册表(累积结果)
4166
+ * @param parentRoutePath 父级页面路由路径(用于关联接口到页面)
4167
+ */
4168
+ function traverseMenuTree(nodes, registry, parentRoutePath) {
4169
+ var e_1, _a;
4170
+ var _b;
4171
+ if (parentRoutePath === void 0) { parentRoutePath = null; }
4172
+ try {
4173
+ for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
4174
+ var node = nodes_1_1.value;
4175
+ var fieldCatalog = (_b = node.configJson) === null || _b === void 0 ? void 0 : _b.fieldCatalog;
4176
+ var routePath = extractRoutePath(node.url);
4177
+ var apiPath = extractApiPath(node.url);
4178
+ // 确定当前的页面路由路径(页面级别或继承父级)
4179
+ var currentRoutePath = parentRoutePath;
4180
+ // 如果是页面节点(resourceType === 3 且 level === 3),记录路由路径
4181
+ if (node.resourceType === 3 && node.level === 3 && routePath) {
4182
+ currentRoutePath = routePath;
4183
+ // 如果页面本身有 fieldCatalog,存储
4184
+ if (fieldCatalog && Object.keys(fieldCatalog).length > 0) {
4185
+ registry.byRoutePath[routePath] = fieldCatalog;
4186
+ }
4187
+ // 初始化该页面的接口列表
4188
+ if (!registry.routeToApis[routePath]) {
4189
+ registry.routeToApis[routePath] = [];
4190
+ }
4191
+ }
4192
+ // 如果是接口节点(resourceType === 3 且 level >= 4),处理接口配置
4193
+ if (node.resourceType === 3 && node.level >= 4) {
4194
+ // 按 resourceCode 存储
4195
+ if (fieldCatalog && Object.keys(fieldCatalog).length > 0) {
4196
+ registry.byResourceCode[node.resourceCode] = fieldCatalog;
4197
+ // 按 URL 存储
4198
+ if (apiPath) {
4199
+ registry.byUrl[apiPath] = fieldCatalog;
4200
+ }
4201
+ // 关联到父级页面
4202
+ if (currentRoutePath && registry.routeToApis[currentRoutePath]) {
4203
+ registry.routeToApis[currentRoutePath].push(node.resourceCode);
4204
+ }
4205
+ }
4206
+ }
4207
+ // 递归处理子节点
4208
+ if (node.children && node.children.length > 0) {
4209
+ traverseMenuTree(node.children, registry, currentRoutePath);
4210
+ }
4211
+ }
4212
+ }
4213
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
4214
+ finally {
4215
+ try {
4216
+ if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
4217
+ }
4218
+ finally { if (e_1) throw e_1.error; }
4219
+ }
4220
+ }
4221
+ // ==================== 导出的主函数 ====================
4222
+ /**
4223
+ * 解析菜单树,提取所有 fieldCatalog 配置
4224
+ * @param menuData 菜单数据(后端返回的 result 数组)
4225
+ * @returns 多维度映射的 fieldCatalog 注册表
4226
+ *
4227
+ * @example
4228
+ * ```ts
4229
+ * const menuData = await getTenantAppMenu();
4230
+ * const registry = parseMenuFieldCatalog(menuData.data.result);
4231
+ *
4232
+ * // 按接口 URL 获取
4233
+ * const catalog1 = registry.byUrl['/saas/base/baseProject/getProjectPage'];
4234
+ *
4235
+ * // 按 resourceCode 获取
4236
+ * const catalog2 = registry.byResourceCode['getProjectPage'];
4237
+ *
4238
+ * // 按页面路由获取
4239
+ * const catalog3 = registry.byRoutePath['/project-manage/list'];
4240
+ * ```
4241
+ */
4242
+ function parseMenuFieldCatalog(menuData) {
4243
+ var registry = {
4244
+ byUrl: {},
4245
+ byResourceCode: {},
4246
+ byRoutePath: {},
4247
+ routeToApis: {}
4248
+ };
4249
+ traverseMenuTree(menuData, registry);
4250
+ return registry;
4251
+ }
4252
+ /**
4253
+ * 根据页面路由获取合并后的 fieldCatalog
4254
+ * @description 合并页面自身的 fieldCatalog 和其关联接口的 fieldCatalog
4255
+ * @param registry fieldCatalog 注册表
4256
+ * @param routePath 页面路由路径
4257
+ * @returns 合并后的 fieldCatalog
4258
+ */
4259
+ function getMergedFieldCatalogByRoute(registry, routePath) {
4260
+ var e_2, _a;
4261
+ var result = {};
4262
+ // 1. 先添加页面自身的 fieldCatalog
4263
+ var pageFieldCatalog = registry.byRoutePath[routePath];
4264
+ if (pageFieldCatalog) {
4265
+ Object.assign(result, pageFieldCatalog);
4266
+ }
4267
+ // 2. 添加该页面关联的所有接口的 fieldCatalog
4268
+ var apiCodes = registry.routeToApis[routePath] || [];
4269
+ try {
4270
+ for (var apiCodes_1 = __values(apiCodes), apiCodes_1_1 = apiCodes_1.next(); !apiCodes_1_1.done; apiCodes_1_1 = apiCodes_1.next()) {
4271
+ var code = apiCodes_1_1.value;
4272
+ var apiFieldCatalog = registry.byResourceCode[code];
4273
+ if (apiFieldCatalog) {
4274
+ Object.assign(result, apiFieldCatalog);
4275
+ }
4276
+ }
4277
+ }
4278
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
4279
+ finally {
4280
+ try {
4281
+ if (apiCodes_1_1 && !apiCodes_1_1.done && (_a = apiCodes_1.return)) _a.call(apiCodes_1);
4282
+ }
4283
+ finally { if (e_2) throw e_2.error; }
4284
+ }
4285
+ return result;
4286
+ }
4287
+ /**
4288
+ * 将 fieldCatalog 转换为以 allowedField 为 key 的映射
4289
+ * @description 便于通过表格列的 prop 快速查找字段配置
4290
+ * @param fieldCatalog 原始 fieldCatalog(key 为完整字段名如 'vwProjectCountparking.projectName')
4291
+ * @returns 以 allowedField 为 key 的映射
4292
+ */
4293
+ function normalizeFieldCatalog(fieldCatalog) {
4294
+ var e_3, _a;
4295
+ var result = {};
4296
+ try {
4297
+ for (var _b = __values(Object.entries(fieldCatalog)), _c = _b.next(); !_c.done; _c = _b.next()) {
4298
+ var _d = __read(_c.value, 2), _fullName = _d[0], item = _d[1];
4299
+ if (item.allowedField) {
4300
+ result[item.allowedField] = item;
4301
+ }
4302
+ }
4303
+ }
4304
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
4305
+ finally {
4306
+ try {
4307
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
4308
+ }
4309
+ finally { if (e_3) throw e_3.error; }
4310
+ }
4311
+ return result;
4312
+ }
4313
+
4314
+ /**
4315
+ * 输入验证和格式化工具函数
4316
+ * @description 提供表单输入相关的验证和格式化工具方法
4317
+ */
4318
+ /**
4319
+ * 限制小数位数输入
4320
+ * @description 过滤非数字字符,只保留一个小数点,并限制小数位数
4321
+ * @param value 输入值
4322
+ * @param decimalPlaces 允许的小数位数
4323
+ * @returns 格式化后的字符串
4324
+ *
4325
+ * @example
4326
+ * ```ts
4327
+ * limitDecimalInput("123.456", 2); // "123.45"
4328
+ * limitDecimalInput("abc123.45def", 2); // "123.45"
4329
+ * limitDecimalInput("12.34.56", 2); // "12.3456" -> "12.34"
4330
+ * limitDecimalInput("", 2); // ""
4331
+ * ```
4332
+ */
4333
+ function limitDecimalInput(value, decimalPlaces) {
4334
+ // 只允许数字和一个小数点
4335
+ var newValue = value.replace(/[^\d.]/g, "");
4336
+ // 只保留第一个小数点
4337
+ var parts = newValue.split(".");
4338
+ if (parts.length > 2) {
4339
+ newValue = parts[0] + "." + parts.slice(1).join("");
4340
+ }
4341
+ // 重新分割处理后的值以限制小数位数
4342
+ var finalParts = newValue.split(".");
4343
+ if (finalParts.length === 2 && finalParts[1].length > decimalPlaces) {
4344
+ newValue = finalParts[0] + "." + finalParts[1].slice(0, decimalPlaces);
4345
+ }
4346
+ return newValue;
4347
+ }
4348
+ /**
4349
+ * 限制正整数输入
4350
+ * @description 过滤非数字字符,只允许输入正整数
4351
+ * @param value 输入值
4352
+ * @returns 只包含数字的字符串
4353
+ *
4354
+ * @example
4355
+ * ```ts
4356
+ * limitIntegerInput("123"); // "123"
4357
+ * limitIntegerInput("abc123def"); // "123"
4358
+ * limitIntegerInput("12.34"); // "1234"
4359
+ * limitIntegerInput("-123"); // "123"
4360
+ * limitIntegerInput(""); // ""
4361
+ * ```
4362
+ */
4363
+ function limitIntegerInput(value) {
4364
+ // 只允许数字
4365
+ return value.replace(/[^\d]/g, "");
4366
+ }
4367
+ /**
4368
+ * 限制数字输入(支持负数和小数)
4369
+ * @description 过滤非数字字符,只保留一个负号(在开头)和一个小数点,并限制小数位数
4370
+ * @param value 输入值
4371
+ * @param decimalPlaces 允许的小数位数
4372
+ * @returns 格式化后的字符串
4373
+ *
4374
+ * @example
4375
+ * ```ts
4376
+ * limitNumberInput("-123.456", 2); // "-123.45"
4377
+ * limitNumberInput("--123.45", 2); // "-123.45"
4378
+ * limitNumberInput("abc-123.45def", 2); // "-123.45"
4379
+ * ```
4380
+ */
4381
+ function limitNumberInput(value, decimalPlaces) {
4382
+ // 检查是否以负号开头
4383
+ var isNegative = value.startsWith("-");
4384
+ // 移除所有非数字和小数点字符
4385
+ var newValue = value.replace(/[^\d.]/g, "");
4386
+ // 只保留第一个小数点
4387
+ var parts = newValue.split(".");
4388
+ if (parts.length > 2) {
4389
+ newValue = parts[0] + "." + parts.slice(1).join("");
4390
+ }
4391
+ // 重新分割处理后的值以限制小数位数
4392
+ var finalParts = newValue.split(".");
4393
+ if (finalParts.length === 2 && finalParts[1].length > decimalPlaces) {
4394
+ newValue = finalParts[0] + "." + finalParts[1].slice(0, decimalPlaces);
4395
+ }
4396
+ // 添加负号
4397
+ if (isNegative && newValue) {
4398
+ newValue = "-" + newValue;
4399
+ }
4400
+ return newValue;
4401
+ }
4402
+
4403
+ var emitter = mitt();
4404
+
4405
+ /**
4406
+ * SM3 国密哈希算法工具
4407
+ * @description 使用 sm-crypto 库对敏感数据(如密码)进行 SM3 加密
4408
+ *
4409
+ * SM3 是中国国家密码管理局发布的密码杂凑算法标准
4410
+ * 输出 256 位(32 字节)的哈希值
4411
+ */
4412
+ /**
4413
+ * SM3 哈希计算
4414
+ * @param message 待哈希的字符串
4415
+ * @returns 64 位十六进制字符串
4416
+ *
4417
+ * @example
4418
+ * ```ts
4419
+ * const hash = sm3('hello world');
4420
+ * ```
4421
+ */
4422
+ function sm3(message) {
4423
+ return sm3$1(message);
4424
+ }
4425
+ /**
4426
+ * 对密码进行 SM3 加密
4427
+ * @param password 原始密码
4428
+ * @returns SM3 加密后的密码(64 位十六进制字符串)
4429
+ *
4430
+ * @example
4431
+ * ```ts
4432
+ * const encryptedPassword = encryptPassword('admin123');
4433
+ * ```
4434
+ */
4435
+ function encryptPassword(password) {
4436
+ return sm3$1(password);
4437
+ }
4438
+
4439
+ /**
4440
+ * 文件上传前验证工具
4441
+ * 包含文件大小、类型、配额、网络等验证
4442
+ */
4443
+ // 默认配置
4444
+ var DEFAULT_CONFIG = {
4445
+ maxFileSize: 500 * 1024 * 1024,
4446
+ maxTotalSize: 5 * 1024 * 1024 * 1024,
4447
+ allowedTypes: [],
4448
+ maxFilesCount: 100,
4449
+ checkNetwork: true,
4450
+ checkQuota: false
4451
+ };
4452
+ /**
4453
+ * 文件大小验证器
4454
+ */
4455
+ function validateFileSize(file, maxSize) {
4456
+ if (maxSize === void 0) { maxSize = DEFAULT_CONFIG.maxFileSize; }
4457
+ if (file.size > maxSize) {
4458
+ var maxSizeMB = Math.round(maxSize / 1024 / 1024);
4459
+ var fileSizeMB = Math.round(file.size / 1024 / 1024);
4460
+ return {
4461
+ valid: false,
4462
+ code: "FILE_SIZE_EXCEEDED",
4463
+ error: "\u6587\u4EF6 \"" + file.name + "\" \u5927\u5C0F " + fileSizeMB + "MB \u8D85\u8FC7\u9650\u5236 " + maxSizeMB + "MB"
4464
+ };
4465
+ }
4466
+ return { valid: true };
4467
+ }
4468
+ /**
4469
+ * 总文件大小验证器
4470
+ */
4471
+ function validateTotalSize(files, maxTotalSize) {
4472
+ if (maxTotalSize === void 0) { maxTotalSize = DEFAULT_CONFIG.maxTotalSize; }
4473
+ var totalSize = files.reduce(function (sum, file) { return sum + file.size; }, 0);
4474
+ if (totalSize > maxTotalSize) {
4475
+ var maxSizeGB = (maxTotalSize / 1024 / 1024 / 1024).toFixed(2);
4476
+ var totalSizeGB = (totalSize / 1024 / 1024 / 1024).toFixed(2);
4477
+ return {
4478
+ valid: false,
4479
+ code: "TOTAL_SIZE_EXCEEDED",
4480
+ error: "\u603B\u6587\u4EF6\u5927\u5C0F " + totalSizeGB + "GB \u8D85\u8FC7\u9650\u5236 " + maxSizeGB + "GB"
4481
+ };
4482
+ }
4483
+ return { valid: true };
4484
+ }
4485
+ /**
4486
+ * 文件类型验证器
4487
+ */
4488
+ function validateFileType(file, allowedTypes) {
4489
+ var _a;
4490
+ if (allowedTypes === void 0) { allowedTypes = []; }
4491
+ // 空数组表示允许所有类型
4492
+ if (allowedTypes.length === 0) {
4493
+ return { valid: true };
4494
+ }
4495
+ var fileType = file.type.toLowerCase();
4496
+ var fileExt = (_a = file.name.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
4497
+ // 检查 MIME 类型或扩展名
4498
+ var isTypeAllowed = allowedTypes.some(function (type) {
4499
+ return type.toLowerCase() === fileType ||
4500
+ type.toLowerCase() === "." + fileExt ||
4501
+ type.toLowerCase() === fileExt;
4502
+ });
4503
+ if (!isTypeAllowed) {
4504
+ return {
4505
+ valid: false,
4506
+ code: "FILE_TYPE_NOT_ALLOWED",
4507
+ error: "\u6587\u4EF6 \"" + file.name + "\" \u7C7B\u578B\u4E0D\u652F\u6301\u3002\u5141\u8BB8\u7684\u7C7B\u578B: " + allowedTypes.join(", ")
4508
+ };
4509
+ }
4510
+ return { valid: true };
4511
+ }
4512
+ /**
4513
+ * 文件数量验证器
4514
+ */
4515
+ function validateFilesCount(currentCount, newFilesCount, maxCount) {
4516
+ if (maxCount === void 0) { maxCount = DEFAULT_CONFIG.maxFilesCount; }
4517
+ var totalCount = currentCount + newFilesCount;
4518
+ if (totalCount > maxCount) {
4519
+ return {
4520
+ valid: false,
4521
+ code: "FILES_COUNT_EXCEEDED",
4522
+ error: "\u6587\u4EF6\u6570\u91CF\u8D85\u8FC7\u9650\u5236\uFF08\u5F53\u524D " + currentCount + " + \u65B0\u589E " + newFilesCount + " = " + totalCount + "\uFF0C\u6700\u5927 " + maxCount + "\uFF09"
4523
+ };
4524
+ }
4525
+ return { valid: true };
4526
+ }
4527
+ /**
4528
+ * 网络状态检测器
4529
+ */
4530
+ function checkNetworkStatus() {
4531
+ var _a;
4532
+ if (!navigator.onLine) {
4533
+ return {
4534
+ valid: false,
4535
+ code: "NETWORK_OFFLINE",
4536
+ error: "网络连接已断开,请检查网络后重试"
4537
+ };
4538
+ }
4539
+ var nav = navigator;
4540
+ var connection = nav.connection || nav.mozConnection || nav.webkitConnection;
4541
+ if (connection) {
4542
+ // 如果是慢速连接,给出警告(但不阻止)
4543
+ var slowTypes = ["slow-2g", "2g"];
4544
+ var effectiveType = (_a = connection.effectiveType) !== null && _a !== void 0 ? _a : "";
4545
+ if (slowTypes.includes(effectiveType)) {
4546
+ return {
4547
+ valid: true,
4548
+ code: "NETWORK_SLOW",
4549
+ error: "当前网络速度较慢,上传可能需要较长时间"
4550
+ };
4551
+ }
4552
+ }
4553
+ return { valid: true };
4554
+ }
4555
+ /**
4556
+ * 配额检查器(模拟,实际需要调用后端 API)
4557
+ */
4558
+ function checkStorageQuota(filesTotalSize) {
4559
+ return __awaiter(this, void 0, void 0, function () {
4560
+ var mockQuota, requiredGB, availableGB, error_1;
4561
+ return __generator(this, function (_a) {
4562
+ switch (_a.label) {
4563
+ case 0:
4564
+ _a.trys.push([0, 2, , 3]);
4565
+ // 模拟后端 API 调用延迟
4566
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 100); })];
4567
+ case 1:
4568
+ // 模拟后端 API 调用延迟
4569
+ _a.sent();
4570
+ mockQuota = {
4571
+ used: 1024 * 1024 * 1024,
4572
+ total: 10 * 1024 * 1024 * 1024,
4573
+ available: 9 * 1024 * 1024 * 1024 // 可用 9GB
4574
+ };
4575
+ if (filesTotalSize > mockQuota.available) {
4576
+ requiredGB = (filesTotalSize / 1024 / 1024 / 1024).toFixed(2);
4577
+ availableGB = (mockQuota.available / 1024 / 1024 / 1024).toFixed(2);
4578
+ return [2 /*return*/, {
4579
+ valid: false,
4580
+ code: "QUOTA_EXCEEDED",
4581
+ error: "\u5B58\u50A8\u7A7A\u95F4\u4E0D\u8DB3\u3002\u9700\u8981 " + requiredGB + "GB\uFF0C\u5269\u4F59 " + availableGB + "GB"
4582
+ }];
4583
+ }
4584
+ return [2 /*return*/, { valid: true }];
4585
+ case 2:
4586
+ error_1 = _a.sent();
4587
+ console.error("检查配额失败:", error_1);
4588
+ return [2 /*return*/, {
4589
+ valid: true,
4590
+ code: "QUOTA_CHECK_FAILED",
4591
+ error: "无法检查存储配额,将继续上传"
4592
+ }];
4593
+ case 3: return [2 /*return*/];
4594
+ }
4595
+ });
4596
+ });
4597
+ }
4598
+ /**
4599
+ * 综合验证器 - 执行所有验证
4600
+ */
4601
+ function validateFilesBeforeUpload(files, currentFiles, config) {
4602
+ if (currentFiles === void 0) { currentFiles = []; }
4603
+ if (config === void 0) { config = {}; }
4604
+ return __awaiter(this, void 0, void 0, function () {
4605
+ var finalConfig, results, countResult, files_1, files_1_1, file, sizeResult, typeResult, allFiles, totalSizeResult, networkResult, totalSize, quotaResult;
4606
+ var e_1, _a;
4607
+ return __generator(this, function (_b) {
4608
+ switch (_b.label) {
4609
+ case 0:
4610
+ finalConfig = __assign(__assign({}, DEFAULT_CONFIG), config);
4611
+ results = [];
4612
+ countResult = validateFilesCount(currentFiles.length, files.length, finalConfig.maxFilesCount);
4613
+ if (!countResult.valid) {
4614
+ return [2 /*return*/, [countResult]];
4615
+ }
4616
+ try {
4617
+ // 2. 验证每个文件的大小和类型
4618
+ for (files_1 = __values(files), files_1_1 = files_1.next(); !files_1_1.done; files_1_1 = files_1.next()) {
4619
+ file = files_1_1.value;
4620
+ sizeResult = validateFileSize(file, finalConfig.maxFileSize);
4621
+ if (!sizeResult.valid) {
4622
+ results.push(sizeResult);
4623
+ continue;
4624
+ }
4625
+ typeResult = validateFileType(file, finalConfig.allowedTypes);
4626
+ if (!typeResult.valid) {
4627
+ results.push(typeResult);
4628
+ continue;
4629
+ }
4630
+ }
4631
+ }
4632
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
4633
+ finally {
4634
+ try {
4635
+ if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1);
4636
+ }
4637
+ finally { if (e_1) throw e_1.error; }
4638
+ }
4639
+ // 如果有单个文件验证失败,直接返回
4640
+ if (results.length > 0) {
4641
+ return [2 /*return*/, results];
4642
+ }
4643
+ allFiles = __spread(currentFiles, files);
4644
+ totalSizeResult = validateTotalSize(allFiles, finalConfig.maxTotalSize);
4645
+ if (!totalSizeResult.valid) {
4646
+ return [2 /*return*/, [totalSizeResult]];
4647
+ }
4648
+ // 4. 检查网络状态
4649
+ if (finalConfig.checkNetwork) {
4650
+ networkResult = checkNetworkStatus();
4651
+ if (!networkResult.valid) {
4652
+ return [2 /*return*/, [networkResult]];
4653
+ }
4654
+ // 慢速网络警告
4655
+ if (networkResult.code === "NETWORK_SLOW") {
4656
+ results.push(networkResult);
4657
+ }
4658
+ }
4659
+ if (!finalConfig.checkQuota) return [3 /*break*/, 2];
4660
+ totalSize = allFiles.reduce(function (sum, file) { return sum + file.size; }, 0);
4661
+ return [4 /*yield*/, checkStorageQuota(totalSize)];
4662
+ case 1:
4663
+ quotaResult = _b.sent();
4664
+ if (!quotaResult.valid) {
4665
+ return [2 /*return*/, [quotaResult]];
4666
+ }
4667
+ _b.label = 2;
4668
+ case 2:
4669
+ // 所有验证通过
4670
+ if (results.length === 0) {
4671
+ results.push({ valid: true });
4672
+ }
4673
+ return [2 /*return*/, results];
4674
+ }
4675
+ });
4676
+ });
4677
+ }
4678
+ /**
4679
+ * 格式化文件大小
4680
+ */
4681
+ function formatFileSize(bytes) {
4682
+ if (bytes === 0)
4683
+ return "0 B";
4684
+ var k = 1024;
4685
+ var sizes = ["B", "KB", "MB", "GB", "TB"];
4686
+ var i = Math.floor(Math.log(bytes) / Math.log(k));
4687
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
4688
+ }
4689
+ /**
4690
+ * 获取友好的错误提示
4691
+ */
4692
+ function getValidationErrorMessage(results) {
4693
+ var errors = results.filter(function (r) { return !r.valid || r.code === "NETWORK_SLOW"; });
4694
+ if (errors.length === 0)
4695
+ return "";
4696
+ return errors.map(function (e) { return e.error; }).join("\n");
4697
+ }
4698
+
4699
+ /**
4700
+ * 上传速度计算和时间预估工具
4701
+ * 使用滑动窗口算法计算实时上传速度
4702
+ */
4703
+ // 速度计算器类
4704
+ var UploadSpeedCalculator = /** @class */ (function () {
4705
+ /**
4706
+ * @param windowSize 滑动窗口大小(秒),默认 10 秒
4707
+ * @param minPoints 最少记录点数,默认 3 个
4708
+ */
4709
+ function UploadSpeedCalculator(windowSize, minPoints) {
4710
+ if (windowSize === void 0) { windowSize = 10; }
4711
+ if (minPoints === void 0) { minPoints = 3; }
4712
+ this.speedPoints = []; // 速度记录点列表
4713
+ this.startTime = 0; // 开始时间
4714
+ this.totalBytes = 0; // 总字节数
4715
+ this.windowSize = windowSize;
4716
+ this.minPoints = minPoints;
4717
+ }
4718
+ /**
4719
+ * 开始计算
4720
+ * @param totalBytes 总字节数
4721
+ */
4722
+ UploadSpeedCalculator.prototype.start = function (totalBytes) {
4723
+ this.startTime = Date.now();
4724
+ this.totalBytes = totalBytes;
4725
+ this.speedPoints = [];
4726
+ this.addPoint(0); // 添加起始点
4727
+ };
4728
+ /**
4729
+ * 添加速度记录点
4730
+ * @param uploadedBytes 已上传字节数
4731
+ */
4732
+ UploadSpeedCalculator.prototype.addPoint = function (uploadedBytes) {
4733
+ var now = Date.now();
4734
+ this.speedPoints.push({
4735
+ timestamp: now,
4736
+ uploadedBytes: uploadedBytes
4737
+ });
4738
+ // 清理过期的记录点(超出滑动窗口)
4739
+ var windowMs = this.windowSize * 1000;
4740
+ this.speedPoints = this.speedPoints.filter(function (point) { return now - point.timestamp <= windowMs; });
4741
+ };
4742
+ /**
4743
+ * 计算当前上传速度(字节/秒)
4744
+ */
4745
+ UploadSpeedCalculator.prototype.getCurrentSpeed = function () {
4746
+ if (this.speedPoints.length < this.minPoints) {
4747
+ return 0;
4748
+ }
4749
+ var oldestPoint = this.speedPoints[0];
4750
+ var newestPoint = this.speedPoints[this.speedPoints.length - 1];
4751
+ var timeDiff = (newestPoint.timestamp - oldestPoint.timestamp) / 1000; // 秒
4752
+ var bytesDiff = newestPoint.uploadedBytes - oldestPoint.uploadedBytes;
4753
+ if (timeDiff === 0) {
4754
+ return 0;
4755
+ }
4756
+ return bytesDiff / timeDiff;
4757
+ };
4758
+ /**
4759
+ * 计算平均上传速度(字节/秒)
4760
+ */
4761
+ UploadSpeedCalculator.prototype.getAverageSpeed = function () {
4762
+ if (this.startTime === 0 || this.speedPoints.length === 0) {
4763
+ return 0;
4764
+ }
4765
+ var now = Date.now();
4766
+ var timeDiff = (now - this.startTime) / 1000; // 秒
4767
+ var newestPoint = this.speedPoints[this.speedPoints.length - 1];
4768
+ var uploadedBytes = newestPoint.uploadedBytes;
4769
+ if (timeDiff === 0) {
4770
+ return 0;
4771
+ }
4772
+ return uploadedBytes / timeDiff;
4773
+ };
4774
+ /**
4775
+ * 计算剩余时间(秒)
4776
+ * @param uploadedBytes 已上传字节数
4777
+ * @returns 剩余秒数,-1 表示无法计算
4778
+ */
4779
+ UploadSpeedCalculator.prototype.getRemainingTime = function (uploadedBytes) {
4780
+ var speed = this.getCurrentSpeed();
4781
+ if (speed === 0) {
4782
+ return -1;
4783
+ }
4784
+ var remainingBytes = this.totalBytes - uploadedBytes;
4785
+ return remainingBytes / speed;
4786
+ };
4787
+ /**
4788
+ * 格式化速度(自动选择单位)
4789
+ * @param bytesPerSecond 速度(字节/秒)
4790
+ */
4791
+ UploadSpeedCalculator.formatSpeed = function (bytesPerSecond) {
4792
+ if (bytesPerSecond === 0) {
4793
+ return "0 B/s";
4794
+ }
4795
+ var k = 1024;
4796
+ var sizes = ["B/s", "KB/s", "MB/s", "GB/s"];
4797
+ var i = Math.floor(Math.log(bytesPerSecond) / Math.log(k));
4798
+ var speed = parseFloat((bytesPerSecond / Math.pow(k, i)).toFixed(2));
4799
+ return speed + " " + sizes[i];
4800
+ };
4801
+ /**
4802
+ * 格式化剩余时间(友好显示)
4803
+ * @param seconds 剩余秒数
4804
+ */
4805
+ UploadSpeedCalculator.formatRemainingTime = function (seconds) {
4806
+ if (seconds < 0 || !isFinite(seconds)) {
4807
+ return "计算中...";
4808
+ }
4809
+ if (seconds < 60) {
4810
+ return Math.ceil(seconds) + " \u79D2";
4811
+ }
4812
+ var minutes = Math.floor(seconds / 60);
4813
+ if (minutes < 60) {
4814
+ return minutes + " \u5206\u949F";
4815
+ }
4816
+ var hours = Math.floor(minutes / 60);
4817
+ var remainingMinutes = minutes % 60;
4818
+ if (hours < 24) {
4819
+ return remainingMinutes > 0
4820
+ ? hours + " \u5C0F\u65F6 " + remainingMinutes + " \u5206\u949F"
4821
+ : hours + " \u5C0F\u65F6";
4822
+ }
4823
+ var days = Math.floor(hours / 24);
4824
+ var remainingHours = hours % 24;
4825
+ return remainingHours > 0
4826
+ ? days + " \u5929 " + remainingHours + " \u5C0F\u65F6"
4827
+ : days + " \u5929";
4828
+ };
4829
+ /**
4830
+ * 获取上传进度百分比
4831
+ * @param uploadedBytes 已上传字节数
4832
+ */
4833
+ UploadSpeedCalculator.prototype.getProgress = function (uploadedBytes) {
4834
+ if (this.totalBytes === 0) {
4835
+ return 0;
4836
+ }
4837
+ return Math.min(100, (uploadedBytes / this.totalBytes) * 100);
4838
+ };
4839
+ /**
4840
+ * 重置计算器
4841
+ */
4842
+ UploadSpeedCalculator.prototype.reset = function () {
4843
+ this.speedPoints = [];
4844
+ this.startTime = 0;
4845
+ this.totalBytes = 0;
4846
+ };
4847
+ return UploadSpeedCalculator;
4848
+ }());
4849
+ /**
4850
+ * 全局速度计算器管理器
4851
+ * 为每个文件维护独立的速度计算器
4852
+ */
4853
+ var SpeedCalculatorManager = /** @class */ (function () {
4854
+ function SpeedCalculatorManager() {
4855
+ this.calculators = new Map();
4856
+ }
4857
+ /**
4858
+ * 获取或创建文件的速度计算器
4859
+ * @param fileId 文件 ID
4860
+ */
4861
+ SpeedCalculatorManager.prototype.getCalculator = function (fileId) {
4862
+ if (!this.calculators.has(fileId)) {
4863
+ this.calculators.set(fileId, new UploadSpeedCalculator());
4864
+ }
4865
+ return this.calculators.get(fileId);
4866
+ };
4867
+ /**
4868
+ * 移除文件的速度计算器
4869
+ * @param fileId 文件 ID
4870
+ */
4871
+ SpeedCalculatorManager.prototype.removeCalculator = function (fileId) {
4872
+ this.calculators.delete(fileId);
4873
+ };
4874
+ /**
4875
+ * 清空所有计算器
4876
+ */
4877
+ SpeedCalculatorManager.prototype.clear = function () {
4878
+ this.calculators.clear();
4879
+ };
4880
+ /**
4881
+ * 获取所有文件的总速度
4882
+ */
4883
+ SpeedCalculatorManager.prototype.getTotalSpeed = function () {
4884
+ var e_1, _a;
4885
+ var totalSpeed = 0;
4886
+ try {
4887
+ for (var _b = __values(this.calculators.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
4888
+ var calculator = _c.value;
4889
+ totalSpeed += calculator.getCurrentSpeed();
4890
+ }
4891
+ }
4892
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
4893
+ finally {
4894
+ try {
4895
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
4896
+ }
4897
+ finally { if (e_1) throw e_1.error; }
4898
+ }
4899
+ return totalSpeed;
4900
+ };
4901
+ return SpeedCalculatorManager;
4902
+ }());
4903
+ // 导出单例实例
4904
+ var speedCalculatorManager = new SpeedCalculatorManager();
4905
+
4906
+ export { ApiBuilder, CodeToText, InsertBuilder, Money, QueryBuilder, RoundingMode, SpeedCalculatorManager, TextToCode, UpdateBuilder, UploadSpeedCalculator, WebsocketManager, addClass, addDays, appendFieldByUniqueId, base64ToBlob, base64ToFile, blobToDataURL, buildHierarchyTree, buildUUID, calcFileSize, ceil, checkNetworkStatus, checkStorageQuota, clearLoginData, compatibleDate, compressImg, computeMoney, convertBase64UrlToBlob, convertCurrency, convertTextToCode, copyTextToClipboard, createWebSocketStore, darken, dataURLtoBlob, deepEqual, delay, deleteChildren, deviceDetection, emitter$1 as emitter, encryptPassword, extractPathList, fileSizeFormat, filterRepeat, findNodePath, floor, formatBank, formatBytes, formatCentsToYuan, formatEmptyValue, formatFileSize, formatFloat, formatMoney, formatPhone, formatPhoneHide, formatTime, formateTimestamp, fromNow, genExportByBlob, generateEnglishLetters, getCookie, getDeviceType, getEnvironment, getFileData, getFromType, getIsComWx, getIsDevelopment, getKeyList, getMergedFieldCatalogByRoute, getNodeByUniqueId, getQueryMap, getQueryString, getQueryVariable, getSvgInfo, getTicket, getToken, getValidationErrorMessage, getWecomToken, handleFlatStr, handleTree, hasClass, hexToRgb, hideTextAtIndex, http, httpEnum, humpTurnDashed, intersection, isAllEmpty, isEmail, isEmpty, isExternal, isImage, isIncludeAllChildren, isMobile, isMobileSimple, isPhone, isQQ, isTelephone, isUrl, lighten, limitDecimalInput, limitIntegerInput, limitNumberInput, emitter as mittBus, newDate, normalizeFieldCatalog, openLink, parseMenuFieldCatalog, provinceAndCityData, provinceAndCityDataPlus, randomString, recordLogMiddleware, recordLogMiddlewareFastify, recordLogMiddlewareHono, recordLogMiddlewareKoa, recordLogMiddlewareMidway, regionData, regionDataPlus, removeClass, removeTicket, removeToken, rgbToHex, sendLog, setTicket, sm3, speedCalculatorManager, subBefore, sum, toThousands, toggleClass, trimVal, uuid, validateFileSize, validateFileType, validateFilesBeforeUpload, validateFilesCount, validateTotalSize, validateTwoDecimal, websocketService };