@snack-kit/lib 0.6.0 → 0.8.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/README.md +17 -0
- package/dist/cjs/{chunk-HGUNPVKD.cjs → chunk-LQ5WJVQX.cjs} +19 -13
- package/dist/cjs/chunk-LQ5WJVQX.cjs.map +1 -0
- package/dist/cjs/{chunk-U6KYHCBL.cjs → chunk-MNKOKLT2.cjs} +124 -2
- package/dist/cjs/chunk-MNKOKLT2.cjs.map +1 -0
- package/dist/cjs/debugger.cjs +2 -2
- package/dist/cjs/index.cjs +46 -38
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/utils.cjs +43 -35
- package/dist/es/chunk-C4CPPDML.js +349 -0
- package/dist/es/chunk-C4CPPDML.js.map +1 -0
- package/dist/es/{chunk-FB42OGY3.js → chunk-YXJTZURC.js} +19 -13
- package/dist/es/chunk-YXJTZURC.js.map +1 -0
- package/dist/es/debugger.js +1 -1
- package/dist/es/index.js +3 -3
- package/dist/es/index.js.map +1 -1
- package/dist/es/utils.js +1 -1
- package/dist/types/debugger.d.ts +16 -11
- package/dist/types/index.d.ts +2 -2
- package/dist/types/utils.d.ts +119 -1
- package/dist/umd/debugger.global.js +17 -11
- package/dist/umd/debugger.global.js.map +1 -1
- package/dist/umd/index.global.js +140 -12
- package/dist/umd/index.global.js.map +1 -1
- package/dist/umd/utils.global.js +122 -0
- package/dist/umd/utils.global.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/chunk-HGUNPVKD.cjs.map +0 -1
- package/dist/cjs/chunk-U6KYHCBL.cjs.map +0 -1
- package/dist/es/chunk-FB42OGY3.js.map +0 -1
- package/dist/es/chunk-WJX5Q3WL.js +0 -229
- package/dist/es/chunk-WJX5Q3WL.js.map +0 -1
package/README.md
CHANGED
|
@@ -124,12 +124,20 @@ import { Debugger } from '@snack-kit/lib/debugger'
|
|
|
124
124
|
|
|
125
125
|
// 仅在非生产环境加载
|
|
126
126
|
if (import.meta.env.DEV) {
|
|
127
|
+
// 配置对象形式(可设置 timeout 等选项)
|
|
127
128
|
await Debugger.init({
|
|
128
129
|
gateways: [
|
|
129
130
|
'http://dev-gateway.example.com',
|
|
130
131
|
'http://test-gateway.example.com',
|
|
131
132
|
],
|
|
133
|
+
timeout: 5000,
|
|
132
134
|
})
|
|
135
|
+
|
|
136
|
+
// 数组简写形式(等价写法)
|
|
137
|
+
await Debugger.init([
|
|
138
|
+
'http://dev-gateway.example.com',
|
|
139
|
+
'http://test-gateway.example.com',
|
|
140
|
+
])
|
|
133
141
|
}
|
|
134
142
|
|
|
135
143
|
// 生产环境正常调用,Debugger 未激活时自动以 Origin 加载
|
|
@@ -243,6 +251,15 @@ MIT
|
|
|
243
251
|
|
|
244
252
|
## Changelog
|
|
245
253
|
|
|
254
|
+
### 0.8.0
|
|
255
|
+
|
|
256
|
+
- **[utils]** 新增 `CopyToClipboard(str): Promise<boolean>`,优先使用 `navigator.clipboard.writeText()`,自动降级为 `execCommand`
|
|
257
|
+
- **[utils]** 新增 `REGEXPRULES` 完整正则规则集,覆盖数字/英文/中文、身份证、邮箱、电话、URL、IP、时间、颜色等分类
|
|
258
|
+
|
|
259
|
+
### 0.7.0
|
|
260
|
+
|
|
261
|
+
- **[debugger]** `Debugger.init()` 新增数组简写入参形式,直接传入网关 URL 数组等价于 `{ gateways: [...] }`
|
|
262
|
+
|
|
246
263
|
### 0.6.0
|
|
247
264
|
|
|
248
265
|
- **[http]** `Context` 内部使用独立 axios 实例,隔离外部拦截器对上下文加载请求的污染
|
|
@@ -542,24 +542,21 @@ var Debugger = class _Debugger {
|
|
|
542
542
|
/**
|
|
543
543
|
* 初始化并渲染调试面板
|
|
544
544
|
*
|
|
545
|
+
* 支持两种调用形式:
|
|
546
|
+
* - **配置对象**:传入 `DebuggerOptions`,可配置网关列表和超时时间
|
|
547
|
+
* - **数组简写**:直接传入网关 URL 数组,等价于 `{ gateways: [...] }`
|
|
548
|
+
*
|
|
545
549
|
* 调用后在页面右下角插入浮动按钮,点击展开调试面板。
|
|
546
550
|
* 面板支持:选择调试网关、切换目标服务、查看并复制路由 ctx。
|
|
547
551
|
* 网关/服务选择通过 `localStorage` 持久化,刷新后自动恢复。
|
|
548
552
|
*
|
|
549
|
-
* @param options
|
|
553
|
+
* @param options 配置对象 或 网关 URL 数组
|
|
550
554
|
*
|
|
551
|
-
* @example
|
|
555
|
+
* @example 配置对象形式
|
|
552
556
|
* ```ts
|
|
553
557
|
* import { Debugger } from '@snack-kit/lib/debugger'
|
|
554
558
|
*
|
|
555
559
|
* await Debugger.init({
|
|
556
|
-
* gateways: 'http://dev-gateway.example.com',
|
|
557
|
-
* })
|
|
558
|
-
* ```
|
|
559
|
-
*
|
|
560
|
-
* @example 多网关(开发/测试环境切换)
|
|
561
|
-
* ```ts
|
|
562
|
-
* await Debugger.init({
|
|
563
560
|
* gateways: [
|
|
564
561
|
* 'http://dev-gateway.example.com',
|
|
565
562
|
* 'http://test-gateway.example.com',
|
|
@@ -568,17 +565,26 @@ var Debugger = class _Debugger {
|
|
|
568
565
|
* })
|
|
569
566
|
* ```
|
|
570
567
|
*
|
|
568
|
+
* @example 数组简写形式
|
|
569
|
+
* ```ts
|
|
570
|
+
* await Debugger.init([
|
|
571
|
+
* 'http://dev-gateway.example.com',
|
|
572
|
+
* 'http://test-gateway.example.com',
|
|
573
|
+
* ])
|
|
574
|
+
* ```
|
|
575
|
+
*
|
|
571
576
|
* @example 仅在非生产环境加载
|
|
572
577
|
* ```ts
|
|
573
578
|
* if (import.meta.env.DEV) {
|
|
574
579
|
* const { Debugger } = await import('@snack-kit/lib/debugger')
|
|
575
|
-
* await Debugger.init(
|
|
580
|
+
* await Debugger.init(['http://dev-gateway.example.com'])
|
|
576
581
|
* }
|
|
577
582
|
* ```
|
|
578
583
|
*/
|
|
579
584
|
static async init(options) {
|
|
580
585
|
globalThis[chunkUNFUIZVY_cjs.DEBUGGER_ACTIVE_KEY] = true;
|
|
581
|
-
const
|
|
586
|
+
const normalized = Array.isArray(options) ? { gateways: options } : options;
|
|
587
|
+
const instance = new _Debugger({ timeout: 1e4, ...normalized });
|
|
582
588
|
instance.injectStyle();
|
|
583
589
|
instance.buildDOM();
|
|
584
590
|
await instance.restoreState();
|
|
@@ -870,5 +876,5 @@ var Debugger = class _Debugger {
|
|
|
870
876
|
};
|
|
871
877
|
|
|
872
878
|
exports.Debugger = Debugger;
|
|
873
|
-
//# sourceMappingURL=chunk-
|
|
874
|
-
//# sourceMappingURL=chunk-
|
|
879
|
+
//# sourceMappingURL=chunk-LQ5WJVQX.cjs.map
|
|
880
|
+
//# sourceMappingURL=chunk-LQ5WJVQX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/debugger/debugger.ts"],"names":["axios","DEBUGGER_ACTIVE_KEY","Context"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","file":"chunk-LQ5WJVQX.cjs","sourcesContent":["import axios from 'axios'\nimport { Context, DEBUGGER_ACTIVE_KEY } from '../http/context'\nimport type { ServerItem } from '../http/types'\nimport type { DebuggerOptions } from './types'\n\n/**\n * Debugger 专用的隔离 axios 实例。\n * 独立于用户通过 `import { axios } from '@snack-kit/lib/http'` 添加的拦截器,\n * 确保调试面板请求不被外部拦截器污染。\n */\nconst _http = axios.create()\n\n/** localStorage key 前缀 */\nconst STORAGE_PREFIX = '__snackkit_debugger__'\nconst KEY_GATEWAY = `${STORAGE_PREFIX}gateway`\nconst KEY_TYPE = `${STORAGE_PREFIX}type`\nconst KEY_SERVER = `${STORAGE_PREFIX}server`\n\n\n/** 是否为中文环境 */\nfunction isChinese(): boolean {\n return /^zh/i.test(navigator.language ?? '')\n}\n\n/** i18n 文案 */\nconst T = {\n gateway: () => isChinese() ? '网关' : 'Gateway',\n tag: () => isChinese() ? '标签' : 'Tag',\n server: () => isChinese() ? '服务' : 'Server',\n ctx: () => isChinese() ? '上下文' : 'Ctx',\n ctxLabel: () => isChinese() ? '上下文 — 点击行复制 key' : 'Ctx — click row to copy key',\n search: () => isChinese() ? '搜索...' : 'Search...',\n noMatch: () => isChinese() ? '无匹配项' : 'No results',\n allTags: () => isChinese() ? '全部标签' : 'All tags',\n selectGateway: () => isChinese() ? '选择网关' : 'Select gateway',\n selectServer: () => isChinese() ? '选择服务' : 'Select server',\n filterCtx: () => isChinese() ? '过滤路由...' : 'Filter routes...',\n selectFirst: () => isChinese() ? '← 请先选择服务' : '← Select a server first',\n loading: () => isChinese() ? '加载服务列表...' : 'Loading...',\n loadFailed: (m: string) => isChinese() ? `加载失败: ${m}` : `Failed: ${m}`,\n loaded: (n: number) => isChinese() ? `已加载 ${n} 个服务` : `${n} servers loaded`,\n switching: () => isChinese() ? '切换服务中...' : 'Switching...',\n switchFailed: (m: string) => isChinese() ? `切换失败: ${m}` : `Failed: ${m}`,\n routes: (name: string, n: number) => isChinese() ? `${name} · ${n} 条路由` : `${name} · ${n} routes`,\n copied: (k: string) => isChinese() ? `已复制: ${k}` : `Copied: ${k}`,\n copyAll: () => isChinese() ? '复制全部 JSON' : 'Copy all JSON',\n copyAllDone: () => isChinese() ? '已复制为 JSON' : 'Copied as JSON',\n}\n\n/** 面板内联样式 */\nconst PANEL_STYLE = `\n #__snackkit_debugger__ {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 99999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', sans-serif;\n font-size: 13px;\n color: #b8ccec;\n user-select: none;\n }\n\n /* ── 浮动按钮 ── */\n #__snackkit_debugger__ .dbg-toggle {\n width: 42px;\n height: 42px;\n border-radius: 50%;\n background: linear-gradient(135deg, #4f8ef7, #6d6ff5);\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 14px rgba(79,142,247,0.45);\n margin-left: auto;\n font-size: 20px;\n transition: transform 0.15s, box-shadow 0.15s;\n }\n #__snackkit_debugger__ .dbg-toggle:hover {\n transform: scale(1.08);\n box-shadow: 0 6px 20px rgba(79,142,247,0.55);\n }\n #__snackkit_debugger__ .dbg-toggle:active { transform: scale(0.94); }\n\n /* ── 面板主体 ── */\n #__snackkit_debugger__ .dbg-panel {\n background: #1e2638;\n border: 1px solid #2d3a55;\n border-radius: 12px;\n width: 440px;\n margin-bottom: 10px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.45), 0 0 0 1px rgba(255,255,255,0.05);\n overflow: visible;\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n pointer-events: none;\n transition: opacity 0.18s ease, transform 0.18s ease;\n }\n #__snackkit_debugger__ .dbg-panel.open {\n opacity: 1;\n transform: translateY(0) scale(1);\n pointer-events: auto;\n }\n\n /* ── 面板 Header ── */\n #__snackkit_debugger__ .dbg-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: #171e2e;\n border-bottom: 1px solid #2d3a55;\n border-radius: 12px 12px 0 0;\n }\n #__snackkit_debugger__ .dbg-header-left {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n #__snackkit_debugger__ .dbg-header-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #34d399;\n box-shadow: 0 0 6px rgba(52,211,153,0.6);\n }\n #__snackkit_debugger__ .dbg-header-dot.loading {\n background: #fbbf24;\n box-shadow: 0 0 6px rgba(251,191,36,0.6);\n animation: dbg-pulse 1s ease-in-out infinite;\n }\n #__snackkit_debugger__ .dbg-header-dot.err {\n background: #f87171;\n box-shadow: 0 0 6px rgba(248,113,113,0.6);\n }\n #__snackkit_debugger__ .dbg-header-title {\n font-size: 12px;\n font-weight: 600;\n color: #dce8fa;\n letter-spacing: 0.03em;\n }\n #__snackkit_debugger__ .dbg-header-meta {\n font-size: 11px;\n color: #4d6080;\n }\n\n /* ── 面板内容区 ── */\n #__snackkit_debugger__ .dbg-body {\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n height: 420px;\n overflow: visible;\n }\n\n /* ── 字段行 ── */\n #__snackkit_debugger__ .dbg-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n }\n #__snackkit_debugger__ .dbg-field-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n #__snackkit_debugger__ .dbg-label {\n font-size: 10px;\n font-weight: 600;\n color: #5e72a0;\n text-transform: uppercase;\n letter-spacing: 0.07em;\n }\n\n /* ── 一键复制全部 JSON 按钮 ── */\n #__snackkit_debugger__ .dbg-copy-all {\n display: flex;\n align-items: center;\n gap: 4px;\n background: transparent;\n border: 1px solid #2d3a55;\n border-radius: 4px;\n padding: 2px 7px;\n color: #5e72a0;\n font-size: 10px;\n font-family: inherit;\n cursor: pointer;\n transition: border-color 0.15s, color 0.15s, background 0.15s;\n }\n #__snackkit_debugger__ .dbg-copy-all:hover {\n border-color: #4f8ef7;\n color: #7aacfa;\n background: rgba(79,142,247,0.08);\n }\n #__snackkit_debugger__ .dbg-copy-all.done {\n border-color: #34d399;\n color: #34d399;\n }\n\n /* ── 自定义下拉 ── */\n #__snackkit_debugger__ .dbg-select {\n position: relative;\n }\n #__snackkit_debugger__ .dbg-select-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n background: #252f45;\n border: 1px solid #2d3a55;\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n min-height: 32px;\n }\n #__snackkit_debugger__ .dbg-select-trigger:hover { border-color: #3d5070; background: #2d3a55; }\n #__snackkit_debugger__ .dbg-select.open .dbg-select-trigger {\n border-color: #4f8ef7;\n background: #2d3a55;\n }\n #__snackkit_debugger__ .dbg-select-val {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n color: #b8ccec;\n }\n #__snackkit_debugger__ .dbg-select-val.placeholder { color: #3d5070; }\n #__snackkit_debugger__ .dbg-select-arrow {\n color: #3d5070;\n font-size: 10px;\n flex-shrink: 0;\n transition: transform 0.15s, color 0.15s;\n }\n #__snackkit_debugger__ .dbg-select.open .dbg-select-arrow {\n transform: rotate(180deg);\n color: #4f8ef7;\n }\n #__snackkit_debugger__ .dbg-select-dropdown {\n position: absolute;\n bottom: calc(100% + 4px);\n left: 0;\n right: 0;\n background: #1e2638;\n border: 1px solid #2d3a55;\n border-radius: 8px;\n box-shadow: 0 -8px 24px rgba(0,0,0,0.35);\n overflow: hidden;\n opacity: 0;\n transform: translateY(4px);\n pointer-events: none;\n transition: opacity 0.14s, transform 0.14s;\n z-index: 100000;\n }\n #__snackkit_debugger__ .dbg-select.open .dbg-select-dropdown {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n }\n #__snackkit_debugger__ .dbg-select-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 10px;\n border-bottom: 1px solid #2d3a55;\n }\n #__snackkit_debugger__ .dbg-select-search-icon { color: #3d5070; font-size: 11px; flex-shrink: 0; }\n #__snackkit_debugger__ .dbg-select-search input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n color: #b8ccec;\n font-size: 12px;\n font-family: inherit;\n }\n #__snackkit_debugger__ .dbg-select-search input::placeholder { color: #3d5070; }\n #__snackkit_debugger__ .dbg-select-list {\n max-height: 160px;\n overflow-y: auto;\n }\n #__snackkit_debugger__ .dbg-select-list::-webkit-scrollbar { width: 3px; }\n #__snackkit_debugger__ .dbg-select-list::-webkit-scrollbar-track { background: transparent; }\n #__snackkit_debugger__ .dbg-select-list::-webkit-scrollbar-thumb { background: #2d3a55; border-radius: 2px; }\n #__snackkit_debugger__ .dbg-select-option {\n padding: 7px 10px;\n cursor: pointer;\n font-size: 12px;\n color: #8aa4c8;\n transition: background 0.1s, color 0.1s;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n #__snackkit_debugger__ .dbg-select-option:hover { background: #2d3a55; color: #dce8fa; }\n #__snackkit_debugger__ .dbg-select-option.active { color: #7aacfa; background: #1e3060; }\n #__snackkit_debugger__ .dbg-select-option.hidden { display: none; }\n #__snackkit_debugger__ .dbg-select-empty {\n padding: 12px 10px;\n font-size: 12px;\n color: #3d5070;\n text-align: center;\n }\n\n /* ── 路由列表 ── */\n #__snackkit_debugger__ .dbg-ctx-field {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 5px;\n }\n #__snackkit_debugger__ .dbg-ctx-wrap {\n flex: 1;\n min-height: 0;\n border: 1px solid #2d3a55;\n border-radius: 6px;\n overflow: hidden;\n background: #252f45;\n display: flex;\n flex-direction: column;\n }\n #__snackkit_debugger__ .dbg-ctx-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-bottom: 1px solid #2d3a55;\n background: #1e2638;\n }\n #__snackkit_debugger__ .dbg-ctx-search input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n color: #b8ccec;\n font-size: 12px;\n font-family: inherit;\n }\n #__snackkit_debugger__ .dbg-ctx-search input::placeholder { color: #3d5070; }\n #__snackkit_debugger__ .dbg-ctx-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n #__snackkit_debugger__ .dbg-ctx-list::-webkit-scrollbar { width: 3px; }\n #__snackkit_debugger__ .dbg-ctx-list::-webkit-scrollbar-track { background: transparent; }\n #__snackkit_debugger__ .dbg-ctx-list::-webkit-scrollbar-thumb { background: #2d3a55; border-radius: 2px; }\n #__snackkit_debugger__ .dbg-ctx-item {\n padding: 5px 10px;\n cursor: pointer;\n display: grid;\n grid-template-columns: minmax(80px, 148px) 1fr auto;\n gap: 8px;\n align-items: center;\n border-bottom: 1px solid #1e2638;\n transition: background 0.1s;\n }\n #__snackkit_debugger__ .dbg-ctx-item:last-child { border-bottom: none; }\n #__snackkit_debugger__ .dbg-ctx-item:hover { background: #2d3a55; }\n #__snackkit_debugger__ .dbg-ctx-item.hidden { display: none; }\n #__snackkit_debugger__ .dbg-ctx-key {\n font-size: 12px;\n color: #7aacfa;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n #__snackkit_debugger__ .dbg-ctx-val {\n font-size: 11px;\n color: #4d6080;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n transition: color 0.1s;\n }\n #__snackkit_debugger__ .dbg-ctx-item:hover .dbg-ctx-val { color: #7a90b0; }\n #__snackkit_debugger__ .dbg-ctx-copy {\n font-size: 11px;\n color: #3d5070;\n opacity: 0;\n flex-shrink: 0;\n transition: opacity 0.1s, color 0.1s;\n }\n #__snackkit_debugger__ .dbg-ctx-item:hover .dbg-ctx-copy { opacity: 1; color: #5e72a0; }\n #__snackkit_debugger__ .dbg-ctx-item.copied .dbg-ctx-copy { color: #34d399; opacity: 1; }\n #__snackkit_debugger__ .dbg-ctx-empty {\n padding: 16px 10px;\n font-size: 12px;\n color: #3d5070;\n text-align: center;\n }\n\n /* ── 底部状态栏 ── */\n #__snackkit_debugger__ .dbg-footer {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n background: #171e2e;\n border-top: 1px solid #2d3a55;\n border-radius: 0 0 12px 12px;\n font-size: 11px;\n color: #4d6080;\n min-height: 30px;\n }\n #__snackkit_debugger__ .dbg-footer.ok { color: #34d399; }\n #__snackkit_debugger__ .dbg-footer.err { color: #f87171; }\n #__snackkit_debugger__ .dbg-footer-dot {\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background: currentColor;\n flex-shrink: 0;\n }\n\n @keyframes dbg-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n }\n`\n\n/** 可搜索的自定义下拉组件 */\nclass SearchSelect {\n private el: HTMLElement\n private trigger: HTMLElement\n private valEl: HTMLElement\n private dropdown: HTMLElement\n private searchInput: HTMLInputElement\n private listEl: HTMLElement\n private options: Array<{ value: string; label: string }> = []\n private selected = ''\n private onChange: (value: string) => void\n\n constructor(onChange: (value: string) => void) {\n this.onChange = onChange\n this.el = document.createElement('div')\n this.el.className = 'dbg-select'\n\n // 触发器\n this.trigger = document.createElement('div')\n this.trigger.className = 'dbg-select-trigger'\n this.valEl = document.createElement('span')\n this.valEl.className = 'dbg-select-val placeholder'\n const arrow = document.createElement('span')\n arrow.className = 'dbg-select-arrow'\n arrow.textContent = '▾'\n this.trigger.appendChild(this.valEl)\n this.trigger.appendChild(arrow)\n\n // 下拉面板\n this.dropdown = document.createElement('div')\n this.dropdown.className = 'dbg-select-dropdown'\n\n // 搜索框\n const searchWrap = document.createElement('div')\n searchWrap.className = 'dbg-select-search'\n const searchIcon = document.createElement('span')\n searchIcon.className = 'dbg-select-search-icon'\n searchIcon.textContent = '⌕'\n this.searchInput = document.createElement('input')\n this.searchInput.type = 'text'\n this.searchInput.placeholder = T.search()\n searchWrap.appendChild(searchIcon)\n searchWrap.appendChild(this.searchInput)\n\n this.listEl = document.createElement('div')\n this.listEl.className = 'dbg-select-list'\n\n this.dropdown.appendChild(searchWrap)\n this.dropdown.appendChild(this.listEl)\n this.el.appendChild(this.trigger)\n this.el.appendChild(this.dropdown)\n\n this.bindEvents()\n }\n\n private bindEvents(): void {\n this.trigger.addEventListener('click', (e) => {\n e.stopPropagation()\n const isOpen = this.el.classList.contains('open')\n document.querySelectorAll('#__snackkit_debugger__ .dbg-select.open').forEach((el) => {\n if (el !== this.el) el.classList.remove('open')\n })\n this.el.classList.toggle('open', !isOpen)\n if (!isOpen) {\n this.searchInput.value = ''\n this.filterOptions('')\n setTimeout(() => this.searchInput.focus(), 50)\n }\n })\n\n this.searchInput.addEventListener('input', () => {\n this.filterOptions(this.searchInput.value)\n })\n\n this.searchInput.addEventListener('click', (e) => e.stopPropagation())\n\n document.addEventListener('click', () => {\n this.el.classList.remove('open')\n })\n }\n\n private filterOptions(query: string): void {\n const q = query.toLowerCase()\n let visibleCount = 0\n this.listEl.querySelectorAll<HTMLElement>('.dbg-select-option').forEach((opt) => {\n const match = !q || opt.textContent!.toLowerCase().includes(q)\n opt.classList.toggle('hidden', !match)\n if (match) visibleCount++\n })\n let emptyEl = this.listEl.querySelector<HTMLElement>('.dbg-select-empty')\n if (visibleCount === 0) {\n if (!emptyEl) {\n emptyEl = document.createElement('div')\n emptyEl.className = 'dbg-select-empty'\n emptyEl.textContent = T.noMatch()\n this.listEl.appendChild(emptyEl)\n }\n } else {\n emptyEl?.remove()\n }\n }\n\n /** 更新选项列表 */\n setOptions(options: Array<{ value: string; label: string }>, placeholder: string): void {\n this.options = options\n this.listEl.innerHTML = ''\n this.valEl.textContent = placeholder\n this.valEl.className = 'dbg-select-val placeholder'\n this.selected = ''\n\n options.forEach(({ value, label }) => {\n const opt = document.createElement('div')\n opt.className = 'dbg-select-option'\n opt.dataset['value'] = value\n opt.textContent = label\n opt.setAttribute('title', label)\n opt.addEventListener('click', (e) => {\n e.stopPropagation()\n this.select(value, label)\n this.el.classList.remove('open')\n })\n this.listEl.appendChild(opt)\n })\n }\n\n /** 选中某个值(不触发 onChange) */\n setValue(value: string): void {\n const opt = this.options.find((o) => o.value === value)\n if (opt) this.select(opt.value, opt.label, false)\n }\n\n private select(value: string, label: string, emit = true): void {\n this.selected = value\n this.valEl.textContent = label\n this.valEl.className = 'dbg-select-val'\n this.listEl.querySelectorAll('.dbg-select-option').forEach((el) => {\n el.classList.toggle('active', (el as HTMLElement).dataset['value'] === value)\n })\n if (emit) this.onChange(value)\n }\n\n getValue(): string { return this.selected }\n getElement(): HTMLElement { return this.el }\n}\n\n/**\n * 浏览器端浮动调试面板\n *\n * 允许开发者在运行时:\n * - 选择调试网关 → 拉取服务清单\n * - 切换目标服务 → 重新加载 Context 路由映射\n * - 查看并复制可用的路由 ctx 列表\n *\n * 与 http 模块集成:使用 `Get()` 拉取服务清单,使用 `context.load()` 切换请求目标。\n *\n * @see [交互式 Demo](../demo/debugger.html)\n *\n * @example\n * ```ts\n * import { Debugger } from '@snack-kit/lib/debugger'\n *\n * await Debugger.init({ gateways: 'http://dev-gateway.example.com' })\n * ```\n */\nexport class Debugger {\n private options: Required<DebuggerOptions>\n private gateways: string[]\n private servers: ServerItem[] = []\n private currentCtxMap: Record<string, string> = {}\n private panelEl!: HTMLElement\n private headerDot!: HTMLElement\n private gwVersion!: HTMLElement\n private footerEl!: HTMLElement\n private copyAllBtn!: HTMLButtonElement\n private gwSelect!: SearchSelect\n private typeSelect!: SearchSelect\n private serverSelect!: SearchSelect\n private ctxList!: HTMLElement\n private ctxSearchInput!: HTMLInputElement\n\n private constructor(options: Required<DebuggerOptions>) {\n this.options = options\n this.gateways = Array.isArray(options.gateways) ? options.gateways : [options.gateways]\n }\n\n /**\n * 初始化并渲染调试面板\n *\n * 支持两种调用形式:\n * - **配置对象**:传入 `DebuggerOptions`,可配置网关列表和超时时间\n * - **数组简写**:直接传入网关 URL 数组,等价于 `{ gateways: [...] }`\n *\n * 调用后在页面右下角插入浮动按钮,点击展开调试面板。\n * 面板支持:选择调试网关、切换目标服务、查看并复制路由 ctx。\n * 网关/服务选择通过 `localStorage` 持久化,刷新后自动恢复。\n *\n * @param options 配置对象 或 网关 URL 数组\n *\n * @example 配置对象形式\n * ```ts\n * import { Debugger } from '@snack-kit/lib/debugger'\n *\n * await Debugger.init({\n * gateways: [\n * 'http://dev-gateway.example.com',\n * 'http://test-gateway.example.com',\n * ],\n * timeout: 5000,\n * })\n * ```\n *\n * @example 数组简写形式\n * ```ts\n * await Debugger.init([\n * 'http://dev-gateway.example.com',\n * 'http://test-gateway.example.com',\n * ])\n * ```\n *\n * @example 仅在非生产环境加载\n * ```ts\n * if (import.meta.env.DEV) {\n * const { Debugger } = await import('@snack-kit/lib/debugger')\n * await Debugger.init(['http://dev-gateway.example.com'])\n * }\n * ```\n */\n static async init(options: DebuggerOptions | string[]): Promise<Debugger> {\n // 在 globalThis 写入标志位,Context.load() 无参数时检测到后将跳过自动加载\n ;(globalThis as Record<string, unknown>)[DEBUGGER_ACTIVE_KEY] = true\n const normalized: DebuggerOptions = Array.isArray(options) ? { gateways: options } : options\n const instance = new Debugger({ timeout: 10000, ...normalized })\n instance.injectStyle()\n instance.buildDOM()\n await instance.restoreState()\n return instance\n }\n\n /** 注入内联样式 */\n private injectStyle(): void {\n if (document.getElementById('__snackkit_debugger_style__')) return\n const style = document.createElement('style')\n style.id = '__snackkit_debugger_style__'\n style.textContent = PANEL_STYLE\n document.head.appendChild(style)\n }\n\n /** 构建 DOM 结构 */\n private buildDOM(): void {\n const root = document.createElement('div')\n root.id = '__snackkit_debugger__'\n\n // ── 面板 ──\n const panel = document.createElement('div')\n panel.className = 'dbg-panel'\n this.panelEl = panel\n\n // Header\n const header = document.createElement('div')\n header.className = 'dbg-header'\n const headerLeft = document.createElement('div')\n headerLeft.className = 'dbg-header-left'\n this.headerDot = document.createElement('span')\n this.headerDot.className = 'dbg-header-dot loading'\n const headerTitle = document.createElement('span')\n headerTitle.className = 'dbg-header-title'\n headerTitle.textContent = 'Snack Kit Debugger'\n headerLeft.appendChild(this.headerDot)\n headerLeft.appendChild(headerTitle)\n header.appendChild(headerLeft)\n panel.appendChild(header)\n\n // Body\n const body = document.createElement('div')\n body.className = 'dbg-body'\n\n // 网关选择(标签行右侧显示版本号)\n this.gwVersion = document.createElement('span')\n this.gwVersion.className = 'dbg-header-meta'\n this.gwSelect = new SearchSelect((val) => this.onGatewayChange(val))\n this.gwSelect.setOptions(this.gateways.map((g) => ({ value: g, label: g })), T.selectGateway())\n body.appendChild(this.createFieldWithAction(T.gateway(), this.gwVersion, this.gwSelect.getElement()))\n\n // 标签(类型)选择\n this.typeSelect = new SearchSelect((val) => this.onTypeChange(val))\n body.appendChild(this.createField(T.tag(), this.typeSelect.getElement()))\n\n // 服务选择\n this.serverSelect = new SearchSelect((val) => this.onServerChange(val))\n body.appendChild(this.createField(T.server(), this.serverSelect.getElement()))\n\n // 路由列表(含一键复制全部 JSON 按钮)\n const ctxWrap = document.createElement('div')\n ctxWrap.className = 'dbg-ctx-wrap'\n\n const ctxSearch = document.createElement('div')\n ctxSearch.className = 'dbg-ctx-search'\n const ctxSearchIcon = document.createElement('span')\n ctxSearchIcon.className = 'dbg-select-search-icon'\n ctxSearchIcon.textContent = '⌕'\n this.ctxSearchInput = document.createElement('input')\n this.ctxSearchInput.type = 'text'\n this.ctxSearchInput.placeholder = T.filterCtx()\n this.ctxSearchInput.addEventListener('input', () => this.filterCtx(this.ctxSearchInput.value))\n ctxSearch.appendChild(ctxSearchIcon)\n ctxSearch.appendChild(this.ctxSearchInput)\n\n this.ctxList = document.createElement('div')\n this.ctxList.className = 'dbg-ctx-list'\n\n ctxWrap.appendChild(ctxSearch)\n ctxWrap.appendChild(this.ctxList)\n\n // 一键复制全部 JSON 按钮\n this.copyAllBtn = document.createElement('button')\n this.copyAllBtn.className = 'dbg-copy-all'\n this.copyAllBtn.textContent = T.copyAll()\n this.copyAllBtn.setAttribute('title', isChinese()\n ? '将全部上下文复制为 JSON,可作为 Context.load({...}) 的参数'\n : 'Copy all ctx entries as JSON for Context.load({...})')\n this.copyAllBtn.addEventListener('click', (e) => {\n e.stopPropagation()\n this.copyAllCtx()\n })\n\n const ctxField = this.createFieldWithAction(T.ctxLabel(), this.copyAllBtn, ctxWrap)\n ctxField.classList.add('dbg-ctx-field')\n body.appendChild(ctxField)\n\n panel.appendChild(body)\n\n // Footer 状态栏\n const footer = document.createElement('div')\n footer.className = 'dbg-footer'\n this.footerEl = footer\n panel.appendChild(footer)\n\n // ── 浮动按钮 ──\n const toggle = document.createElement('button')\n toggle.className = 'dbg-toggle'\n toggle.textContent = '🐛'\n toggle.setAttribute('title', 'Snack Debugger')\n toggle.addEventListener('click', (e) => {\n e.stopPropagation()\n panel.classList.toggle('open')\n })\n\n root.appendChild(panel)\n root.appendChild(toggle)\n document.body.appendChild(root)\n }\n\n /** 创建普通字段行(label + content) */\n private createField(label: string, content: HTMLElement): HTMLElement {\n const field = document.createElement('div')\n field.className = 'dbg-field'\n const lbl = document.createElement('div')\n lbl.className = 'dbg-label'\n lbl.textContent = label\n field.appendChild(lbl)\n field.appendChild(content)\n return field\n }\n\n /** 创建带操作按钮的字段行(label + action button + content) */\n private createFieldWithAction(label: string, action: HTMLElement, content: HTMLElement): HTMLElement {\n const field = document.createElement('div')\n field.className = 'dbg-field'\n const fieldHeader = document.createElement('div')\n fieldHeader.className = 'dbg-field-header'\n const lbl = document.createElement('div')\n lbl.className = 'dbg-label'\n lbl.textContent = label\n fieldHeader.appendChild(lbl)\n fieldHeader.appendChild(action)\n field.appendChild(fieldHeader)\n field.appendChild(content)\n return field\n }\n\n /** 恢复上次持久化的状态 */\n private async restoreState(): Promise<void> {\n const savedGw = localStorage.getItem(KEY_GATEWAY)\n const gw = (savedGw && this.gateways.includes(savedGw)) ? savedGw : this.gateways[0]\n this.gwSelect.setValue(gw)\n await this.loadServers(gw)\n\n const savedType = localStorage.getItem(KEY_TYPE)\n if (savedType) {\n this.typeSelect.setValue(savedType)\n this.renderServerOptions(savedType)\n }\n\n const savedServer = localStorage.getItem(KEY_SERVER)\n if (savedServer && this.servers.find((s) => s.key === savedServer)) {\n this.serverSelect.setValue(savedServer)\n await this.applyServer(savedServer)\n }\n }\n\n private async onGatewayChange(gw: string): Promise<void> {\n localStorage.setItem(KEY_GATEWAY, gw)\n this.gwVersion.textContent = ''\n await this.loadServers(gw)\n }\n\n private onTypeChange(type: string): void {\n localStorage.setItem(KEY_TYPE, type)\n this.renderServerOptions(type)\n }\n\n private async onServerChange(key: string): Promise<void> {\n localStorage.setItem(KEY_SERVER, key)\n await this.applyServer(key)\n }\n\n /** 从网关加载服务列表 */\n private async loadServers(gwUrl: string): Promise<void> {\n this.setHeader('loading')\n this.setFooter(T.loading(), '')\n try {\n const res = await _http.get<ServerItem[]>(`${gwUrl}/web-debug/host/list`, {\n timeout: this.options.timeout,\n })\n this.servers = res.data ?? []\n this.renderTypeOptions()\n this.setHeader('ok')\n this.setFooter(T.loaded(this.servers.length), 'ok')\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n this.setHeader('err')\n this.setFooter(T.loadFailed(message), 'err')\n }\n }\n\n /** 渲染标签选项 */\n private renderTypeOptions(): void {\n const types = [...new Set(this.servers.map((s) => s.type).filter(Boolean))]\n const opts = [{ value: '', label: T.allTags() }, ...types.map((t) => ({ value: t, label: t }))]\n this.typeSelect.setOptions(opts, T.allTags())\n this.typeSelect.setValue('')\n this.renderServerOptions('')\n }\n\n /** 根据标签渲染服务选项 */\n private renderServerOptions(type: string): void {\n const filtered = type ? this.servers.filter((s) => s.type === type) : this.servers\n this.serverSelect.setOptions(\n filtered.map((s) => ({ value: s.key, label: `${s.name} (${s.key})` })),\n T.selectServer(),\n )\n this.renderCtxList({})\n }\n\n /** 切换目标服务,重新加载 Context 路由映射 */\n private async applyServer(key: string): Promise<void> {\n if (!key) { this.renderCtxList({}); return }\n const server = this.servers.find((s) => s.key === key)\n if (!server) return\n\n this.setFooter(T.switching(), '')\n try {\n await Context.load(server.origin, this.options.timeout)\n const res = await fetch(`${server.origin}/ngw/context`)\n const raw: Record<string, unknown> = res.ok ? await res.json() : {}\n const ctxMap: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n if (k !== '$info' && typeof v === 'string') ctxMap[k] = v\n }\n const info = Context.info\n if (info) this.gwVersion.textContent = `v${info.version}`\n this.renderCtxList(ctxMap)\n const count = Object.keys(ctxMap).length\n this.setFooter(T.routes(server.name, count), 'ok')\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n this.setFooter(T.switchFailed(msg), 'err')\n }\n }\n\n /** 渲染路由列表 */\n private renderCtxList(ctxMap: Record<string, string>): void {\n this.currentCtxMap = ctxMap\n this.ctxList.innerHTML = ''\n this.ctxSearchInput.value = ''\n const entries = Object.entries(ctxMap)\n if (entries.length === 0) {\n const empty = document.createElement('div')\n empty.className = 'dbg-ctx-empty'\n empty.textContent = T.selectFirst()\n this.ctxList.appendChild(empty)\n return\n }\n entries.forEach(([k, v]) => {\n const item = document.createElement('div')\n item.className = 'dbg-ctx-item'\n item.dataset['key'] = k\n\n const keySpan = document.createElement('span')\n keySpan.className = 'dbg-ctx-key'\n keySpan.textContent = k\n keySpan.setAttribute('title', k)\n\n const valSpan = document.createElement('span')\n valSpan.className = 'dbg-ctx-val'\n valSpan.textContent = v\n valSpan.setAttribute('title', `${k} → ${v}`)\n\n const copyIcon = document.createElement('span')\n copyIcon.className = 'dbg-ctx-copy'\n copyIcon.textContent = '⎘'\n\n item.appendChild(keySpan)\n item.appendChild(valSpan)\n item.appendChild(copyIcon)\n item.addEventListener('click', () => this.copyCtxItem(item, k))\n this.ctxList.appendChild(item)\n })\n }\n\n /** 过滤路由列表 */\n private filterCtx(query: string): void {\n const q = query.toLowerCase()\n this.ctxList.querySelectorAll<HTMLElement>('.dbg-ctx-item').forEach((item) => {\n const key = item.dataset['key'] ?? ''\n item.classList.toggle('hidden', !!q && !key.toLowerCase().includes(q))\n })\n }\n\n /** 复制单个 ctx key */\n private copyCtxItem(item: HTMLElement, text: string): void {\n navigator.clipboard.writeText(text).then(() => {\n item.classList.add('copied')\n const icon = item.querySelector('.dbg-ctx-copy')\n if (icon) icon.textContent = '✓'\n setTimeout(() => {\n item.classList.remove('copied')\n const ic = item.querySelector('.dbg-ctx-copy')\n if (ic) ic.textContent = '⎘'\n }, 1500)\n this.setFooter(T.copied(text), 'ok')\n setTimeout(() => this.setFooter('', ''), 2000)\n })\n }\n\n /** 一键复制全部上下文为 JSON */\n private copyAllCtx(): void {\n const entries = Object.keys(this.currentCtxMap)\n if (entries.length === 0) return\n const json = JSON.stringify(this.currentCtxMap, null, 2)\n navigator.clipboard.writeText(json).then(() => {\n this.copyAllBtn.textContent = '✓ ' + T.copyAllDone()\n this.copyAllBtn.classList.add('done')\n setTimeout(() => {\n this.copyAllBtn.textContent = T.copyAll()\n this.copyAllBtn.classList.remove('done')\n }, 2000)\n this.setFooter(T.copyAllDone(), 'ok')\n setTimeout(() => this.setFooter('', ''), 2500)\n })\n }\n\n private setHeader(state: 'ok' | 'err' | 'loading'): void {\n this.headerDot.className = `dbg-header-dot${state !== 'ok' ? ` ${state}` : ''}`\n }\n\n private setFooter(msg: string, cls: '' | 'ok' | 'err'): void {\n this.footerEl.innerHTML = msg\n ? `<span class=\"dbg-footer-dot\"></span>${msg}`\n : ''\n this.footerEl.className = `dbg-footer${cls ? ` ${cls}` : ''}`\n }\n}\n"]}
|
|
@@ -56,6 +56,98 @@ var IsUrl = (val) => REGEX.url.test(val);
|
|
|
56
56
|
var IsIpv4 = (val) => REGEX.ipv4.test(val);
|
|
57
57
|
var IsInteger = (val) => REGEX.integer.test(val);
|
|
58
58
|
var IsPositiveInteger = (val) => REGEX.positiveInteger.test(val);
|
|
59
|
+
var REGEXPRULES = {
|
|
60
|
+
// ── 数字 / 英文 / 中文 ──────────────────────────────────────────────────
|
|
61
|
+
/** 只能是数字和字母 */
|
|
62
|
+
numberEnglish: /^\w+$/,
|
|
63
|
+
/** 只能是非数字和字母 */
|
|
64
|
+
unnumberEnglish: /^\W*$/,
|
|
65
|
+
/** 只能是数字 */
|
|
66
|
+
number: /^\d+$/,
|
|
67
|
+
/** 只能是非数字 */
|
|
68
|
+
unnumber: /^\D*$/,
|
|
69
|
+
/** 只能是英文 */
|
|
70
|
+
english: /^[a-zA-Z]+$/,
|
|
71
|
+
/** 只能是中文 */
|
|
72
|
+
chinese: /^[\u4E00-\u9FA5]+$/,
|
|
73
|
+
/** 不能包含中文 */
|
|
74
|
+
unchinese: /^[^\u4e00-\u9fa5]*$/,
|
|
75
|
+
/** 整数(含负数和零) */
|
|
76
|
+
integer: /(^-|^)\d+$/,
|
|
77
|
+
/** 中文、字母、数字 */
|
|
78
|
+
chineseEnglishNumber: /^[\u4e00-\u9fa5\w]+$/,
|
|
79
|
+
/** 浮点数 */
|
|
80
|
+
floatNumber: /^(-?[1-9]\d*\.\d+|-?0\.\d*[1-9]\d*|0\.0+)$/,
|
|
81
|
+
/** 严格浮点数 */
|
|
82
|
+
strictFloatNumber: /^(-?[1-9]\d*\.\d+|-?0\.\d*[1-9])$/,
|
|
83
|
+
// ── 身份证 ──────────────────────────────────────────────────────────────
|
|
84
|
+
/** 二代身份证 */
|
|
85
|
+
idcard: /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/,
|
|
86
|
+
/** 香港身份证 */
|
|
87
|
+
hkIdcard: /^[a-zA-Z]\d{6}\([\dA]\)$/,
|
|
88
|
+
/** 澳门身份证 */
|
|
89
|
+
amIdcard: /^[1|5|7]\d{6}\(\d\)$/,
|
|
90
|
+
/** 台湾身份证 */
|
|
91
|
+
twIdcard: /^[a-zA-Z][0-9]{9}$/,
|
|
92
|
+
// ── 邮箱 ────────────────────────────────────────────────────────────────
|
|
93
|
+
/** 邮箱(符合 RFC 标准) */
|
|
94
|
+
email: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-_0-9]+\.)+[a-zA-Z]{2,}))$/,
|
|
95
|
+
/** 中文邮箱 */
|
|
96
|
+
chineseEmail: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
|
|
97
|
+
// ── 电话 ────────────────────────────────────────────────────────────────
|
|
98
|
+
/** 手机号(宽松:13-19 开头) */
|
|
99
|
+
phone: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
|
|
100
|
+
/** 手机号(严谨,基于工信部 2019 年最新公布号段) */
|
|
101
|
+
strictPhone: /^(?:(?:\+|00)86)?1(?:(?:3\d)|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8\d)|(?:9[189]))\d{8}$/,
|
|
102
|
+
/** 座机 */
|
|
103
|
+
telphone: /^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/,
|
|
104
|
+
/** 手机机身号码(IMEI) */
|
|
105
|
+
IMEI: /^\d{15,17}$/,
|
|
106
|
+
// ── URL / 地址 ──────────────────────────────────────────────────────────
|
|
107
|
+
/** URL(http / https / ftp) */
|
|
108
|
+
url: /^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&:/~+#]*[\w\-@?^=%&/~+#])?/,
|
|
109
|
+
/** URL(仅 http / https) */
|
|
110
|
+
link: /^(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&:/~+#]*[\w\-@?^=%&/~+#])?/,
|
|
111
|
+
/** 磁力链接(宽松匹配) */
|
|
112
|
+
magnet: /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/,
|
|
113
|
+
/** 图片地址 */
|
|
114
|
+
image: /^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i,
|
|
115
|
+
/** 视频地址 */
|
|
116
|
+
video: /^https?:\/\/(.+\/)+.+(\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i,
|
|
117
|
+
/** Base64 数据 URI */
|
|
118
|
+
base64: /^\s*data:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s]*?)\s*$/i,
|
|
119
|
+
/** 以 http/https 开头的绝对路径 */
|
|
120
|
+
httpStart: /^(http|https):\/\/\S*/,
|
|
121
|
+
// ── IP ──────────────────────────────────────────────────────────────────
|
|
122
|
+
/** 必须带端口号的网址或 IP */
|
|
123
|
+
ipport: /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/,
|
|
124
|
+
/** IPv4(可带端口) */
|
|
125
|
+
ipv4Port: /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/,
|
|
126
|
+
/** 子网掩码 */
|
|
127
|
+
netmask: /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(255|254|252|248|240|224|192|128|0)$/,
|
|
128
|
+
// ── 时间 ────────────────────────────────────────────────────────────────
|
|
129
|
+
/** 24 小时制时间(HH:mm:ss) */
|
|
130
|
+
"24Time": /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/,
|
|
131
|
+
/** 12 小时制时间(hh:mm:ss) */
|
|
132
|
+
"12Time": /^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/,
|
|
133
|
+
/** 日期(宽松,如 2022-9-1) */
|
|
134
|
+
date: /^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/,
|
|
135
|
+
/** 日期(严谨,支持闰年判断) */
|
|
136
|
+
strictDate: /^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/,
|
|
137
|
+
// ── 其他 ────────────────────────────────────────────────────────────────
|
|
138
|
+
/** QQ 号 */
|
|
139
|
+
qq: /^[1-9][0-9]{4,10}$/,
|
|
140
|
+
/** 微信号(6-20 位,字母开头) */
|
|
141
|
+
wx: /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/,
|
|
142
|
+
/** 邮政编码(中国) */
|
|
143
|
+
postal: /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/,
|
|
144
|
+
/** 匹配连续重复字符 */
|
|
145
|
+
double: /(.)\1+/g,
|
|
146
|
+
/** 密码强度(最少 6 位,含大小写字母、数字、特殊字符各至少 1 个) */
|
|
147
|
+
passwordCheck: /^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/,
|
|
148
|
+
/** 16 进制颜色值 */
|
|
149
|
+
color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
|
|
150
|
+
};
|
|
59
151
|
|
|
60
152
|
// src/utils/array.ts
|
|
61
153
|
var Unique = (arr) => [...new Set(arr)];
|
|
@@ -187,6 +279,34 @@ var QueryToObject = (query) => {
|
|
|
187
279
|
});
|
|
188
280
|
return result;
|
|
189
281
|
};
|
|
282
|
+
var CopyToClipboard = async (str) => {
|
|
283
|
+
if (typeof navigator !== "undefined" && navigator.clipboard?.writeText) {
|
|
284
|
+
try {
|
|
285
|
+
await navigator.clipboard.writeText(str);
|
|
286
|
+
return true;
|
|
287
|
+
} catch {
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
const el = document.createElement("textarea");
|
|
292
|
+
el.value = str;
|
|
293
|
+
el.setAttribute("readonly", "");
|
|
294
|
+
el.style.cssText = "position:absolute;left:-9999px;top:-9999px";
|
|
295
|
+
document.body.appendChild(el);
|
|
296
|
+
const selection = document.getSelection();
|
|
297
|
+
const prevRange = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;
|
|
298
|
+
el.select();
|
|
299
|
+
const ok = document.execCommand("copy");
|
|
300
|
+
document.body.removeChild(el);
|
|
301
|
+
if (prevRange && selection) {
|
|
302
|
+
selection.removeAllRanges();
|
|
303
|
+
selection.addRange(prevRange);
|
|
304
|
+
}
|
|
305
|
+
return ok;
|
|
306
|
+
} catch {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
190
310
|
|
|
191
311
|
// src/utils/time.ts
|
|
192
312
|
var FormatDate = (date = /* @__PURE__ */ new Date(), format = "yyyy-MM-dd HH:mm:ss") => {
|
|
@@ -227,6 +347,7 @@ var GetDayRange = (date = /* @__PURE__ */ new Date()) => {
|
|
|
227
347
|
};
|
|
228
348
|
|
|
229
349
|
exports.CleanObject = CleanObject;
|
|
350
|
+
exports.CopyToClipboard = CopyToClipboard;
|
|
230
351
|
exports.Debounce = Debounce;
|
|
231
352
|
exports.DeepClone = DeepClone;
|
|
232
353
|
exports.Delay = Delay;
|
|
@@ -256,9 +377,10 @@ exports.Omit = Omit;
|
|
|
256
377
|
exports.Pick = Pick;
|
|
257
378
|
exports.QueryToObject = QueryToObject;
|
|
258
379
|
exports.REGEX = REGEX;
|
|
380
|
+
exports.REGEXPRULES = REGEXPRULES;
|
|
259
381
|
exports.Throttle = Throttle;
|
|
260
382
|
exports.UUID = UUID;
|
|
261
383
|
exports.Unique = Unique;
|
|
262
384
|
exports.UniqueByKey = UniqueByKey;
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
264
|
-
//# sourceMappingURL=chunk-
|
|
385
|
+
//# sourceMappingURL=chunk-MNKOKLT2.cjs.map
|
|
386
|
+
//# sourceMappingURL=chunk-MNKOKLT2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/detect.ts","../../src/utils/validate.ts","../../src/utils/array.ts","../../src/utils/object.ts","../../src/utils/func.ts","../../src/utils/string.ts","../../src/utils/time.ts"],"names":[],"mappings":"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","file":"chunk-MNKOKLT2.cjs","sourcesContent":["/**\n * 类型检测工具\n *\n * 统一使用 Object.prototype.toString 确保跨环境准确性,\n * 规避 typeof null === 'object' 等已知陷阱。\n */\n\nconst _toString = (val: unknown): string => Object.prototype.toString.call(val)\n\n/**\n * 是否为数字(含可转换的字符串数字,如 '42'、'3.14')\n * @example IsNumber(42) // true\n * @example IsNumber('42') // true\n * @example IsNumber('abc') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsNumber = (val: unknown): boolean =>\n !isNaN(parseFloat(val as string)) && isFinite(val as number)\n\n/**\n * 是否为严格数字类型(不含字符串数字)\n * @example IsRealNumber(42) // true\n * @example IsRealNumber('42') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsRealNumber = (val: unknown): val is number =>\n typeof val === 'number' && !isNaN(val)\n\n/**\n * 是否为字符串\n * @example IsString('hello') // true\n * @example IsString(new String('hello')) // true\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsString = (val: unknown): val is string =>\n _toString(val) === '[object String]'\n\n/**\n * 是否为布尔值\n * @example IsBoolean(true) // true\n * @example IsBoolean(1) // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsBoolean = (val: unknown): val is boolean =>\n _toString(val) === '[object Boolean]'\n\n/**\n * 是否为数组\n * @example IsArray([1, 2]) // true\n * @example IsArray({}) // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3.5+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsArray = (val: unknown): val is unknown[] => Array.isArray(val)\n\n/**\n * 是否为函数\n * @example IsFunction(() => {}) // true\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsFunction = (val: unknown): val is (...args: unknown[]) => unknown =>\n _toString(val) === '[object Function]'\n\n/**\n * 是否为普通对象(排除 null 和数组)\n * @example IsObject({}) // true\n * @example IsObject([]) // false\n * @example IsObject(null) // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsObject = (val: unknown): val is Record<string, unknown> =>\n _toString(val) === '[object Object]'\n\n/**\n * 是否为空值(null / undefined / 空字符串)\n * @example IsNull(null) // true\n * @example IsNull(undefined) // true\n * @example IsNull('') // true\n * @example IsNull(0) // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsNull = (val: unknown): boolean =>\n val === null || val === undefined || val === ''\n\n/**\n * 深度相等比较,支持对象和数组的递归比较。\n *\n * 注意:仅比较自身可枚举属性,不比较原型链上的属性。\n * 不支持 Map、Set、Date、RegExp 等特殊对象的深度比较。\n * @example IsEqual({ a: 1 }, { a: 1 }) // true\n * @example IsEqual([1, 2], [1, 2]) // true\n * @example IsEqual({ a: 1 }, { a: 2 }) // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n if (a === null || b === null) return false\n if (typeof a !== 'object') return false\n // 数组与普通对象不相等\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!IsEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])) {\n return false\n }\n }\n return true\n}\n","/**\n * 输入校验工具 + 常用正则常量\n */\n\n/**\n * 常用正则规则常量,来源参考 any-rule(https://github.com/any86/any-rule)\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const REGEX = {\n /** 手机号(宽松:13-19 开头) */\n phone: /^(?:(?:\\+|00)86)?1[3-9]\\d{9}$/,\n /** 手机号(严谨,基于工信部 2019 年最新公布号段) */\n strictPhone: /^(?:(?:\\+|00)86)?1(?:(?:3\\d)|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8\\d)|(?:9[189]))\\d{8}$/,\n /** 邮箱(符合 RFC 标准) */\n email: /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-_0-9]+\\.)+[a-zA-Z]{2,}))$/,\n /** URL(支持 http / https / ftp) */\n url: /^(https?|ftp):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:/~+#]*[\\w\\-@?^=%&/~+#])?/,\n /** IPv4 地址 */\n ipv4: /^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$/,\n /** 整数(含负数和零) */\n integer: /^[+-]?\\d+$/,\n /** 正整数(不含零) */\n positiveInteger: /^[1-9]\\d*$/,\n /** 二代身份证 */\n idcard: /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]$/,\n /** 日期(宽松,如 2022-9-1) */\n date: /^\\d{1,4}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2]\\d|30|31)$/,\n /** 16 进制颜色值 */\n color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,\n} as const\n\n/**\n * 是否为合法邮箱地址\n * @example IsEmail('user@example.com') // true\n * @example IsEmail('invalid') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsEmail = (val: string): boolean => REGEX.email.test(val)\n\n/**\n * 是否为中国大陆手机号(宽松校验)\n * @example IsPhone('13812345678') // true\n * @example IsPhone('12345678901') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsPhone = (val: string): boolean => REGEX.phone.test(val)\n\n/**\n * 是否为合法 URL\n * @example IsUrl('https://example.com') // true\n * @example IsUrl('not-a-url') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsUrl = (val: string): boolean => REGEX.url.test(val)\n\n/**\n * 是否为合法 IPv4 地址\n * @example IsIpv4('192.168.1.1') // true\n * @example IsIpv4('999.0.0.1') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsIpv4 = (val: string): boolean => REGEX.ipv4.test(val)\n\n/**\n * 是否为整数(含负数和零)\n * @example IsInteger('42') // true\n * @example IsInteger('-10') // true\n * @example IsInteger('3.14') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsInteger = (val: string): boolean => REGEX.integer.test(val)\n\n/**\n * 是否为正整数(不含零)\n * @example IsPositiveInteger('1') // true\n * @example IsPositiveInteger('0') // false\n * @example IsPositiveInteger('-1') // false\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const IsPositiveInteger = (val: string): boolean => REGEX.positiveInteger.test(val)\n\n/**\n * 完整正则规则集,来源参考 any-rule(https://github.com/any86/any-rule)。\n *\n * 包含数字/英文/中文、身份证、邮箱、电话、URL、IP、时间、颜色等常用规则。\n *\n * @example\n * ```ts\n * REGEXPRULES.phone.test('13812345678') // true\n * REGEXPRULES.email.test('user@example.com') // true\n * ```\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const REGEXPRULES = {\n // ── 数字 / 英文 / 中文 ──────────────────────────────────────────────────\n /** 只能是数字和字母 */\n numberEnglish: /^\\w+$/,\n /** 只能是非数字和字母 */\n unnumberEnglish: /^\\W*$/,\n /** 只能是数字 */\n number: /^\\d+$/,\n /** 只能是非数字 */\n unnumber: /^\\D*$/,\n /** 只能是英文 */\n english: /^[a-zA-Z]+$/,\n /** 只能是中文 */\n chinese: /^[\\u4E00-\\u9FA5]+$/,\n /** 不能包含中文 */\n unchinese: /^[^\\u4e00-\\u9fa5]*$/,\n /** 整数(含负数和零) */\n integer: /(^-|^)\\d+$/,\n /** 中文、字母、数字 */\n chineseEnglishNumber: /^[\\u4e00-\\u9fa5\\w]+$/,\n /** 浮点数 */\n floatNumber: /^(-?[1-9]\\d*\\.\\d+|-?0\\.\\d*[1-9]\\d*|0\\.0+)$/,\n /** 严格浮点数 */\n strictFloatNumber: /^(-?[1-9]\\d*\\.\\d+|-?0\\.\\d*[1-9])$/,\n\n // ── 身份证 ──────────────────────────────────────────────────────────────\n /** 二代身份证 */\n idcard: /^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]$/,\n /** 香港身份证 */\n hkIdcard: /^[a-zA-Z]\\d{6}\\([\\dA]\\)$/,\n /** 澳门身份证 */\n amIdcard: /^[1|5|7]\\d{6}\\(\\d\\)$/,\n /** 台湾身份证 */\n twIdcard: /^[a-zA-Z][0-9]{9}$/,\n\n // ── 邮箱 ────────────────────────────────────────────────────────────────\n /** 邮箱(符合 RFC 标准) */\n email: /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-_0-9]+\\.)+[a-zA-Z]{2,}))$/,\n /** 中文邮箱 */\n chineseEmail: /^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$/,\n\n // ── 电话 ────────────────────────────────────────────────────────────────\n /** 手机号(宽松:13-19 开头) */\n phone: /^(?:(?:\\+|00)86)?1[3-9]\\d{9}$/,\n /** 手机号(严谨,基于工信部 2019 年最新公布号段) */\n strictPhone: /^(?:(?:\\+|00)86)?1(?:(?:3\\d)|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8\\d)|(?:9[189]))\\d{8}$/,\n /** 座机 */\n telphone: /^(?:(?:\\d{3}-)?\\d{8}|^(?:\\d{4}-)?\\d{7,8})(?:-\\d+)?$/,\n /** 手机机身号码(IMEI) */\n IMEI: /^\\d{15,17}$/,\n\n // ── URL / 地址 ──────────────────────────────────────────────────────────\n /** URL(http / https / ftp) */\n url: /^(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-.,@?^=%&:/~+#]*[\\w\\-@?^=%&/~+#])?/,\n /** URL(仅 http / https) */\n link: /^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-.,@?^=%&:/~+#]*[\\w\\-@?^=%&/~+#])?/,\n /** 磁力链接(宽松匹配) */\n magnet: /^magnet:\\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/,\n /** 图片地址 */\n image: /^https?:\\/\\/(.+\\/)+.+(\\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i,\n /** 视频地址 */\n video: /^https?:\\/\\/(.+\\/)+.+(\\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i,\n /** Base64 数据 URI */\n base64: /^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s]*?)\\s*$/i,\n /** 以 http/https 开头的绝对路径 */\n httpStart: /^(http|https):\\/\\/\\S*/,\n\n // ── IP ──────────────────────────────────────────────────────────────────\n /** 必须带端口号的网址或 IP */\n ipport: /^((ht|f)tps?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+:\\d{1,5}\\/?$/,\n /** IPv4(可带端口) */\n ipv4Port: /^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/,\n /** 子网掩码 */\n netmask: /^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(255|254|252|248|240|224|192|128|0)$/,\n\n // ── 时间 ────────────────────────────────────────────────────────────────\n /** 24 小时制时间(HH:mm:ss) */\n '24Time': /^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$/,\n /** 12 小时制时间(hh:mm:ss) */\n '12Time': /^(?:1[0-2]|0?[1-9]):[0-5]\\d:[0-5]\\d$/,\n /** 日期(宽松,如 2022-9-1) */\n date: /^\\d{1,4}(-)(1[0-2]|0?[1-9])\\1(0?[1-9]|[1-2]\\d|30|31)$/,\n /** 日期(严谨,支持闰年判断) */\n strictDate: /^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$/,\n\n // ── 其他 ────────────────────────────────────────────────────────────────\n /** QQ 号 */\n qq: /^[1-9][0-9]{4,10}$/,\n /** 微信号(6-20 位,字母开头) */\n wx: /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/,\n /** 邮政编码(中国) */\n postal: /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\\d{4}$/,\n /** 匹配连续重复字符 */\n double: /(.)\\1+/g,\n /** 密码强度(最少 6 位,含大小写字母、数字、特殊字符各至少 1 个) */\n passwordCheck: /^\\S*(?=\\S{6,})(?=\\S*\\d)(?=\\S*[A-Z])(?=\\S*[a-z])(?=\\S*[!@#$%^&*? ])\\S*$/,\n /** 16 进制颜色值 */\n color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,\n} as const\n","/**\n * 数组工具\n */\n\n/**\n * 数组去重(基于 Set,时间复杂度 O(n))\n * @example Unique([1, 2, 1, 3]) // [1, 2, 3]\n * @remarks\n * 浏览器兼容性:Chrome 38+ · Firefox 13+ · Safari 7.1+ · Node.js 0.12+\n *\n * 依赖 `Set`(ES2015)。\n */\nexport const Unique = <T>(arr: T[]): T[] => [...new Set(arr)]\n\n/**\n * 按对象指定 key 的值去重,保留首次出现的元素\n * @param arr 待去重数组\n * @param key 用于去重的对象属性名\n * @example\n * UniqueByKey([{ id: 1, name: 'a' }, { id: 1, name: 'b' }], 'id')\n * // [{ id: 1, name: 'a' }]\n * @remarks\n * 浏览器兼容性:Chrome 38+ · Firefox 13+ · Safari 7.1+ · Node.js 0.12+\n *\n * 依赖 `Set`(ES2015)。\n */\nexport const UniqueByKey = <T extends object>(arr: T[], key: keyof T): T[] => {\n const seen = new Set<unknown>()\n const result: T[] = []\n for (const item of arr) {\n const k = item[key]\n if (!seen.has(k)) {\n seen.add(k)\n result.push(item)\n }\n }\n return result\n}\n\n/**\n * 差集:返回只在 arr 中存在、不在 other 中存在的元素(基于 Set,时间复杂度 O(n))\n * @param arr 基础数组\n * @param other 比较数组\n * @example Minus([1, 2, 3], [2, 3, 4]) // [1]\n * @remarks\n * 浏览器兼容性:Chrome 38+ · Firefox 13+ · Safari 7.1+ · Node.js 0.12+\n *\n * 依赖 `Set`(ES2015)。\n */\nexport const Minus = <T>(arr: T[], other: T[]): T[] => {\n const otherSet = new Set(other)\n return arr.filter(item => !otherSet.has(item))\n}\n","/**\n * 对象工具\n */\n\n/**\n * 深拷贝对象或数组。\n *\n * 优先使用原生 `structuredClone`(支持 Date、RegExp、Map、Set、循环引用等),\n * 降级为 JSON 序列化(不支持 undefined、函数、循环引用)。\n * @example DeepClone({ a: { b: 1 } }) // { a: { b: 1 } }(新对象)\n * @remarks\n * 浏览器兼容性:\n * - `structuredClone`(优先):Chrome 98+ · Firefox 94+ · Safari 15.4+ · Node.js 17.0+\n * - JSON 降级(自动回退):Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 在不支持 `structuredClone` 的环境中自动降级为 `JSON.parse(JSON.stringify(obj))`,\n * 降级时不支持 `undefined`、函数、`Date`、`RegExp`、循环引用。\n */\nexport const DeepClone = <T>(obj: T): T => {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj)\n }\n // 降级:仅适用于纯 JSON 可序列化的数据\n return JSON.parse(JSON.stringify(obj)) as T\n}\n\n/**\n * 删除对象中值为 null 或 undefined 的属性,返回新对象(不修改原对象)。\n *\n * 注意:空字符串、false、0 等假值不会被删除。\n * @example CleanObject({ a: 1, b: null, c: undefined }) // { a: 1 }\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const CleanObject = <T extends object>(obj: T): Partial<T> => {\n const result = {} as Partial<T>\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const val = obj[key]\n if (val !== null && val !== undefined) {\n result[key] = val\n }\n }\n }\n return result\n}\n\n/**\n * 按 key 列表提取对象子集,返回新对象(类型安全)。\n * @example Pick({ a: 1, b: 2, c: 3 }, ['a', 'c']) // { a: 1, c: 3 }\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n */\nexport const Pick = <T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> => {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key]\n }\n }\n return result\n}\n\n/**\n * 排除指定 key 后返回新对象(类型安全)。\n * @example Omit({ a: 1, b: 2, c: 3 }, ['b']) // { a: 1, c: 3 }\n * @remarks\n * 浏览器兼容性:Chrome 38+ · Firefox 13+ · Safari 7.1+ · Node.js 0.12+\n *\n * 依赖 `Set`(ES2015)。\n */\nexport const Omit = <T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> => {\n const excludeSet = new Set<keyof T>(keys)\n const result = {} as Omit<T, K>\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && !excludeSet.has(key as keyof T)) {\n (result as Record<string, unknown>)[key] = obj[key]\n }\n }\n return result\n}\n","/**\n * 函数工具\n */\n\n/**\n * 防抖:在最后一次调用后等待 delay 毫秒再执行(trailing edge)。\n *\n * 适合搜索输入、窗口 resize、表单提交等场景。\n * @param fn 要防抖的函数\n * @param delay 延迟毫秒数,默认 300ms\n * @example\n * const handleInput = Debounce((val: string) => search(val), 500)\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 依赖 `setTimeout` / `clearTimeout`,全平台支持。\n */\nexport const Debounce = <T extends (...args: Parameters<T>) => ReturnType<T>>(\n fn: T,\n delay = 300\n): ((...args: Parameters<T>) => void) => {\n let timer: ReturnType<typeof setTimeout> | null = null\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n if (timer !== null) clearTimeout(timer)\n timer = setTimeout(() => {\n fn.apply(this, args)\n timer = null\n }, delay)\n }\n}\n\n/**\n * 节流:在 delay 毫秒内最多执行一次(leading edge,时间戳实现)。\n *\n * 适合滚动监听、mousemove、高频点击等场景。\n * @param fn 要节流的函数\n * @param delay 节流间隔毫秒数,默认 50ms\n * @example\n * const handleScroll = Throttle(() => updatePosition(), 100)\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 依赖 `Date.now()`,无 `setTimeout` 悬空回调风险。\n */\nexport const Throttle = <T extends (...args: Parameters<T>) => ReturnType<T>>(\n fn: T,\n delay = 50\n): ((...args: Parameters<T>) => void) => {\n let lastTime = 0\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n const now = Date.now()\n if (now - lastTime >= delay) {\n lastTime = now\n fn.apply(this, args)\n }\n }\n}\n\n/**\n * Promise 延迟:等待指定毫秒数后 resolve。\n * @param ms 延迟毫秒数\n * @example await Delay(1000) // 等待 1 秒\n * @remarks\n * 浏览器兼容性:Chrome 32+ · Firefox 29+ · Safari 8+ · Node.js 0.12+\n *\n * 依赖 `Promise`(ES2015)和 `setTimeout`。\n */\nexport const Delay = (ms: number): Promise<void> =>\n new Promise(resolve => setTimeout(resolve, ms))\n","/**\n * 字符串 / UUID / URL 工具\n */\n\n/**\n * 生成标准 RFC 4122 v4 UUID。\n *\n * 优先使用 `crypto.randomUUID()`(现代浏览器 / Node.js 19+),\n * 降级为基于 `crypto.getRandomValues` 的手动实现。\n * @example UUID() // 'f47ac10b-58cc-4372-a567-0e02b2c3d479'\n * @remarks\n * 浏览器兼容性:\n * - `crypto.randomUUID()`(优先):Chrome 92+ · Firefox 95+ · Safari 15.4+ · Node.js 19.0+\n * - `crypto.getRandomValues` 降级:Chrome 11+ · Firefox 21+ · Safari 6.1+ · Node.js 15.0+\n *\n * Node.js 14.17+ 可通过 `import { randomUUID } from 'crypto'` 单独使用,\n * 但全局 `crypto` 对象需 Node.js 15.0+ 才可用。\n */\nexport const UUID = (): string => {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n // 降级:RFC 4122 v4,使用 crypto.getRandomValues 保证随机性\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const arr = new Uint8Array(1)\n crypto.getRandomValues(arr)\n const r = arr[0] & 0xf\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n/**\n * 从 URL 中获取指定查询参数的值,不存在则返回空字符串。\n * @param name 参数名\n * @param url 目标 URL,默认取 `window.location.href`\n * @example GetURLParam('page', 'https://example.com?page=2&size=10') // '2'\n * @remarks\n * 浏览器兼容性:Chrome 49+ · Firefox 44+ · Safari 10.1+ · Node.js 10.0+\n *\n * 依赖 `URL` API 和 `URLSearchParams`(WHATWG URL Standard)。\n * 若 URL 格式非法会静默返回空字符串。\n */\nexport const GetURLParam = (\n name: string,\n url: string = typeof window !== 'undefined' ? window.location.href : ''\n): string => {\n try {\n return new URL(url).searchParams.get(name) ?? ''\n } catch {\n return ''\n }\n}\n\n/**\n * 获取 URL 中所有查询参数,以键值对对象返回。\n *\n * 若同名参数出现多次,取最后一个值。\n * @param url 目标 URL,默认取 `window.location.href`\n * @example GetURLParams('https://example.com?a=1&b=2') // { a: '1', b: '2' }\n * @remarks\n * 浏览器兼容性:Chrome 49+ · Firefox 44+ · Safari 10.1+ · Node.js 10.0+\n *\n * 依赖 `URL` API 和 `URLSearchParams`(WHATWG URL Standard)。\n * 若 URL 格式非法会静默返回空对象。\n */\nexport const GetURLParams = (\n url: string = typeof window !== 'undefined' ? window.location.href : ''\n): Record<string, string> => {\n try {\n const result: Record<string, string> = {}\n new URL(url).searchParams.forEach((val, key) => {\n result[key] = val\n })\n return result\n } catch {\n return {}\n }\n}\n\n/**\n * 将对象转换为 URL 查询字符串(以 `?` 开头)。\n *\n * 值为 null / undefined 的属性会被跳过,特殊字符自动编码。\n * @example ObjectToQuery({ page: 1, size: 10 }) // '?page=1&size=10'\n * @example ObjectToQuery({}) // ''\n * @remarks\n * 浏览器兼容性:Chrome 49+ · Firefox 44+ · Safari 10.1+ · Node.js 10.0+\n *\n * 依赖 `URLSearchParams`(WHATWG URL Standard)。\n * 空格编码为 `+`(application/x-www-form-urlencoded 规范),\n * 与 `encodeURIComponent` 的 `%20` 编码略有差异。\n */\nexport const ObjectToQuery = (obj: Record<string, unknown>): string => {\n const params = new URLSearchParams()\n for (const [key, val] of Object.entries(obj)) {\n if (val !== null && val !== undefined) {\n params.append(key, String(val))\n }\n }\n const str = params.toString()\n return str ? `?${str}` : ''\n}\n\n/**\n * 将查询字符串解析为键值对对象。\n *\n * 支持以 `?` 开头或不以 `?` 开头的格式,自动解码编码字符。\n * @example QueryToObject('?a=1&b=hello%20world') // { a: '1', b: 'hello world' }\n * @remarks\n * 浏览器兼容性:Chrome 49+ · Firefox 44+ · Safari 10.1+ · Node.js 10.0+\n *\n * 依赖 `URLSearchParams`(WHATWG URL Standard)。\n */\nexport const QueryToObject = (query: string): Record<string, string> => {\n const str = query.startsWith('?') ? query.slice(1) : query\n const result: Record<string, string> = {}\n new URLSearchParams(str).forEach((val, key) => {\n result[key] = val\n })\n return result\n}\n\n/**\n * 将文本写入系统剪贴板。\n *\n * 优先使用现代 `navigator.clipboard.writeText()` API(异步、安全上下文);\n * 在不支持或非安全上下文(非 HTTPS / localhost)时,降级为\n * `document.execCommand('copy')`(已废弃但兼容性广)。\n *\n * @returns 成功时 resolve `true`,失败时 resolve `false`(不抛出异常)\n *\n * @example\n * ```ts\n * const ok = await CopyToClipboard('Hello World')\n * if (!ok) console.warn('复制失败')\n * ```\n *\n * @remarks\n * 浏览器兼容性:\n * - `navigator.clipboard`(优先):Chrome 66+ · Firefox 63+ · Safari 13.1+(需 HTTPS 或 localhost)\n * - `execCommand` 降级:Chrome 1+ · Firefox 41+ · Safari 10+\n */\nexport const CopyToClipboard = async (str: string): Promise<boolean> => {\n // 优先使用现代 Clipboard API\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n try {\n await navigator.clipboard.writeText(str)\n return true\n } catch {\n // 降级到 execCommand\n }\n }\n // 降级:textarea + execCommand\n try {\n const el = document.createElement('textarea')\n el.value = str\n el.setAttribute('readonly', '')\n el.style.cssText = 'position:absolute;left:-9999px;top:-9999px'\n document.body.appendChild(el)\n const selection = document.getSelection()\n const prevRange = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null\n el.select()\n const ok = document.execCommand('copy')\n document.body.removeChild(el)\n if (prevRange && selection) {\n selection.removeAllRanges()\n selection.addRange(prevRange)\n }\n return ok\n } catch {\n return false\n }\n}\n","/**\n * 时间日期工具\n */\n\n/**\n * 格式化日期时间。\n *\n * 支持占位符:`yyyy`(年)、`MM`(月)、`dd`(日)、`HH`(24 小时制小时)、`mm`(分钟)、`ss`(秒)。\n * @param date 日期,默认当前时间,支持 Date 对象、日期字符串、时间戳\n * @param format 格式字符串,默认 `'yyyy-MM-dd HH:mm:ss'`\n * @example FormatDate(new Date('2024-01-05 09:05:03')) // '2024-01-05 09:05:03'\n * @example FormatDate(new Date('2024-01-05'), 'yyyy/MM/dd') // '2024/01/05'\n * @example FormatDate(new Date('2024-01-05'), 'yy-MM-dd') // '24-01-05'\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 依赖原生 `Date` API,全平台支持。\n * 传入非法日期字符串时返回空字符串。\n */\nexport const FormatDate = (\n date: Date | string | number = new Date(),\n format = 'yyyy-MM-dd HH:mm:ss'\n): string => {\n const d = date instanceof Date ? date : new Date(date)\n if (isNaN(d.getTime())) return ''\n\n const map: Record<string, number> = {\n 'M+': d.getMonth() + 1,\n 'd+': d.getDate(),\n 'H+': d.getHours(),\n 'm+': d.getMinutes(),\n 's+': d.getSeconds(),\n }\n\n // 年份单独处理(支持 yy / yyyy)\n let result = format.replace(/(y+)/, (_, p: string) =>\n String(d.getFullYear()).slice(4 - p.length)\n )\n\n for (const [pattern, value] of Object.entries(map)) {\n result = result.replace(new RegExp(`(${pattern})`), (_, p: string) =>\n String(value).padStart(p.length, '0')\n )\n }\n\n return result\n}\n\n/**\n * 获取指定日期偏移 N 天后的日期字符串。\n *\n * 正数表示往后,负数表示往前。不修改传入的 Date 对象。\n * @param date 基准日期,默认当前时间\n * @param days 偏移天数(正数往后,负数往前)\n * @param format 格式字符串,默认 `'yyyy-MM-dd HH:mm:ss'`\n * @example GetDateOffset(new Date('2024-01-10'), 3, 'yyyy-MM-dd') // '2024-01-13'\n * @example GetDateOffset(new Date('2024-01-10'), -3, 'yyyy-MM-dd') // '2024-01-07'\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 依赖原生 `Date` API,全平台支持。\n */\nexport const GetDateOffset = (\n date: Date = new Date(),\n days = 0,\n format = 'yyyy-MM-dd HH:mm:ss'\n): string => {\n const d = new Date(date.getTime())\n d.setDate(d.getDate() + days)\n return FormatDate(d, format)\n}\n\n/**\n * 获取指定日期当天的开始时间戳(00:00:00.000)和结束时间戳(23:59:59.999)。\n * @param date 指定日期,默认当前时间\n * @example GetDayRange(new Date('2024-01-05'))\n * // { start: 1704384000000, end: 1704470399999 }\n * @remarks\n * 浏览器兼容性:Chrome 5+ · Firefox 3+ · Safari 4+ · Node.js 0.10+\n *\n * 依赖原生 `Date` API,全平台支持。\n * 时间戳基于本地时区计算。\n */\nexport const GetDayRange = (\n date: Date = new Date()\n): { start: number; end: number } => {\n const y = date.getFullYear()\n const m = date.getMonth()\n const d = date.getDate()\n return {\n start: new Date(y, m, d, 0, 0, 0, 0).getTime(),\n end: new Date(y, m, d, 23, 59, 59, 999).getTime(),\n }\n}\n"]}
|
package/dist/cjs/debugger.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkLQ5WJVQX_cjs = require('./chunk-LQ5WJVQX.cjs');
|
|
4
4
|
var chunkUNFUIZVY_cjs = require('./chunk-UNFUIZVY.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "Debugger", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkLQ5WJVQX_cjs.Debugger; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "DEBUGGER_ACTIVE_KEY", {
|
|
13
13
|
enumerable: true,
|