ly-utils-lib 1.0.12 → 2.5.0

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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1002 -685
  3. package/dist/array.cjs +237 -0
  4. package/dist/array.cjs.map +1 -0
  5. package/dist/array.d.cts +2 -0
  6. package/dist/array.d.ts +2 -0
  7. package/dist/array.js +150 -0
  8. package/dist/array.js.map +1 -0
  9. package/dist/crypto.cjs +193 -0
  10. package/dist/crypto.cjs.map +1 -0
  11. package/dist/crypto.d.cts +3 -0
  12. package/dist/crypto.d.ts +3 -0
  13. package/dist/crypto.js +144 -0
  14. package/dist/crypto.js.map +1 -0
  15. package/dist/date.cjs +563 -0
  16. package/dist/date.cjs.map +1 -0
  17. package/dist/date.d.cts +2 -0
  18. package/dist/date.d.ts +2 -0
  19. package/dist/date.js +451 -0
  20. package/dist/date.js.map +1 -0
  21. package/dist/excel.cjs +227 -0
  22. package/dist/excel.cjs.map +1 -0
  23. package/dist/excel.d.cts +2 -0
  24. package/dist/excel.d.ts +2 -0
  25. package/dist/excel.js +196 -0
  26. package/dist/excel.js.map +1 -0
  27. package/dist/index-B80SEVzM.d.cts +382 -0
  28. package/dist/index-B80SEVzM.d.ts +382 -0
  29. package/dist/index-Ba1rjTzj.d.cts +299 -0
  30. package/dist/index-Ba1rjTzj.d.ts +299 -0
  31. package/dist/index-Bg1ise7y.d.cts +253 -0
  32. package/dist/index-Bg1ise7y.d.ts +253 -0
  33. package/dist/index-BoqNpwNa.d.cts +203 -0
  34. package/dist/index-BoqNpwNa.d.ts +203 -0
  35. package/dist/index-C0qUnb9Y.d.cts +533 -0
  36. package/dist/index-C0qUnb9Y.d.ts +533 -0
  37. package/dist/index-Cq1GhjpY.d.cts +229 -0
  38. package/dist/index-Cq1GhjpY.d.ts +229 -0
  39. package/dist/index-Cy-mb5v_.d.cts +262 -0
  40. package/dist/index-Cy-mb5v_.d.ts +262 -0
  41. package/dist/index-D1f9Sym2.d.cts +148 -0
  42. package/dist/index-D1f9Sym2.d.ts +148 -0
  43. package/dist/index-Dan5oF-5.d.cts +213 -0
  44. package/dist/index-Dan5oF-5.d.ts +213 -0
  45. package/dist/index-XABfrs7z.d.cts +596 -0
  46. package/dist/index-XABfrs7z.d.ts +596 -0
  47. package/dist/index-YXWfKCK7.d.cts +109 -0
  48. package/dist/index-YXWfKCK7.d.ts +109 -0
  49. package/dist/index.cjs +3691 -0
  50. package/dist/index.cjs.map +1 -0
  51. package/dist/index.d.cts +22 -0
  52. package/dist/index.d.ts +22 -0
  53. package/dist/index.js +3629 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/map.cjs +839 -0
  56. package/dist/map.cjs.map +1 -0
  57. package/dist/map.d.cts +6 -0
  58. package/dist/map.d.ts +6 -0
  59. package/dist/map.js +811 -0
  60. package/dist/map.js.map +1 -0
  61. package/dist/object.cjs +316 -0
  62. package/dist/object.cjs.map +1 -0
  63. package/dist/object.d.cts +2 -0
  64. package/dist/object.d.ts +2 -0
  65. package/dist/object.js +247 -0
  66. package/dist/object.js.map +1 -0
  67. package/dist/pdf.cjs +197 -0
  68. package/dist/pdf.cjs.map +1 -0
  69. package/dist/pdf.d.cts +3 -0
  70. package/dist/pdf.d.ts +3 -0
  71. package/dist/pdf.js +173 -0
  72. package/dist/pdf.js.map +1 -0
  73. package/dist/storage.cjs +255 -0
  74. package/dist/storage.cjs.map +1 -0
  75. package/dist/storage.d.cts +1 -0
  76. package/dist/storage.d.ts +1 -0
  77. package/dist/storage.js +226 -0
  78. package/dist/storage.js.map +1 -0
  79. package/dist/string.cjs +232 -0
  80. package/dist/string.cjs.map +1 -0
  81. package/dist/string.d.cts +2 -0
  82. package/dist/string.d.ts +2 -0
  83. package/dist/string.js +170 -0
  84. package/dist/string.js.map +1 -0
  85. package/dist/utils.cjs +429 -0
  86. package/dist/utils.cjs.map +1 -0
  87. package/dist/utils.d.cts +2 -0
  88. package/dist/utils.d.ts +2 -0
  89. package/dist/utils.js +371 -0
  90. package/dist/utils.js.map +1 -0
  91. package/dist/websocket.cjs +338 -0
  92. package/dist/websocket.cjs.map +1 -0
  93. package/dist/websocket.d.cts +1 -0
  94. package/dist/websocket.d.ts +1 -0
  95. package/dist/websocket.js +330 -0
  96. package/dist/websocket.js.map +1 -0
  97. package/package.json +159 -33
  98. package/dist/ly-utils-lib.cjs.js +0 -115
  99. package/dist/ly-utils-lib.cjs.js.map +0 -1
  100. package/dist/ly-utils-lib.es.js +0 -58589
  101. package/dist/ly-utils-lib.es.js.map +0 -1
  102. package/dist/ly-utils-lib.umd.js +0 -115
  103. package/dist/ly-utils-lib.umd.js.map +0 -1
  104. package/dist/types/index.d.ts +0 -15
  105. package/dist/types/utils/esToolkit.d.ts +0 -2
  106. package/dist/types/utils/ol.d.ts +0 -175
  107. package/dist/types/utils/router.d.ts +0 -10
  108. package/dist/types/utils/storage.d.ts +0 -42
  109. package/dist/types/utils/time.d.ts +0 -66
  110. package/dist/types/utils/tool.d.ts +0 -80
  111. package/dist/vite.svg +0 -1
