@zero-library/common 2.1.10 → 2.2.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.
package/dist/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { FileUnknownOutlined, FileZipOutlined, FileMarkdownOutlined, FileGifOutlined, FileImageOutlined, FileJpgOutlined, NotificationOutlined, VideoCameraOutlined, FilePptOutlined, FileExcelOutlined, FileWordOutlined, FilePdfOutlined, FileTextOutlined } from '@ant-design/icons';
3
3
  import * as React16 from 'react';
4
4
  import { forwardRef, useState, useMemo, useEffect, lazy, Suspense, useRef, createContext, useCallback, useContext } from 'react';
5
- import { Spin, Result, Splitter, Empty, Image, Flex, Drawer, Tag, Avatar, Alert, notification, Modal, Form, Input, Button } from 'antd';
5
+ import { Spin, Result, message, notification, Modal, Splitter, Empty, Image, Flex, Drawer, Tag, Avatar, Alert, Form, Input, Button } from 'antd';
6
6
  import parse from 'html-react-parser';
7
7
  import { jsonrepair } from 'jsonrepair';
8
8
  import markdownit from 'markdown-it';
@@ -13,13 +13,12 @@ import { zoomPlugin } from '@react-pdf-viewer/zoom';
13
13
  import '@react-pdf-viewer/core/lib/styles/index.css';
14
14
  import zh_CN from '@react-pdf-viewer/locales/lib/zh_CN.json';
15
15
  import '@react-pdf-viewer/page-navigation/lib/styles/index.css';
16
- import dayjs from 'dayjs';
17
- import relativeTime from 'dayjs/plugin/relativeTime';
18
16
  import AES from 'crypto-js/aes';
19
17
  import encUtf8 from 'crypto-js/enc-utf8';
18
+ import dayjs from 'dayjs';
19
+ import relativeTime from 'dayjs/plugin/relativeTime';
20
20
  import Decimal from 'decimal.js';
21
21
  import axios from 'axios';
22
- import { message } from 'antd/lib';
23
22
  import '@react-pdf-viewer/thumbnail/lib/styles/index.css';
24
23
  import '@react-pdf-viewer/zoom/lib/styles/index.css';
25
24
  import classNames2 from 'classnames';
@@ -59,24 +58,8 @@ var AudioPlayer_default = ({ fileUrl }) => {
59
58
  "\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u6301 audio \u6807\u7B7E\u3002"
60
59
  ] });
61
60
  };