package/dist/index.cjs ADDED
@@ -0,0 +1,3691 @@
1
+ 'use strict';
2
+
3
+ var dayjs = require('dayjs');
4
+ var durationPlugin = require('dayjs/plugin/duration');
5
+ var isBetweenPlugin = require('dayjs/plugin/isBetween');
6
+ var isSameOrAfterPlugin = require('dayjs/plugin/isSameOrAfter');
7
+ var isSameOrBeforePlugin = require('dayjs/plugin/isSameOrBefore');
8
+ var quarterOfYear = require('dayjs/plugin/quarterOfYear');
9
+ var relativeTime = require('dayjs/plugin/relativeTime');
10
+ var timezone = require('dayjs/plugin/timezone');
11
+ var utc = require('dayjs/plugin/utc');
12
+ var weekOfYear = require('dayjs/plugin/weekOfYear');
13
+ var weekYear = require('dayjs/plugin/weekYear');
14
+ var isLeapYearPlugin = require('dayjs/plugin/isLeapYear');
15
+ var dayOfYear = require('dayjs/plugin/dayOfYear');
16
+ var minMax = require('dayjs/plugin/minMax');
17
+ var weekday = require('dayjs/plugin/weekday');
18
+ require('dayjs/locale/zh-cn');
19
+ var esToolkit = require('es-toolkit');
20
+ var XLSX = require('xlsx');
21
+ var html2canvas = require('html2canvas');
22
+ var jspdf = require('jspdf');
23
+ var ol = require('ol');
24
+ var control = require('ol/control');
25
+ var geom = require('ol/geom');
26
+ var interaction = require('ol/interaction');
27
+ var Overlay = require('ol/Overlay');
28
+ var TileLayer = require('ol/layer/Tile');
29
+ var VectorLayer = require('ol/layer/Vector');
30
+ var proj = require('ol/proj');
31
+ var OSM = require('ol/source/OSM');
32
+ var VectorSource = require('ol/source/Vector');
33
+ var XYZ = require('ol/source/XYZ');
34
+ var GeoJSON = require('ol/format/GeoJSON');
35
+ var style = require('ol/style');
36
+ var extent = require('ol/extent');
37
+ var Cookies = require('js-cookie');
38
+ var CryptoJS = require('crypto-js');
39
+
40
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
41
+
42
+ function _interopNamespace(e) {
43
+ if (e && e.__esModule) return e;
44
+ var n = Object.create(null);
45
+ if (e) {
46
+ Object.keys(e).forEach(function (k) {
47
+ if (k !== 'default') {
48
+ var d = Object.getOwnPropertyDescriptor(e, k);
49
+ Object.defineProperty(n, k, d.get ? d : {
50
+ enumerable: true,
51
+ get: function () { return e[k]; }
52
+ });
53
+ }
54
+ });
55
+ }
56
+ n.default = e;
57
+ return Object.freeze(n);
58
+ }
59
+
60
+ var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
61
+ var durationPlugin__default = /*#__PURE__*/_interopDefault(durationPlugin);
62
+ var isBetweenPlugin__default = /*#__PURE__*/_interopDefault(isBetweenPlugin);
63
+ var isSameOrAfterPlugin__default = /*#__PURE__*/_interopDefault(isSameOrAfterPlugin);
64
+ var isSameOrBeforePlugin__default = /*#__PURE__*/_interopDefault(isSameOrBeforePlugin);
65
+ var quarterOfYear__default = /*#__PURE__*/_interopDefault(quarterOfYear);
66
+ var relativeTime__default = /*#__PURE__*/_interopDefault(relativeTime);
67
+ var timezone__default = /*#__PURE__*/_interopDefault(timezone);
68
+ var utc__default = /*#__PURE__*/_interopDefault(utc);
69
+ var weekOfYear__default = /*#__PURE__*/_interopDefault(weekOfYear);
70
+ var weekYear__default = /*#__PURE__*/_interopDefault(weekYear);
71
+ var isLeapYearPlugin__default = /*#__PURE__*/_interopDefault(isLeapYearPlugin);
72
+ var dayOfYear__default = /*#__PURE__*/_interopDefault(dayOfYear);
73
+ var minMax__default = /*#__PURE__*/_interopDefault(minMax);
74
+ var weekday__default = /*#__PURE__*/_interopDefault(weekday);
75
+ var XLSX__namespace = /*#__PURE__*/_interopNamespace(XLSX);
76
+ var html2canvas__default = /*#__PURE__*/_interopDefault(html2canvas);
77
+ var Overlay__default = /*#__PURE__*/_interopDefault(Overlay);
78
+ var TileLayer__default = /*#__PURE__*/_interopDefault(TileLayer);
79
+ var VectorLayer__default = /*#__PURE__*/_interopDefault(VectorLayer);
80
+ var OSM__default = /*#__PURE__*/_interopDefault(OSM);
81
+ var VectorSource__default = /*#__PURE__*/_interopDefault(VectorSource);
82
+ var XYZ__default = /*#__PURE__*/_interopDefault(XYZ);
83
+ var GeoJSON__default = /*#__PURE__*/_interopDefault(GeoJSON);
84
+ var Cookies__default = /*#__PURE__*/_interopDefault(Cookies);
85
+ var CryptoJS__namespace = /*#__PURE__*/_interopNamespace(CryptoJS);
86
+
87
+ var __defProp = Object.defineProperty;
88
+ var __export = (target, all) => {
89
+ for (var name in all)
90
+ __defProp(target, name, { get: all[name], enumerable: true });
91
+ };
92
+
93
+ // src/modules/date/index.ts
94
+ var date_exports = {};
95
+ __export(date_exports, {
96
+ add: () => add,
97
+ clone: () => clone,
98
+ compare: () => compare,
99
+ computeDate: () => computeDate,
100
+ dayjs: () => dayjs__default.default,
101
+ default: () => date_default,
102
+ diff: () => diff,
103
+ diffDays: () => diffDays,
104
+ diffHours: () => diffHours,
105
+ endDate: () => endDate,
106
+ endOf: () => endOf,
107
+ format: () => format,
108
+ formatDuration: () => formatDuration,
109
+ formatTimestamp: () => formatTimestamp,
110
+ fromNow: () => fromNow,
111
+ fromUTC: () => fromUTC,
112
+ fromUnix: () => fromUnix,
113
+ getAge: () => getAge,
114
+ getChineseYear: () => getChineseYear,
115
+ getDate: () => getDate,
116
+ getDateRange: () => getDateRange,
117
+ getDay: () => getDay,
118
+ getDayOfYear: () => getDayOfYear,
119
+ getDaysInMonth: () => getDaysInMonth,
120
+ getFirstDayOfMonth: () => getFirstDayOfMonth,
121
+ getFirstDayOfMonthDate: () => getFirstDayOfMonthDate,
122
+ getFirstDayOfWeek: () => getFirstDayOfWeek,
123
+ getFirstDayOfYear: () => getFirstDayOfYear,
124
+ getHolidayName: () => getHolidayName,
125
+ getHour: () => getHour,
126
+ getLastDayOfMonth: () => getLastDayOfMonth,
127
+ getLastDayOfMonthDate: () => getLastDayOfMonthDate,
128
+ getLastDayOfWeek: () => getLastDayOfWeek,
129
+ getLastDayOfYear: () => getLastDayOfYear,
130
+ getMinute: () => getMinute,
131
+ getMonth: () => getMonth,
132
+ getMonthRange: () => getMonthRange,
133
+ getQuarter: () => getQuarter,
134
+ getQuarterRange: () => getQuarterRange,
135
+ getRangeDate: () => getRangeDate,
136
+ getRecentDays: () => getRecentDays,
137
+ getRecentMonths: () => getRecentMonths,
138
+ getRecentWeeks: () => getRecentWeeks,
139
+ getRelativeTime: () => getRelativeTime,
140
+ getSecond: () => getSecond,
141
+ getTime: () => getTime,
142
+ getTimeOfDay: () => getTimeOfDay,
143
+ getTimeOfDayName: () => getTimeOfDayName,
144
+ getTimestamp: () => getTimestamp,
145
+ getTimezoneOffset: () => getTimezoneOffset,
146
+ getWeek: () => getWeek,
147
+ getWeekRange: () => getWeekRange,
148
+ getWeekday: () => getWeekday,
149
+ getWeekdayName: () => getWeekdayName,
150
+ getWorkdaysBetween: () => getWorkdaysBetween,
151
+ getYear: () => getYear,
152
+ getYearRange: () => getYearRange,
153
+ getZodiacSign: () => getZodiacSign,
154
+ isAfter: () => isAfter,
155
+ isBefore: () => isBefore,
156
+ isBetween: () => isBetween,
157
+ isHoliday: () => isHoliday,
158
+ isLeapYear: () => isLeapYear,
159
+ isSame: () => isSame,
160
+ isSameMonth: () => isSameMonth,
161
+ isSameOrAfter: () => isSameOrAfter,
162
+ isSameOrBefore: () => isSameOrBefore,
163
+ isSameYear: () => isSameYear,
164
+ isThisMonth: () => isThisMonth,
165
+ isThisWeek: () => isThisWeek,
166
+ isThisYear: () => isThisYear,
167
+ isToday: () => isToday,
168
+ isTomorrow: () => isTomorrow,
169
+ isValid: () => isValid,
170
+ isWeekend: () => isWeekend,
171
+ isWorkday: () => isWorkday,
172
+ isYesterday: () => isYesterday,
173
+ maxDate: () => maxDate,
174
+ minDate: () => minDate,
175
+ now: () => now,
176
+ parse: () => parse,
177
+ startDate: () => startDate,
178
+ startOf: () => startOf,
179
+ subtract: () => subtract,
180
+ toNow: () => toNow,
181
+ toTimezone: () => toTimezone,
182
+ toUTC: () => toUTC,
183
+ unix: () => unix,
184
+ valueOf: () => valueOf
185
+ });
186
+ dayjs__default.default.extend(relativeTime__default.default);
187
+ dayjs__default.default.extend(utc__default.default);
188
+ dayjs__default.default.extend(timezone__default.default);
189
+ dayjs__default.default.extend(durationPlugin__default.default);
190
+ dayjs__default.default.extend(isBetweenPlugin__default.default);
191
+ dayjs__default.default.extend(isSameOrBeforePlugin__default.default);
192
+ dayjs__default.default.extend(isSameOrAfterPlugin__default.default);
193
+ dayjs__default.default.extend(weekOfYear__default.default);
194
+ dayjs__default.default.extend(weekYear__default.default);
195
+ dayjs__default.default.extend(quarterOfYear__default.default);
196
+ dayjs__default.default.extend(isLeapYearPlugin__default.default);
197
+ dayjs__default.default.extend(dayOfYear__default.default);
198
+ dayjs__default.default.extend(minMax__default.default);
199
+ dayjs__default.default.extend(weekday__default.default);
200
+ dayjs__default.default.locale("zh-cn");
201
+ var now = () => dayjs__default.default();
202
+ var format = (date, formatStr = "YYYY-MM-DD HH:mm:ss") => {
203
+ return dayjs__default.default(date).format(formatStr);
204
+ };
205
+ var getDate = (date = /* @__PURE__ */ new Date()) => {
206
+ return dayjs__default.default(date).format("YYYY-MM-DD");
207
+ };
208
+ var getTime = (date = /* @__PURE__ */ new Date()) => {
209
+ return dayjs__default.default(date).format("HH:mm:ss");
210
+ };
211
+ var getTimestamp = (date = /* @__PURE__ */ new Date()) => {
212
+ return dayjs__default.default(date).valueOf();
213
+ };
214
+ var add = (date, amount, unit = "day") => {
215
+ return dayjs__default.default(date).add(amount, unit);
216
+ };
217
+ var subtract = (date, amount, unit = "day") => {
218
+ return dayjs__default.default(date).subtract(amount, unit);
219
+ };
220
+ var startOf = (date, unit = "day") => {
221
+ return dayjs__default.default(date).startOf(unit);
222
+ };
223
+ var endOf = (date, unit = "day") => {
224
+ return dayjs__default.default(date).endOf(unit);
225
+ };
226
+ var diffDays = (date1, date2) => {
227
+ return dayjs__default.default(date1).diff(dayjs__default.default(date2), "day");
228
+ };
229
+ var diffHours = (date1, date2) => {
230
+ return dayjs__default.default(date1).diff(dayjs__default.default(date2), "hour");
231
+ };
232
+ var isToday = (date) => {
233
+ return dayjs__default.default(date).isSame(dayjs__default.default(), "day");
234
+ };
235
+ var isYesterday = (date) => {
236
+ return dayjs__default.default(date).isSame(dayjs__default.default().subtract(1, "day"), "day");
237
+ };
238
+ var isTomorrow = (date) => {
239
+ return dayjs__default.default(date).isSame(dayjs__default.default().add(1, "day"), "day");
240
+ };
241
+ var isBetween = (date, startDate2, endDate2) => {
242
+ return dayjs__default.default(date).isBetween(startDate2, endDate2, null, "[]");
243
+ };
244
+ var fromNow = (date) => {
245
+ return dayjs__default.default(date).fromNow();
246
+ };
247
+ var getWeek = (date = /* @__PURE__ */ new Date()) => {
248
+ return dayjs__default.default(date).week();
249
+ };
250
+ var computeDate = (compute, date = /* @__PURE__ */ new Date(), type = "day", num = 1, format2 = "YYYY-MM-DD") => {
251
+ const d = dayjs__default.default(date);
252
+ if (compute === "after") {
253
+ return d.add(num, type).format(format2);
254
+ }
255
+ if (compute === "before") {
256
+ return d.subtract(num, type).format(format2);
257
+ }
258
+ return d.format(format2);
259
+ };
260
+ var startDate = (type = "month", format2 = "YYYY-MM-DD") => {
261
+ return dayjs__default.default().startOf(type).format(format2);
262
+ };
263
+ var endDate = (type = "month", format2 = "YYYY-MM-DD") => {
264
+ return dayjs__default.default().endOf(type).format(format2);
265
+ };
266
+ var formatTimestamp = (timestamp = 0, format2 = "YYYY-MM-DD HH:mm:ss") => {
267
+ const ts = timestamp === 0 ? getTimestamp() / 1e3 : timestamp;
268
+ return dayjs__default.default.unix(ts).format(format2);
269
+ };
270
+ var diff = (type, startDate2, endDate2 = /* @__PURE__ */ new Date()) => {
271
+ return dayjs__default.default(endDate2).diff(dayjs__default.default(startDate2), type);
272
+ };
273
+ var getRangeDate = (startDate2, endDate2, format2 = "YYYY-MM-DD") => {
274
+ const diffDays2 = diff("day", startDate2, endDate2);
275
+ const range = [];
276
+ for (let i = 0; i <= diffDays2; i++) {
277
+ const day = computeDate("after", startDate2, "day", i, format2);
278
+ range.push({
279
+ day,
280
+ timestamp: getTimestamp(day) / 1e3
281
+ });
282
+ }
283
+ return range;
284
+ };
285
+ var getRelativeTime = (date) => {
286
+ const diffMinutes = diff("minute", date);
287
+ if (diffMinutes < 1) {
288
+ return "\u521A\u521A";
289
+ }
290
+ if (diffMinutes < 60) {
291
+ return `${diffMinutes}\u5206\u949F\u524D`;
292
+ }
293
+ if (diffMinutes < 1440) {
294
+ return `${Math.floor(diffMinutes / 60)}\u5C0F\u65F6\u524D`;
295
+ }
296
+ if (diffMinutes < 43200) {
297
+ return `${Math.floor(diffMinutes / 1440)}\u5929\u524D`;
298
+ }
299
+ return format(date, "YYYY-MM-DD");
300
+ };
301
+ var isValid = (date) => {
302
+ return dayjs__default.default(date).isValid();
303
+ };
304
+ var getFirstDayOfMonth = (date = /* @__PURE__ */ new Date()) => {
305
+ return dayjs__default.default(date).date() - dayjs__default.default(date).startOf("month").date() + 1;
306
+ };
307
+ var getLastDayOfMonth = (date = /* @__PURE__ */ new Date()) => {
308
+ return dayjs__default.default(date).endOf("month").date();
309
+ };
310
+ var getQuarter = (date = /* @__PURE__ */ new Date()) => {
311
+ return dayjs__default.default(date).quarter();
312
+ };
313
+ var getDaysInMonth = (date = /* @__PURE__ */ new Date()) => {
314
+ return dayjs__default.default(date).daysInMonth();
315
+ };
316
+ var getMonthRange = (date = /* @__PURE__ */ new Date()) => {
317
+ const d = dayjs__default.default(date);
318
+ return [d.startOf("month").format("YYYY-MM-DD"), d.endOf("month").format("YYYY-MM-DD")];
319
+ };
320
+ var getQuarterRange = (date = /* @__PURE__ */ new Date()) => {
321
+ const d = dayjs__default.default(date);
322
+ const quarter = d.quarter();
323
+ const start = d.month((quarter - 1) * 3).startOf("month").format("YYYY-MM-DD");
324
+ const end = d.month(quarter * 3 - 1).endOf("month").format("YYYY-MM-DD");
325
+ return [start, end];
326
+ };
327
+ var getYearRange = (date = /* @__PURE__ */ new Date()) => {
328
+ const d = dayjs__default.default(date);
329
+ return [d.startOf("year").format("YYYY-MM-DD"), d.endOf("year").format("YYYY-MM-DD")];
330
+ };
331
+ var getWeekRange = (date = /* @__PURE__ */ new Date(), startDay = 0) => {
332
+ const d = dayjs__default.default(date);
333
+ const day = d.day();
334
+ const diff3 = day < startDay ? 7 - startDay + day : day - startDay;
335
+ const start = d.subtract(diff3, "day").format("YYYY-MM-DD");
336
+ const end = d.subtract(diff3, "day").add(6, "day").format("YYYY-MM-DD");
337
+ return [start, end];
338
+ };
339
+ var isLeapYear = (year) => {
340
+ return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
341
+ };
342
+ var getYear = (date = /* @__PURE__ */ new Date()) => {
343
+ return dayjs__default.default(date).year();
344
+ };
345
+ var getMonth = (date = /* @__PURE__ */ new Date()) => {
346
+ return dayjs__default.default(date).month() + 1;
347
+ };
348
+ var getDay = (date = /* @__PURE__ */ new Date()) => {
349
+ return dayjs__default.default(date).date();
350
+ };
351
+ var getHour = (date = /* @__PURE__ */ new Date()) => {
352
+ return dayjs__default.default(date).hour();
353
+ };
354
+ var getMinute = (date = /* @__PURE__ */ new Date()) => {
355
+ return dayjs__default.default(date).minute();
356
+ };
357
+ var getSecond = (date = /* @__PURE__ */ new Date()) => {
358
+ return dayjs__default.default(date).second();
359
+ };
360
+ var getWeekday = (date = /* @__PURE__ */ new Date()) => {
361
+ return dayjs__default.default(date).day();
362
+ };
363
+ var getWeekdayName = (date = /* @__PURE__ */ new Date()) => {
364
+ const weekdays = ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D"];
365
+ return weekdays[dayjs__default.default(date).day()];
366
+ };
367
+ var getDayOfYear = (date = /* @__PURE__ */ new Date()) => {
368
+ return dayjs__default.default(date).dayOfYear();
369
+ };
370
+ var getFirstDayOfWeek = (date = /* @__PURE__ */ new Date()) => {
371
+ return dayjs__default.default(date).weekday(0);
372
+ };
373
+ var getLastDayOfWeek = (date = /* @__PURE__ */ new Date()) => {
374
+ return dayjs__default.default(date).weekday(6);
375
+ };
376
+ var getFirstDayOfMonthDate = (date = /* @__PURE__ */ new Date()) => {
377
+ return dayjs__default.default(date).startOf("month");
378
+ };
379
+ var getLastDayOfMonthDate = (date = /* @__PURE__ */ new Date()) => {
380
+ return dayjs__default.default(date).endOf("month");
381
+ };
382
+ var getFirstDayOfYear = (date = /* @__PURE__ */ new Date()) => {
383
+ return dayjs__default.default(date).startOf("year");
384
+ };
385
+ var getLastDayOfYear = (date = /* @__PURE__ */ new Date()) => {
386
+ return dayjs__default.default(date).endOf("year");
387
+ };
388
+ var isSame = (date1, date2, unit = "day") => {
389
+ return dayjs__default.default(date1).isSame(date2, unit);
390
+ };
391
+ var compare = (date1, date2) => {
392
+ const d1 = dayjs__default.default(date1).valueOf();
393
+ const d2 = dayjs__default.default(date2).valueOf();
394
+ if (d1 > d2) return 1;
395
+ if (d1 < d2) return -1;
396
+ return 0;
397
+ };
398
+ var isSameOrBefore = (date1, date2) => {
399
+ return dayjs__default.default(date1).isSameOrBefore(date2);
400
+ };
401
+ var isSameOrAfter = (date1, date2) => {
402
+ return dayjs__default.default(date1).isSameOrAfter(date2);
403
+ };
404
+ var isBefore = (date1, date2) => {
405
+ return dayjs__default.default(date1).isBefore(date2);
406
+ };
407
+ var isAfter = (date1, date2) => {
408
+ return dayjs__default.default(date1).isAfter(date2);
409
+ };
410
+ var getAge = (birthday) => {
411
+ return dayjs__default.default().diff(birthday, "year");
412
+ };
413
+ var isWorkday = (date = /* @__PURE__ */ new Date()) => {
414
+ const day = dayjs__default.default(date).day();
415
+ return day !== 0 && day !== 6;
416
+ };
417
+ var isWeekend = (date = /* @__PURE__ */ new Date()) => {
418
+ const day = dayjs__default.default(date).day();
419
+ return day === 0 || day === 6;
420
+ };
421
+ var getTimeOfDay = (date = /* @__PURE__ */ new Date()) => {
422
+ const hour = dayjs__default.default(date).hour();
423
+ if (hour >= 5 && hour < 9) return "morning";
424
+ if (hour >= 9 && hour < 12) return "noon";
425
+ if (hour >= 12 && hour < 18) return "afternoon";
426
+ if (hour >= 18 && hour < 22) return "evening";
427
+ return "night";
428
+ };
429
+ var getTimeOfDayName = (date = /* @__PURE__ */ new Date()) => {
430
+ const timeOfDay = getTimeOfDay(date);
431
+ const names = {
432
+ morning: "\u6E05\u6668",
433
+ noon: "\u4E0A\u5348",
434
+ afternoon: "\u4E0B\u5348",
435
+ evening: "\u665A\u4E0A",
436
+ night: "\u6DF1\u591C"
437
+ };
438
+ return names[timeOfDay];
439
+ };
440
+ var getWorkdaysBetween = (startDate2, endDate2) => {
441
+ let count = 0;
442
+ const start = dayjs__default.default(startDate2);
443
+ const end = dayjs__default.default(endDate2);
444
+ const days = Math.abs(start.diff(end, "day"));
445
+ for (let i = 0; i <= days; i++) {
446
+ const current = start.add(i, "day");
447
+ if (isWorkday(current)) {
448
+ count++;
449
+ }
450
+ }
451
+ return count;
452
+ };
453
+ var getDateRange = (startDate2, endDate2, unit = "day") => {
454
+ const start = dayjs__default.default(startDate2);
455
+ const end = dayjs__default.default(endDate2);
456
+ const dates = [];
457
+ const diff3 = end.diff(start, unit);
458
+ for (let i = 0; i <= diff3; i++) {
459
+ dates.push(start.add(i, unit));
460
+ }
461
+ return dates;
462
+ };
463
+ var getRecentDays = (days) => {
464
+ const dates = [];
465
+ for (let i = 0; i < days; i++) {
466
+ dates.push(dayjs__default.default().subtract(i, "day"));
467
+ }
468
+ return dates.reverse();
469
+ };
470
+ var getRecentMonths = (months) => {
471
+ const dates = [];
472
+ for (let i = 0; i < months; i++) {
473
+ dates.push(dayjs__default.default().subtract(i, "month"));
474
+ }
475
+ return dates.reverse();
476
+ };
477
+ var getRecentWeeks = (weeks) => {
478
+ const dates = [];
479
+ for (let i = 0; i < weeks; i++) {
480
+ dates.push(dayjs__default.default().subtract(i, "week"));
481
+ }
482
+ return dates.reverse();
483
+ };
484
+ var toUTC = (date) => {
485
+ return dayjs__default.default(date).utc();
486
+ };
487
+ var fromUTC = (date) => {
488
+ return dayjs__default.default.utc(date).local();
489
+ };
490
+ var toTimezone = (date, timezone2) => {
491
+ return dayjs__default.default(date).tz(timezone2);
492
+ };
493
+ var getTimezoneOffset = (date = /* @__PURE__ */ new Date()) => {
494
+ return dayjs__default.default(date).utcOffset();
495
+ };
496
+ var formatDuration = (milliseconds) => {
497
+ const d = dayjs__default.default.duration(milliseconds);
498
+ const hours = Math.floor(d.asHours());
499
+ const minutes = d.minutes();
500
+ const seconds = d.seconds();
501
+ if (hours > 0) {
502
+ return `${hours}\u5C0F\u65F6${minutes}\u5206${seconds}\u79D2`;
503
+ }
504
+ if (minutes > 0) {
505
+ return `${minutes}\u5206${seconds}\u79D2`;
506
+ }
507
+ return `${seconds}\u79D2`;
508
+ };
509
+ var minDate = (dates) => {
510
+ return dayjs__default.default.min(dates.map((d) => dayjs__default.default(d)));
511
+ };
512
+ var maxDate = (dates) => {
513
+ return dayjs__default.default.max(dates.map((d) => dayjs__default.default(d)));
514
+ };
515
+ var isThisMonth = (date) => {
516
+ return dayjs__default.default(date).isSame(dayjs__default.default(), "month");
517
+ };
518
+ var isThisYear = (date) => {
519
+ return dayjs__default.default(date).isSame(dayjs__default.default(), "year");
520
+ };
521
+ var isThisWeek = (date) => {
522
+ return dayjs__default.default(date).isSame(dayjs__default.default(), "week");
523
+ };
524
+ var isSameMonth = (date1, date2) => {
525
+ return dayjs__default.default(date1).isSame(date2, "month");
526
+ };
527
+ var isSameYear = (date1, date2) => {
528
+ return dayjs__default.default(date1).isSame(date2, "year");
529
+ };
530
+ var getChineseYear = (date = /* @__PURE__ */ new Date()) => {
531
+ const animals = ["\u9F20", "\u725B", "\u864E", "\u5154", "\u9F99", "\u86C7", "\u9A6C", "\u7F8A", "\u7334", "\u9E21", "\u72D7", "\u732A"];
532
+ const baseYear = 1900;
533
+ const year = dayjs__default.default(date).year();
534
+ const index = (year - baseYear) % 12;
535
+ return animals[index >= 0 ? index : index + 12] + "\u5E74";
536
+ };
537
+ var getZodiacSign = (date = /* @__PURE__ */ new Date()) => {
538
+ const month = dayjs__default.default(date).month() + 1;
539
+ const day = dayjs__default.default(date).date();
540
+ if (month === 3 && day >= 21 || month === 4 && day <= 19) return "\u767D\u7F8A\u5EA7";
541
+ if (month === 4 && day >= 20 || month === 5 && day <= 20) return "\u91D1\u725B\u5EA7";
542
+ if (month === 5 && day >= 21 || month === 6 && day <= 20) return "\u53CC\u5B50\u5EA7";
543
+ if (month === 6 && day >= 21 || month === 7 && day <= 22) return "\u5DE8\u87F9\u5EA7";
544
+ if (month === 7 && day >= 23 || month === 8 && day <= 22) return "\u72EE\u5B50\u5EA7";
545
+ if (month === 8 && day >= 23 || month === 9 && day <= 22) return "\u5904\u5973\u5EA7";
546
+ if (month === 9 && day >= 23 || month === 10 && day <= 22) return "\u5929\u79E4\u5EA7";
547
+ if (month === 10 && day >= 23 || month === 11 && day <= 21) return "\u5929\u874E\u5EA7";
548
+ if (month === 11 && day >= 22 || month === 12 && day <= 21) return "\u5C04\u624B\u5EA7";
549
+ if (month === 12 && day >= 22 || month === 1 && day <= 19) return "\u6469\u7FAF\u5EA7";
550
+ if (month === 1 && day >= 20 || month === 2 && day <= 18) return "\u6C34\u74F6\u5EA7";
551
+ return "\u53CC\u9C7C\u5EA7";
552
+ };
553
+ var isHoliday = (date = /* @__PURE__ */ new Date()) => {
554
+ const holidays = {
555
+ "0101": "\u5143\u65E6",
556
+ "0214": "\u60C5\u4EBA\u8282",
557
+ "0308": "\u5987\u5973\u8282",
558
+ "0401": "\u611A\u4EBA\u8282",
559
+ "0501": "\u52B3\u52A8\u8282",
560
+ "0504": "\u9752\u5E74\u8282",
561
+ "0601": "\u513F\u7AE5\u8282",
562
+ "0701": "\u5EFA\u515A\u8282",
563
+ "0801": "\u5EFA\u519B\u8282",
564
+ "0910": "\u6559\u5E08\u8282",
565
+ "1001": "\u56FD\u5E86\u8282",
566
+ "1224": "\u5E73\u5B89\u591C",
567
+ "1225": "\u5723\u8BDE\u8282"
568
+ };
569
+ const month = dayjs__default.default(date).format("MM");
570
+ const day = dayjs__default.default(date).format("DD");
571
+ const key = `${month}${day}`;
572
+ return holidays[key] !== void 0;
573
+ };
574
+ var getHolidayName = (date = /* @__PURE__ */ new Date()) => {
575
+ const holidays = {
576
+ "0101": "\u5143\u65E6",
577
+ "0214": "\u60C5\u4EBA\u8282",
578
+ "0308": "\u5987\u5973\u8282",
579
+ "0401": "\u611A\u4EBA\u8282",
580
+ "0501": "\u52B3\u52A8\u8282",
581
+ "0504": "\u9752\u5E74\u8282",
582
+ "0601": "\u513F\u7AE5\u8282",
583
+ "0701": "\u5EFA\u515A\u8282",
584
+ "0801": "\u5EFA\u519B\u8282",
585
+ "0910": "\u6559\u5E08\u8282",
586
+ "1001": "\u56FD\u5E86\u8282",
587
+ "1224": "\u5E73\u5B89\u591C",
588
+ "1225": "\u5723\u8BDE\u8282"
589
+ };
590
+ const month = dayjs__default.default(date).format("MM");
591
+ const day = dayjs__default.default(date).format("DD");
592
+ const key = `${month}${day}`;
593
+ return holidays[key] || null;
594
+ };
595
+ var parse = (dateString, formatStr) => {
596
+ return formatStr ? dayjs__default.default(dateString, formatStr) : dayjs__default.default(dateString);
597
+ };
598
+ var toNow = (date) => {
599
+ return dayjs__default.default(date).toNow();
600
+ };
601
+ var clone = (date) => {
602
+ return dayjs__default.default(date).clone();
603
+ };
604
+ var unix = (date = /* @__PURE__ */ new Date()) => {
605
+ return dayjs__default.default(date).unix();
606
+ };
607
+ var fromUnix = (timestamp) => {
608
+ return dayjs__default.default.unix(timestamp);
609
+ };
610
+ var valueOf = (date = /* @__PURE__ */ new Date()) => {
611
+ return dayjs__default.default(date).valueOf();
612
+ };
613
+ var date_default = dayjs__default.default;
614
+
615
+ // src/modules/array/index.ts
616
+ var array_exports = {};
617
+ __export(array_exports, {
618
+ arrayToTree: () => arrayToTree,
619
+ average: () => average,
620
+ chunk: () => esToolkit.chunk,
621
+ compact: () => esToolkit.compact,
622
+ difference: () => esToolkit.difference,
623
+ filter: () => filter,
624
+ find: () => find,
625
+ findIndex: () => findIndex,
626
+ flatten: () => esToolkit.flatten,
627
+ flattenDeep: () => esToolkit.flattenDeep,
628
+ getPaginationInfo: () => getPaginationInfo,
629
+ groupBy: () => esToolkit.groupBy,
630
+ head: () => esToolkit.head,
631
+ includes: () => includes,
632
+ insert: () => insert,
633
+ intersection: () => esToolkit.intersection,
634
+ isEmpty: () => isEmpty,
635
+ isEqual: () => esToolkit.isEqual,
636
+ last: () => esToolkit.last,
637
+ map: () => map,
638
+ max: () => max,
639
+ maxValue: () => maxValue,
640
+ min: () => min,
641
+ minValue: () => minValue,
642
+ move: () => move,
643
+ omit: () => esToolkit.omit,
644
+ paginate: () => paginate,
645
+ reduceSum: () => reduceSum,
646
+ remove: () => remove,
647
+ removeAt: () => removeAt,
648
+ sample: () => esToolkit.sample,
649
+ shuffle: () => shuffle,
650
+ sortBy: () => esToolkit.sortBy,
651
+ split: () => split,
652
+ sum: () => esToolkit.sum,
653
+ treeToArray: () => treeToArray,
654
+ uniq: () => esToolkit.uniq,
655
+ uniqBy: () => esToolkit.uniqBy,
656
+ unique: () => unique
657
+ });
658
+ var unique = (arr, key) => {
659
+ if (key) {
660
+ return esToolkit.uniqBy(arr, (item) => item[key]);
661
+ }
662
+ return esToolkit.uniq(arr);
663
+ };
664
+ var min = (arr) => {
665
+ if (arr.length === 0) return void 0;
666
+ return Math.min(...arr);
667
+ };
668
+ var max = (arr) => {
669
+ if (arr.length === 0) return void 0;
670
+ return Math.max(...arr);
671
+ };
672
+ var isEmpty = (arr) => {
673
+ return arr.length === 0;
674
+ };
675
+ var split = (arr, size2) => {
676
+ const result = [];
677
+ for (let i = 0; i < arr.length; i += size2) {
678
+ result.push(arr.slice(i, i + size2));
679
+ }
680
+ return result;
681
+ };
682
+ var shuffle = (arr) => {
683
+ const result = [...arr];
684
+ for (let i = result.length - 1; i > 0; i--) {
685
+ const j = Math.floor(Math.random() * (i + 1));
686
+ [result[i], result[j]] = [result[j], result[i]];
687
+ }
688
+ return result;
689
+ };
690
+ var findIndex = (arr, predicate) => {
691
+ return arr.findIndex(predicate);
692
+ };
693
+ var find = (arr, predicate) => {
694
+ return arr.find(predicate);
695
+ };
696
+ var filter = (arr, predicate) => {
697
+ return arr.filter(predicate);
698
+ };
699
+ var map = (arr, mapper) => {
700
+ return arr.map(mapper);
701
+ };
702
+ var reduceSum = (arr, mapper) => {
703
+ if (mapper) {
704
+ return arr.reduce((acc, item) => acc + mapper(item), 0);
705
+ }
706
+ return arr.reduce((acc, item) => acc + item, 0);
707
+ };
708
+ var average = (arr, mapper) => {
709
+ if (arr.length === 0) return 0;
710
+ if (mapper) {
711
+ const sum3 = arr.reduce((acc, item) => acc + mapper(item), 0);
712
+ return sum3 / arr.length;
713
+ }
714
+ return arr.reduce((acc, item) => acc + item, 0) / arr.length;
715
+ };
716
+ var maxValue = (arr, mapper) => {
717
+ if (arr.length === 0) return void 0;
718
+ if (mapper) {
719
+ return Math.max(...arr.map(mapper));
720
+ }
721
+ return Math.max(...arr);
722
+ };
723
+ var minValue = (arr, mapper) => {
724
+ if (arr.length === 0) return void 0;
725
+ if (mapper) {
726
+ return Math.min(...arr.map(mapper));
727
+ }
728
+ return Math.min(...arr);
729
+ };
730
+ var includes = (arr, value) => {
731
+ return arr.includes(value);
732
+ };
733
+ var remove = (arr, value) => {
734
+ return arr.filter((item) => item !== value);
735
+ };
736
+ var removeAt = (arr, index) => {
737
+ return arr.filter((_, i) => i !== index);
738
+ };
739
+ var insert = (arr, index, value) => {
740
+ return [...arr.slice(0, index), value, ...arr.slice(index)];
741
+ };
742
+ var move = (arr, from, to) => {
743
+ const result = [...arr];
744
+ const [removed] = result.splice(from, 1);
745
+ result.splice(to, 0, removed);
746
+ return result;
747
+ };
748
+ var arrayToTree = (arr, options = {}) => {
749
+ const { idKey = "id", parentIdKey = "parentId", childrenKey = "children" } = options;
750
+ const map2 = /* @__PURE__ */ new Map();
751
+ const roots = [];
752
+ arr.forEach((item) => {
753
+ map2.set(item[idKey], { ...item, [childrenKey]: [] });
754
+ });
755
+ map2.forEach((item) => {
756
+ const parentId = item[parentIdKey];
757
+ if (parentId && map2.has(parentId)) {
758
+ const parent = map2.get(parentId);
759
+ if (parent) {
760
+ parent[childrenKey].push(item);
761
+ }
762
+ } else {
763
+ roots.push(item);
764
+ }
765
+ });
766
+ return roots;
767
+ };
768
+ var treeToArray = (tree, childrenKey = "children") => {
769
+ const result = [];
770
+ const traverse = (nodes) => {
771
+ nodes.forEach((node) => {
772
+ result.push(node);
773
+ if (node[childrenKey] && node[childrenKey].length > 0) {
774
+ traverse(node[childrenKey]);
775
+ }
776
+ });
777
+ };
778
+ traverse(tree);
779
+ return result;
780
+ };
781
+ var paginate = (arr, page, pageSize) => {
782
+ const start = (page - 1) * pageSize;
783
+ return arr.slice(start, start + pageSize);
784
+ };
785
+ var getPaginationInfo = (total, page, pageSize) => {
786
+ const totalPages = Math.ceil(total / pageSize);
787
+ const startIndex = (page - 1) * pageSize;
788
+ const endIndex = Math.min(startIndex + pageSize, total);
789
+ return {
790
+ total,
791
+ page,
792
+ pageSize,
793
+ totalPages,
794
+ startIndex,
795
+ endIndex,
796
+ hasNext: page < totalPages,
797
+ hasPrev: page > 1
798
+ };
799
+ };
800
+
801
+ // src/modules/string/index.ts
802
+ var string_exports = {};
803
+ __export(string_exports, {
804
+ byteLength: () => byteLength,
805
+ camelCase: () => esToolkit.camelCase,
806
+ capitalize: () => esToolkit.capitalize,
807
+ escapeHtml: () => escapeHtml,
808
+ extractEmails: () => extractEmails,
809
+ extractNumbers: () => extractNumbers,
810
+ extractPhones: () => extractPhones,
811
+ firstLowerCase: () => firstLowerCase,
812
+ firstUpperCase: () => firstUpperCase,
813
+ formatMoney: () => formatMoney,
814
+ getExtension: () => getExtension,
815
+ getFileName: () => getFileName,
816
+ hideEmail: () => hideEmail,
817
+ hideIdCard: () => hideIdCard,
818
+ hidePhone: () => hidePhone,
819
+ highlight: () => highlight,
820
+ isEmail: () => isEmail,
821
+ isEmpty: () => isEmpty2,
822
+ isIdCard: () => isIdCard,
823
+ isPhone: () => isPhone,
824
+ isUrl: () => isUrl,
825
+ kebabCase: () => esToolkit.kebabCase,
826
+ lowerFirst: () => esToolkit.lowerFirst,
827
+ pad: () => pad,
828
+ random: () => random,
829
+ repeat: () => repeat,
830
+ reverse: () => reverse,
831
+ shortId: () => shortId,
832
+ snakeCase: () => esToolkit.snakeCase,
833
+ startCase: () => esToolkit.startCase,
834
+ stripTags: () => stripTags,
835
+ toBoolean: () => toBoolean,
836
+ toNumber: () => toNumber,
837
+ trim: () => esToolkit.trim,
838
+ truncateText: () => truncateText,
839
+ unescapeHtml: () => unescapeHtml,
840
+ upperFirst: () => esToolkit.upperFirst,
841
+ uuid: () => uuid
842
+ });
843
+ var isEmpty2 = (str) => {
844
+ if (!str) return true;
845
+ return esToolkit.trim(str).length === 0;
846
+ };
847
+ var random = (length = 8, charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") => {
848
+ let result = "";
849
+ for (let i = 0; i < length; i++) {
850
+ result += charset.charAt(Math.floor(Math.random() * charset.length));
851
+ }
852
+ return result;
853
+ };
854
+ var uuid = () => {
855
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
856
+ const r = Math.random() * 16 | 0;
857
+ const v = c === "x" ? r : r & 3 | 8;
858
+ return v.toString(16);
859
+ });
860
+ };
861
+ var shortId = (length = 6) => {
862
+ const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
863
+ let result = "";
864
+ for (let i = 0; i < length; i++) {
865
+ result += charset.charAt(Math.floor(Math.random() * charset.length));
866
+ }
867
+ return result;
868
+ };
869
+ var firstUpperCase = (str) => {
870
+ return str.charAt(0).toUpperCase() + str.slice(1);
871
+ };
872
+ var firstLowerCase = (str) => {
873
+ return str.charAt(0).toLowerCase() + str.slice(1);
874
+ };
875
+ var reverse = (str) => {
876
+ return str.split("").reverse().join("");
877
+ };
878
+ var repeat = (str, count) => {
879
+ return str.repeat(count);
880
+ };
881
+ var pad = (str, length, char = "0", isEnd = false) => {
882
+ const s = String(str);
883
+ if (isEnd) {
884
+ return s.padEnd(length, char);
885
+ }
886
+ return s.padStart(length, char);
887
+ };
888
+ var getExtension = (filename) => {
889
+ const idx = filename.lastIndexOf(".");
890
+ if (idx === -1) return "";
891
+ return filename.slice(idx + 1);
892
+ };
893
+ var getFileName = (filename) => {
894
+ const lastSlash = Math.max(filename.lastIndexOf("/"), filename.lastIndexOf("\\"));
895
+ const nameWithExt = lastSlash === -1 ? filename : filename.slice(lastSlash + 1);
896
+ const lastDot = nameWithExt.lastIndexOf(".");
897
+ return lastDot === -1 ? nameWithExt : nameWithExt.slice(0, lastDot);
898
+ };
899
+ var hidePhone = (phone) => {
900
+ return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
901
+ };
902
+ var hideEmail = (email) => {
903
+ const [username, domain] = email.split("@");
904
+ if (username.length <= 2) return email;
905
+ return `${username[0]}${"*".repeat(username.length - 2)}${username[username.length - 1]}@${domain}`;
906
+ };
907
+ var hideIdCard = (idCard) => {
908
+ if (idCard.length < 8) return idCard;
909
+ return `${idCard.slice(0, 4)}${"*".repeat(idCard.length - 8)}${idCard.slice(-4)}`;
910
+ };
911
+ var formatMoney = (amount, decimals = 2, separator = ",") => {
912
+ const str = amount.toFixed(decimals);
913
+ const parts = str.split(".");
914
+ parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator);
915
+ return parts.join(".");
916
+ };
917
+ var toNumber = (str, defaultValue = 0) => {
918
+ if (typeof str === "number") return str;
919
+ if (!str) return defaultValue;
920
+ const num = Number(str);
921
+ return isNaN(num) ? defaultValue : num;
922
+ };
923
+ var toBoolean = (str, defaultValue = false) => {
924
+ if (typeof str === "boolean") return str;
925
+ if (!str) return defaultValue;
926
+ return ["true", "1", "yes", "on"].includes(str.toLowerCase());
927
+ };
928
+ var extractNumbers = (str) => {
929
+ const matches = str.match(/-?\d+(\.\d+)?/g);
930
+ return matches ? matches.map(Number) : [];
931
+ };
932
+ var extractPhones = (str) => {
933
+ const matches = str.match(/1[3-9]\d{9}/g);
934
+ return matches || [];
935
+ };
936
+ var extractEmails = (str) => {
937
+ const matches = str.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g);
938
+ return matches || [];
939
+ };
940
+ var isPhone = (phone) => {
941
+ return /^1[3-9]\d{9}$/.test(phone);
942
+ };
943
+ var isEmail = (email) => {
944
+ return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email);
945
+ };
946
+ var isIdCard = (idCard) => {
947
+ return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idCard);
948
+ };
949
+ var isUrl = (url) => {
950
+ try {
951
+ new URL(url);
952
+ return true;
953
+ } catch {
954
+ return false;
955
+ }
956
+ };
957
+ var highlight = (text, keyword, highlightClass = "highlight") => {
958
+ if (!keyword) return text;
959
+ const regex = new RegExp(`(${keyword})`, "gi");
960
+ return text.replace(regex, `<span class="${highlightClass}">$1</span>`);
961
+ };
962
+ var truncateText = (text, length = 100, suffix = "...") => {
963
+ if (text.length <= length) return text;
964
+ return text.slice(0, length) + suffix;
965
+ };
966
+ var escapeHtml = (str) => {
967
+ const htmlEscapes = {
968
+ "&": "&amp;",
969
+ "<": "&lt;",
970
+ ">": "&gt;",
971
+ '"': "&quot;",
972
+ "'": "&#39;"
973
+ };
974
+ return str.replace(/[&<>"']/g, (char) => htmlEscapes[char]);
975
+ };
976
+ var unescapeHtml = (str) => {
977
+ const htmlUnescapes = {
978
+ "&amp;": "&",
979
+ "&lt;": "<",
980
+ "&gt;": ">",
981
+ "&quot;": '"',
982
+ "&#39;": "'"
983
+ };
984
+ return str.replace(/&(amp|lt|gt|quot|#39);/g, (match) => htmlUnescapes[match]);
985
+ };
986
+ var stripTags = (str) => {
987
+ return str.replace(/<[^>]*>/g, "");
988
+ };
989
+ var byteLength = (str) => {
990
+ let len = 0;
991
+ for (let i = 0; i < str.length; i++) {
992
+ const code = str.charCodeAt(i);
993
+ if (code >= 1 && code <= 126) {
994
+ len += 1;
995
+ } else if (code >= 128 && code <= 2047) {
996
+ len += 2;
997
+ } else if (code >= 2048 && code <= 65535) {
998
+ len += 3;
999
+ } else {
1000
+ len += 4;
1001
+ }
1002
+ }
1003
+ return len;
1004
+ };
1005
+
1006
+ // src/modules/object/index.ts
1007
+ var object_exports = {};
1008
+ __export(object_exports, {
1009
+ clear: () => clear,
1010
+ cloneDeep: () => esToolkit.cloneDeep,
1011
+ deepFreeze: () => deepFreeze,
1012
+ deepMerge: () => deepMerge,
1013
+ deleteDeep: () => deleteDeep,
1014
+ diff: () => diff2,
1015
+ entries: () => entries,
1016
+ filter: () => filter2,
1017
+ first: () => first,
1018
+ fromPairs: () => fromPairs,
1019
+ fromQueryString: () => fromQueryString,
1020
+ get: () => get,
1021
+ getDeep: () => getDeep,
1022
+ groupBy: () => esToolkit.groupBy,
1023
+ groupByPath: () => groupByPath,
1024
+ has: () => has,
1025
+ hasDeep: () => hasDeep,
1026
+ invert: () => esToolkit.invert,
1027
+ isArray: () => isArray,
1028
+ isBoolean: () => isBoolean,
1029
+ isEmpty: () => isEmpty3,
1030
+ isEmptyObject: () => esToolkit.isEmptyObject,
1031
+ isEqual: () => esToolkit.isEqual,
1032
+ isFunction: () => isFunction,
1033
+ isNil: () => isNil,
1034
+ isNull: () => isNull,
1035
+ isNumber: () => isNumber,
1036
+ isObject: () => isObject,
1037
+ isString: () => isString,
1038
+ isUndefined: () => isUndefined,
1039
+ keys: () => keys,
1040
+ last: () => last2,
1041
+ mapKeys: () => mapKeys,
1042
+ mapValues: () => mapValues,
1043
+ merge: () => esToolkit.merge,
1044
+ omit: () => esToolkit.omit,
1045
+ pick: () => esToolkit.pick,
1046
+ renameKeys: () => renameKeys,
1047
+ set: () => set,
1048
+ setDeep: () => setDeep,
1049
+ size: () => size,
1050
+ sortKeys: () => sortKeys,
1051
+ toFormData: () => toFormData,
1052
+ toQueryString: () => toQueryString,
1053
+ values: () => values
1054
+ });
1055
+ var keys = (obj) => {
1056
+ return Object.keys(obj);
1057
+ };
1058
+ var values = (obj) => {
1059
+ return Object.values(obj);
1060
+ };
1061
+ var entries = (obj) => {
1062
+ return Object.entries(obj);
1063
+ };
1064
+ var fromPairs = (pairs) => {
1065
+ const result = {};
1066
+ for (const [key, value] of pairs) {
1067
+ result[key] = value;
1068
+ }
1069
+ return result;
1070
+ };
1071
+ var get = (obj, path, defaultValue) => {
1072
+ const keys2 = path.split(".");
1073
+ let result = obj;
1074
+ for (const key of keys2) {
1075
+ if (result === null || result === void 0) {
1076
+ return defaultValue;
1077
+ }
1078
+ result = result[key];
1079
+ }
1080
+ return result === void 0 ? defaultValue : result;
1081
+ };
1082
+ var set = (obj, path, value) => {
1083
+ const keys2 = path.split(".");
1084
+ let result = obj;
1085
+ for (let i = 0; i < keys2.length - 1; i++) {
1086
+ const key = keys2[i];
1087
+ if (!(key in result) || typeof result[key] !== "object") {
1088
+ result[key] = {};
1089
+ }
1090
+ result = result[key];
1091
+ }
1092
+ result[keys2[keys2.length - 1]] = value;
1093
+ };
1094
+ var has = (obj, path) => {
1095
+ const keys2 = path.split(".");
1096
+ let result = obj;
1097
+ for (const key of keys2) {
1098
+ if (result === null || result === void 0 || !(key in result)) {
1099
+ return false;
1100
+ }
1101
+ result = result[key];
1102
+ }
1103
+ return true;
1104
+ };
1105
+ var isEmpty3 = (obj) => {
1106
+ if (obj === null || obj === void 0) return true;
1107
+ if (Array.isArray(obj)) return obj.length === 0;
1108
+ if (typeof obj === "object") return esToolkit.isEmptyObject(obj);
1109
+ return false;
1110
+ };
1111
+ var deepMerge = (target, ...sources) => {
1112
+ if (!sources.length) return target;
1113
+ const source = sources.shift();
1114
+ if (isObject(target) && isObject(source)) {
1115
+ for (const key in source) {
1116
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
1117
+ const sourceValue = source[key];
1118
+ const targetValue = target[key];
1119
+ if (isObject(sourceValue)) {
1120
+ if (!isObject(targetValue)) {
1121
+ target[key] = {};
1122
+ }
1123
+ deepMerge(target[key], sourceValue);
1124
+ } else {
1125
+ target[key] = sourceValue;
1126
+ }
1127
+ }
1128
+ }
1129
+ }
1130
+ return deepMerge(target, ...sources);
1131
+ };
1132
+ var isObject = (obj) => {
1133
+ return obj !== null && typeof obj === "object" && !Array.isArray(obj);
1134
+ };
1135
+ var isArray = (obj) => {
1136
+ return Array.isArray(obj);
1137
+ };
1138
+ var isFunction = (obj) => {
1139
+ return typeof obj === "function";
1140
+ };
1141
+ var isNumber = (obj) => {
1142
+ return typeof obj === "number" && !isNaN(obj);
1143
+ };
1144
+ var isString = (obj) => {
1145
+ return typeof obj === "string";
1146
+ };
1147
+ var isBoolean = (obj) => {
1148
+ return typeof obj === "boolean";
1149
+ };
1150
+ var isNil = (obj) => {
1151
+ return obj === null || obj === void 0;
1152
+ };
1153
+ var isNull = (obj) => {
1154
+ return obj === null;
1155
+ };
1156
+ var isUndefined = (obj) => {
1157
+ return obj === void 0;
1158
+ };
1159
+ var size = (obj) => {
1160
+ return Object.keys(obj).length;
1161
+ };
1162
+ var clear = (obj) => {
1163
+ Object.keys(obj).forEach((key) => {
1164
+ delete obj[key];
1165
+ });
1166
+ return obj;
1167
+ };
1168
+ var toQueryString = (obj) => {
1169
+ return Object.entries(obj).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
1170
+ };
1171
+ var fromQueryString = (queryString) => {
1172
+ const params = {};
1173
+ const pairs = queryString.slice(1).split("&");
1174
+ for (const pair of pairs) {
1175
+ const [key, value] = pair.split("=");
1176
+ if (key) {
1177
+ params[decodeURIComponent(key)] = value ? decodeURIComponent(value) : "";
1178
+ }
1179
+ }
1180
+ return params;
1181
+ };
1182
+ var sortKeys = (obj, compareFn) => {
1183
+ const sortedKeys = Object.keys(obj).sort(compareFn);
1184
+ const result = {};
1185
+ for (const key of sortedKeys) {
1186
+ result[key] = obj[key];
1187
+ }
1188
+ return result;
1189
+ };
1190
+ var renameKeys = (obj, renameMap) => {
1191
+ const result = {};
1192
+ for (const key in obj) {
1193
+ const newKey = renameMap[key] || key;
1194
+ result[newKey] = obj[key];
1195
+ }
1196
+ return result;
1197
+ };
1198
+ var filter2 = (obj, predicate) => {
1199
+ const result = {};
1200
+ for (const key in obj) {
1201
+ if (predicate(obj[key], key)) {
1202
+ result[key] = obj[key];
1203
+ }
1204
+ }
1205
+ return result;
1206
+ };
1207
+ var mapValues = (obj, mapper) => {
1208
+ const result = {};
1209
+ for (const key in obj) {
1210
+ result[key] = mapper(obj[key], key);
1211
+ }
1212
+ return result;
1213
+ };
1214
+ var mapKeys = (obj, mapper) => {
1215
+ const result = {};
1216
+ for (const key in obj) {
1217
+ const newKey = mapper(key, obj[key]);
1218
+ result[newKey] = obj[key];
1219
+ }
1220
+ return result;
1221
+ };
1222
+ var getDeep = (obj, path, defaultValue) => {
1223
+ return get(obj, path, defaultValue);
1224
+ };
1225
+ var setDeep = (obj, path, value) => {
1226
+ set(obj, path, value);
1227
+ };
1228
+ var hasDeep = (obj, path) => {
1229
+ return has(obj, path);
1230
+ };
1231
+ var deleteDeep = (obj, path) => {
1232
+ const keys2 = path.split(".");
1233
+ let current = obj;
1234
+ for (let i = 0; i < keys2.length - 1; i++) {
1235
+ if (!current[keys2[i]]) {
1236
+ return false;
1237
+ }
1238
+ current = current[keys2[i]];
1239
+ }
1240
+ const lastKey = keys2[keys2.length - 1];
1241
+ if (lastKey in current) {
1242
+ delete current[lastKey];
1243
+ return true;
1244
+ }
1245
+ return false;
1246
+ };
1247
+ var toFormData = (obj) => {
1248
+ const formData = new FormData();
1249
+ for (const key in obj) {
1250
+ const value = obj[key];
1251
+ if (value !== void 0 && value !== null) {
1252
+ if (value instanceof File) {
1253
+ formData.append(key, value);
1254
+ } else if (Array.isArray(value)) {
1255
+ formData.append(key, JSON.stringify(value));
1256
+ } else if (typeof value === "object") {
1257
+ formData.append(key, JSON.stringify(value));
1258
+ } else {
1259
+ formData.append(key, String(value));
1260
+ }
1261
+ }
1262
+ }
1263
+ return formData;
1264
+ };
1265
+ var diff2 = (obj, base) => {
1266
+ const result = {};
1267
+ for (const key in obj) {
1268
+ if (!esToolkit.isEqual(obj[key], base[key])) {
1269
+ result[key] = obj[key];
1270
+ }
1271
+ }
1272
+ return result;
1273
+ };
1274
+ var deepFreeze = (obj) => {
1275
+ if (isObject(obj) || isArray(obj)) {
1276
+ Object.freeze(obj);
1277
+ for (const key in obj) {
1278
+ deepFreeze(obj[key]);
1279
+ }
1280
+ }
1281
+ return obj;
1282
+ };
1283
+ var first = (obj) => {
1284
+ const values2 = Object.values(obj);
1285
+ return values2[0];
1286
+ };
1287
+ var last2 = (obj) => {
1288
+ const values2 = Object.values(obj);
1289
+ return values2[values2.length - 1];
1290
+ };
1291
+ var groupByPath = (arr, keyPath) => {
1292
+ return esToolkit.groupBy(arr, (item) => get(item, keyPath));
1293
+ };
1294
+
1295
+ // src/modules/excel/index.ts
1296
+ var excel_exports = {};
1297
+ __export(excel_exports, {
1298
+ excelToTable: () => excelToTable,
1299
+ exportExcel: () => exportExcel,
1300
+ exportExcelWithColumnWidths: () => exportExcelWithColumnWidths,
1301
+ exportExcelWithHeaders: () => exportExcelWithHeaders,
1302
+ exportExcelWithMerges: () => exportExcelWithMerges,
1303
+ exportMultiSheetExcel: () => exportMultiSheetExcel,
1304
+ exportTableToExcel: () => exportTableToExcel,
1305
+ getSheetNames: () => getSheetNames,
1306
+ importAllSheetsExcel: () => importAllSheetsExcel,
1307
+ importExcel: () => importExcel
1308
+ });
1309
+ var exportExcel = (data, options = {}) => {
1310
+ const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
1311
+ const processedData = header ? data.map((item) => {
1312
+ const row = {};
1313
+ for (const key in header) {
1314
+ row[header[key]] = item[key];
1315
+ }
1316
+ return row;
1317
+ }) : data;
1318
+ const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
1319
+ const workbook = XLSX__namespace.utils.book_new();
1320
+ XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
1321
+ XLSX__namespace.writeFile(workbook, filename);
1322
+ };
1323
+ var exportMultiSheetExcel = (sheetsData, filename = "export.xlsx") => {
1324
+ const workbook = XLSX__namespace.utils.book_new();
1325
+ sheetsData.forEach(({ name, data, header }) => {
1326
+ const processedData = header ? data.map((item) => {
1327
+ const row = {};
1328
+ for (const key in header) {
1329
+ row[header[key]] = item[key];
1330
+ }
1331
+ return row;
1332
+ }) : data;
1333
+ const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
1334
+ XLSX__namespace.utils.book_append_sheet(workbook, worksheet, name);
1335
+ });
1336
+ XLSX__namespace.writeFile(workbook, filename);
1337
+ };
1338
+ var importExcel = (file, options = {}) => {
1339
+ return new Promise((resolve, reject) => {
1340
+ const { header = 0, raw = false, defval = "" } = options;
1341
+ const reader = new FileReader();
1342
+ reader.onload = (e) => {
1343
+ try {
1344
+ const data = e.target?.result;
1345
+ if (!data) {
1346
+ throw new Error("Failed to read file");
1347
+ }
1348
+ const workbook = XLSX__namespace.read(data, { type: "binary" });
1349
+ const sheetName = workbook.SheetNames[0];
1350
+ const worksheet = workbook.Sheets[sheetName];
1351
+ const jsonData = XLSX__namespace.utils.sheet_to_json(worksheet, {
1352
+ header,
1353
+ raw,
1354
+ defval
1355
+ });
1356
+ resolve(jsonData);
1357
+ } catch (error) {
1358
+ reject(new Error(String(error)));
1359
+ }
1360
+ };
1361
+ reader.onerror = (error) => {
1362
+ reject(new Error(String(error)));
1363
+ };
1364
+ if (file instanceof File) {
1365
+ reader.readAsBinaryString(file);
1366
+ } else {
1367
+ reader.readAsBinaryString(new Blob([file]));
1368
+ }
1369
+ });
1370
+ };
1371
+ var importAllSheetsExcel = (file, options = {}) => {
1372
+ return new Promise((resolve, reject) => {
1373
+ const { header = 0, raw = false, defval = "" } = options;
1374
+ const reader = new FileReader();
1375
+ reader.onload = (e) => {
1376
+ try {
1377
+ const data = e.target?.result;
1378
+ if (!data) {
1379
+ throw new Error("Failed to read file");
1380
+ }
1381
+ const workbook = XLSX__namespace.read(data, { type: "binary" });
1382
+ const result = {};
1383
+ workbook.SheetNames.forEach((sheetName) => {
1384
+ const worksheet = workbook.Sheets[sheetName];
1385
+ result[sheetName] = XLSX__namespace.utils.sheet_to_json(worksheet, {
1386
+ header,
1387
+ raw,
1388
+ defval
1389
+ });
1390
+ });
1391
+ resolve(result);
1392
+ } catch (error) {
1393
+ reject(new Error(String(error)));
1394
+ }
1395
+ };
1396
+ reader.onerror = (error) => {
1397
+ reject(new Error(String(error)));
1398
+ };
1399
+ if (file instanceof File) {
1400
+ reader.readAsBinaryString(file);
1401
+ } else {
1402
+ reader.readAsBinaryString(new Blob([file]));
1403
+ }
1404
+ });
1405
+ };
1406
+ var exportExcelWithHeaders = (data, headers, filename = "export.xlsx", sheetName = "Sheet1") => {
1407
+ const worksheet = XLSX__namespace.utils.json_to_sheet([]);
1408
+ XLSX__namespace.utils.sheet_add_aoa(worksheet, [headers.map((h) => h.label)], { origin: "A1" });
1409
+ const rows = data.map((item) => headers.map((h) => item[h.key]));
1410
+ XLSX__namespace.utils.sheet_add_aoa(worksheet, rows, { origin: "A2" });
1411
+ const workbook = XLSX__namespace.utils.book_new();
1412
+ XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
1413
+ XLSX__namespace.writeFile(workbook, filename);
1414
+ };
1415
+ var exportExcelWithColumnWidths = (data, columnWidths, options = {}) => {
1416
+ const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
1417
+ const processedData = header ? data.map((item) => {
1418
+ const row = {};
1419
+ for (const key in header) {
1420
+ row[header[key]] = item[key];
1421
+ }
1422
+ return row;
1423
+ }) : data;
1424
+ const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
1425
+ worksheet["!cols"] = columnWidths;
1426
+ const workbook = XLSX__namespace.utils.book_new();
1427
+ XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
1428
+ XLSX__namespace.writeFile(workbook, filename);
1429
+ };
1430
+ var exportExcelWithMerges = (data, merges, options = {}) => {
1431
+ const { filename = "export.xlsx", sheetName = "Sheet1", header } = options;
1432
+ const processedData = header ? data.map((item) => {
1433
+ const row = {};
1434
+ for (const key in header) {
1435
+ row[header[key]] = item[key];
1436
+ }
1437
+ return row;
1438
+ }) : data;
1439
+ const worksheet = XLSX__namespace.utils.json_to_sheet(processedData);
1440
+ worksheet["!merges"] = merges;
1441
+ const workbook = XLSX__namespace.utils.book_new();
1442
+ XLSX__namespace.utils.book_append_sheet(workbook, worksheet, sheetName);
1443
+ XLSX__namespace.writeFile(workbook, filename);
1444
+ };
1445
+ var getSheetNames = (file) => {
1446
+ return new Promise((resolve, reject) => {
1447
+ const reader = new FileReader();
1448
+ reader.onload = (e) => {
1449
+ try {
1450
+ const data = e.target?.result;
1451
+ if (!data) {
1452
+ throw new Error("Failed to read file");
1453
+ }
1454
+ const workbook = XLSX__namespace.read(data, { type: "binary" });
1455
+ resolve(workbook.SheetNames);
1456
+ } catch (error) {
1457
+ reject(new Error(String(error)));
1458
+ }
1459
+ };
1460
+ reader.onerror = (error) => {
1461
+ reject(new Error(String(error)));
1462
+ };
1463
+ if (file instanceof File) {
1464
+ reader.readAsBinaryString(file);
1465
+ } else {
1466
+ reader.readAsBinaryString(new Blob([file]));
1467
+ }
1468
+ });
1469
+ };
1470
+ var exportTableToExcel = (tableElement, filename = "export.xlsx") => {
1471
+ const workbook = XLSX__namespace.utils.table_to_book(tableElement);
1472
+ XLSX__namespace.writeFile(workbook, filename);
1473
+ };
1474
+ var excelToTable = (file, sheetIndex = 0) => {
1475
+ return new Promise((resolve, reject) => {
1476
+ const reader = new FileReader();
1477
+ reader.onload = (e) => {
1478
+ try {
1479
+ const data = e.target?.result;
1480
+ if (!data) {
1481
+ throw new Error("Failed to read file");
1482
+ }
1483
+ const workbook = XLSX__namespace.read(data, { type: "binary" });
1484
+ const sheetName = workbook.SheetNames[sheetIndex];
1485
+ const worksheet = workbook.Sheets[sheetName];
1486
+ const html = XLSX__namespace.utils.sheet_to_html(worksheet);
1487
+ resolve(html);
1488
+ } catch (error) {
1489
+ reject(new Error(String(error)));
1490
+ }
1491
+ };
1492
+ reader.onerror = (error) => {
1493
+ reject(new Error(String(error)));
1494
+ };
1495
+ reader.readAsBinaryString(file);
1496
+ });
1497
+ };
1498
+
1499
+ // src/modules/pdf/index.ts
1500
+ var pdf_exports = {};
1501
+ __export(pdf_exports, {
1502
+ addImageToPDF: () => addImageToPDF,
1503
+ addPage: () => addPage,
1504
+ addTableToPDF: () => addTableToPDF,
1505
+ addTextToPDF: () => addTextToPDF,
1506
+ captureToImage: () => captureToImage,
1507
+ captureToImageDownload: () => captureToImageDownload,
1508
+ captureToPDF: () => captureToPDF,
1509
+ captureToPDFWithPagination: () => captureToPDFWithPagination,
1510
+ createPDF: () => createPDF,
1511
+ html2canvas: () => html2canvas__default.default,
1512
+ jsPDF: () => jspdf.jsPDF,
1513
+ mergePDFs: () => mergePDFs,
1514
+ pdfToBlob: () => pdfToBlob,
1515
+ pdfToDataURL: () => pdfToDataURL,
1516
+ savePDF: () => savePDF
1517
+ });
1518
+ var captureToPDF = async (element, options = {}) => {
1519
+ const {
1520
+ filename = "download.pdf",
1521
+ scale = 2,
1522
+ useCORS = true,
1523
+ backgroundColor = "#ffffff",
1524
+ logging = false,
1525
+ margin = 10
1526
+ } = options;
1527
+ const canvas = await html2canvas__default.default(element, {
1528
+ scale,
1529
+ useCORS,
1530
+ backgroundColor,
1531
+ logging
1532
+ });
1533
+ const imgData = canvas.toDataURL("image/png");
1534
+ const imgWidth = canvas.width;
1535
+ const imgHeight = canvas.height;
1536
+ const pdfWidth = imgWidth / scale;
1537
+ const pdfHeight = imgHeight / scale;
1538
+ const pdf = new jspdf.jsPDF({
1539
+ orientation: pdfWidth > pdfHeight ? "l" : "p",
1540
+ unit: "pt",
1541
+ format: [pdfWidth + margin * 2, pdfHeight + margin * 2]
1542
+ });
1543
+ pdf.addImage(imgData, "PNG", margin, margin, pdfWidth, pdfHeight);
1544
+ pdf.save(filename);
1545
+ };
1546
+ var captureToPDFWithPagination = async (element, options = {}) => {
1547
+ const {
1548
+ filename = "download.pdf",
1549
+ scale = 2,
1550
+ useCORS = true,
1551
+ backgroundColor = "#ffffff",
1552
+ logging = false,
1553
+ margin = 10
1554
+ } = options;
1555
+ const canvas = await html2canvas__default.default(element, {
1556
+ scale,
1557
+ useCORS,
1558
+ backgroundColor,
1559
+ logging
1560
+ });
1561
+ const imgData = canvas.toDataURL("image/png");
1562
+ const imgWidth = canvas.width;
1563
+ const imgHeight = canvas.height;
1564
+ const pdf = new jspdf.jsPDF("p", "pt", "a4");
1565
+ const pdfWidth = pdf.internal.pageSize.getWidth();
1566
+ const pdfHeight = pdf.internal.pageSize.getHeight();
1567
+ const imgWidthInPDF = pdfWidth - margin * 2;
1568
+ const imgHeightInPDF = imgHeight / imgWidth * imgWidthInPDF;
1569
+ let heightLeft = imgHeightInPDF;
1570
+ let position = margin;
1571
+ pdf.addImage(imgData, "PNG", margin, position, imgWidthInPDF, imgHeightInPDF);
1572
+ heightLeft -= pdfHeight - margin * 2;
1573
+ while (heightLeft > 0) {
1574
+ position = heightLeft - imgHeightInPDF + margin;
1575
+ pdf.addPage();
1576
+ pdf.addImage(imgData, "PNG", margin, position, imgWidthInPDF, imgHeightInPDF);
1577
+ heightLeft -= pdfHeight - margin * 2;
1578
+ }
1579
+ pdf.save(filename);
1580
+ };
1581
+ var captureToImage = async (element, options = {}) => {
1582
+ const canvas = await html2canvas__default.default(element, {
1583
+ scale: 2,
1584
+ useCORS: true,
1585
+ backgroundColor: "#ffffff",
1586
+ logging: false,
1587
+ ...options
1588
+ });
1589
+ return canvas.toDataURL("image/png");
1590
+ };
1591
+ var captureToImageDownload = async (element, filename = "screenshot.png", options = {}) => {
1592
+ const dataUrl = await captureToImage(element, options);
1593
+ const link = document.createElement("a");
1594
+ link.href = dataUrl;
1595
+ link.download = filename;
1596
+ link.click();
1597
+ };
1598
+ var createPDF = (options = {}) => {
1599
+ return new jspdf.jsPDF(options);
1600
+ };
1601
+ var addTextToPDF = (pdf, text, x, y, options = {}) => {
1602
+ const { maxWidth, align = "left", fontSize = 12, fontStyle = "normal" } = options;
1603
+ pdf.setFontSize(fontSize);
1604
+ pdf.setFont("helvetica", fontStyle);
1605
+ pdf.text(text, x, y, { maxWidth, align });
1606
+ };
1607
+ var addImageToPDF = (pdf, imageData, x, y, width, height) => {
1608
+ pdf.addImage(imageData, "PNG", x, y, width, height);
1609
+ };
1610
+ var addTableToPDF = (pdf, headers, data, options = {}) => {
1611
+ const {
1612
+ x = 10,
1613
+ y = 10,
1614
+ cellWidth = 50,
1615
+ cellHeight = 20,
1616
+ headerBackgroundColor = "#4472C4",
1617
+ headerTextColor = "#ffffff",
1618
+ textColor = "#000000",
1619
+ fontSize = 10,
1620
+ lineWidth = 0.1,
1621
+ lineColor = [200, 200, 200]
1622
+ } = options;
1623
+ pdf.setFontSize(fontSize);
1624
+ let currentY = y;
1625
+ headers.forEach((header, index) => {
1626
+ const cellX = x + index * cellWidth;
1627
+ pdf.setFillColor(
1628
+ parseInt(headerBackgroundColor.slice(1, 3), 16),
1629
+ parseInt(headerBackgroundColor.slice(3, 5), 16),
1630
+ parseInt(headerBackgroundColor.slice(5, 7), 16)
1631
+ );
1632
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "F");
1633
+ pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2]);
1634
+ pdf.setLineWidth(lineWidth);
1635
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "S");
1636
+ pdf.setTextColor(
1637
+ parseInt(headerTextColor.slice(1, 3), 16),
1638
+ parseInt(headerTextColor.slice(3, 5), 16),
1639
+ parseInt(headerTextColor.slice(5, 7), 16)
1640
+ );
1641
+ pdf.text(header, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {
1642
+ align: "center"
1643
+ });
1644
+ });
1645
+ currentY += cellHeight;
1646
+ pdf.setTextColor(
1647
+ parseInt(textColor.slice(1, 3), 16),
1648
+ parseInt(textColor.slice(3, 5), 16),
1649
+ parseInt(textColor.slice(5, 7), 16)
1650
+ );
1651
+ data.forEach((row) => {
1652
+ row.forEach((cell, index) => {
1653
+ const cellX = x + index * cellWidth;
1654
+ pdf.setDrawColor(lineColor[0], lineColor[1], lineColor[2]);
1655
+ pdf.setLineWidth(lineWidth);
1656
+ pdf.rect(cellX, currentY, cellWidth, cellHeight, "S");
1657
+ pdf.text(cell, cellX + cellWidth / 2, currentY + cellHeight / 2 + fontSize / 4, {
1658
+ align: "center"
1659
+ });
1660
+ });
1661
+ currentY += cellHeight;
1662
+ });
1663
+ };
1664
+ var addPage = (pdf) => {
1665
+ pdf.addPage();
1666
+ };
1667
+ var savePDF = (pdf, filename = "download.pdf") => {
1668
+ pdf.save(filename);
1669
+ };
1670
+ var pdfToDataURL = (pdf) => {
1671
+ return pdf.output("dataurlstring");
1672
+ };
1673
+ var pdfToBlob = (pdf) => {
1674
+ return pdf.output("blob");
1675
+ };
1676
+ var mergePDFs = (_pdfs) => {
1677
+ return Promise.reject(
1678
+ new Error("mergePDFs \u529F\u80FD\u9700\u8981\u4F7F\u7528 pdf-lib \u5E93\u5B9E\u73B0\u3002\u8BF7\u5B89\u88C5 pdf-lib \u5E76\u4F7F\u7528\u5176\u63D0\u4F9B\u7684\u5408\u5E76\u529F\u80FD\u3002")
1679
+ );
1680
+ };
1681
+
1682
+ // src/modules/map/index.ts
1683
+ var map_exports = {};
1684
+ __export(map_exports, {
1685
+ MapInstance: () => MapInstance,
1686
+ createCircleStyle: () => createCircleStyle,
1687
+ createFillStyle: () => createFillStyle,
1688
+ createGaodeLayer: () => createGaodeLayer,
1689
+ createIconStyle: () => createIconStyle,
1690
+ createLineFeature: () => createLineFeature,
1691
+ createOSMLayer: () => createOSMLayer,
1692
+ createPointFeature: () => createPointFeature,
1693
+ createPolygonFeature: () => createPolygonFeature,
1694
+ createStrokeStyle: () => createStrokeStyle,
1695
+ createStyledLineFeature: () => createStyledLineFeature,
1696
+ createStyledPointFeature: () => createStyledPointFeature,
1697
+ createStyledPolygonFeature: () => createStyledPolygonFeature,
1698
+ createTiandituLayer: () => createTiandituLayer,
1699
+ createXYZLayer: () => createXYZLayer,
1700
+ lonLatToXY: () => lonLatToXY,
1701
+ xyToLonLat: () => xyToLonLat
1702
+ });
1703
+ var MapInstance = class {
1704
+ constructor(options) {
1705
+ this.vectorSources = /* @__PURE__ */ new Map();
1706
+ this.vectorLayers = /* @__PURE__ */ new Map();
1707
+ this.overlays = /* @__PURE__ */ new Map();
1708
+ this.themeLayers = /* @__PURE__ */ new Map();
1709
+ this.drawInteraction = null;
1710
+ this.modifyInteraction = null;
1711
+ this.snapInteraction = null;
1712
+ this.selectInteraction = null;
1713
+ this.currentTheme = "light";
1714
+ this.icons = /* @__PURE__ */ new Map();
1715
+ this.enableDynamicScale = false;
1716
+ this.projection = "EPSG:4326";
1717
+ this.enableDynamicScale = options.enableDynamicScale || false;
1718
+ this.projection = options.projection || "EPSG:4326";
1719
+ this.currentTheme = options.theme || "light";
1720
+ if (options.icons) {
1721
+ Object.entries(options.icons).forEach(([name, config]) => {
1722
+ this.icons.set(name, config);
1723
+ });
1724
+ }
1725
+ const controls = control.defaults({
1726
+ zoom: false,
1727
+ rotate: false,
1728
+ attribution: false
1729
+ });
1730
+ if (options.showScaleLine !== false) {
1731
+ controls.push(new control.ScaleLine());
1732
+ }
1733
+ if (options.showFullScreen !== false) {
1734
+ controls.push(new control.FullScreen());
1735
+ }
1736
+ this.map = new ol.Map({
1737
+ target: options.container,
1738
+ layers: [],
1739
+ view: new ol.View({
1740
+ center: proj.fromLonLat(options.center || [116.3974, 39.9093]),
1741
+ // 默认北京
1742
+ zoom: options.zoom || 10,
1743
+ minZoom: options.minZoom || 1,
1744
+ maxZoom: options.maxZoom || 20,
1745
+ projection: this.projection,
1746
+ constrainResolution: true,
1747
+ smoothResolutionConstraint: false
1748
+ }),
1749
+ controls
1750
+ });
1751
+ if (options.themeConfig) {
1752
+ this.setupThemeLayers(options.themeConfig);
1753
+ }
1754
+ if (options.layers) {
1755
+ options.layers.forEach((layer) => this.map.addLayer(layer.layer));
1756
+ }
1757
+ if (this.enableDynamicScale) {
1758
+ this.map.on("moveend", () => this.handleZoomChange());
1759
+ }
1760
+ }
1761
+ // ==================== 主题管理 ====================
1762
+ /**
1763
+ * 设置主题图层
1764
+ */
1765
+ setupThemeLayers(config) {
1766
+ const lightUrl = config.lightUrl || "https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}";
1767
+ const darkUrl = config.darkUrl || "https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=9&x={x}&y={y}&z={z}";
1768
+ const lightLayer = new TileLayer__default.default({
1769
+ preload: Infinity,
1770
+ source: new XYZ__default.default({ url: lightUrl })
1771
+ });
1772
+ const darkLayer = new TileLayer__default.default({
1773
+ preload: Infinity,
1774
+ source: new XYZ__default.default({ url: darkUrl })
1775
+ });
1776
+ this.themeLayers.set("light", lightLayer);
1777
+ this.themeLayers.set("dark", darkLayer);
1778
+ this.map.addLayer(lightLayer);
1779
+ this.map.addLayer(darkLayer);
1780
+ this.setTheme(this.currentTheme);
1781
+ }
1782
+ /**
1783
+ * 切换主题
1784
+ */
1785
+ setTheme(theme) {
1786
+ this.currentTheme = theme;
1787
+ this.themeLayers.forEach((layer, key) => {
1788
+ layer.setVisible(key === theme);
1789
+ });
1790
+ }
1791
+ /**
1792
+ * 获取当前主题
1793
+ */
1794
+ getTheme() {
1795
+ return this.currentTheme;
1796
+ }
1797
+ // ==================== 图层管理 ====================
1798
+ /**
1799
+ * 创建矢量图层
1800
+ */
1801
+ createVectorLayer(config) {
1802
+ if (this.vectorLayers.has(config.name)) {
1803
+ console.warn(`\u56FE\u5C42 "${config.name}" \u5DF2\u5B58\u5728`);
1804
+ return;
1805
+ }
1806
+ const source = new VectorSource__default.default({
1807
+ format: new GeoJSON__default.default()
1808
+ });
1809
+ const layer = new VectorLayer__default.default({
1810
+ source,
1811
+ style: config.style,
1812
+ minZoom: config.minZoom,
1813
+ maxZoom: config.maxZoom,
1814
+ zIndex: config.zIndex,
1815
+ visible: config.visible !== false
1816
+ });
1817
+ this.vectorSources.set(config.name, source);
1818
+ this.vectorLayers.set(config.name, layer);
1819
+ this.map.addLayer(layer);
1820
+ }
1821
+ /**
1822
+ * 获取矢量图层
1823
+ */
1824
+ getVectorLayer(name) {
1825
+ return this.vectorLayers.get(name);
1826
+ }
1827
+ /**
1828
+ * 获取矢量数据源
1829
+ */
1830
+ getVectorSource(name) {
1831
+ return this.vectorSources.get(name);
1832
+ }
1833
+ /**
1834
+ * 显示/隐藏矢量图层
1835
+ */
1836
+ setLayerVisible(name, visible) {
1837
+ const layer = this.vectorLayers.get(name);
1838
+ if (layer) {
1839
+ layer.setVisible(visible);
1840
+ }
1841
+ }
1842
+ /**
1843
+ * 设置矢量图层样式
1844
+ */
1845
+ setLayerStyle(name, style) {
1846
+ const layer = this.vectorLayers.get(name);
1847
+ if (layer) {
1848
+ layer.setStyle(style);
1849
+ }
1850
+ }
1851
+ /**
1852
+ * 清除矢量图层
1853
+ */
1854
+ clearLayer(name) {
1855
+ const source = this.vectorSources.get(name);
1856
+ if (source) {
1857
+ source.clear();
1858
+ }
1859
+ }
1860
+ /**
1861
+ * 删除矢量图层
1862
+ */
1863
+ removeLayer(name) {
1864
+ const layer = this.vectorLayers.get(name);
1865
+ if (layer) {
1866
+ this.map.removeLayer(layer);
1867
+ this.vectorLayers.delete(name);
1868
+ this.vectorSources.delete(name);
1869
+ }
1870
+ }
1871
+ // ==================== 要素管理 ====================
1872
+ /**
1873
+ * 添加标记
1874
+ */
1875
+ addMarker(options, layerName = "default") {
1876
+ if (!this.vectorLayers.has(layerName)) {
1877
+ this.createVectorLayer({ name: layerName });
1878
+ }
1879
+ const source = this.vectorSources.get(layerName);
1880
+ const feature = new ol.Feature({
1881
+ geometry: new geom.Point(proj.fromLonLat(options.coordinate))
1882
+ });
1883
+ const style = options.style || this.createMarkerStyle(options);
1884
+ feature.setStyle(style);
1885
+ source.addFeature(feature);
1886
+ return feature;
1887
+ }
1888
+ /**
1889
+ * 创建标记样式
1890
+ */
1891
+ createMarkerStyle(options) {
1892
+ if (options.icon && this.icons.has(options.icon)) {
1893
+ const iconConfig = this.icons.get(options.icon);
1894
+ return new style.Style({
1895
+ image: new style.Icon({
1896
+ anchor: iconConfig.anchor || [0.5, 0.5],
1897
+ src: iconConfig.src,
1898
+ scale: iconConfig.scale || 1
1899
+ })
1900
+ });
1901
+ }
1902
+ if (options.iconConfig) {
1903
+ return new style.Style({
1904
+ image: new style.Icon({
1905
+ anchor: options.iconConfig.anchor || [0.5, 0.5],
1906
+ src: options.iconConfig.src,
1907
+ scale: options.iconConfig.scale || 1
1908
+ })
1909
+ });
1910
+ }
1911
+ return new style.Style({
1912
+ image: new style.Circle({
1913
+ radius: options.radius || 7,
1914
+ fill: new style.Fill({ color: options.color || "#ff3333" }),
1915
+ stroke: new style.Stroke({
1916
+ color: options.strokeColor || "#ffffff",
1917
+ width: options.strokeWidth || 2
1918
+ })
1919
+ })
1920
+ });
1921
+ }
1922
+ /**
1923
+ * 移除标记
1924
+ */
1925
+ removeMarker(feature, layerName = "default") {
1926
+ const source = this.vectorSources.get(layerName);
1927
+ if (source) {
1928
+ source.removeFeature(feature);
1929
+ }
1930
+ }
1931
+ /**
1932
+ * 从 GeoJSON 添加要素
1933
+ */
1934
+ addFeaturesFromGeoJSON(geoJson, layerName = "default") {
1935
+ if (!this.vectorLayers.has(layerName)) {
1936
+ this.createVectorLayer({ name: layerName });
1937
+ }
1938
+ const source = this.vectorSources.get(layerName);
1939
+ const format2 = new GeoJSON__default.default();
1940
+ const features = format2.readFeatures(typeof geoJson === "string" ? geoJson : JSON.stringify(geoJson));
1941
+ source.addFeatures(features);
1942
+ return features;
1943
+ }
1944
+ /**
1945
+ * 添加要素
1946
+ */
1947
+ addFeature(feature, layerName = "default") {
1948
+ if (!this.vectorLayers.has(layerName)) {
1949
+ this.createVectorLayer({ name: layerName });
1950
+ }
1951
+ const source = this.vectorSources.get(layerName);
1952
+ source.addFeature(feature);
1953
+ }
1954
+ /**
1955
+ * 批量添加要素
1956
+ */
1957
+ addFeatures(features, layerName = "default") {
1958
+ if (!this.vectorLayers.has(layerName)) {
1959
+ this.createVectorLayer({ name: layerName });
1960
+ }
1961
+ const source = this.vectorSources.get(layerName);
1962
+ source.addFeatures(features);
1963
+ }
1964
+ /**
1965
+ * 移除要素
1966
+ */
1967
+ removeFeature(feature, layerName = "default") {
1968
+ const source = this.vectorSources.get(layerName);
1969
+ if (source) {
1970
+ source.removeFeature(feature);
1971
+ }
1972
+ }
1973
+ /**
1974
+ * 清除所有矢量要素
1975
+ */
1976
+ clearFeatures(layerName = "default") {
1977
+ const source = this.vectorSources.get(layerName);
1978
+ if (source) {
1979
+ source.clear();
1980
+ }
1981
+ }
1982
+ /**
1983
+ * 获取图层中的所有要素
1984
+ */
1985
+ getFeatures(layerName = "default") {
1986
+ const source = this.vectorSources.get(layerName);
1987
+ return source ? source.getFeatures() : [];
1988
+ }
1989
+ /**
1990
+ * 创建 GeoJSON
1991
+ */
1992
+ createGeoJSON(type, data) {
1993
+ const coordinates = this.getCoordinates(type, data);
1994
+ const id = this.generateUUID();
1995
+ return {
1996
+ type: "FeatureCollection",
1997
+ features: [{
1998
+ type: "Feature",
1999
+ geometry: {
2000
+ type,
2001
+ coordinates
2002
+ },
2003
+ properties: {
2004
+ id,
2005
+ value: data
2006
+ }
2007
+ }]
2008
+ };
2009
+ }
2010
+ /**
2011
+ * 获取坐标
2012
+ */
2013
+ getCoordinates(type, data) {
2014
+ if (type === "Point") {
2015
+ return proj.fromLonLat(proj.transform(data.points, "EPSG:3857", "EPSG:4326"));
2016
+ } else if (type === "LineString") {
2017
+ return this.setPointArray(data.points);
2018
+ } else if (type === "Polygon") {
2019
+ return [this.setPointArray(data.points)];
2020
+ }
2021
+ return [];
2022
+ }
2023
+ /**
2024
+ * 设置点数组
2025
+ */
2026
+ setPointArray(points) {
2027
+ return points.map((item) => proj.fromLonLat(proj.transform(item, "EPSG:3857", "EPSG:4326")));
2028
+ }
2029
+ /**
2030
+ * 生成 UUID
2031
+ */
2032
+ generateUUID() {
2033
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
2034
+ const r = Math.random() * 16 | 0;
2035
+ const v = c === "x" ? r : r & 3 | 8;
2036
+ return v.toString(16);
2037
+ });
2038
+ }
2039
+ /**
2040
+ * 设置要素样式
2041
+ */
2042
+ setFeatureStyle(feature, options) {
2043
+ const style = this.createFeatureStyle(options);
2044
+ feature.setStyle(style);
2045
+ }
2046
+ /**
2047
+ * 创建要素样式
2048
+ */
2049
+ createFeatureStyle(options) {
2050
+ if (options.style) {
2051
+ return options.style;
2052
+ }
2053
+ if (options.icon && this.icons.has(options.icon)) {
2054
+ const iconConfig = this.icons.get(options.icon);
2055
+ return new style.Style({
2056
+ image: new style.Icon({
2057
+ anchor: iconConfig.anchor || [0.5, 0.5],
2058
+ src: iconConfig.src,
2059
+ scale: iconConfig.scale || 1
2060
+ })
2061
+ });
2062
+ }
2063
+ if (options.iconConfig) {
2064
+ return new style.Style({
2065
+ image: new style.Icon({
2066
+ anchor: options.iconConfig.anchor || [0.5, 0.5],
2067
+ src: options.iconConfig.src,
2068
+ scale: options.iconConfig.scale || 1
2069
+ })
2070
+ });
2071
+ }
2072
+ return new style.Style({
2073
+ stroke: new style.Stroke({
2074
+ color: options.strokeColor || "#3388ff",
2075
+ width: options.strokeWidth || 2
2076
+ }),
2077
+ fill: new style.Fill({
2078
+ color: options.fillColor || "rgba(51, 136, 255, 0.2)"
2079
+ }),
2080
+ image: new style.Circle({
2081
+ radius: 7,
2082
+ fill: new style.Fill({ color: options.strokeColor || "#3388ff" }),
2083
+ stroke: new style.Stroke({
2084
+ color: "#ffffff",
2085
+ width: 2
2086
+ })
2087
+ })
2088
+ });
2089
+ }
2090
+ // ==================== 动态缩放 ====================
2091
+ /**
2092
+ * 处理缩放变化
2093
+ */
2094
+ handleZoomChange() {
2095
+ const zoom = this.getZoom();
2096
+ if (zoom !== void 0) {
2097
+ this.updateIconScale(zoom);
2098
+ }
2099
+ }
2100
+ /**
2101
+ * 更新图标缩放比例
2102
+ */
2103
+ updateIconScale(zoom) {
2104
+ let scale = 1;
2105
+ if (zoom >= 14) {
2106
+ scale = 0.5;
2107
+ } else if (zoom < 14 && zoom >= 12) {
2108
+ scale = 0.4;
2109
+ } else if (zoom < 12) {
2110
+ scale = 0.3;
2111
+ }
2112
+ this.vectorLayers.forEach((layer) => {
2113
+ const features = layer.getSource()?.getFeatures();
2114
+ if (features) {
2115
+ features.forEach((feature) => {
2116
+ const style$1 = feature.getStyle();
2117
+ if (style$1) {
2118
+ const image = style$1.getImage();
2119
+ if (image instanceof style.Icon) {
2120
+ image.setScale(scale);
2121
+ }
2122
+ }
2123
+ });
2124
+ }
2125
+ });
2126
+ }
2127
+ // ==================== Overlay 管理 ====================
2128
+ /**
2129
+ * 创建 Overlay
2130
+ */
2131
+ createOverlay(options) {
2132
+ const overlay = new Overlay__default.default({
2133
+ element: options.element,
2134
+ autoPan: options.autoPan !== false,
2135
+ offset: options.offset,
2136
+ positioning: options.positioning || "bottom-center"
2137
+ });
2138
+ this.overlays.set(options.name, overlay);
2139
+ this.map.addOverlay(overlay);
2140
+ }
2141
+ /**
2142
+ * 显示 Overlay
2143
+ */
2144
+ showOverlay(name, coordinate) {
2145
+ const overlay = this.overlays.get(name);
2146
+ if (overlay) {
2147
+ overlay.setPosition(proj.fromLonLat(coordinate));
2148
+ }
2149
+ }
2150
+ /**
2151
+ * 隐藏 Overlay
2152
+ */
2153
+ hideOverlay(name) {
2154
+ const overlay = this.overlays.get(name);
2155
+ if (overlay) {
2156
+ overlay.setPosition(void 0);
2157
+ }
2158
+ }
2159
+ /**
2160
+ * 移除 Overlay
2161
+ */
2162
+ removeOverlay(name) {
2163
+ const overlay = this.overlays.get(name);
2164
+ if (overlay) {
2165
+ this.map.removeOverlay(overlay);
2166
+ this.overlays.delete(name);
2167
+ }
2168
+ }
2169
+ // ==================== 交互管理 ====================
2170
+ /**
2171
+ * 开始绘制
2172
+ */
2173
+ startDraw(options) {
2174
+ this.stopDraw();
2175
+ const source = options.layerName && this.vectorSources.has(options.layerName) ? this.vectorSources.get(options.layerName) : new VectorSource__default.default();
2176
+ this.drawInteraction = new interaction.Draw({
2177
+ source,
2178
+ type: options.type,
2179
+ style: options.style
2180
+ });
2181
+ this.map.addInteraction(this.drawInteraction);
2182
+ if (options.onDrawEnd) {
2183
+ this.drawInteraction.on("drawend", (evt) => {
2184
+ options.onDrawEnd?.(evt.feature);
2185
+ });
2186
+ }
2187
+ this.snapInteraction = new interaction.Snap({ source });
2188
+ this.map.addInteraction(this.snapInteraction);
2189
+ }
2190
+ /**
2191
+ * 停止绘制
2192
+ */
2193
+ stopDraw() {
2194
+ if (this.drawInteraction) {
2195
+ this.map.removeInteraction(this.drawInteraction);
2196
+ this.drawInteraction = null;
2197
+ }
2198
+ if (this.snapInteraction) {
2199
+ this.map.removeInteraction(this.snapInteraction);
2200
+ this.snapInteraction = null;
2201
+ }
2202
+ }
2203
+ /**
2204
+ * 开始编辑
2205
+ */
2206
+ startModify(layerName = "default") {
2207
+ this.stopModify();
2208
+ const source = this.vectorSources.get(layerName);
2209
+ if (!source) {
2210
+ console.warn(`\u56FE\u5C42 "${layerName}" \u4E0D\u5B58\u5728`);
2211
+ return;
2212
+ }
2213
+ this.modifyInteraction = new interaction.Modify({
2214
+ source
2215
+ });
2216
+ this.map.addInteraction(this.modifyInteraction);
2217
+ this.snapInteraction = new interaction.Snap({ source });
2218
+ this.map.addInteraction(this.snapInteraction);
2219
+ }
2220
+ /**
2221
+ * 停止编辑
2222
+ */
2223
+ stopModify() {
2224
+ if (this.modifyInteraction) {
2225
+ this.map.removeInteraction(this.modifyInteraction);
2226
+ this.modifyInteraction = null;
2227
+ }
2228
+ if (this.snapInteraction) {
2229
+ this.map.removeInteraction(this.snapInteraction);
2230
+ this.snapInteraction = null;
2231
+ }
2232
+ }
2233
+ /**
2234
+ * 开始选择
2235
+ */
2236
+ startSelect(layerName = "default", onSelect) {
2237
+ this.stopSelect();
2238
+ this.selectInteraction = new interaction.Select({
2239
+ layers: this.vectorLayers.get(layerName) ? [this.vectorLayers.get(layerName)] : void 0
2240
+ });
2241
+ this.map.addInteraction(this.selectInteraction);
2242
+ if (onSelect) {
2243
+ this.selectInteraction.on("select", (evt) => {
2244
+ onSelect(evt.selected);
2245
+ });
2246
+ }
2247
+ }
2248
+ /**
2249
+ * 停止选择
2250
+ */
2251
+ stopSelect() {
2252
+ if (this.selectInteraction) {
2253
+ this.map.removeInteraction(this.selectInteraction);
2254
+ this.selectInteraction = null;
2255
+ }
2256
+ }
2257
+ /**
2258
+ * 获取选中的要素
2259
+ */
2260
+ getSelectedFeatures() {
2261
+ return this.selectInteraction?.getFeatures().getArray() || [];
2262
+ }
2263
+ // ==================== 地图控制 ====================
2264
+ /**
2265
+ * 获取原始地图实例
2266
+ */
2267
+ getOlMap() {
2268
+ return this.map;
2269
+ }
2270
+ /**
2271
+ * 获取视图
2272
+ */
2273
+ getView() {
2274
+ return this.map.getView();
2275
+ }
2276
+ /**
2277
+ * 设置中心点
2278
+ */
2279
+ setCenter(coord) {
2280
+ const view = this.getView();
2281
+ if (view) {
2282
+ view.setCenter(proj.fromLonLat(coord));
2283
+ this.map.render();
2284
+ }
2285
+ }
2286
+ /**
2287
+ * 获取中心点
2288
+ */
2289
+ getCenter() {
2290
+ const view = this.getView();
2291
+ if (view) {
2292
+ const center = view.getCenter();
2293
+ return center ? proj.toLonLat(center) : void 0;
2294
+ }
2295
+ return void 0;
2296
+ }
2297
+ /**
2298
+ * 设置缩放级别
2299
+ */
2300
+ setZoom(zoom) {
2301
+ const view = this.getView();
2302
+ if (view) {
2303
+ view.setZoom(zoom);
2304
+ this.map.render();
2305
+ }
2306
+ }
2307
+ /**
2308
+ * 获取缩放级别
2309
+ */
2310
+ getZoom() {
2311
+ return this.getView()?.getZoom();
2312
+ }
2313
+ /**
2314
+ * 缩放到指定范围
2315
+ */
2316
+ fit(extent, options) {
2317
+ if (!extent) return;
2318
+ const view = this.getView();
2319
+ if (view) {
2320
+ view.fit(extent, options);
2321
+ this.map.render();
2322
+ }
2323
+ }
2324
+ /**
2325
+ * 缩放到图层
2326
+ */
2327
+ fitLayer(layerName, options) {
2328
+ const source = this.vectorSources.get(layerName);
2329
+ if (source) {
2330
+ const extent = source.getExtent();
2331
+ if (extent && extent[0] !== Infinity) {
2332
+ this.fit(extent, options);
2333
+ }
2334
+ }
2335
+ }
2336
+ /**
2337
+ * 缩放到坐标数组
2338
+ */
2339
+ fitCoordinates(coordinates, options) {
2340
+ const extent$1 = extent.boundingExtent(coordinates);
2341
+ this.fit(extent$1, options);
2342
+ }
2343
+ /**
2344
+ * 添加图层
2345
+ */
2346
+ addLayer(layer) {
2347
+ this.map.addLayer(layer.layer);
2348
+ }
2349
+ /**
2350
+ * 移除图层
2351
+ */
2352
+ removeMapLayer(layer) {
2353
+ this.map.removeLayer(layer.layer);
2354
+ }
2355
+ /**
2356
+ * 更新地图大小
2357
+ */
2358
+ updateSize() {
2359
+ this.map.updateSize();
2360
+ }
2361
+ /**
2362
+ * 地图事件监听
2363
+ */
2364
+ on(event, callback) {
2365
+ this.map.on(event, callback);
2366
+ }
2367
+ /**
2368
+ * 移除事件监听
2369
+ */
2370
+ off(event, callback) {
2371
+ this.map.un(event, callback);
2372
+ }
2373
+ /**
2374
+ * 销毁地图
2375
+ */
2376
+ destroy() {
2377
+ this.stopDraw();
2378
+ this.stopModify();
2379
+ this.stopSelect();
2380
+ this.overlays.forEach((overlay) => this.map.removeOverlay(overlay));
2381
+ this.overlays.clear();
2382
+ this.vectorLayers.forEach((layer) => this.map.removeLayer(layer));
2383
+ this.vectorLayers.clear();
2384
+ this.vectorSources.clear();
2385
+ this.map.setTarget(void 0);
2386
+ }
2387
+ };
2388
+ function createOSMLayer(name = "OSM") {
2389
+ return {
2390
+ name,
2391
+ layer: new TileLayer__default.default({
2392
+ source: new OSM__default.default()
2393
+ })
2394
+ };
2395
+ }
2396
+ function createXYZLayer(url, name = "XYZ") {
2397
+ return {
2398
+ name,
2399
+ layer: new TileLayer__default.default({
2400
+ source: new XYZ__default.default({
2401
+ url
2402
+ })
2403
+ })
2404
+ };
2405
+ }
2406
+ function createGaodeLayer(name = "\u9AD8\u5FB7\u5730\u56FE") {
2407
+ return createXYZLayer(
2408
+ "https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
2409
+ name
2410
+ );
2411
+ }
2412
+ function createTiandituLayer(token, type = "vec", name = "\u5929\u5730\u56FE") {
2413
+ const url = `https://t{s}.tianditu.gov.cn/DataServer?T=${type}_w&x={x}&y={y}&l={z}&tk=${token}`;
2414
+ return createXYZLayer(url, name);
2415
+ }
2416
+ function lonLatToXY(lon, lat) {
2417
+ return proj.fromLonLat([lon, lat]);
2418
+ }
2419
+ function xyToLonLat(x, y) {
2420
+ return proj.toLonLat([x, y]);
2421
+ }
2422
+ function createPointFeature(coordinate) {
2423
+ return new ol.Feature({
2424
+ geometry: new geom.Point(proj.fromLonLat(coordinate))
2425
+ });
2426
+ }
2427
+ function createLineFeature(coordinates) {
2428
+ return new ol.Feature({
2429
+ geometry: new geom.LineString(coordinates.map((coord) => proj.fromLonLat(coord)))
2430
+ });
2431
+ }
2432
+ function createPolygonFeature(coordinates) {
2433
+ return new ol.Feature({
2434
+ geometry: new geom.Polygon(coordinates.map((ring) => ring.map((coord) => proj.fromLonLat(coord))))
2435
+ });
2436
+ }
2437
+ function createStyledPointFeature(coordinate, style) {
2438
+ const feature = createPointFeature(coordinate);
2439
+ feature.setStyle(style);
2440
+ return feature;
2441
+ }
2442
+ function createStyledLineFeature(coordinates, style) {
2443
+ const feature = createLineFeature(coordinates);
2444
+ feature.setStyle(style);
2445
+ return feature;
2446
+ }
2447
+ function createStyledPolygonFeature(coordinates, style) {
2448
+ const feature = createPolygonFeature(coordinates);
2449
+ feature.setStyle(style);
2450
+ return feature;
2451
+ }
2452
+ function createIconStyle(iconUrl, options) {
2453
+ return new style.Style({
2454
+ image: new style.Icon({
2455
+ anchor: options?.anchor || [0.5, 0.5],
2456
+ src: iconUrl,
2457
+ scale: options?.scale || 1,
2458
+ color: options?.color
2459
+ })
2460
+ });
2461
+ }
2462
+ function createCircleStyle(options) {
2463
+ return new style.Style({
2464
+ image: new style.Circle({
2465
+ radius: options?.radius || 7,
2466
+ fill: new style.Fill({ color: options?.fillColor || "#3388ff" }),
2467
+ stroke: new style.Stroke({
2468
+ color: options?.strokeColor || "#ffffff",
2469
+ width: options?.strokeWidth || 2
2470
+ })
2471
+ })
2472
+ });
2473
+ }
2474
+ function createStrokeStyle(options) {
2475
+ return new style.Style({
2476
+ stroke: new style.Stroke({
2477
+ color: options?.color || "#3388ff",
2478
+ width: options?.width || 2,
2479
+ lineDash: options?.lineDash
2480
+ })
2481
+ });
2482
+ }
2483
+ function createFillStyle(options) {
2484
+ return new style.Style({
2485
+ stroke: new style.Stroke({
2486
+ color: options?.strokeColor || "#3388ff",
2487
+ width: options?.strokeWidth || 2
2488
+ }),
2489
+ fill: new style.Fill({
2490
+ color: options?.fillColor || "rgba(51, 136, 255, 0.2)"
2491
+ })
2492
+ });
2493
+ }
2494
+
2495
+ // src/modules/storage/index.ts
2496
+ var storage_exports = {};
2497
+ __export(storage_exports, {
2498
+ clearLocal: () => clearLocal,
2499
+ clearSession: () => clearSession,
2500
+ clearStorage: () => clearStorage,
2501
+ getAllCookies: () => getAllCookies,
2502
+ getCookie: () => getCookie,
2503
+ getCookieJSON: () => getCookieJSON,
2504
+ getCookieSize: () => getCookieSize,
2505
+ getLocal: () => getLocal,
2506
+ getLocalKeys: () => getLocalKeys,
2507
+ getLocalSize: () => getLocalSize,
2508
+ getSession: () => getSession,
2509
+ getSessionKeys: () => getSessionKeys,
2510
+ getSessionSize: () => getSessionSize,
2511
+ getStorage: () => getStorage,
2512
+ hasCookie: () => hasCookie,
2513
+ removeCookie: () => removeCookie,
2514
+ removeLocal: () => removeLocal,
2515
+ removeSession: () => removeSession,
2516
+ removeStorage: () => removeStorage,
2517
+ setCookie: () => setCookie,
2518
+ setCookieJSON: () => setCookieJSON,
2519
+ setLocal: () => setLocal,
2520
+ setSession: () => setSession,
2521
+ setStorage: () => setStorage
2522
+ });
2523
+ function safeParse(json) {
2524
+ if (!json || json === "undefined" || json === "null") {
2525
+ return void 0;
2526
+ }
2527
+ try {
2528
+ return JSON.parse(json);
2529
+ } catch {
2530
+ return json;
2531
+ }
2532
+ }
2533
+ function isStorageAvailable(storage) {
2534
+ try {
2535
+ const testKey = "__storage_test__";
2536
+ storage.setItem(testKey, testKey);
2537
+ storage.removeItem(testKey);
2538
+ return true;
2539
+ } catch {
2540
+ return false;
2541
+ }
2542
+ }
2543
+ function setLocal(key, value, options) {
2544
+ if (!isStorageAvailable(window.localStorage)) {
2545
+ console.warn("LocalStorage is not available");
2546
+ return;
2547
+ }
2548
+ const data = options?.ttl ? {
2549
+ value,
2550
+ expires: Date.now() + options.ttl
2551
+ } : value;
2552
+ window.localStorage.setItem(key, JSON.stringify(data));
2553
+ }
2554
+ function getLocal(key) {
2555
+ if (!isStorageAvailable(window.localStorage)) {
2556
+ return void 0;
2557
+ }
2558
+ const json = window.localStorage.getItem(key);
2559
+ if (!json) {
2560
+ return void 0;
2561
+ }
2562
+ const data = safeParse(json);
2563
+ if (data && typeof data === "object" && "expires" in data && "value" in data) {
2564
+ if (data.expires && Date.now() > data.expires) {
2565
+ removeLocal(key);
2566
+ return void 0;
2567
+ }
2568
+ return data.value;
2569
+ }
2570
+ return data;
2571
+ }
2572
+ function removeLocal(key) {
2573
+ if (isStorageAvailable(window.localStorage)) {
2574
+ window.localStorage.removeItem(key);
2575
+ }
2576
+ }
2577
+ function clearLocal() {
2578
+ if (isStorageAvailable(window.localStorage)) {
2579
+ window.localStorage.clear();
2580
+ }
2581
+ }
2582
+ function getLocalKeys() {
2583
+ if (!isStorageAvailable(window.localStorage)) {
2584
+ return [];
2585
+ }
2586
+ return Object.keys(window.localStorage);
2587
+ }
2588
+ function getLocalSize() {
2589
+ return getLocalKeys().length;
2590
+ }
2591
+ function setSession(key, value, options) {
2592
+ if (!isStorageAvailable(window.sessionStorage)) {
2593
+ console.warn("SessionStorage is not available");
2594
+ return;
2595
+ }
2596
+ const data = options?.ttl ? {
2597
+ value,
2598
+ expires: Date.now() + options.ttl
2599
+ } : value;
2600
+ window.sessionStorage.setItem(key, JSON.stringify(data));
2601
+ }
2602
+ function getSession(key) {
2603
+ if (!isStorageAvailable(window.sessionStorage)) {
2604
+ return void 0;
2605
+ }
2606
+ const json = window.sessionStorage.getItem(key);
2607
+ if (!json) {
2608
+ return void 0;
2609
+ }
2610
+ const data = safeParse(json);
2611
+ if (data && typeof data === "object" && "expires" in data && "value" in data) {
2612
+ if (data.expires && Date.now() > data.expires) {
2613
+ removeSession(key);
2614
+ return void 0;
2615
+ }
2616
+ return data.value;
2617
+ }
2618
+ return data;
2619
+ }
2620
+ function removeSession(key) {
2621
+ if (isStorageAvailable(window.sessionStorage)) {
2622
+ window.sessionStorage.removeItem(key);
2623
+ }
2624
+ }
2625
+ function clearSession() {
2626
+ if (isStorageAvailable(window.sessionStorage)) {
2627
+ window.sessionStorage.clear();
2628
+ }
2629
+ }
2630
+ function getSessionKeys() {
2631
+ if (!isStorageAvailable(window.sessionStorage)) {
2632
+ return [];
2633
+ }
2634
+ return Object.keys(window.sessionStorage);
2635
+ }
2636
+ function getSessionSize() {
2637
+ return getSessionKeys().length;
2638
+ }
2639
+ function setCookie(key, value, options) {
2640
+ const cookieOptions = {};
2641
+ if (options?.days) {
2642
+ cookieOptions.expires = options.days;
2643
+ } else if (options?.expires !== void 0) {
2644
+ cookieOptions.expires = options.expires;
2645
+ }
2646
+ if (options?.path !== void 0) {
2647
+ cookieOptions.path = options.path;
2648
+ }
2649
+ if (options?.domain !== void 0) {
2650
+ cookieOptions.domain = options.domain;
2651
+ }
2652
+ if (options?.secure !== void 0) {
2653
+ cookieOptions.secure = options.secure;
2654
+ }
2655
+ if (options?.sameSite !== void 0) {
2656
+ cookieOptions.sameSite = options.sameSite;
2657
+ }
2658
+ Cookies__default.default.set(key, value, cookieOptions);
2659
+ }
2660
+ function getCookie(key) {
2661
+ return Cookies__default.default.get(key);
2662
+ }
2663
+ function removeCookie(key, options) {
2664
+ Cookies__default.default.remove(key, options);
2665
+ }
2666
+ function getAllCookies() {
2667
+ return Cookies__default.default.get() || {};
2668
+ }
2669
+ function hasCookie(key) {
2670
+ return Cookies__default.default.get(key) !== void 0;
2671
+ }
2672
+ function getCookieJSON(key) {
2673
+ const value = Cookies__default.default.get(key);
2674
+ if (!value) {
2675
+ return void 0;
2676
+ }
2677
+ try {
2678
+ return JSON.parse(value);
2679
+ } catch {
2680
+ return void 0;
2681
+ }
2682
+ }
2683
+ function setCookieJSON(key, value, options) {
2684
+ setCookie(key, JSON.stringify(value), options);
2685
+ }
2686
+ function getCookieSize() {
2687
+ return Object.keys(getAllCookies()).length;
2688
+ }
2689
+ function setStorage(type, key, value, options) {
2690
+ switch (type) {
2691
+ case "local":
2692
+ setLocal(key, value, options);
2693
+ break;
2694
+ case "session":
2695
+ setSession(key, value, options);
2696
+ break;
2697
+ case "cookie":
2698
+ setCookie(key, value, options);
2699
+ break;
2700
+ }
2701
+ }
2702
+ function getStorage(type, key) {
2703
+ switch (type) {
2704
+ case "local":
2705
+ return getLocal(key);
2706
+ case "session":
2707
+ return getSession(key);
2708
+ case "cookie":
2709
+ return getCookie(key);
2710
+ }
2711
+ }
2712
+ function removeStorage(type, key) {
2713
+ switch (type) {
2714
+ case "local":
2715
+ removeLocal(key);
2716
+ break;
2717
+ case "session":
2718
+ removeSession(key);
2719
+ break;
2720
+ case "cookie":
2721
+ removeCookie(key);
2722
+ break;
2723
+ }
2724
+ }
2725
+ function clearStorage(type) {
2726
+ switch (type) {
2727
+ case "local":
2728
+ clearLocal();
2729
+ break;
2730
+ case "session":
2731
+ clearSession();
2732
+ break;
2733
+ case "cookie": {
2734
+ const cookies = getAllCookies();
2735
+ for (const key of Object.keys(cookies)) {
2736
+ removeCookie(key);
2737
+ }
2738
+ break;
2739
+ }
2740
+ }
2741
+ }
2742
+
2743
+ // src/modules/utils/index.ts
2744
+ var utils_exports = {};
2745
+ __export(utils_exports, {
2746
+ avg: () => avg,
2747
+ base64toBlob: () => base64toBlob,
2748
+ base64toFile: () => base64toFile,
2749
+ camelToSnake: () => camelToSnake,
2750
+ capitalize: () => capitalize2,
2751
+ chunk: () => chunk2,
2752
+ clone: () => clone2,
2753
+ copyToClipboard: () => copyToClipboard,
2754
+ debounce: () => esToolkit.debounce,
2755
+ deepMerge: () => deepMerge2,
2756
+ delay: () => delay,
2757
+ downloadBase64: () => downloadBase64,
2758
+ downloadBlob: () => downloadBlob,
2759
+ downloadFile: () => downloadFile,
2760
+ formatFileSize: () => formatFileSize,
2761
+ formatNumber: () => formatNumber,
2762
+ get: () => get2,
2763
+ getDarkColor: () => getDarkColor,
2764
+ getLightColor: () => getLightColor,
2765
+ groupBy: () => groupBy3,
2766
+ hexToRgb: () => hexToRgb,
2767
+ hexToRgbString: () => hexToRgbString,
2768
+ imgToBase64: () => imgToBase64,
2769
+ isArray: () => isArray2,
2770
+ isBoolean: () => isBoolean2,
2771
+ isEmpty: () => isEmpty4,
2772
+ isEqual: () => isEqual3,
2773
+ isFunction: () => isFunction2,
2774
+ isNumber: () => isNumber2,
2775
+ isObject: () => isObject2,
2776
+ isString: () => isString2,
2777
+ isValidEmail: () => isValidEmail,
2778
+ isValidPhone: () => isValidPhone,
2779
+ isValidUrl: () => isValidUrl,
2780
+ max: () => max2,
2781
+ min: () => min2,
2782
+ omit: () => omit3,
2783
+ pick: () => pick2,
2784
+ randomInt: () => randomInt,
2785
+ readFromClipboard: () => readFromClipboard,
2786
+ retry: () => retry,
2787
+ rgbArrayToHex: () => rgbArrayToHex,
2788
+ rgbToHex: () => rgbToHex,
2789
+ set: () => set2,
2790
+ snakeToCamel: () => snakeToCamel,
2791
+ sortBy: () => sortBy2,
2792
+ sum: () => sum2,
2793
+ throttle: () => esToolkit.throttle,
2794
+ truncate: () => truncate,
2795
+ uniq: () => uniq2,
2796
+ uniqueId: () => uniqueId
2797
+ });
2798
+ var clone2 = (obj) => {
2799
+ if (obj === null || typeof obj !== "object") {
2800
+ return obj;
2801
+ }
2802
+ if (obj instanceof Date) {
2803
+ return new Date(obj.getTime());
2804
+ }
2805
+ if (obj instanceof Array) {
2806
+ return obj.map((item) => clone2(item));
2807
+ }
2808
+ if (obj instanceof Object) {
2809
+ const copy = {};
2810
+ Object.keys(obj).forEach((key) => {
2811
+ copy[key] = clone2(obj[key]);
2812
+ });
2813
+ return copy;
2814
+ }
2815
+ return obj;
2816
+ };
2817
+ var isEqual3 = (a, b) => {
2818
+ if (a === b) return true;
2819
+ if (a === null || b === null) return false;
2820
+ if (typeof a !== typeof b) return false;
2821
+ if (typeof a !== "object") return a === b;
2822
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
2823
+ if (Array.isArray(a)) {
2824
+ if (a.length !== b.length) return false;
2825
+ for (let i = 0; i < a.length; i++) {
2826
+ if (!isEqual3(a[i], b[i])) return false;
2827
+ }
2828
+ return true;
2829
+ }
2830
+ const keysA = Object.keys(a);
2831
+ const keysB = Object.keys(b);
2832
+ if (keysA.length !== keysB.length) return false;
2833
+ for (const key of keysA) {
2834
+ if (!keysB.includes(key)) return false;
2835
+ if (!isEqual3(a[key], b[key])) return false;
2836
+ }
2837
+ return true;
2838
+ };
2839
+ var deepMerge2 = (...objects) => {
2840
+ const result = {};
2841
+ objects.forEach((obj) => {
2842
+ if (isObject2(obj)) {
2843
+ Object.keys(obj).forEach((key) => {
2844
+ const value = obj[key];
2845
+ if (isObject2(value) && isObject2(result[key])) {
2846
+ result[key] = deepMerge2(result[key], value);
2847
+ } else {
2848
+ result[key] = clone2(value);
2849
+ }
2850
+ });
2851
+ }
2852
+ });
2853
+ return result;
2854
+ };
2855
+ var get2 = (obj, path) => {
2856
+ return path.split(".").reduce((acc, key) => acc?.[key], obj);
2857
+ };
2858
+ var set2 = (obj, path, value) => {
2859
+ const keys2 = path.split(".");
2860
+ const lastKey = keys2.pop();
2861
+ const target = keys2.reduce((acc, key) => {
2862
+ if (!acc[key]) acc[key] = {};
2863
+ return acc[key];
2864
+ }, obj);
2865
+ target[lastKey] = value;
2866
+ };
2867
+ var omit3 = (obj, keys2) => {
2868
+ const result = { ...obj };
2869
+ keys2.forEach((key) => delete result[key]);
2870
+ return result;
2871
+ };
2872
+ var pick2 = (obj, keys2) => {
2873
+ const result = {};
2874
+ keys2.forEach((key) => {
2875
+ if (key in obj) {
2876
+ result[key] = obj[key];
2877
+ }
2878
+ });
2879
+ return result;
2880
+ };
2881
+ var isObject2 = (value) => {
2882
+ return value !== null && typeof value === "object" && !Array.isArray(value);
2883
+ };
2884
+ var isArray2 = (value) => {
2885
+ return Array.isArray(value);
2886
+ };
2887
+ var isString2 = (value) => {
2888
+ return typeof value === "string";
2889
+ };
2890
+ var isNumber2 = (value) => {
2891
+ return typeof value === "number" && !isNaN(value);
2892
+ };
2893
+ var isBoolean2 = (value) => {
2894
+ return typeof value === "boolean";
2895
+ };
2896
+ var isFunction2 = (value) => {
2897
+ return typeof value === "function";
2898
+ };
2899
+ var isEmpty4 = (value) => {
2900
+ if (value === null || value === void 0) return true;
2901
+ if (isString2(value) || Array.isArray(value)) return value.length === 0;
2902
+ if (isObject2(value)) return Object.keys(value).length === 0;
2903
+ return false;
2904
+ };
2905
+ var uniq2 = (array) => {
2906
+ return [...new Set(array)];
2907
+ };
2908
+ var sortBy2 = (array, key) => {
2909
+ const sortFn = typeof key === "function" ? key : (item) => item[key];
2910
+ return [...array].sort((a, b) => {
2911
+ const valueA = sortFn(a);
2912
+ const valueB = sortFn(b);
2913
+ if (valueA < valueB) return -1;
2914
+ if (valueA > valueB) return 1;
2915
+ return 0;
2916
+ });
2917
+ };
2918
+ var chunk2 = (array, size2) => {
2919
+ const result = [];
2920
+ for (let i = 0; i < array.length; i += size2) {
2921
+ result.push(array.slice(i, i + size2));
2922
+ }
2923
+ return result;
2924
+ };
2925
+ var groupBy3 = (array, key) => {
2926
+ const groupFn = typeof key === "function" ? key : (item) => String(item[key]);
2927
+ return array.reduce(
2928
+ (result, item) => {
2929
+ const groupKey = groupFn(item);
2930
+ if (!result[groupKey]) {
2931
+ result[groupKey] = [];
2932
+ }
2933
+ result[groupKey].push(item);
2934
+ return result;
2935
+ },
2936
+ {}
2937
+ );
2938
+ };
2939
+ var sum2 = (array) => {
2940
+ return array.reduce((acc, num) => acc + num, 0);
2941
+ };
2942
+ var avg = (array) => {
2943
+ return array.length > 0 ? sum2(array) / array.length : 0;
2944
+ };
2945
+ var max2 = (array) => {
2946
+ return Math.max(...array);
2947
+ };
2948
+ var min2 = (array) => {
2949
+ return Math.min(...array);
2950
+ };
2951
+ var camelToSnake = (str) => {
2952
+ return str.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`);
2953
+ };
2954
+ var snakeToCamel = (str) => {
2955
+ return str.replace(/_([a-z])/g, (_, match) => match.toUpperCase());
2956
+ };
2957
+ var capitalize2 = (str) => {
2958
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
2959
+ };
2960
+ var truncate = (str, length = 100, suffix = "...") => {
2961
+ if (str.length <= length) return str;
2962
+ return `${str.slice(0, length)}${suffix}`;
2963
+ };
2964
+ var formatFileSize = (bytes) => {
2965
+ if (bytes === 0) return "0 B";
2966
+ const k = 1024;
2967
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
2968
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
2969
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
2970
+ };
2971
+ var formatNumber = (num) => {
2972
+ return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
2973
+ };
2974
+ var isValidUrl = (str) => {
2975
+ try {
2976
+ new URL(str);
2977
+ return true;
2978
+ } catch {
2979
+ return false;
2980
+ }
2981
+ };
2982
+ var isValidEmail = (email) => {
2983
+ const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
2984
+ return regex.test(email);
2985
+ };
2986
+ var isValidPhone = (phone) => {
2987
+ const regex = /^1[3-9]\d{9}$/;
2988
+ return regex.test(phone);
2989
+ };
2990
+ var randomInt = (min3, max3) => {
2991
+ return Math.floor(Math.random() * (max3 - min3 + 1)) + min3;
2992
+ };
2993
+ var uniqueId = (prefix = "") => {
2994
+ return `${prefix}${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
2995
+ };
2996
+ var delay = (ms) => {
2997
+ return new Promise((resolve) => setTimeout(resolve, ms));
2998
+ };
2999
+ var retry = async (fn, retries = 3, delayMs = 1e3) => {
3000
+ try {
3001
+ return await fn();
3002
+ } catch (error) {
3003
+ if (retries <= 0) {
3004
+ throw error;
3005
+ }
3006
+ await delay(delayMs);
3007
+ return retry(fn, retries - 1, delayMs);
3008
+ }
3009
+ };
3010
+ var hexToRgb = (str) => {
3011
+ const hexRegex = /^#?([0-9A-Fa-f]{6})$/;
3012
+ if (!hexRegex.test(str)) {
3013
+ return null;
3014
+ }
3015
+ const hex = str.replace("#", "");
3016
+ const r = parseInt(hex.substring(0, 2), 16);
3017
+ const g = parseInt(hex.substring(2, 4), 16);
3018
+ const b = parseInt(hex.substring(4, 6), 16);
3019
+ return [r, g, b];
3020
+ };
3021
+ var hexToRgbString = (str) => {
3022
+ const rgb = hexToRgb(str);
3023
+ if (!rgb) {
3024
+ return null;
3025
+ }
3026
+ return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
3027
+ };
3028
+ var rgbToHex = (r, g, b) => {
3029
+ const numRegex = /^\d{1,3}$/;
3030
+ if (!numRegex.test(r.toString()) || !numRegex.test(g.toString()) || !numRegex.test(b.toString())) {
3031
+ return null;
3032
+ }
3033
+ if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
3034
+ return null;
3035
+ }
3036
+ const toHex = (num) => {
3037
+ const hex = num.toString(16);
3038
+ return hex.length === 1 ? `0${hex}` : hex;
3039
+ };
3040
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
3041
+ };
3042
+ var rgbArrayToHex = (rgb) => {
3043
+ if (rgb.length !== 3) {
3044
+ return null;
3045
+ }
3046
+ return rgbToHex(rgb[0], rgb[1], rgb[2]);
3047
+ };
3048
+ var getLightColor = (color, alpha) => {
3049
+ const rgb = hexToRgb(color);
3050
+ if (!rgb) {
3051
+ return null;
3052
+ }
3053
+ const [r, g, b] = rgb;
3054
+ const newR = Math.floor((255 - r) * alpha + r);
3055
+ const newG = Math.floor((255 - g) * alpha + g);
3056
+ const newB = Math.floor((255 - b) * alpha + b);
3057
+ return rgbToHex(newR, newG, newB);
3058
+ };
3059
+ var getDarkColor = (color, alpha) => {
3060
+ const rgb = hexToRgb(color);
3061
+ if (!rgb) {
3062
+ return null;
3063
+ }
3064
+ const [r, g, b] = rgb;
3065
+ const newR = Math.floor(r * (1 - alpha));
3066
+ const newG = Math.floor(g * (1 - alpha));
3067
+ const newB = Math.floor(b * (1 - alpha));
3068
+ return rgbToHex(newR, newG, newB);
3069
+ };
3070
+ var imgToBase64 = (url, type = "image/png") => {
3071
+ return new Promise((resolve, reject) => {
3072
+ const image = new Image();
3073
+ image.crossOrigin = "anonymous";
3074
+ image.onload = () => {
3075
+ const canvas = document.createElement("canvas");
3076
+ canvas.width = image.naturalWidth;
3077
+ canvas.height = image.naturalHeight;
3078
+ const ctx = canvas.getContext("2d");
3079
+ if (!ctx) {
3080
+ reject(new Error("Failed to get canvas context"));
3081
+ return;
3082
+ }
3083
+ ctx.drawImage(image, 0, 0);
3084
+ const base64 = canvas.toDataURL(type);
3085
+ resolve(base64);
3086
+ };
3087
+ image.onerror = (err) => {
3088
+ reject(new Error(`Failed to load image: ${String(err)}`));
3089
+ };
3090
+ image.src = url;
3091
+ });
3092
+ };
3093
+ var base64toFile = (base64, fileName, mimeType = "image/jpeg") => {
3094
+ const dataArr = base64.split(",");
3095
+ const byteString = atob(dataArr[1]);
3096
+ const u8Arr = new Uint8Array(byteString.length);
3097
+ for (let i = 0; i < byteString.length; i++) {
3098
+ u8Arr[i] = byteString.charCodeAt(i);
3099
+ }
3100
+ return new File([u8Arr], fileName, { type: mimeType });
3101
+ };
3102
+ var base64toBlob = (base64, mimeType = "image/jpeg") => {
3103
+ const dataArr = base64.split(",");
3104
+ const byteString = atob(dataArr[1]);
3105
+ const u8Arr = new Uint8Array(byteString.length);
3106
+ for (let i = 0; i < byteString.length; i++) {
3107
+ u8Arr[i] = byteString.charCodeAt(i);
3108
+ }
3109
+ return new Blob([u8Arr], { type: mimeType });
3110
+ };
3111
+ var downloadFile = (url, fileName = "\u6587\u4EF6", target = false) => {
3112
+ const link = document.createElement("a");
3113
+ link.style.display = "none";
3114
+ link.href = url;
3115
+ if (target) {
3116
+ link.target = "_blank";
3117
+ } else {
3118
+ link.setAttribute("download", fileName);
3119
+ }
3120
+ document.body.appendChild(link);
3121
+ link.click();
3122
+ document.body.removeChild(link);
3123
+ };
3124
+ var downloadBlob = (blob, fileName) => {
3125
+ const url = URL.createObjectURL(blob);
3126
+ downloadFile(url, fileName);
3127
+ URL.revokeObjectURL(url);
3128
+ };
3129
+ var downloadBase64 = (base64, fileName, mimeType = "image/jpeg") => {
3130
+ const blob = base64toBlob(base64, mimeType);
3131
+ downloadBlob(blob, fileName);
3132
+ };
3133
+ var copyToClipboard = async (text) => {
3134
+ try {
3135
+ if (navigator.clipboard && navigator.clipboard.writeText) {
3136
+ await navigator.clipboard.writeText(text);
3137
+ return true;
3138
+ }
3139
+ const textarea = document.createElement("textarea");
3140
+ textarea.value = text;
3141
+ textarea.style.position = "fixed";
3142
+ textarea.style.opacity = "0";
3143
+ document.body.appendChild(textarea);
3144
+ textarea.select();
3145
+ const success = document.execCommand("copy");
3146
+ document.body.removeChild(textarea);
3147
+ return success;
3148
+ } catch {
3149
+ return false;
3150
+ }
3151
+ };
3152
+ var readFromClipboard = async () => {
3153
+ try {
3154
+ if (navigator.clipboard && navigator.clipboard.readText) {
3155
+ return await navigator.clipboard.readText();
3156
+ }
3157
+ return "";
3158
+ } catch {
3159
+ return "";
3160
+ }
3161
+ };
3162
+
3163
+ // src/modules/crypto/index.ts
3164
+ var crypto_exports = {};
3165
+ __export(crypto_exports, {
3166
+ CryptoJS: () => CryptoJS__namespace,
3167
+ aesDecrypt: () => aesDecrypt,
3168
+ aesEncrypt: () => aesEncrypt,
3169
+ base64Decode: () => base64Decode,
3170
+ base64Encode: () => base64Encode,
3171
+ desDecrypt: () => desDecrypt,
3172
+ desEncrypt: () => desEncrypt,
3173
+ generateIV: () => generateIV,
3174
+ generateKey: () => generateKey,
3175
+ hexDecode: () => hexDecode,
3176
+ hexEncode: () => hexEncode,
3177
+ hmacMD5: () => hmacMD5,
3178
+ hmacSHA1: () => hmacSHA1,
3179
+ hmacSHA256: () => hmacSHA256,
3180
+ hmacSHA512: () => hmacSHA512,
3181
+ md5: () => md5,
3182
+ pbkdf2: () => pbkdf2,
3183
+ rabbitDecrypt: () => rabbitDecrypt,
3184
+ rabbitEncrypt: () => rabbitEncrypt,
3185
+ rc4Decrypt: () => rc4Decrypt,
3186
+ rc4Encrypt: () => rc4Encrypt,
3187
+ sha1: () => sha1,
3188
+ sha256: () => sha256,
3189
+ sha512: () => sha512,
3190
+ tripleDesDecrypt: () => tripleDesDecrypt,
3191
+ tripleDesEncrypt: () => tripleDesEncrypt,
3192
+ utf8Decode: () => utf8Decode,
3193
+ utf8Encode: () => utf8Encode,
3194
+ uuid: () => uuid2
3195
+ });
3196
+ var md5 = (message) => {
3197
+ return CryptoJS__namespace.MD5(message).toString();
3198
+ };
3199
+ var sha1 = (message) => {
3200
+ return CryptoJS__namespace.SHA1(message).toString();
3201
+ };
3202
+ var sha256 = (message) => {
3203
+ return CryptoJS__namespace.SHA256(message).toString();
3204
+ };
3205
+ var sha512 = (message) => {
3206
+ return CryptoJS__namespace.SHA512(message).toString();
3207
+ };
3208
+ var hmacMD5 = (message, key) => {
3209
+ return CryptoJS__namespace.HmacMD5(message, key).toString();
3210
+ };
3211
+ var hmacSHA1 = (message, key) => {
3212
+ return CryptoJS__namespace.HmacSHA1(message, key).toString();
3213
+ };
3214
+ var hmacSHA256 = (message, key) => {
3215
+ return CryptoJS__namespace.HmacSHA256(message, key).toString();
3216
+ };
3217
+ var hmacSHA512 = (message, key) => {
3218
+ return CryptoJS__namespace.HmacSHA512(message, key).toString();
3219
+ };
3220
+ var aesEncrypt = (message, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3221
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3222
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3223
+ const encrypted = CryptoJS__namespace.AES.encrypt(message, keyWord, {
3224
+ iv: ivWord,
3225
+ mode: mode2,
3226
+ padding
3227
+ });
3228
+ return encrypted.toString();
3229
+ };
3230
+ var aesDecrypt = (ciphertext, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3231
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3232
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3233
+ const decrypted = CryptoJS__namespace.AES.decrypt(ciphertext, keyWord, {
3234
+ iv: ivWord,
3235
+ mode: mode2,
3236
+ padding
3237
+ });
3238
+ return decrypted.toString(CryptoJS__namespace.enc.Utf8);
3239
+ };
3240
+ var desEncrypt = (message, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3241
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3242
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3243
+ const encrypted = CryptoJS__namespace.DES.encrypt(message, keyWord, {
3244
+ iv: ivWord,
3245
+ mode: mode2,
3246
+ padding
3247
+ });
3248
+ return encrypted.toString();
3249
+ };
3250
+ var desDecrypt = (ciphertext, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3251
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3252
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3253
+ const decrypted = CryptoJS__namespace.DES.decrypt(ciphertext, keyWord, {
3254
+ iv: ivWord,
3255
+ mode: mode2,
3256
+ padding
3257
+ });
3258
+ return decrypted.toString(CryptoJS__namespace.enc.Utf8);
3259
+ };
3260
+ var tripleDesEncrypt = (message, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3261
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3262
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3263
+ const encrypted = CryptoJS__namespace.TripleDES.encrypt(message, keyWord, {
3264
+ iv: ivWord,
3265
+ mode: mode2,
3266
+ padding
3267
+ });
3268
+ return encrypted.toString();
3269
+ };
3270
+ var tripleDesDecrypt = (ciphertext, key, iv, mode2 = CryptoJS__namespace.mode.CBC, padding = CryptoJS__namespace.pad.Pkcs7) => {
3271
+ const keyWord = CryptoJS__namespace.enc.Utf8.parse(key);
3272
+ const ivWord = iv ? CryptoJS__namespace.enc.Utf8.parse(iv) : void 0;
3273
+ const decrypted = CryptoJS__namespace.TripleDES.decrypt(ciphertext, keyWord, {
3274
+ iv: ivWord,
3275
+ mode: mode2,
3276
+ padding
3277
+ });
3278
+ return decrypted.toString(CryptoJS__namespace.enc.Utf8);
3279
+ };
3280
+ var rc4Encrypt = (message, key) => {
3281
+ const encrypted = CryptoJS__namespace.RC4.encrypt(message, key);
3282
+ return encrypted.toString();
3283
+ };
3284
+ var rc4Decrypt = (ciphertext, key) => {
3285
+ const decrypted = CryptoJS__namespace.RC4.decrypt(ciphertext, key);
3286
+ return decrypted.toString(CryptoJS__namespace.enc.Utf8);
3287
+ };
3288
+ var rabbitEncrypt = (message, key) => {
3289
+ const encrypted = CryptoJS__namespace.Rabbit.encrypt(message, key);
3290
+ return encrypted.toString();
3291
+ };
3292
+ var rabbitDecrypt = (ciphertext, key) => {
3293
+ const decrypted = CryptoJS__namespace.Rabbit.decrypt(ciphertext, key);
3294
+ return decrypted.toString(CryptoJS__namespace.enc.Utf8);
3295
+ };
3296
+ var base64Encode = (message) => {
3297
+ return CryptoJS__namespace.enc.Base64.stringify(CryptoJS__namespace.enc.Utf8.parse(message));
3298
+ };
3299
+ var base64Decode = (encoded) => {
3300
+ return CryptoJS__namespace.enc.Base64.parse(encoded).toString(CryptoJS__namespace.enc.Utf8);
3301
+ };
3302
+ var utf8Encode = (message) => {
3303
+ return CryptoJS__namespace.enc.Utf8.stringify(CryptoJS__namespace.enc.Utf8.parse(message));
3304
+ };
3305
+ var utf8Decode = (encoded) => {
3306
+ return CryptoJS__namespace.enc.Utf8.parse(encoded).toString(CryptoJS__namespace.enc.Utf8);
3307
+ };
3308
+ var hexEncode = (message) => {
3309
+ return CryptoJS__namespace.enc.Hex.stringify(CryptoJS__namespace.enc.Utf8.parse(message));
3310
+ };
3311
+ var hexDecode = (encoded) => {
3312
+ return CryptoJS__namespace.enc.Hex.parse(encoded).toString(CryptoJS__namespace.enc.Utf8);
3313
+ };
3314
+ var generateKey = (length = 32) => {
3315
+ const key = CryptoJS__namespace.lib.WordArray.random(length);
3316
+ return CryptoJS__namespace.enc.Base64.stringify(key);
3317
+ };
3318
+ var generateIV = (length = 16) => {
3319
+ const iv = CryptoJS__namespace.lib.WordArray.random(length);
3320
+ return CryptoJS__namespace.enc.Base64.stringify(iv);
3321
+ };
3322
+ var pbkdf2 = (password, salt, iterations = 1e3, keySize = 32) => {
3323
+ const key = CryptoJS__namespace.PBKDF2(password, salt, {
3324
+ keySize: keySize / 4,
3325
+ iterations
3326
+ });
3327
+ return key.toString();
3328
+ };
3329
+ var uuid2 = () => {
3330
+ return CryptoJS__namespace.lib.WordArray.random(16).toString();
3331
+ };
3332
+
3333
+ // src/modules/websocket/index.ts
3334
+ var websocket_exports = {};
3335
+ __export(websocket_exports, {
3336
+ WebSocketClient: () => WebSocketClient,
3337
+ WebSocketState: () => WebSocketState,
3338
+ createWebSocket: () => createWebSocket,
3339
+ default: () => websocket_default,
3340
+ quickConnect: () => quickConnect
3341
+ });
3342
+ var WebSocketState = /* @__PURE__ */ ((WebSocketState2) => {
3343
+ WebSocketState2[WebSocketState2["CONNECTING"] = 0] = "CONNECTING";
3344
+ WebSocketState2[WebSocketState2["OPEN"] = 1] = "OPEN";
3345
+ WebSocketState2[WebSocketState2["CLOSING"] = 2] = "CLOSING";
3346
+ WebSocketState2[WebSocketState2["CLOSED"] = 3] = "CLOSED";
3347
+ return WebSocketState2;
3348
+ })(WebSocketState || {});
3349
+ var WebSocketClient = class {
3350
+ constructor(options) {
3351
+ this.ws = null;
3352
+ this.handlers = {};
3353
+ this.reconnectTimer = null;
3354
+ this.heartbeatTimer = null;
3355
+ this.heartbeatTimeoutTimer = null;
3356
+ this.reconnectCount = 0;
3357
+ this.isManualDisconnect = false;
3358
+ this.messageQueue = [];
3359
+ this.connectResolve = null;
3360
+ this.connectReject = null;
3361
+ this.options = {
3362
+ url: options.url,
3363
+ protocol: options.protocol || (options.url.startsWith("https") ? "wss" : "ws"),
3364
+ protocols: options.protocols || [],
3365
+ autoReconnect: options.autoReconnect ?? true,
3366
+ reconnectAttempts: options.reconnectAttempts ?? 3,
3367
+ reconnectInterval: options.reconnectInterval ?? 3e3,
3368
+ heartbeatInterval: options.heartbeatInterval ?? 3e4,
3369
+ heartbeatMessage: options.heartbeatMessage ?? "ping",
3370
+ heartbeatTimeout: options.heartbeatTimeout ?? 5e3,
3371
+ connectTimeout: options.connectTimeout ?? 1e4,
3372
+ debug: options.debug ?? true
3373
+ };
3374
+ if (options.autoReconnect !== false) {
3375
+ this.connect();
3376
+ }
3377
+ }
3378
+ /**
3379
+ * 连接 WebSocket
3380
+ */
3381
+ connect() {
3382
+ if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
3383
+ this.log("WebSocket already connected or connecting");
3384
+ return;
3385
+ }
3386
+ this.isManualDisconnect = false;
3387
+ this.reconnectCount = 0;
3388
+ const protocol = this.options.url.startsWith("ws://") || this.options.url.startsWith("wss://") ? "" : `${this.options.protocol}://`;
3389
+ const wsUrl = protocol ? `${protocol}${this.options.url}` : this.options.url;
3390
+ this.log(`Connecting to ${wsUrl}`);
3391
+ try {
3392
+ this.ws = new WebSocket(wsUrl, this.options.protocols);
3393
+ this.setupEventHandlers();
3394
+ setTimeout(() => {
3395
+ if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {
3396
+ this.ws.close();
3397
+ this.log("Connection timeout");
3398
+ if (this.connectReject) {
3399
+ this.connectReject(new Error("Connection timeout"));
3400
+ this.connectResolve = null;
3401
+ this.connectReject = null;
3402
+ }
3403
+ }
3404
+ }, this.options.connectTimeout);
3405
+ } catch (error) {
3406
+ this.log("Connection failed:", error);
3407
+ this.handleError(error);
3408
+ }
3409
+ }
3410
+ /**
3411
+ * 断开连接
3412
+ */
3413
+ disconnect() {
3414
+ this.isManualDisconnect = true;
3415
+ this.cleanup();
3416
+ if (this.ws) {
3417
+ this.ws.close();
3418
+ this.ws = null;
3419
+ }
3420
+ this.log("Disconnected manually");
3421
+ }
3422
+ /**
3423
+ * 发送消息(异步)
3424
+ */
3425
+ async send(data) {
3426
+ if (!this.isConnected()) {
3427
+ return new Promise((resolve, reject) => {
3428
+ this.messageQueue.push(data);
3429
+ const checkConnection = () => {
3430
+ if (this.isConnected()) {
3431
+ this.sendSync(data);
3432
+ resolve();
3433
+ } else if (!this.ws) {
3434
+ reject(new Error("WebSocket is not connected"));
3435
+ } else {
3436
+ setTimeout(checkConnection, 100);
3437
+ }
3438
+ };
3439
+ checkConnection();
3440
+ });
3441
+ }
3442
+ this.sendSync(data);
3443
+ }
3444
+ /**
3445
+ * 发送消息(同步)
3446
+ */
3447
+ sendSync(data) {
3448
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
3449
+ this.log("WebSocket is not connected, message queued");
3450
+ this.messageQueue.push(data);
3451
+ return;
3452
+ }
3453
+ try {
3454
+ const message = typeof data === "object" ? JSON.stringify(data) : data;
3455
+ this.ws.send(message);
3456
+ this.log("Message sent:", message);
3457
+ } catch (error) {
3458
+ this.log("Send error:", error);
3459
+ this.handleError(error);
3460
+ }
3461
+ }
3462
+ /**
3463
+ * 获取连接状态
3464
+ */
3465
+ getState() {
3466
+ return this.ws?.readyState ?? 3 /* CLOSED */;
3467
+ }
3468
+ /**
3469
+ * 是否已连接
3470
+ */
3471
+ isConnected() {
3472
+ return this.ws?.readyState === WebSocket.OPEN;
3473
+ }
3474
+ /**
3475
+ * 获取 WebSocket 实例
3476
+ */
3477
+ getInstance() {
3478
+ return this.ws;
3479
+ }
3480
+ /**
3481
+ * 设置事件处理器
3482
+ */
3483
+ on(event, handler) {
3484
+ this.handlers[event] = handler;
3485
+ }
3486
+ /**
3487
+ * 移除事件处理器
3488
+ */
3489
+ off(event, handler) {
3490
+ if (!handler || this.handlers[event] === handler) {
3491
+ delete this.handlers[event];
3492
+ }
3493
+ }
3494
+ /**
3495
+ * 重新连接
3496
+ */
3497
+ reconnect() {
3498
+ this.disconnect();
3499
+ this.reconnectCount = 0;
3500
+ this.isManualDisconnect = false;
3501
+ this.connect();
3502
+ }
3503
+ /**
3504
+ * 设置事件处理器
3505
+ */
3506
+ setupEventHandlers() {
3507
+ if (!this.ws) return;
3508
+ this.ws.onopen = (event) => {
3509
+ this.log("Connected");
3510
+ this.reconnectCount = 0;
3511
+ while (this.messageQueue.length > 0) {
3512
+ const message = this.messageQueue.shift();
3513
+ if (message) {
3514
+ this.sendSync(message);
3515
+ }
3516
+ }
3517
+ this.startHeartbeat();
3518
+ if (this.handlers.onOpen) {
3519
+ this.handlers.onOpen(event);
3520
+ }
3521
+ if (this.connectResolve) {
3522
+ this.connectResolve();
3523
+ this.connectResolve = null;
3524
+ this.connectReject = null;
3525
+ }
3526
+ };
3527
+ this.ws.onmessage = (event) => {
3528
+ this.log("Message received:", event.data);
3529
+ let data = event.data;
3530
+ if (typeof event.data === "string") {
3531
+ try {
3532
+ data = JSON.parse(event.data);
3533
+ } catch {
3534
+ }
3535
+ }
3536
+ if (this.handlers.onMessage) {
3537
+ this.handlers.onMessage(data, event);
3538
+ }
3539
+ };
3540
+ this.ws.onclose = (event) => {
3541
+ this.log("Connection closed:", event.code, event.reason);
3542
+ this.cleanup();
3543
+ if (this.handlers.onClose) {
3544
+ this.handlers.onClose(event);
3545
+ }
3546
+ if (!this.isManualDisconnect && this.options.autoReconnect) {
3547
+ this.attemptReconnect();
3548
+ }
3549
+ };
3550
+ this.ws.onerror = (event) => {
3551
+ this.log("Error:", event);
3552
+ if (this.handlers.onError) {
3553
+ this.handlers.onError(event);
3554
+ }
3555
+ };
3556
+ }
3557
+ /**
3558
+ * 尝试重连
3559
+ */
3560
+ attemptReconnect() {
3561
+ if (this.reconnectCount >= this.options.reconnectAttempts) {
3562
+ this.log("Reconnect failed, max attempts reached");
3563
+ this.cleanup();
3564
+ if (this.handlers.onReconnectFailed) {
3565
+ this.handlers.onReconnectFailed();
3566
+ }
3567
+ if (this.connectReject) {
3568
+ this.connectReject(new Error("Reconnect failed"));
3569
+ this.connectResolve = null;
3570
+ this.connectReject = null;
3571
+ }
3572
+ return;
3573
+ }
3574
+ this.reconnectCount++;
3575
+ this.log(`Reconnecting... Attempt ${this.reconnectCount}/${this.options.reconnectAttempts}`);
3576
+ if (this.handlers.onReconnect) {
3577
+ this.handlers.onReconnect(this.reconnectCount);
3578
+ }
3579
+ this.reconnectTimer = setTimeout(() => {
3580
+ this.connect();
3581
+ }, this.options.reconnectInterval);
3582
+ }
3583
+ /**
3584
+ * 启动心跳
3585
+ */
3586
+ startHeartbeat() {
3587
+ this.stopHeartbeat();
3588
+ this.heartbeatTimer = setInterval(() => {
3589
+ if (this.isConnected()) {
3590
+ const message = this.options.heartbeatMessage;
3591
+ this.log("Sending heartbeat");
3592
+ if (this.handlers.onHeartbeat) {
3593
+ this.handlers.onHeartbeat();
3594
+ }
3595
+ this.sendSync(message);
3596
+ this.heartbeatTimeoutTimer = setTimeout(() => {
3597
+ this.log("Heartbeat timeout");
3598
+ if (this.handlers.onHeartbeatTimeout) {
3599
+ this.handlers.onHeartbeatTimeout();
3600
+ }
3601
+ if (this.ws) {
3602
+ this.ws.close();
3603
+ }
3604
+ }, this.options.heartbeatTimeout);
3605
+ }
3606
+ }, this.options.heartbeatInterval);
3607
+ }
3608
+ /**
3609
+ * 停止心跳
3610
+ */
3611
+ stopHeartbeat() {
3612
+ if (this.heartbeatTimer) {
3613
+ clearInterval(this.heartbeatTimer);
3614
+ this.heartbeatTimer = null;
3615
+ }
3616
+ if (this.heartbeatTimeoutTimer) {
3617
+ clearTimeout(this.heartbeatTimeoutTimer);
3618
+ this.heartbeatTimeoutTimer = null;
3619
+ }
3620
+ }
3621
+ /**
3622
+ * 清理资源
3623
+ */
3624
+ cleanup() {
3625
+ this.stopHeartbeat();
3626
+ if (this.reconnectTimer) {
3627
+ clearTimeout(this.reconnectTimer);
3628
+ this.reconnectTimer = null;
3629
+ }
3630
+ }
3631
+ /**
3632
+ * 处理错误
3633
+ */
3634
+ handleError(error) {
3635
+ this.log("Error:", error.message);
3636
+ if (this.handlers.onError) {
3637
+ this.handlers.onError(new ErrorEvent("error", { error }));
3638
+ }
3639
+ }
3640
+ /**
3641
+ * 日志输出
3642
+ */
3643
+ log(...args) {
3644
+ if (this.options.debug) {
3645
+ console.log("[WebSocket]", ...args);
3646
+ }
3647
+ }
3648
+ };
3649
+ function createWebSocket(options) {
3650
+ return new WebSocketClient(options);
3651
+ }
3652
+ function quickConnect(url, handlers) {
3653
+ const client = new WebSocketClient({ url, autoReconnect: true });
3654
+ if (handlers) {
3655
+ Object.entries(handlers).forEach(([event, handler]) => {
3656
+ client.on(event, handler);
3657
+ });
3658
+ }
3659
+ return client;
3660
+ }
3661
+ var websocket_default = {
3662
+ WebSocketClient,
3663
+ createWebSocket,
3664
+ quickConnect,
3665
+ WebSocketState
3666
+ };
3667
+ /**
3668
+ * Utils Toolkit
3669
+ * 一个功能强大的 JavaScript/TypeScript 工具函数库
3670
+ *
3671
+ * @version 1.0.0
3672
+ * @license MIT
3673
+ */
3674
+
3675
+ Object.defineProperty(exports, "dayjs", {
3676
+ enumerable: true,
3677
+ get: function () { return dayjs__default.default; }
3678
+ });
3679
+ exports.array = array_exports;
3680
+ exports.crypto = crypto_exports;
3681
+ exports.date = date_exports;
3682
+ exports.excel = excel_exports;
3683
+ exports.map = map_exports;
3684
+ exports.object = object_exports;
3685
+ exports.pdf = pdf_exports;
3686
+ exports.storage = storage_exports;
3687
+ exports.string = string_exports;
3688
+ exports.utils = utils_exports;
3689
+ exports.websocket = websocket_exports;
3690
+ //# sourceMappingURL=index.cjs.map
3691
+ //# sourceMappingURL=index.cjs.map