62
-
63
- // src/utils/theme.ts
64
- var getPrimaryColor = () => {
65
- const searchParams = new URLSearchParams(location.search);
66
- const mainSource = searchParams.get("mainSource") || "cube-uc";
67
- if (mainSource === "cube-uc") {
68
- return "#34AFBE";
69
- } else if (mainSource === "uc") {
70
- return "#FA541C";
71
- }
72
- };
73
- var LgPrimaryColor = getPrimaryColor();
74
- var themeConfig = {
75
- token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },
76
- cssVar: true
77
- };
78
61
  var FileIcon_default = ({ suffix, fontSize = 22 }) => {
79
- const styles = { fontSize, color: LgPrimaryColor };
62
+ const styles = { fontSize, color: "var(--ant-color-primary)" };
80
63
  const Icon = useMemo(() => {
81
64
  switch (suffix?.toUpperCase()) {
82
65
  case "TXT":
@@ -171,7 +154,7 @@ function highlightKeywords(html, keywords) {
171
154
  function makePlaceholder(id) {
172
155
  return `__ALERT_DATA_${id}__`;
173
156
  }
174
- function extractAlertPlaceholders(src) {
157
+ function alertMarkClean(src) {
175
158
  let pos = 0;
176
159
  let id = 0;
177
160
  let out = "";
@@ -187,17 +170,13 @@ function extractAlertPlaceholders(src) {
187
170
  const relAfter = afterStart.slice(":::alert".length);
188
171
  const matchLineEnd = relAfter.search(/\s*:::\s*/);
189
172
  let endIdx = -1;
173
+ let isNoEnd = 1;
190
174
  if (matchLineEnd !== -1) {
191
- endIdx = start + ":::alert".length + matchLineEnd + 1;
175
+ endIdx = start + ":::alert".length + matchLineEnd;
176
+ isNoEnd = 0;
192
177
  } else {
193
- const fallback = src.indexOf(":::", start + ":::alert".length);
194
- if (fallback === -1) {
195
- out += src.slice(start);
196
- pos = src.length;
197
- break;
198
- } else {
199
- endIdx = fallback;
200
- }
178
+ endIdx = src.length;
179
+ isNoEnd = 1;
201
180
  }
202
181
  const inner = src.slice(start + ":::alert".length, endIdx).trim();
203
182
  const typeMatch = inner.match(/type\s*=\s*(?:(['"])(.*?)\1|(\S+))/);
@@ -209,8 +188,8 @@ function extractAlertPlaceholders(src) {
209
188
  }
210
189
  const ph = makePlaceholder(id++);
211
190
  placeholders.set(ph, rawData);
212
- const typeText = type ? ` type=${JSON.stringify(type)}` : "";
213
- out += `:::alert${typeText} data="${ph}" :::`;
191
+ const typeText = type ? `type=${JSON.stringify(type)}` : "";
192
+ out += `:::alert ${typeText} data="${ph}" loading="${isNoEnd}" :::`;
214
193
  const realClose = src.indexOf(":::", endIdx);
215
194
  pos = realClose === -1 ? endIdx : realClose + 3;
216
195
  }
@@ -239,33 +218,23 @@ try {
239
218
  var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onChange, onPartialChange }) => {
240
219
  const reactContent = useMemo(() => {
241
220
  if (!content) return null;
242
- let fixedContent = content;
243
- const openCount = (fixedContent.match(/:::alert\b/g) || []).length;
244
- const closeCount = (fixedContent.match(/\s*:::\s*/gm) || []).length - openCount;
245
- let incomplete = false;
246
- if (openCount > closeCount) {
247
- incomplete = true;
248
- fixedContent += " :::";
249
- }
250
- const { text: preprocessed, placeholders } = extractAlertPlaceholders(fixedContent);
221
+ const { text: preprocessed, placeholders } = alertMarkClean(content);
251
222
  let rawHtml = md.render(preprocessed);
252
223
  rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml;
253
224
  let lazyIndex = -1;
254
- const allLazyMatches = [...rawHtml.matchAll(/<lazy-component/gi)];
255
- const lastLazyIndex = allLazyMatches.length - 1;
256
225
  return parse(rawHtml, {
257
226
  replace: (domNode) => {
258
227
  if (domNode.name === "lazy-component") {
259
228
  lazyIndex++;
260
229
  const el = domNode;
261
230
  const type = el.attribs.type;
231
+ const loading = !!Number(el.attribs.loading);
262
232
  const dataAttr = el.attribs.data || "";
263
233
  let data = {};
264
234
  if (/^__ALERT_DATA_\d+__$/.test(dataAttr)) {
265
235
  const raw = placeholders.get(dataAttr) ?? "";
266
236
  data = parseData(raw);
267
237
  }
268
- const loading = incomplete && lazyIndex === lastLazyIndex;
269
238
  return /* @__PURE__ */ jsx(
270
239
  LazyComponent_default,
271
240
  {
@@ -370,7 +339,7 @@ function isNumber(val) {
370
339
  return is(val, "Number");
371
340
  }
372
341
  function isNumberNoNaN(val) {
373
- return is(val, "Number") && !isNaN(val);
342
+ return isNumber(val) && !isNaN(val);
374
343
  }
375
344
  function isString(val) {
376
345
  return is(val, "String");
@@ -391,7 +360,7 @@ function isArray(val) {
391
360
  return Array.isArray(val);
392
361
  }
393
362
  function isEmpty(val) {
394
- if (isArray(val) || isString(val)) {
363
+ if (isString(val) || isArray(val)) {
395
364
  return val.length === 0;
396
365
  }
397
366
  if (isNullOrUnDef(val)) {
@@ -403,28 +372,89 @@ function isEmpty(val) {
403
372
  return isEmptyObj(val);
404
373
  }
405
374
  function isWindow(val) {
406
- return typeof window !== "undefined" && is(val, "Window");
375
+ return is(val, "Window");
407
376
  }
408
377
  function isElement(val) {
409
- return isObject(val) && !!val.tagName;
378
+ return isObject(val) && !!val?.tagName;
410
379
  }
411
380
  function isMap(val) {
412
381
  return is(val, "Map");
413
382
  }
414
- var isServer = typeof window === "undefined";
415
- var isClient = !isServer;
383
+ function isSet(val) {
384
+ return is(val, "Set");
385
+ }
416
386
  var isExternal = (path) => {
417
- return /^(https?:|mailto:|tel:)/.test(path);
387
+ if (!isString(path)) return false;
388
+ return /^(https?:|mailto:|tel:|ftp:)/.test(path);
418
389
  };
419
390
  var isBlob = (val) => {
420
391
  return is(val, "Blob");
421
392
  };
422
393
  var isLocalhost = (host) => {
423
- return /^(localhost:)/.test(host || location.host);
394
+ const targetHost = host || location.host;
395
+ return /^(localhost|127\.0\.0\.1|0\.0\.0\.0|\[?::1\]?)(:\d+)?$/.test(targetHost);
396
+ };
397
+ function isReferenceType(val) {
398
+ return typeof val === "object" && !isNull(val) || isFunction(val);
399
+ }
400
+ var isScriptSafe = (script) => {
401
+ if (isString(script)) {
402
+ const unsafeKeywords = [
403
+ "eval",
404
+ // 动态执行代码,极高风险
405
+ "new Function",
406
+ // 动态创建函数,高风险
407
+ "setTimeout",
408
+ // 可能被用于延迟恶意代码执行
409
+ "setInterval",
410
+ // 可能被用于持续执行恶意代码
411
+ "window",
412
+ // 访问全局窗口对象
413
+ "document",
414
+ // 访问文档对象,可能操作DOM
415
+ "location",
416
+ // 可能被用于钓鱼攻击或重定向
417
+ "navigator",
418
+ // 访问浏览器信息
419
+ "localStorage",
420
+ // 访问本地存储数据
421
+ "sessionStorage",
422
+ // 访问会话存储数据
423
+ "history",
424
+ // 可能被用于操纵浏览历史
425
+ "fetch",
426
+ // 发起网络请求
427
+ "XMLHttpRequest",
428
+ // 发起 AJAX 请求
429
+ "WebSocket",
430
+ // 建立 WebSocket 连接
431
+ "alert",
432
+ // 弹出警告框(可能用于社会工程学攻击)
433
+ "confirm",
434
+ // 弹出确认框(可能用于社会工程学攻击)
435
+ "prompt"
436
+ // 弹出输入框(可能用于社会工程学攻击)
437
+ // 'console' // 控制台对象(通常被注释掉)
438
+ ];
439
+ const regex = new RegExp(`\\b(${unsafeKeywords.join("|")})\\b`, "i");
440
+ if (regex.test(script)) {
441
+ return false;
442
+ }
443
+ return true;
444
+ }
445
+ return false;
446
+ };
447
+ var isJson = (text = "") => {
448
+ try {
449
+ const parsed = JSON.parse(text);
450
+ return isObject(parsed) || isArray(parsed);
451
+ } catch {
452
+ return false;
453
+ }
424
454
  };
425
455
 
426
456
  // src/hooks/iframe/useIframeRelayBridge.ts
427
- function useIframeRelayBridge(allowedOrigins = ["*"]) {
457
+ var useIframeRelayBridge_default = (allowedOrigins = ["*"]) => {
428
458
  const handlers = useRef({});
429
459
  useEffect(() => {
430
460
  const onMessage = (evt) => {
@@ -451,8 +481,64 @@ function useIframeRelayBridge(allowedOrigins = ["*"]) {
451
481
  handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler);
452
482
  }
453
483
  return { on, off };
454
- }
455
- function useCreateValtioContext() {
484
+ };
485
+ var useAutoRefresh_default = (listenValue, shouldRefresh, callback, delay = 1e4) => {
486
+ const timerRef = useRef(null);
487
+ const shouldRefreshRef = useRef(shouldRefresh);
488
+ const callbackRef = useRef(callback);
489
+ const [num, setNum] = useState(0);
490
+ useEffect(() => {
491
+ shouldRefreshRef.current = shouldRefresh;
492
+ callbackRef.current = callback;
493
+ }, [shouldRefresh, callback]);
494
+ useEffect(() => {
495
+ if (timerRef.current) {
496
+ clearTimeout(timerRef.current);
497
+ timerRef.current = null;
498
+ }
499
+ if (shouldRefreshRef.current(listenValue)) {
500
+ timerRef.current = setTimeout(async () => {
501
+ await callbackRef.current();
502
+ setNum(num + 1);
503
+ }, delay);
504
+ }
505
+ return () => {
506
+ if (timerRef.current) {
507
+ clearTimeout(timerRef.current);
508
+ }
509
+ };
510
+ }, [listenValue, delay, num]);
511
+ };
512
+ var useCountDown_default = (callback) => {
513
+ const [count, setCount] = useState(0);
514
+ const [startCount, setStartCount] = useState(0);
515
+ const timer = useRef(null);
516
+ const pause = () => {
517
+ clearInterval(timer.current);
518
+ timer.current = null;
519
+ };
520
+ const start = (initialValue = 60) => {
521
+ pause();
522
+ setCount(initialValue);
523
+ setStartCount((startCount2) => startCount2 + 1);
524
+ timer.current = setInterval(() => {
525
+ setCount((count2) => count2 - 1);
526
+ }, 1e3);
527
+ };
528
+ useEffect(() => {
529
+ return () => {
530
+ pause();
531
+ };
532
+ }, []);
533
+ useEffect(() => {
534
+ if (count === 0 && startCount !== 0) {
535
+ pause();
536
+ callback?.();
537
+ }
538
+ }, [count]);
539
+ return { count, start, pause, startCount };
540
+ };
541
+ var useCreateValtioContext_default = () => {
456
542
  const Context = createContext(null);
457
543
  const ValtioProvider = ({ store, children }) => /* @__PURE__ */ jsx(Context.Provider, { value: store, children });
458
544
  const useValtioStore = () => {
@@ -462,11 +548,12 @@ function useCreateValtioContext() {
462
548
  };
463
549
  return {
464
550
  ValtioProvider,
465
- useValtioStore
466
- // Context
551
+ useValtioStore,
552
+ // 导出 Context 以便外部使用
553
+ Context
467
554
  };
468
- }
469
- function useDebounce(func, wait = 400) {
555
+ };
556
+ var useDebounce_default = (func, wait = 400) => {
470
557
  const { current } = useRef({ func, timeOut: null });
471
558
  useEffect(() => {
472
559
  current.func = func;
@@ -501,99 +588,155 @@ function useDebounce(func, wait = 400) {
501
588
  debounce.flush = flush;
502
589
  debounce.cancel = cancel;
503
590
  return useCallback(debounce, []);
504
- }
505
-
506
- // src/utils/common.ts
507
- var deepCopy = (obj, isJson = true) => {
508
- if (!isArray(obj) && !isObject(obj)) return obj;
509
- if (isJson) return JSON.parse(JSON.stringify(obj));
510
- const result = isArray(obj) ? [] : {};
511
- for (const key in obj) {
512
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
513
- result[key] = deepCopy(obj[key], isJson);
591
+ };
592
+ var deepCopy = (obj, isJson2 = true) => {
593
+ if (isJson2) {
594
+ try {
595
+ return JSON.parse(JSON.stringify(obj));
596
+ } catch {
597
+ return deepCopy(obj, false);
514
598
  }
515
599
  }
516
- return result;
600
+ const visited = /* @__PURE__ */ new WeakMap();
601
+ const cloneRecursively = (value) => {
602
+ if (isNullOrUnDef(value)) return value;
603
+ const type = typeof value;
604
+ if (type !== "object") return value;
605
+ if (visited.has(value)) {
606
+ return visited.get(value);
607
+ }
608
+ if (isDate(value)) return new Date(value);
609
+ if (isRegExp(value)) return new RegExp(value);
610
+ if (isMap(value)) {
611
+ const clonedMap = /* @__PURE__ */ new Map();
612
+ visited.set(value, clonedMap);
613
+ for (const [k, v] of value.entries()) {
614
+ clonedMap.set(cloneRecursively(k), cloneRecursively(v));
615
+ }
616
+ return clonedMap;
617
+ }
618
+ if (isSet(value)) {
619
+ const clonedSet = /* @__PURE__ */ new Set();
620
+ visited.set(value, clonedSet);
621
+ for (const v of value.values()) {
622
+ clonedSet.add(cloneRecursively(v));
623
+ }
624
+ return clonedSet;
625
+ }
626
+ if (isArray(value)) {
627
+ const result = [];
628
+ visited.set(value, result);
629
+ for (let i = 0; i < value.length; i++) {
630
+ result[i] = cloneRecursively(value[i]);
631
+ }
632
+ return result;
633
+ } else {
634
+ const result = {};
635
+ visited.set(value, result);
636
+ for (const key in value) {
637
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
638
+ result[key] = cloneRecursively(value[key]);
639
+ }
640
+ }
641
+ return result;
642
+ }
643
+ };
644
+ return cloneRecursively(obj);
517
645
  };
518
646
  function deepEqual(a, b) {
519
- if (Object.is(a, b)) return true;
520
- if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
521
- if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString();
522
- if (a instanceof Map && b instanceof Map) {
523
- if (a.size !== b.size) return false;
524
- for (const [key, val] of a.entries()) {
525
- if (!b.has(key) || !deepEqual(val, b.get(key))) return false;
647
+ const visited = /* @__PURE__ */ new WeakMap();
648
+ const isEqual = (x, y) => {
649
+ if (Object.is(x, y)) return true;
650
+ if (typeof x === "object" && !isNull(x) && typeof y === "object" && !isNull(y)) {
651
+ if (visited.has(x)) {
652
+ if (visited.get(x).has(y)) return true;
653
+ }
654
+ if (!visited.has(x)) visited.set(x, /* @__PURE__ */ new WeakSet());
655
+ visited.get(x).add(y);
656
+ if (!visited.has(y)) visited.set(y, /* @__PURE__ */ new WeakSet());
657
+ visited.get(y).add(x);
526
658
  }
527
- return true;
528
- }
529
- if (a instanceof Set && b instanceof Set) {
530
- if (a.size !== b.size) return false;
531
- for (const val of a.values()) {
532
- if (!b.has(val)) return false;
659
+ if (isDate(x) && isDate(y)) return x.getTime() === y.getTime();
660
+ if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString();
661
+ if (isMap(x) && isMap(y)) {
662
+ if (x.size !== y.size) return false;
663
+ for (const [key, val] of x.entries()) {
664
+ if (!y.has(key)) return false;
665
+ if (!isEqual(val, y.get(key))) return false;
666
+ }
667
+ return true;
533
668
  }
534
- return true;
535
- }
536
- if (Array.isArray(a) && Array.isArray(b)) {
537
- if (a.length !== b.length) return false;
538
- return a.every((item, i) => deepEqual(item, b[i]));
539
- }
540
- if (typeof a === "function" && typeof b === "function") return a.toString() === b.toString();
541
- if (isObject(a) && isObject(b)) {
542
- const keysA = Object.keys(a);
543
- const keysB = Object.keys(b);
544
- if (keysA.length !== keysB.length) return false;
545
- for (const key of keysA) {
546
- if (!deepEqual(a[key], b[key])) return false;
669
+ if (isSet(x) && isSet(y)) {
670
+ if (x.size !== y.size) return false;
671
+ for (const val of x.values()) {
672
+ const hasEqual = Array.from(y.values()).some((bVal) => isEqual(val, bVal));
673
+ if (!hasEqual) return false;
674
+ }
675
+ return true;
547
676
  }
548
- return true;
549
- }
550
- return false;
677
+ if (isArray(x) && isArray(y)) {
678
+ if (x.length !== y.length) return false;
679
+ return x.every((item, i) => isEqual(item, y[i]));
680
+ }
681
+ if (isFunction(x) && isFunction(y)) return x === y;
682
+ if (isObject(x) && isObject(y)) {
683
+ const keysA = Object.keys(x);
684
+ const keysB = Object.keys(y);
685
+ if (keysA.length !== keysB.length) return false;
686
+ for (const key of keysA) {
687
+ if (!keysB.includes(key)) return false;
688
+ if (!isEqual(x[key], y[key])) return false;
689
+ }
690
+ return true;
691
+ }
692
+ return false;
693
+ };
694
+ return isEqual(a, b);
551
695
  }
552
696
  var deepMerge = (base, override) => {
697
+ if (!base || !override) {
698
+ return base || override || {};
699
+ }
553
700
  const result = { ...base };
554
701
  Object.keys(override || {}).forEach((key) => {
555
702
  const baseValue = base[key];
556
703
  const overrideValue = override[key];
557
- if (typeof baseValue === "object" && baseValue !== null && !isArray(baseValue) && typeof overrideValue === "object" && overrideValue !== null && !isArray(overrideValue)) {
704
+ if (isObject(baseValue) && isObject(overrideValue)) {
558
705
  result[key] = deepMerge(baseValue, overrideValue);
559
- } else if (overrideValue !== void 0) {
706
+ } else if (isDef(overrideValue)) {
560
707
  result[key] = overrideValue;
561
708
  }
562
709
  });
563
710
  return result;
564
711
  };
565
- var objToOptions = (obj) => {
566
- return Object.keys(obj).map((key) => ({
712
+ var objToOptions = (obj, filter) => {
713
+ return Object.keys(obj).filter((key) => !filter || filter(key, obj[key])).map((key) => ({
567
714
  label: obj[key],
568
- value: Number(key)
715
+ value: isNaN(Number(key)) ? key : Number(key)
569
716
  }));
570
717
  };
571
718
  var arrToObj = (arr = [], key) => {
572
719
  const obj = {};
573
- arr?.forEach((item) => {
720
+ arr.forEach((item) => {
574
721
  obj[item[key]] = item;
575
722
  });
576
723
  return obj;
577
724
  };
578
- var nsSetInterval = (fn, t) => {
725
+ var setInterval2 = (fn, t) => {
579
726
  let timer = null;
580
- let isCancelled = false;
581
- const interval = () => {
727
+ let running = true;
728
+ const loop = () => {
582
729
  timer = setTimeout(async () => {
583
- if (isCancelled) {
584
- return;
585
- }
730
+ if (!running) return;
586
731
  await fn();
587
- if (!isCancelled) {
588
- interval();
589
- }
732
+ if (running) loop();
590
733
  }, t);
591
734
  };
592
- interval();
735
+ loop();
593
736
  return {
594
- isRun: () => !!timer,
737
+ isRun: () => running,
595
738
  cancel: () => {
596
- isCancelled = true;
739
+ running = false;
597
740
  if (timer) {
598
741
  clearTimeout(timer);
599
742
  timer = null;
@@ -602,14 +745,13 @@ var nsSetInterval = (fn, t) => {
602
745
  };
603
746
  };
604
747
  var genNonDuplicateID = () => {
605
- let idStr = Date.now().toString(36);
606
- idStr += Math.random().toString(36).substr(2);
607
- return idStr;
748
+ return crypto.randomUUID();
608
749
  };
609
- var copyText = (text) => {
610
- if (navigator.clipboard && window.isSecureContext) {
611
- return navigator.clipboard.writeText(text);
612
- } else {
750
+ var copyText = async (text, prompt = "\u590D\u5236\u6210\u529F") => {
751
+ try {
752
+ await navigator.clipboard.writeText(text);
753
+ if (prompt) message.success(prompt);
754
+ } catch (e) {
613
755
  const textArea = document.createElement("textarea");
614
756
  textArea.value = text;
615
757
  textArea.style.position = "absolute";
@@ -619,10 +761,9 @@ var copyText = (text) => {
619
761
  document.body.appendChild(textArea);
620
762
  textArea.focus();
621
763
  textArea.select();
622
- return new Promise((res, rej) => {
623
- document.execCommand("copy") ? res() : rej();
624
- textArea.remove();
625
- });
764
+ const ok = document.execCommand("copy");
765
+ if (ok && prompt) message.success(prompt);
766
+ textArea.remove();
626
767
  }
627
768
  };
628
769
  function formatNumberWithCommas(number) {
@@ -646,25 +787,71 @@ var getFileName = (filePath) => {
646
787
  var getFileSuffixName = (fileName) => {
647
788
  return fileName.split(".").pop() || "";
648
789
  };
649
- var textAreaView = (con) => {
790
+ var convertNewlineToBr = (con) => {
650
791
  return con ? con.replace(/\r\n/g, "\n").replace(/\n/g, "<br/>") : "";
651
792
  };
652
- var buildUrlParams = (obj, url) => {
653
- const params = Object.entries(obj).filter(([, value]) => !isNullOrUnDef(value)).map(([key, value]) => {
793
+ var getAllUrlParams = (url = "") => {
794
+ const result = {};
795
+ if (!url) return result;
796
+ let query = "";
797
+ try {
798
+ const u = new URL(url, "http://dummy.com");
799
+ query = u.search;
800
+ } catch {
801
+ const qIndex = url.indexOf("?");
802
+ if (qIndex === -1) return result;
803
+ query = url.slice(qIndex);
804
+ }
805
+ const params = new URLSearchParams(query);
806
+ const seen = /* @__PURE__ */ new Set();
807
+ for (const [key, value] of params.entries()) {
808
+ if (seen.has(key)) {
809
+ if (isArray(result[key])) {
810
+ result[key].push(value);
811
+ } else {
812
+ result[key] = [result[key], value];
813
+ }
814
+ } else {
815
+ result[key] = value;
816
+ seen.add(key);
817
+ }
818
+ }
819
+ return result;
820
+ };
821
+ var buildUrlParams = (obj, url, format = "repeat") => {
822
+ if (!isObject(obj)) return url ?? "";
823
+ let base = url || "";
824
+ let hash = "";
825
+ if (base.includes("#")) {
826
+ const i = base.indexOf("#");
827
+ hash = base.slice(i);
828
+ base = base.slice(0, i);
829
+ }
830
+ const originalParams = getAllUrlParams(base);
831
+ const merged = { ...originalParams, ...obj };
832
+ const params = new URLSearchParams();
833
+ for (const [key, value] of Object.entries(merged)) {
834
+ if (isNullOrUnDef(value)) continue;
654
835
  if (isArray(value)) {
655
- return value.filter((v) => !isNullOrUnDef(v)).map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join("&");
836
+ const list = value.filter((v) => !isNullOrUnDef(v)).map(String);
837
+ if (list.length === 0) continue;
838
+ if (format === "repeat") {
839
+ list.forEach((v) => params.append(key, v));
840
+ } else {
841
+ params.set(key, list.join(","));
842
+ }
843
+ } else {
844
+ params.set(key, String(value));
656
845
  }
657
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
658
- }).join("&");
659
- if (url) {
660
- const separator = url.includes("?") ? "&" : "?";
661
- return `${url}${separator}${params}`;
662
846
  }
663
- return params;
847
+ const query = params.toString();
848
+ if (!base) return query;
849
+ const cleanBase = base.split("?")[0];
850
+ return `${cleanBase}${query ? `?${query}` : ""}${hash}`;
664
851
  };
665
852
  var downloadFile = (url, name) => {
666
853
  const a = document.createElement("a");
667
- a.download = name || "\u56FE\u7247\u4E0B\u8F7D";
854
+ a.download = name || "\u6587\u4EF6";
668
855
  a.href = url;
669
856
  document.body.appendChild(a);
670
857
  a.click();
@@ -672,31 +859,28 @@ var downloadFile = (url, name) => {
672
859
  window.URL.revokeObjectURL(url);
673
860
  };
674
861
  var addUrlLastSlash = (url = "") => {
675
- const u = new URL(url, "https://logosdata.cn");
676
- let pathname = u.pathname;
677
- if (!pathname.endsWith("/")) {
678
- pathname += "/";
679
- }
680
- u.pathname = pathname;
681
- return `${isExternal(url) ? u.origin : ""}${u.pathname}${u.search}${u.hash}`;
862
+ const u = new URL(url, "http://dummy.com");
863
+ if (!u.pathname.endsWith("/")) u.pathname += "/";
864
+ return isExternal(url) ? u.toString() : `${u.pathname}${u.search}${u.hash}`;
682
865
  };
683
- var getUrlMainSource = (url, preHref) => {
684
- if (!preHref) return url;
685
- let newUrl = "";
686
- const preHrefUrl = new URL(preHref);
866
+ var setUrlMainSource = (url, preHref, defaultMainSource) => {
687
867
  const urlParts = url.split("?");
688
868
  const srcParams = new URLSearchParams(urlParts[1] || "");
689
869
  if (srcParams.has("mainSource")) {
690
- newUrl = url;
691
- } else {
692
- const mainSource = preHrefUrl.searchParams.get("mainSource");
693
- if (mainSource) {
694
- newUrl = buildUrlParams({ mainSource }, url);
695
- } else {
696
- newUrl = url;
870
+ return url;
871
+ }
872
+ let mainSourceValue = defaultMainSource;
873
+ if (preHref) {
874
+ try {
875
+ const preHrefUrl = new URL(preHref, "http://dummy.com");
876
+ const preMainSource = preHrefUrl.searchParams.get("mainSource");
877
+ if (preMainSource) {
878
+ mainSourceValue = preMainSource;
879
+ }
880
+ } catch (e) {
697
881
  }
698
882
  }
699
- return newUrl;
883
+ return buildUrlParams({ mainSource: mainSourceValue }, url);
700
884
  };
701
885
  var getWebSocketUrl = (path, customHost) => {
702
886
  const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
@@ -720,9 +904,178 @@ function transform(source, fieldMap) {
720
904
  function transforms(sources, fieldMap) {
721
905
  return sources?.map((source) => transform(source, fieldMap)) || [];
722
906
  }
907
+ var convertCurrency = (money = "") => {
908
+ let newMoney = money;
909
+ const cnNums = ["\u96F6", "\u58F9", "\u8D30", "\u53C1", "\u8086", "\u4F0D", "\u9646", "\u67D2", "\u634C", "\u7396"];
910
+ const cnIntRadice = ["", "\u62FE", "\u4F70", "\u4EDF"];
911
+ const cnIntUnits = ["", "\u4E07", "\u4EBF", "\u5146"];
912
+ const cnDecUnits = ["\u89D2", "\u5206", "\u6BEB", "\u5398"];
913
+ const cnInteger = "\u6574";
914
+ const cnIntLast = "\u5706";
915
+ const minus2 = "(\u8D1F\u6570)";
916
+ let isMinus = false;
917
+ const maxNum = 1e15;
918
+ let integerNum;
919
+ let decimalNum;
920
+ let chineseStr = "";
921
+ let parts;
922
+ if (newMoney === "") {
923
+ return "";
924
+ }
925
+ newMoney = isString(newMoney) ? parseFloat(newMoney) : newMoney;
926
+ if (newMoney < 0) {
927
+ isMinus = true;
928
+ newMoney = Math.abs(newMoney);
929
+ }
930
+ if (newMoney >= maxNum) {
931
+ return "";
932
+ }
933
+ if (newMoney === 0) {
934
+ chineseStr = cnNums[0] + cnIntLast + cnInteger;
935
+ return chineseStr;
936
+ }
937
+ newMoney = newMoney.toString();
938
+ if (newMoney.indexOf(".") === -1) {
939
+ integerNum = newMoney;
940
+ decimalNum = "";
941
+ } else {
942
+ parts = newMoney.split(".");
943
+ integerNum = parts[0];
944
+ decimalNum = parts[1].substr(0, 4);
945
+ }
946
+ if (parseInt(integerNum, 10) > 0) {
947
+ let zeroCount = 0;
948
+ const IntLen = integerNum.length;
949
+ for (let i = 0; i < IntLen; i++) {
950
+ const n = integerNum.substr(i, 1);
951
+ const p = IntLen - i - 1;
952
+ const q = p / 4;
953
+ const m = p % 4;
954
+ if (n === "0") {
955
+ zeroCount++;
956
+ } else {
957
+ if (zeroCount > 0) {
958
+ chineseStr += cnNums[0];
959
+ }
960
+ zeroCount = 0;
961
+ chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
962
+ }
963
+ if (m === 0 && zeroCount < 4) {
964
+ chineseStr += cnIntUnits[q];
965
+ }
966
+ }
967
+ chineseStr += cnIntLast;
968
+ }
969
+ if (decimalNum !== "") {
970
+ const decLen = decimalNum.length;
971
+ for (let i = 0; i < decLen; i++) {
972
+ const n = decimalNum.substr(i, 1);
973
+ if (n !== "0") {
974
+ chineseStr += cnNums[Number(n)] + cnDecUnits[i];
975
+ } else {
976
+ chineseStr += cnNums[0];
977
+ }
978
+ }
979
+ }
980
+ if (chineseStr === "") {
981
+ chineseStr += cnNums[0] + cnIntLast + cnInteger;
982
+ } else if (decimalNum === "") {
983
+ chineseStr += cnInteger;
984
+ }
985
+ if (isMinus) {
986
+ chineseStr = minus2 + chineseStr;
987
+ }
988
+ return chineseStr;
989
+ };
990
+ var getRowSpanCount = (data, key, target) => {
991
+ if (!Array.isArray(data)) return 1;
992
+ const newData = data.map((_) => _[key]);
993
+ let preValue = newData[0];
994
+ const res = [[preValue]];
995
+ let index = 0;
996
+ for (let i = 1; i < newData.length; i++) {
997
+ if (newData[i] === preValue) {
998
+ res[index].push(newData[i]);
999
+ } else {
1000
+ index += 1;
1001
+ res[index] = [];
1002
+ res[index].push(newData[i]);
1003
+ preValue = newData[i];
1004
+ }
1005
+ }
1006
+ const arr = [];
1007
+ res.forEach((_) => {
1008
+ const len = _.length;
1009
+ for (let i = 0; i < len; i++) {
1010
+ arr.push(i === 0 ? len : 0);
1011
+ }
1012
+ });
1013
+ return arr[target];
1014
+ };
1015
+ var importThirdPartyFile = (document2, path) => {
1016
+ const type = path.endsWith(".js") ? "script" : "link";
1017
+ const element = type === "script" ? document2.createElement("script") : document2.createElement("link");
1018
+ if (type === "script") {
1019
+ const scriptElement = element;
1020
+ scriptElement.async = true;
1021
+ scriptElement.src = path;
1022
+ } else {
1023
+ const linkElement = element;
1024
+ linkElement.rel = "stylesheet";
1025
+ linkElement.type = "text/css";
1026
+ linkElement.href = path;
1027
+ }
1028
+ if (document2.head) {
1029
+ document2.head.appendChild(element);
1030
+ }
1031
+ };
1032
+ var processItemList = (items) => {
1033
+ return items.filter((item) => item.hidden !== true).map((item, index) => ({ key: index, ...item }));
1034
+ };
1035
+ var executeScript = (script, params) => {
1036
+ if (isScriptSafe(script)) {
1037
+ const func = new Function(
1038
+ ...Object.keys(params),
1039
+ // 参数列表
1040
+ script
1041
+ // 脚本字符串
1042
+ );
1043
+ try {
1044
+ return func(...Object.values(params));
1045
+ } catch (error) {
1046
+ console.error("Error executing script:", error);
1047
+ }
1048
+ } else {
1049
+ console.error("unsafe script");
1050
+ }
1051
+ };
1052
+ function aesEncrypt(data, key) {
1053
+ if (!key) throw new Error("AES Encrypt: key is required");
1054
+ if (isNullOrUnDef(data)) return "";
1055
+ try {
1056
+ const text = JSON.stringify(data);
1057
+ return AES.encrypt(text, key.trim()).toString();
1058
+ } catch (err) {
1059
+ console.error("AES Encrypt error:", err);
1060
+ throw new Error("AES Encrypt failed");
1061
+ }
1062
+ }
1063
+ function aesDecrypt(data, key) {
1064
+ if (!key) throw new Error("AES Decrypt: key is required");
1065
+ if (!data) return null;
1066
+ try {
1067
+ const bytes = AES.decrypt(data, key.trim());
1068
+ const decoded = bytes.toString(encUtf8);
1069
+ if (!decoded) return null;
1070
+ return JSON.parse(decoded);
1071
+ } catch (err) {
1072
+ console.error("AES Decrypt error:", err);
1073
+ return null;
1074
+ }
1075
+ }
723
1076
 
724
1077
  // src/hooks/useDeepEffect.ts
725
- function useDeepEffect(effect, deps) {
1078
+ var useDeepEffect_default = (effect, deps) => {
726
1079
  const prevDepsRef = useRef();
727
1080
  const depsChanged = !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current[i]));
728
1081
  useEffect(() => {
@@ -731,8 +1084,8 @@ function useDeepEffect(effect, deps) {
731
1084
  return effect();
732
1085
  }
733
1086
  }, [depsChanged]);
734
- }
735
- function useRefState(init) {
1087
+ };
1088
+ var useRefState_default = (init) => {
736
1089
  const [state, setState] = useState(init);
737
1090
  const stateRef = useRef(init);
738
1091
  const setProxy = (newVal) => {
@@ -741,8 +1094,8 @@ function useRefState(init) {
741
1094
  };
742
1095
  const getState = () => stateRef.current;
743
1096
  return [state, setProxy, getState];
744
- }
745
- var useSyncInput = (storeValue, setStoreValue) => {
1097
+ };
1098
+ var useSyncInput_default = (storeValue, setStoreValue) => {
746
1099
  const [inputValue, setInputValue] = useState(storeValue);
747
1100
  useEffect(() => {
748
1101
  if (storeValue !== inputValue) {
@@ -758,7 +1111,7 @@ var useSyncInput = (storeValue, setStoreValue) => {
758
1111
  setInputValue: handleValueChange
759
1112
  };
760
1113
  };
761
- function useThrottle(func, wait) {
1114
+ var useThrottle_default = (func, wait) => {
762
1115
  const { current } = useRef({ func, timeOut: null });
763
1116
  useEffect(() => {
764
1117
  current.func = func;
@@ -792,18 +1145,20 @@ function useThrottle(func, wait) {
792
1145
  throttle.flush = flush;
793
1146
  throttle.cancel = cancel;
794
1147
  return useCallback(throttle, []);
795
- }
1148
+ };
796
1149
  dayjs.extend(relativeTime);
797
- var DateFormatType = "YYYY-MM-DD HH:mm:ss";
798
- var DateFormatType2 = "YYYY-MM-DD";
799
- var UNIT = "date";
800
- var getStartOfTimestamp = (date, unit = UNIT) => {
1150
+ var DEFAULT_DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
1151
+ var DEFAULT_DATE_FORMAT = "YYYY-MM-DD";
1152
+ var DEFAULT_YEAR_MONTH_FORMAT = "YYYY\u5E74MM\u6708";
1153
+ var DEFAULT_YEAR_MONTH_DAY_FORMAT = "YYYY\u5E74MM\u6708DD\u65E5";
1154
+ var DEFAULT_UNIT = "date";
1155
+ var getStartOfTimestamp = (date, unit = DEFAULT_UNIT) => {
801
1156
  return dayjs(date).startOf(unit).valueOf();
802
1157
  };
803
- var getEndOfTimestamp = (date, unit = UNIT) => {
1158
+ var getEndOfTimestamp = (date, unit = DEFAULT_UNIT) => {
804
1159
  return dayjs(date).endOf(unit).valueOf();
805
1160
  };
806
- var formatDate = (date, fmt = DateFormatType) => {
1161
+ var formatDate = (date, fmt = DEFAULT_DATE_TIME_FORMAT) => {
807
1162
  if (date) {
808
1163
  return dayjs(date).format(fmt);
809
1164
  }
@@ -815,33 +1170,6 @@ var getTimestamp = (date) => {
815
1170
  var isExpire = (date) => {
816
1171
  return dayjs(date).isBefore(getStartOfTimestamp());
817
1172
  };
818
- var USER_KEY = "NS-USER";
819
- function setCurrentUser(userInfo) {
820
- const cipherText = AES.encrypt(JSON.stringify(userInfo), "((#II))").toString();
821
- sessionStorage.setItem(USER_KEY, cipherText);
822
- }
823
- function getCurrentUser() {
824
- const userInfoJson = sessionStorage.getItem(USER_KEY);
825
- if (userInfoJson) {
826
- const bytes = AES.decrypt(userInfoJson, "((#II))");
827
- const originalText = bytes.toString(encUtf8);
828
- return JSON.parse(originalText);
829
- }
830
- return null;
831
- }
832
- function clearCurrentUser() {
833
- sessionStorage.removeItem(USER_KEY);
834
- }
835
- var DEVICEID_KEY = "NS-DEVICE-ID";
836
- function getDeviceId() {
837
- let deviceId = localStorage.getItem(DEVICEID_KEY);
838
- if (deviceId) {
839
- return deviceId;
840
- }
841
- deviceId = genNonDuplicateID();
842
- localStorage.setItem(DEVICEID_KEY, deviceId);
843
- return deviceId;
844
- }
845
1173
  var OperatorToMethodName = {
846
1174
  "+": "plus",
847
1175
  "-": "minus",
@@ -894,97 +1222,191 @@ var isInteger = (num) => {
894
1222
  var isNegative = (num) => {
895
1223
  return new Decimal(num).isNegative();
896
1224
  };
897
- var cacheMessage = () => {
898
- const contents = {};
1225
+ var createCachedMessage = () => {
1226
+ const messageCache = {};
899
1227
  return ({ title = "\u63D0\u793A", content, type = "warning", duration = 3, onClose, isCache = true, isOnly = false }) => {
900
1228
  if (!content) return;
901
- const key = isOnly ? "cache-key" : content;
902
- const onClose2 = () => {
903
- delete contents[key];
1229
+ const cacheKey = isOnly ? "unique-message-key" : content;
1230
+ const handleClose = () => {
1231
+ delete messageCache[cacheKey];
904
1232
  onClose?.();
905
1233
  };
906
- if (isCache && contents[key]) ; else {
907
- if (isCache) {
908
- contents[key] = getTimestamp();
909
- }
910
- if (duration) {
911
- if (content.length > 30) {
912
- notification[type]({
913
- message: title,
914
- description: content,
915
- placement: "top",
916
- duration,
917
- onClose: onClose2
918
- });
919
- } else {
920
- message[type]({
921
- content,
922
- duration,
923
- onClose: onClose2
924
- });
925
- }
1234
+ if (isCache && messageCache[cacheKey]) return;
1235
+ if (isCache) {
1236
+ messageCache[cacheKey] = getTimestamp();
1237
+ }
1238
+ if (duration) {
1239
+ if (content.length > 30) {
1240
+ notification[type]({
1241
+ message: title,
1242
+ description: content,
1243
+ placement: "top",
1244
+ duration,
1245
+ onClose: handleClose
1246
+ });
926
1247
  } else {
927
- Modal[type]({
928
- title,
1248
+ message[type]({
929
1249
  content,
930
- okButtonProps: { style: { background: LgPrimaryColor, outline: "none" } },
931
- afterClose: onClose2
1250
+ duration,
1251
+ onClose: handleClose
932
1252
  });
933
1253
  }
1254
+ } else {
1255
+ Modal[type]({
1256
+ title,
1257
+ content,
1258
+ closable: true,
1259
+ centered: true,
1260
+ footer: null,
1261
+ afterClose: handleClose
1262
+ });
934
1263
  }
935
1264
  };
936
1265
  };
937
- var showMessage = cacheMessage();
1266
+ var cachedMessage = createCachedMessage();
938
1267
 
939
- // src/utils/session.ts
940
- var TOKEN_KEY = "NS-TOKEN";
941
- function setToken(accessToken) {
942
- localStorage.setItem(TOKEN_KEY, accessToken);
943
- }
944
- function getUrlToken() {
945
- const searchParams = new URLSearchParams(location.search);
946
- const token = searchParams.get(TOKEN_KEY);
947
- return token || "";
948
- }
949
- function getToken() {
950
- const token = getUrlToken();
951
- if (!token) {
952
- const token2 = localStorage.getItem(TOKEN_KEY);
953
- return token2 || "";
954
- } else {
955
- setToken(token);
956
- return token;
1268
+ // src/utils/pattern.ts
1269
+ var RegMobile = {
1270
+ pattern: /^1[3-9]\d{9}$/,
1271
+ message: "\u624B\u673A\u53F7\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
1272
+ };
1273
+ var RegFixedTelePhone = {
1274
+ pattern: /^0\d{2,3}-\d{7,8}$/,
1275
+ message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
1276
+ };
1277
+ var RegTelePhone = {
1278
+ pattern: /^[\\+\-\\(\\)\\(\\)\d]{1,20}$/,
1279
+ message: "\u7535\u8BDD\u53F7\u7801\u683C\u5F0F\u4E0D\u6B63\u786E\uFF01"
1280
+ };
1281
+ var RegTaxNo = {
1282
+ pattern: /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/,
1283
+ message: "\u7A0E\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
1284
+ };
1285
+ var RegBankCardNo = {
1286
+ pattern: /^[0-9]*$/,
1287
+ message: "\u94F6\u884C\u5361\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
1288
+ };
1289
+ var RegIdentityCardNo = {
1290
+ pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
1291
+ message: "\u8EAB\u4EFD\u8BC1\u53F7\u683C\u5F0F\u6709\u8BEF\uFF01"
1292
+ };
1293
+ var RegNumNo = {
1294
+ pattern: /^[0-9]*$/,
1295
+ message: "\u683C\u5F0F\u6709\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\uFF01"
1296
+ };
1297
+ var RegSmsCode = {
1298
+ pattern: /^[0-9]{6}$/,
1299
+ message: "\u9A8C\u8BC1\u7801\u4E3A6\u4F4D\u6570\u5B57"
1300
+ };
1301
+ var RegEmail = {
1302
+ pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
1303
+ message: "\u90AE\u7BB1\u683C\u5F0F\u6709\u8BEF\uFF01"
1304
+ };
1305
+ var RegDetailAddress = {
1306
+ pattern: /.*(街|路|村|乡|镇|道|巷|号).*/,
1307
+ message: "\u5FC5\u987B\u5305\u542B\u201C\u8857\u3001\u8DEF\u3001\u6751\u3001\u4E61\u3001\u9547\u3001\u9053\u3001\u5DF7\u3001\u53F7\u201D\u7B49\u5173\u952E\u8BCD\u4E4B\u4E00"
1308
+ };
1309
+ var PhoneOrMobileValidator = (errMessage = "\u8054\u7CFB\u7535\u8BDD\u683C\u5F0F\u4E0D\u6B63\u786E") => ({
1310
+ validator: (_, value) => !value || RegFixedTelePhone.pattern.test(value) || RegMobile.pattern.test(value) ? Promise.resolve() : Promise.reject(new Error(errMessage))
1311
+ });
1312
+ var ThanNumValidator = ({
1313
+ min,
1314
+ max,
1315
+ equalMin = false,
1316
+ equalMax = false,
1317
+ errMessage,
1318
+ maxErrMessage,
1319
+ minErrMessage
1320
+ }) => ({
1321
+ validator: (_, value) => {
1322
+ if (!value) {
1323
+ return Promise.resolve();
1324
+ }
1325
+ if (isNumberNoNaN(parseFloat(min))) {
1326
+ if (!(Number(value) > Number(min) || equalMin && Number(value) === Number(min))) {
1327
+ return Promise.reject(new Error(minErrMessage || errMessage || `\u4E0D\u80FD\u5C0F\u4E8E${equalMin ? "" : "\u7B49\u4E8E"}${min}`));
1328
+ }
1329
+ }
1330
+ if (isNumberNoNaN(parseFloat(max))) {
1331
+ if (!(Number(value) < Number(max) || equalMax && Number(value) === Number(max))) {
1332
+ return Promise.reject(new Error(maxErrMessage || errMessage || `\u4E0D\u80FD\u5927\u4E8E${equalMax ? "" : "\u7B49\u4E8E"}${max}`));
1333
+ }
1334
+ }
1335
+ return Promise.resolve();
957
1336
  }
958
- }
959
- function clearToken() {
960
- localStorage.removeItem(TOKEN_KEY);
961
- }
962
- var SIGNPATH = "SIGNPATH";
963
- function getSignPath() {
964
- const path = localStorage.getItem(SIGNPATH);
965
- return `${path || "/sign-in"}`;
966
- }
967
-
968
- // src/utils/request.ts
969
- var OK = 200;
970
- var ERROR = 500;
971
- var MISSING_PARAMETER = 400;
972
- var UNAUTHORIZED = 401;
973
- var FORBIDDEN = 403;
974
- var NOT_FOUND = 404;
975
- var PERMISSION_DENIED = 13001;
976
- function createRequest(baseURL = "/api") {
977
- const redirectUrl = () => {
978
- emit("jumpLink", { url: `/uc${getSignPath()}` });
979
- };
1337
+ });
1338
+ var ThanNumLengthValidator = ({
1339
+ length,
1340
+ decimalsLength,
1341
+ integerLength,
1342
+ lengthErrMessage,
1343
+ decimalsLengthErrMessage,
1344
+ integerLengthErrMessage
1345
+ }) => ({
1346
+ validator: (_, value) => {
1347
+ if (!value) {
1348
+ return Promise.resolve();
1349
+ }
1350
+ if (isNumber(length)) {
1351
+ if (precision(value) > length) {
1352
+ return Promise.reject(new Error(lengthErrMessage || `\u603B\u4F4D\u6570\u4E0D\u80FD\u8D85\u8FC7${length}\u4F4D`));
1353
+ }
1354
+ }
1355
+ if (isNumber(integerLength)) {
1356
+ if (precision(value) - decimalPlaces(value) > integerLength) {
1357
+ return Promise.reject(new Error(integerLengthErrMessage || `\u6574\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${integerLength}\u4F4D`));
1358
+ }
1359
+ }
1360
+ if (isNumber(decimalsLength)) {
1361
+ if (decimalPlaces(value) > decimalsLength) {
1362
+ return Promise.reject(new Error(decimalsLengthErrMessage || `\u5C0F\u6570\u4F4D\u4E0D\u80FD\u8D85\u8FC7${decimalsLength}\u4F4D`));
1363
+ }
1364
+ }
1365
+ return Promise.resolve();
1366
+ }
1367
+ });
1368
+ var MultiEmailValidator = (max) => ({
1369
+ validator: (_, value) => {
1370
+ if (value) {
1371
+ const emailArr = value.split(",").map((v) => v.trim()).filter((v) => v);
1372
+ if (emailArr.length > max) return Promise.reject(new Error(`\u6700\u591A\u8F93\u5165${max}\u4E2A\u90AE\u7BB1`));
1373
+ const noEmailArr = emailArr.filter((email) => !RegEmail.pattern.test(email));
1374
+ if (noEmailArr.length) return Promise.reject(new Error(RegEmail.message));
1375
+ }
1376
+ return Promise.resolve();
1377
+ }
1378
+ });
1379
+ var HttpStatus = {
1380
+ /** 服务器错误 */
1381
+ ERROR: 500,
1382
+ /** 缺少参数或参数错误 */
1383
+ MISSING_PARAMETER: 400,
1384
+ /** 未授权,需要用户验证 */
1385
+ UNAUTHORIZED: 401,
1386
+ /** 禁止访问,服务器理解请求但拒绝执行 */
1387
+ FORBIDDEN: 403,
1388
+ /** 请求的资源未找到 */
1389
+ NOT_FOUND: 404
1390
+ };
1391
+ var BusinessCode = {
1392
+ /** 请求成功 */
1393
+ OK: 200,
1394
+ /** 权限拒绝,没有足够的权限执行操作 */
1395
+ PERMISSION_DENIED: 13001
1396
+ };
1397
+ var showError = (showError2) => showError2 !== false;
1398
+ function createRequest(config) {
980
1399
  const instance = axios.create({
981
- baseURL,
982
- timeout: 6e4
1400
+ baseURL: "/api",
1401
+ // 默认基础URL
1402
+ timeout: 6e4,
1403
+ // 请求超时时间设为60秒
1404
+ ...config
1405
+ // 合并传入的配置项
983
1406
  });
984
1407
  instance.interceptors.request.use(
985
- function(config) {
986
- config.headers[TOKEN_KEY] = getToken();
987
- return config;
1408
+ function(config2) {
1409
+ return config2;
988
1410
  },
989
1411
  function(error) {
990
1412
  return Promise.reject(error);
@@ -993,49 +1415,80 @@ function createRequest(baseURL = "/api") {
993
1415
  instance.interceptors.response.use(
994
1416
  function(response) {
995
1417
  if (isBlob(response.data)) return response;
996
- if (response.data?.code !== OK) {
997
- const isPermission = response.data?.code === PERMISSION_DENIED;
998
- if (response.config?.showError !== false) {
999
- showMessage({
1418
+ if (response.data?.code !== BusinessCode.OK) {
1419
+ const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED;
1420
+ if (showError(response.config?.showError)) {
1421
+ cachedMessage({
1000
1422
  title: isPermission ? "" : void 0,
1001
1423
  content: response.data.message,
1002
1424
  duration: isPermission ? 0 : 3
1003
1425
  });
1004
1426
  }
1005
- return Promise.reject(response.data);
1427
+ return Promise.reject(response);
1006
1428
  }
1007
1429
  return response;
1008
1430
  },
1009
1431
  function(err) {
1010
- const showError = err?.config?.showError !== false;
1011
1432
  if (!err.response) {
1012
- if (showError) showMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1433
+ if (showError(err?.config?.showError)) cachedMessage({ content: "\u7F51\u7EDC\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC", type: "error" });
1013
1434
  } else {
1014
1435
  switch (err.response?.status) {
1015
- case UNAUTHORIZED:
1016
- if (showError) showMessage({ content: err.response?.data.message, type: "error" });
1017
- redirectUrl();
1436
+ case HttpStatus.UNAUTHORIZED:
1437
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: "error" });
1018
1438
  break;
1019
1439
  default:
1020
- if (showError) showMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1440
+ if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || "\u8BF7\u6C42\u9519\u8BEF\uFF01", type: "error" });
1021
1441
  }
1022
1442
  }
1023
1443
  return Promise.reject(err);
1024
1444
  }
1025
1445
  );
1026
1446
  return {
1447
+ /**
1448
+ * 返回原始 axios 实例
1449
+ * 可以用于添加拦截器等
1450
+ */
1451
+ instance,
1452
+ /**
1453
+ * 发送 GET 请求
1454
+ * @param url - 请求地址
1455
+ * @param params - 查询参数
1456
+ * @param options - 额外的请求配置
1457
+ * @returns Promise<any> 响应数据
1458
+ */
1027
1459
  get: async (url, params, options) => {
1028
1460
  const res = await instance({ method: "get", url, params, ...options });
1029
1461
  return res.data;
1030
1462
  },
1463
+ /**
1464
+ * 发送 POST 请求
1465
+ * @param url - 请求地址
1466
+ * @param data - 请求体数据
1467
+ * @param options - 额外的请求配置
1468
+ * @returns Promise<any> 响应数据
1469
+ */
1031
1470
  post: async (url, data, options) => {
1032
1471
  const res = await instance({ method: "post", url, data, ...options });
1033
1472
  return res.data;
1034
1473
  },
1474
+ /**
1475
+ * 发送 PUT 请求
1476
+ * @param url - 请求地址
1477
+ * @param data - 请求体数据
1478
+ * @param options - 额外的请求配置
1479
+ * @returns Promise<any> 响应数据
1480
+ */
1035
1481
  put: async (url, data, options) => {
1036
1482
  const res = await instance({ method: "put", url, data, ...options });
1037
1483
  return res.data;
1038
1484
  },
1485
+ /**
1486
+ * 发送 DELETE 请求
1487
+ * @param url - 请求地址
1488
+ * @param data - 请求体数据
1489
+ * @param options - 额外的请求配置
1490
+ * @returns Promise<any> 响应数据
1491
+ */
1039
1492
  delete: async (url, data, options) => {
1040
1493
  const res = await instance({ method: "delete", url, data, ...options });
1041
1494
  return res.data;
@@ -1043,8 +1496,66 @@ function createRequest(baseURL = "/api") {
1043
1496
  };
1044
1497
  }
1045
1498
 
1499
+ // src/utils/storage.ts
1500
+ function getDeviceId(DEVICEID_KEY) {
1501
+ let deviceId = localStorage.getItem(DEVICEID_KEY);
1502
+ if (deviceId) {
1503
+ return deviceId;
1504
+ }
1505
+ deviceId = genNonDuplicateID();
1506
+ localStorage.setItem(DEVICEID_KEY, deviceId);
1507
+ return deviceId;
1508
+ }
1509
+ function createSecureManager({ key, storage = localStorage, aesKey }) {
1510
+ const set = (data) => {
1511
+ if (isNullOrUnDef(data)) return;
1512
+ storage.setItem(key, aesKey ? aesEncrypt(data, aesKey) : isString(data) ? data : JSON.stringify(data));
1513
+ };
1514
+ const get = () => {
1515
+ const cipher = storage.getItem(key);
1516
+ if (!cipher) {
1517
+ return null;
1518
+ }
1519
+ if (aesKey) {
1520
+ return aesDecrypt(cipher, aesKey);
1521
+ }
1522
+ try {
1523
+ return JSON.parse(cipher);
1524
+ } catch (e) {
1525
+ console.log("Failed to parse stored data:", e);
1526
+ return cipher;
1527
+ }
1528
+ };
1529
+ const clear = () => storage.removeItem(key);
1530
+ return {
1531
+ set,
1532
+ get,
1533
+ clear
1534
+ };
1535
+ }
1536
+ function createTokenManager({ key, storage = localStorage }) {
1537
+ const tokenManager = createSecureManager({ key, storage });
1538
+ const getFromUrl = () => {
1539
+ const searchParams = new URLSearchParams(location.search);
1540
+ return searchParams.get(key);
1541
+ };
1542
+ const get = () => {
1543
+ const urlToken = getFromUrl();
1544
+ if (urlToken) {
1545
+ tokenManager.set(urlToken);
1546
+ return urlToken;
1547
+ }
1548
+ return tokenManager.get();
1549
+ };
1550
+ return {
1551
+ set: tokenManager.set,
1552
+ get,
1553
+ clear: tokenManager.clear
1554
+ };
1555
+ }
1556
+
1046
1557
  // src/hooks/webSocket/useWebSocket.ts
1047
- var useWebSocket = ({
1558
+ var useWebSocket_default = ({
1048
1559
  url,
1049
1560
  onMessage,
1050
1561
  onClose,
@@ -1052,11 +1563,8 @@ var useWebSocket = ({
1052
1563
  heartbeatMessage = "ping",
1053
1564
  clientHeartbeat = true,
1054
1565
  reconnectInterval = 5e3,
1055
- // 默认重连间隔为 5 秒
1056
1566
  maxReconnectAttempts,
1057
- // 不设置默认值为无限重连
1058
1567
  isReconnect = true
1059
- // 默认开启重连机制
1060
1568
  }) => {
1061
1569
  const socketRef = useRef(null);
1062
1570
  const heartbeatIntervalRef = useRef(null);
@@ -1080,6 +1588,7 @@ var useWebSocket = ({
1080
1588
  const stopHeartbeat = () => {
1081
1589
  if (heartbeatIntervalRef.current) {
1082
1590
  clearInterval(heartbeatIntervalRef.current);
1591
+ heartbeatIntervalRef.current = null;
1083
1592
  }
1084
1593
  };
1085
1594
  const stopReconnectTimer = () => {
@@ -1167,19 +1676,22 @@ var useWebSocket = ({
1167
1676
  stopReconnectTimer();
1168
1677
  };
1169
1678
  }, [url]);
1170
- const sendMessage = (message2) => {
1679
+ const sendMessage = (message3) => {
1171
1680
  if (socketRef.current?.readyState === WebSocket.OPEN) {
1172
- socketRef.current.send(message2);
1681
+ socketRef.current.send(message3);
1173
1682
  stopHeartbeat();
1174
1683
  startHeartbeat(socketRef.current);
1684
+ } else {
1685
+ console.warn("WebSocket \u672A\u8FDE\u63A5\uFF0C\u65E0\u6CD5\u53D1\u9001\u6D88\u606F:", message3);
1175
1686
  }
1176
1687
  };
1177
1688
  return {
1689
+ /** 发送消息方法 */
1178
1690
  sendMessage,
1691
+ /** Socket 连接状态 */
1179
1692
  socketReadyState
1180
1693
  };
1181
1694
  };
1182
- var useWebSocket_default = useWebSocket;
1183
1695
  var ProtectedView = ({
1184
1696
  passwordStatus,
1185
1697
  verifyPassword,
@@ -1205,8 +1717,8 @@ var ProtectedView = ({
1205
1717
  var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }) => {
1206
1718
  const embedRef = useRef(null);
1207
1719
  const [sizes, setSizes] = useState([0]);
1208
- const [, setDocLoaded, getDocLoaded] = useRefState(false);
1209
- const [currentPage, setCurrentPage, getCurrentPage] = useRefState(void 0);
1720
+ const [, setDocLoaded, getDocLoaded] = useRefState_default(false);
1721
+ const [currentPage, setCurrentPage, getCurrentPage] = useRefState_default(void 0);
1210
1722
  const [temporaryPassword, setTemporaryPassword] = useState("");
1211
1723
  const jumpToPageNo = useRef();
1212
1724
  const onVerifyPasswordEnd = (password2) => {
@@ -1252,25 +1764,25 @@ var PdfPreview_default = ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumb
1252
1764
  }, 0);
1253
1765
  }, [pageNo]);
1254
1766
  const renderError = (error) => {
1255
- let message2 = "";
1767
+ let message3 = "";
1256
1768
  switch (error.name) {
1257
1769
  case "InvalidPDFException":
1258
- message2 = "\u6587\u4EF6\u65E0\u6548\u6216\u5DF2\u635F\u574F";
1770
+ message3 = "\u6587\u4EF6\u65E0\u6548\u6216\u5DF2\u635F\u574F";
1259
1771
  break;
1260
1772
  case "MissingPDFException":
1261
- message2 = "\u6587\u4EF6\u4E0D\u5B58\u5728";
1773
+ message3 = "\u6587\u4EF6\u4E0D\u5B58\u5728";
1262
1774
  break;
1263
1775
  case "UnexpectedResponseException":
1264
- message2 = "\u610F\u5916\u7684\u670D\u52A1\u5668\u54CD\u5E94";
1776
+ message3 = "\u610F\u5916\u7684\u670D\u52A1\u5668\u54CD\u5E94";
1265
1777
  break;
1266
1778
  // case 'CMapReaderFactory not initialized':
1267
1779
  // message = '字体映射文件加载失败,请刷新页面重试'
1268
1780
  // break
1269
1781
  default:
1270
- message2 = "\u65E0\u6CD5\u52A0\u8F7D\u6587\u6863";
1782
+ message3 = "\u65E0\u6CD5\u52A0\u8F7D\u6587\u6863";
1271
1783
  break;
1272
1784
  }
1273
- return /* @__PURE__ */ jsx(Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsx(Alert, { message: message2, type: "error", showIcon: true }) });
1785
+ return /* @__PURE__ */ jsx(Flex, { className: "height-full", justify: "center", align: "center", children: /* @__PURE__ */ jsx(Alert, { message: message3, type: "error", showIcon: true }) });
1274
1786
  };
1275
1787
  const onPageChange = (e) => {
1276
1788
  let newCurrentPage = e.currentPage;
@@ -1413,10 +1925,10 @@ var FilePreviewDrawer_default = ({
1413
1925
  var styles_module_default2 = {
1414
1926
  iframe: "styles_module_iframe"
1415
1927
  };
1416
- var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
1928
+ var Iframe_default = forwardRef(({ defaultMainSource, id, src, className, onLoad }, ref) => {
1417
1929
  const [loading, setLoading] = useState(false);
1418
1930
  const finalSrc = useMemo(() => {
1419
- return buildUrlParams({ v: Date.now() }, addUrlLastSlash(getUrlMainSource(src, location.href)));
1931
+ return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)));
1420
1932
  }, [src]);
1421
1933
  const onHandleLoad = () => {
1422
1934
  setLoading(false);
@@ -1425,7 +1937,17 @@ var Iframe_default = forwardRef(({ id, src, className, onLoad }, ref) => {
1425
1937
  useEffect(() => {
1426
1938
  setLoading(true);
1427
1939
  }, [src]);
1428
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsx("iframe", { id, ref, src: finalSrc, className: classNames2(styles_module_default2.iframe, className), onLoad: onHandleLoad }) }) });
1940
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Spin, { spinning: loading, wrapperClassName: "full-spin", tip: "\u52A0\u8F7D\u4E2D...", children: /* @__PURE__ */ jsx(
1941
+ "iframe",
1942
+ {
1943
+ id,
1944
+ ref,
1945
+ src: finalSrc,
1946
+ className: classNames2(styles_module_default2.iframe, className),
1947
+ onLoad: onHandleLoad,
1948
+ allow: "clipboard-write"
1949
+ }
1950
+ ) }) });
1429
1951
  });
1430
1952
  var Link = TiptapLink.extend({
1431
1953
  inclusive: false,
@@ -5078,7 +5600,7 @@ var MarkdownEditor_default = ({
5078
5600
  editor?.commands.setContent(value);
5079
5601
  lastContentRef.current = value;
5080
5602
  }, [value, editor]);
5081
- const onPageChange = useDebounce((pageIndex) => {
5603
+ const onPageChange = useDebounce_default((pageIndex) => {
5082
5604
  onScrollPage?.(parseInt(pageIndex ?? "0"));
5083
5605
  }, 300);
5084
5606
  useEffect(() => {
@@ -5201,7 +5723,7 @@ function renderDefault(DefaultComponent, ref, props) {
5201
5723
  if (!DefaultComponent) return null;
5202
5724
  return isRenderFn(DefaultComponent) ? /* @__PURE__ */ jsx(DefaultComponent, { ref, ...props }) : DefaultComponent;
5203
5725
  }
5204
- var RenderWrapper = forwardRef(function RenderWrapper2({ control = true, ctx, DefaultComponent }, ref) {
5726
+ var RenderWrapper_default = forwardRef(function RenderWrapper({ control = true, ctx, DefaultComponent }, ref) {
5205
5727
  if (control === false || isNull(control)) return null;
5206
5728
  if (control === true || control === void 0) {
5207
5729
  return renderDefault(DefaultComponent, ref);
@@ -5231,9 +5753,9 @@ function propsMerge(control, props) {
5231
5753
  return null;
5232
5754
  }
5233
5755
  var UserAvatar_default = ({ size, avatarSrc, userName }) => {
5234
- return avatarSrc ? /* @__PURE__ */ jsx(Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsx(Avatar, { size, className: "cursor-pointer", style: { backgroundColor: LgPrimaryColor }, children: userName?.slice(0, 1)?.toLocaleUpperCase() });
5756
+ return avatarSrc ? /* @__PURE__ */ jsx(Avatar, { size, src: avatarSrc }) : /* @__PURE__ */ jsx(Avatar, { size, className: "cursor-pointer", style: { backgroundColor: "var(--ant-color-primary)" }, children: userName?.slice(0, 1)?.toLocaleUpperCase() });
5235
5757
  };
5236
5758
 
5237
- export { AudioPlayer_default as AudioPlayer, DateFormatType, DateFormatType2, ERROR, FORBIDDEN, FileIcon_default as FileIcon, FilePreview_default as FilePreview, FilePreviewDrawer_default as FilePreviewDrawer, Iframe_default as Iframe, LazyComponent_default as LazyComponent, LgPrimaryColor, MISSING_PARAMETER, MarkdownEditor_default as MarkdownEditor, MarkdownPreview_default as MarkdownPreview, NOT_FOUND, OK, PERMISSION_DENIED, PdfPreview_default as PdfPreview, RenderMarkdown_default as RenderMarkdown, RenderWrapper, TOKEN_KEY, UNAUTHORIZED, UserAvatar_default as UserAvatar, VideoPlayer_default as VideoPlayer, absVal, addUrlLastSlash, arrToObj, buildUrlParams, calculate, clearCurrentUser, clearToken, compareNum, copyText, createRequest, decimalPlaces, deepCopy, deepEqual, deepMerge, dividedBy, downloadFile, emit, emitToChild, formatDate, formatNumberWithCommas, genNonDuplicateID, generateRandomNumbers, getCurrentUser, getDeviceId, getEndOfTimestamp, getFileName, getFileSuffixName, getSignPath, getStartOfTimestamp, getTimestamp, getToken, getUrlMainSource, getUrlToken, getWebSocketUrl, is, isArray, isBlob, isBoolean, isClient, isDate, isDef, isElement, isEmpty, isEmptyObj, isExpire, isExternal, isFunction, isInteger, isLocalhost, isMap, isNegative, isNull, isNullOrUnDef, isNumber, isNumberNoNaN, isObject, isPromise, isRegExp, isServer, isString, isUnDef, isWindow, minus, nsSetInterval, objToOptions, plus, precision, propsMerge, setCurrentUser, setToken, shouldRender, textAreaView, themeConfig, times, toFixed, transform, transforms, useCreateValtioContext, useDebounce, useDeepEffect, useIframeRelayBridge, useRefState, useSyncInput, useThrottle, useWebSocket_default as useWebSocket };
5759
+ export { AudioPlayer_default as AudioPlayer, BusinessCode, DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT, DEFAULT_YEAR_MONTH_DAY_FORMAT, DEFAULT_YEAR_MONTH_FORMAT, FileIcon_default as FileIcon, FilePreview_default as FilePreview, FilePreviewDrawer_default as FilePreviewDrawer, HttpStatus, Iframe_default as Iframe, LazyComponent_default as LazyComponent, MarkdownEditor_default as MarkdownEditor, MarkdownPreview_default as MarkdownPreview, MultiEmailValidator, PdfPreview_default as PdfPreview, PhoneOrMobileValidator, RegBankCardNo, RegDetailAddress, RegEmail, RegFixedTelePhone, RegIdentityCardNo, RegMobile, RegNumNo, RegSmsCode, RegTaxNo, RegTelePhone, RenderMarkdown_default as RenderMarkdown, RenderWrapper_default as RenderWrapper, ThanNumLengthValidator, ThanNumValidator, UserAvatar_default as UserAvatar, VideoPlayer_default as VideoPlayer, absVal, addUrlLastSlash, aesDecrypt, aesEncrypt, arrToObj, buildUrlParams, cachedMessage, calculate, compareNum, convertCurrency, convertNewlineToBr, copyText, createRequest, createSecureManager, createTokenManager, decimalPlaces, deepCopy, deepEqual, deepMerge, dividedBy, downloadFile, emit, emitToChild, executeScript, formatDate, formatNumberWithCommas, genNonDuplicateID, generateRandomNumbers, getAllUrlParams, getDeviceId, getEndOfTimestamp, getFileName, getFileSuffixName, getRowSpanCount, getStartOfTimestamp, getTimestamp, getWebSocketUrl, importThirdPartyFile, is, isArray, isBlob, isBoolean, isDate, isDef, isElement, isEmpty, isEmptyObj, isExpire, isExternal, isFunction, isInteger, isJson, isLocalhost, isMap, isNegative, isNull, isNullOrUnDef, isNumber, isNumberNoNaN, isObject, isPromise, isReferenceType, isRegExp, isScriptSafe, isSet, isString, isUnDef, isWindow, minus, objToOptions, plus, precision, processItemList, propsMerge, setInterval2 as setInterval, setUrlMainSource, shouldRender, times, toFixed, transform, transforms, useAutoRefresh_default as useAutoRefresh, useCountDown_default as useCountDown, useCreateValtioContext_default as useCreateValtioContext, useDebounce_default as useDebounce, useDeepEffect_default as useDeepEffect, useIframeRelayBridge_default as useIframeRelayBridge, useRefState_default as useRefState, useSyncInput_default as useSyncInput, useThrottle_default as useThrottle, useWebSocket_default as useWebSocket };
5238
5760
  //# sourceMappingURL=index.esm.js.map
5239
5761
  //# sourceMappingURL=index.esm.js.map