@snack-kit/lib 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +261 -17
  2. package/dist/cjs/chunk-IMHC6CTK.cjs +13 -0
  3. package/dist/{es/chunk-BEL6AFK4.js.map → cjs/chunk-IMHC6CTK.cjs.map} +1 -1
  4. package/dist/cjs/{chunk-N7BJS6LI.cjs → chunk-XEQEQWDB.cjs} +48 -14
  5. package/dist/cjs/chunk-XEQEQWDB.cjs.map +1 -0
  6. package/dist/cjs/{chunk-YOWLTZM5.cjs → chunk-ZJMTV2GJ.cjs} +7 -6
  7. package/dist/cjs/chunk-ZJMTV2GJ.cjs.map +1 -0
  8. package/dist/cjs/debugger.cjs +7 -3
  9. package/dist/cjs/http.cjs +22 -14
  10. package/dist/cjs/index.cjs +29 -17
  11. package/dist/cjs/index.cjs.map +1 -1
  12. package/dist/es/{chunk-4DLFIN3C.js → chunk-4SGFAIRT.js} +4 -3
  13. package/dist/es/chunk-4SGFAIRT.js.map +1 -0
  14. package/dist/es/chunk-MHCY2PIP.js +3 -0
  15. package/dist/{cjs/chunk-YY5WQN7B.cjs.map → es/chunk-MHCY2PIP.js.map} +1 -1
  16. package/dist/es/{chunk-JQYH5FWE.js → chunk-YV6SGXUJ.js} +48 -15
  17. package/dist/es/chunk-YV6SGXUJ.js.map +1 -0
  18. package/dist/es/debugger.js +2 -2
  19. package/dist/es/http.js +2 -2
  20. package/dist/es/index.js +4 -4
  21. package/dist/es/index.js.map +1 -1
  22. package/dist/types/context-C4dFUDbw.d.ts +237 -0
  23. package/dist/types/debugger.d.ts +3 -0
  24. package/dist/types/http.d.ts +61 -236
  25. package/dist/types/index.d.ts +4 -3
  26. package/dist/umd/debugger.global.js +28 -5
  27. package/dist/umd/debugger.global.js.map +1 -1
  28. package/dist/umd/http.global.js +46 -12
  29. package/dist/umd/http.global.js.map +1 -1
  30. package/dist/umd/index.global.js +49 -13
  31. package/dist/umd/index.global.js.map +1 -1
  32. package/package.json +1 -1
  33. package/dist/cjs/chunk-N7BJS6LI.cjs.map +0 -1
  34. package/dist/cjs/chunk-YOWLTZM5.cjs.map +0 -1
  35. package/dist/cjs/chunk-YY5WQN7B.cjs +0 -4
  36. package/dist/es/chunk-4DLFIN3C.js.map +0 -1
  37. package/dist/es/chunk-BEL6AFK4.js +0 -3
  38. package/dist/es/chunk-JQYH5FWE.js.map +0 -1
package/README.md CHANGED
@@ -1,36 +1,280 @@
1
1
  # @snack-kit/lib
2
2
 
3
- Enterprise-grade utility library.
3
+ 企业级通用工具库,提供 HTTP 客户端、调试面板、通用工具函数等模块,全栈 TypeScript,支持 ESM / CJS / UMD 三种格式。
4
4
 
5
- ## Installation
5
+ ## 安装
6
6
 
7
7
  ```bash
8
8
  npm install @snack-kit/lib
9
9
  ```
10
10
 
11
- ## Usage
11
+ ## 模块
12
+
13
+ | 入口 | 说明 |
14
+ |------|------|
15
+ | `@snack-kit/lib` | 聚合入口,导出全部模块 |
16
+ | `@snack-kit/lib/http` | HTTP 客户端、Context 路由映射 |
17
+ | `@snack-kit/lib/debugger` | 开发调试面板 |
18
+ | `@snack-kit/lib/utils` | 通用工具函数 |
19
+
20
+ ---
21
+
22
+ ## HTTP 模块
23
+
24
+ ### 快速开始
12
25
 
13
26
  ```ts
14
- import { VERSION } from '@snack-kit/lib'
27
+ import { Get, Post, Context } from '@snack-kit/lib/http'
28
+
29
+ // 加载路由映射(生产环境无需传参,自动使用当前 Origin)
30
+ await Context.load()
31
+
32
+ // 发起请求
33
+ const { data, error } = await Get<{ name: string }>('/api/user/1', { ctx: 'user-svc' })
34
+ if (error) console.error(error.message)
35
+ else console.log(data?.name)
15
36
  ```
16
37
 
17
- ## Scripts
38
+ ### 请求方法
39
+
40
+ 所有方法均支持**两种调用形式**:
18
41
 
19
- | Command | Description |
20
- |---|---|
21
- | `npm run build` | Build for production (ESM + CJS + types) |
22
- | `npm run build:watch` | Build in watch mode |
23
- | `npm run test` | Run tests |
24
- | `npm run test:coverage` | Run tests with coverage |
25
- | `npm run docs` | Generate API docs |
26
- | `npm run lint` | Type-check source |
27
- | `npm run release` | Build and publish to npm |
42
+ ```ts
43
+ // 位置参数形式
44
+ Get(url, config?)
45
+ Post(url, data?, config?)
46
+ Put(url, data?, config?)
47
+ Patch(url, data?, config?)
48
+ Del(url, config?)
49
+
50
+ // 配置对象形式(method 已预置,无需传入)
51
+ Get({ url, ...config })
52
+ Post({ url, data, ...config })
53
+ ```
54
+
55
+ **示例:**
56
+
57
+ ```ts
58
+ import { Get, Post, Del } from '@snack-kit/lib/http'
28
59
 
29
- ## Documentation
60
+ // GET
61
+ const { data } = await Get('/api/users', { ctx: 'user-svc' })
62
+
63
+ // POST - 位置参数
64
+ await Post('/api/user', { name: 'Alice' }, { ctx: 'user-svc' })
65
+
66
+ // POST - 配置对象
67
+ await Post({ url: '/api/user', data: { name: 'Alice' }, ctx: 'user-svc' })
68
+
69
+ // DELETE
70
+ await Del('/api/user/1')
71
+ ```
72
+
73
+ ### Context 路由映射
74
+
75
+ ```ts
76
+ import { Context } from '@snack-kit/lib/http'
77
+
78
+ // 生产环境:无参调用,自动以当前页面 Origin 为网关请求 /ngw/context
79
+ await Context.load()
80
+
81
+ // 指定网关地址
82
+ await Context.load('http://172.16.32.155:20000')
83
+
84
+ // 本地注入(测试 / Mock 场景)
85
+ await Context.load({ 'user-svc': 'http://user.api.com' })
86
+
87
+ Context.get('user-svc') // 'http://user.api.com'
88
+ Context.info // { version, domain, client, lang }
89
+ Context.loaded // true
90
+ ```
30
91
 
31
- - [Contributing](docs/CONTRIBUTING.md)
32
- - [API Reference](docs/api/index.html) *(generated)*
92
+ ### 请求取消
93
+
94
+ ```ts
95
+ import { Get, Cancel, CancelAll } from '@snack-kit/lib/http'
96
+
97
+ let cancelId = ''
98
+ Get('/api/list', { onCancelId: (id) => { cancelId = id } })
99
+
100
+ Cancel(cancelId) // 取消单个请求
101
+ CancelAll() // 取消所有进行中的请求
102
+ ```
103
+
104
+ ### 直接使用 axios
105
+
106
+ http 模块同时导出了原始 axios 实例及其常用类型,无需单独安装 `axios`:
107
+
108
+ ```ts
109
+ import { axios } from '@snack-kit/lib/http'
110
+ import type { AxiosRequestConfig, AxiosResponse, AxiosInstance, AxiosError } from '@snack-kit/lib/http'
111
+
112
+ // 直接使用 axios 实例
113
+ const res = await axios.get('https://api.example.com/data')
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Debugger 模块
119
+
120
+ 在开发环境挂载调试面板,支持切换网关、选择目标服务,并自动加载对应的路由映射。
121
+
122
+ ```ts
123
+ import { Debugger } from '@snack-kit/lib/debugger'
124
+
125
+ // 仅在非生产环境加载
126
+ if (import.meta.env.DEV) {
127
+ await Debugger.init({
128
+ gateways: [
129
+ 'http://dev-gateway.example.com',
130
+ 'http://test-gateway.example.com',
131
+ ],
132
+ })
133
+ }
134
+
135
+ // 生产环境正常调用,Debugger 未激活时自动以 Origin 加载
136
+ await Context.load()
137
+ ```
138
+
139
+ > 调用 `Debugger.init()` 后,`Context.load()` 无参调用会自动跳过,由调试面板接管加载时机。
140
+
141
+ ---
142
+
143
+ ## Utils 模块
144
+
145
+ ### 类型检测
146
+
147
+ ```ts
148
+ import { IsNumber, IsString, IsArray, IsObject, IsNull, IsEqual } from '@snack-kit/lib/utils'
149
+
150
+ IsNumber('42') // true
151
+ IsObject([]) // false(数组不算对象)
152
+ IsNull(undefined) // true
153
+ IsEqual({ a: 1 }, { a: 1 }) // true
154
+ ```
155
+
156
+ ### 输入校验
157
+
158
+ ```ts
159
+ import { IsEmail, IsPhone, IsUrl, IsIpv4, REGEX } from '@snack-kit/lib/utils'
160
+
161
+ IsEmail('user@example.com') // true
162
+ IsPhone('13812345678') // true
163
+ IsUrl('https://example.com') // true
164
+ REGEX.color.test('#fff') // true
165
+ ```
166
+
167
+ ### 数组工具
168
+
169
+ ```ts
170
+ import { Unique, UniqueByKey, Minus } from '@snack-kit/lib/utils'
171
+
172
+ Unique([1, 2, 1, 3]) // [1, 2, 3]
173
+ UniqueByKey([{ id: 1 }, { id: 1 }, { id: 2 }], 'id') // [{ id: 1 }, { id: 2 }]
174
+ Minus([1, 2, 3], [2, 3]) // [1]
175
+ ```
176
+
177
+ ### 对象工具
178
+
179
+ ```ts
180
+ import { DeepClone, CleanObject, Pick, Omit } from '@snack-kit/lib/utils'
181
+
182
+ DeepClone({ a: { b: 1 } }) // 深拷贝新对象
183
+ CleanObject({ a: 1, b: null, c: undefined }) // { a: 1 }
184
+ Pick({ a: 1, b: 2, c: 3 }, ['a', 'c']) // { a: 1, c: 3 }
185
+ Omit({ a: 1, b: 2, c: 3 }, ['b']) // { a: 1, c: 3 }
186
+ ```
187
+
188
+ ### 函数工具
189
+
190
+ ```ts
191
+ import { Debounce, Throttle, Delay } from '@snack-kit/lib/utils'
192
+
193
+ const handleInput = Debounce((val: string) => search(val), 500)
194
+ const handleScroll = Throttle(() => updatePosition(), 100)
195
+ await Delay(1000) // 等待 1 秒
196
+ ```
197
+
198
+ ### 字符串 / URL 工具
199
+
200
+ ```ts
201
+ import { UUID, GetURLParam, GetURLParams, ObjectToQuery, QueryToObject } from '@snack-kit/lib/utils'
202
+
203
+ UUID() // 'f47ac10b-58cc-4372-a567-0e02b2c3d479'
204
+ GetURLParam('page', 'https://example.com?page=2') // '2'
205
+ GetURLParams('https://example.com?a=1&b=2') // { a: '1', b: '2' }
206
+ ObjectToQuery({ page: 1, size: 10 }) // '?page=1&size=10'
207
+ QueryToObject('?a=1&b=2') // { a: '1', b: '2' }
208
+ ```
209
+
210
+ ### 时间工具
211
+
212
+ ```ts
213
+ import { FormatDate, GetDateOffset, GetDayRange } from '@snack-kit/lib/utils'
214
+
215
+ FormatDate(new Date(), 'yyyy-MM-dd') // '2026-03-02'
216
+ GetDateOffset(new Date(), -7, 'yyyy-MM-dd') // 7 天前的日期
217
+ GetDayRange(new Date()) // { start: 1740844800000, end: 1740931199999 }
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 开发脚本
223
+
224
+ | 命令 | 说明 |
225
+ |------|------|
226
+ | `npm run build` | 构建生产包(ESM + CJS + UMD + 类型声明) |
227
+ | `npm run build:watch` | 监听模式构建 |
228
+ | `npm run test` | 运行单元测试 |
229
+ | `npm run test:coverage` | 运行测试并生成覆盖率报告 |
230
+ | `npm run docs` | 生成 API 文档 |
231
+ | `npm run lint` | TypeScript 类型检查 |
232
+ | `npm run release` | 构建并发布到 npm |
233
+
234
+ ## API 文档
235
+
236
+ 执行 `npm run docs` 后在 `docs/api/index.html` 查看完整 API 文档。
33
237
 
34
238
  ## License
35
239
 
36
240
  MIT
241
+
242
+ ---
243
+
244
+ ## Changelog
245
+
246
+ ### 0.4.0
247
+
248
+ - **[http]** `Get` / `Post` / `Put` / `Patch` / `Del` 新增配置对象入参形式,`method` 由方法预置无需重复传入
249
+ - **[http]** 新增导出类型 `HttpMethodConfig`(`Omit<HttpRequestConfig, 'method'>`)
250
+ - **[http]** 导出原始 `axios` 实例及 `AxiosRequestConfig` / `AxiosResponse` / `AxiosInstance` / `AxiosError` 类型,无需单独安装 `axios`
251
+
252
+ ### 0.3.0
253
+
254
+ - **[http]** `Context.load()` 参数改为可选:
255
+ - 无参 + Debugger 已激活 → 跳过,由调试面板接管加载
256
+ - 无参 + Debugger 未激活 → 自动以当前页面 `Origin` 为网关请求 `/ngw/context`
257
+ - **[http]** 导出 `DEBUGGER_ACTIVE_KEY` 常量,供 Debugger 模块写入全局标志位
258
+ - **[debugger]** `Debugger.init()` 执行时向 `globalThis` 写入激活标志位
259
+ - **[debugger]** 导出 `DEBUGGER_ACTIVE_KEY`
260
+
261
+ ### 0.2.0
262
+
263
+ - **[utils]** 新增 `utils` 模块,包含以下子模块:
264
+ - `detect`:类型检测(`IsNumber` / `IsString` / `IsArray` / `IsObject` / `IsNull` / `IsEqual` 等)
265
+ - `validate`:输入校验与常用正则(`IsEmail` / `IsPhone` / `IsUrl` / `IsIpv4` / `REGEX` 等)
266
+ - `array`:数组工具(`Unique` / `UniqueByKey` / `Minus`)
267
+ - `object`:对象工具(`DeepClone` / `CleanObject` / `Pick` / `Omit`)
268
+ - `func`:函数工具(`Debounce` / `Throttle` / `Delay`)
269
+ - `string`:字符串工具(`UUID` / `GetURLParam` / `GetURLParams` / `ObjectToQuery` / `QueryToObject`)
270
+ - `time`:时间工具(`FormatDate` / `GetDateOffset` / `GetDayRange`)
271
+ - **[utils]** 所有方法 JSDoc 标注浏览器兼容性范围
272
+ - **[build]** `tsup.config.ts` 与 `package.json` 新增 `utils` 独立打包入口与导出字段
273
+
274
+ ### 0.1.0
275
+
276
+ - 初始版本
277
+ - **[http]** HTTP 客户端模块:`Request` / `Get` / `Post` / `Put` / `Patch` / `Del`
278
+ - **[http]** Context 路由映射:`Context` / `Origin` / `Ctx`
279
+ - **[http]** 请求取消:`Cancel` / `CancelAll`
280
+ - **[debugger]** 开发调试面板:`Debugger.init()`
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var axios = require('axios');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
8
+
9
+
10
+
11
+ module.exports = axios__default.default;
12
+ //# sourceMappingURL=chunk-IMHC6CTK.cjs.map
13
+ //# sourceMappingURL=chunk-IMHC6CTK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-BEL6AFK4.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-IMHC6CTK.cjs","sourcesContent":[]}
@@ -7,6 +7,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
7
  var axios__default = /*#__PURE__*/_interopDefault(axios);
8
8
 
9
9
  // src/http/context.ts
10
+ var DEBUGGER_ACTIVE_KEY = "__snackkit_debugger__active";
10
11
  var HttpContext = class {
11
12
  constructor() {
12
13
  this._store = /* @__PURE__ */ new Map();
@@ -15,12 +16,24 @@ var HttpContext = class {
15
16
  /**
16
17
  * 加载服务地址映射
17
18
  *
19
+ * 支持三种调用方式:
20
+ * - **传入字符串**:作为网关地址,自动请求 `GET /ngw/context` 获取映射表
21
+ * - **传入对象**:直接注入键值映射,不发起网络请求
22
+ * - **不传参数**:
23
+ * - 生产环境(`NODE_ENV === 'production'`):以当前页面 `Origin` 为网关地址自动加载
24
+ * - 开发环境:立即返回,不做任何操作(应由 `Debugger.init()` 接管加载流程)
25
+ *
18
26
  * 远程加载时,响应中的 `$info` 元数据字段会被单独存储,不计入路由映射表。
19
27
  *
20
- * @param source 远程加载传入网关 URL;本地注入传入键值对象
28
+ * @param source 网关 URL / 键值对象 / 省略
21
29
  * @param timeout 远程加载超时(ms),默认 5000
22
30
  *
23
- * @example 远程加载
31
+ * @example 不传参——生产环境自动使用当前页面 Origin
32
+ * ```ts
33
+ * await Context.load()
34
+ * ```
35
+ *
36
+ * @example 传入网关地址
24
37
  * ```ts
25
38
  * await Context.load('http://172.16.32.155:20000', 3000)
26
39
  * ```
@@ -31,6 +44,11 @@ var HttpContext = class {
31
44
  * ```
32
45
  */
33
46
  async load(source, timeout = 5e3) {
47
+ if (source === void 0) {
48
+ if (globalThis[DEBUGGER_ACTIVE_KEY]) return;
49
+ if (!Origin) return;
50
+ source = Origin;
51
+ }
34
52
  if (typeof source === "string") {
35
53
  const url = `${source}/ngw/context`;
36
54
  const res = await axios__default.default.get(url, { timeout });
@@ -182,26 +200,42 @@ async function Request(config) {
182
200
  Unregister(cancelId);
183
201
  }
184
202
  }
185
- function Get(url, config) {
186
- return Request({ ...config, method: "GET", url });
203
+ function Get(urlOrConfig, config) {
204
+ if (typeof urlOrConfig === "string") {
205
+ return Request({ ...config, method: "GET", url: urlOrConfig });
206
+ }
207
+ return Request({ ...urlOrConfig, method: "GET" });
187
208
  }
188
- function Post(url, data, config) {
189
- return Request({ ...config, method: "POST", url, data });
209
+ function Post(urlOrConfig, data, config) {
210
+ if (typeof urlOrConfig === "string") {
211
+ return Request({ ...config, method: "POST", url: urlOrConfig, data });
212
+ }
213
+ return Request({ ...urlOrConfig, method: "POST" });
190
214
  }
191
- function Put(url, data, config) {
192
- return Request({ ...config, method: "PUT", url, data });
215
+ function Put(urlOrConfig, data, config) {
216
+ if (typeof urlOrConfig === "string") {
217
+ return Request({ ...config, method: "PUT", url: urlOrConfig, data });
218
+ }
219
+ return Request({ ...urlOrConfig, method: "PUT" });
193
220
  }
194
- function Patch(url, data, config) {
195
- return Request({ ...config, method: "PATCH", url, data });
221
+ function Patch(urlOrConfig, data, config) {
222
+ if (typeof urlOrConfig === "string") {
223
+ return Request({ ...config, method: "PATCH", url: urlOrConfig, data });
224
+ }
225
+ return Request({ ...urlOrConfig, method: "PATCH" });
196
226
  }
197
- function Del(url, config) {
198
- return Request({ ...config, method: "DELETE", url });
227
+ function Del(urlOrConfig, config) {
228
+ if (typeof urlOrConfig === "string") {
229
+ return Request({ ...config, method: "DELETE", url: urlOrConfig });
230
+ }
231
+ return Request({ ...urlOrConfig, method: "DELETE" });
199
232
  }
200
233
 
201
234
  exports.Cancel = Cancel;
202
235
  exports.CancelAll = CancelAll;
203
236
  exports.Context = Context;
204
237
  exports.Ctx = Ctx;
238
+ exports.DEBUGGER_ACTIVE_KEY = DEBUGGER_ACTIVE_KEY;
205
239
  exports.Del = Del;
206
240
  exports.Get = Get;
207
241
  exports.HttpContext = HttpContext;
@@ -210,5 +244,5 @@ exports.Patch = Patch;
210
244
  exports.Post = Post;
211
245
  exports.Put = Put;
212
246
  exports.Request = Request;
213
- //# sourceMappingURL=chunk-N7BJS6LI.cjs.map
214
- //# sourceMappingURL=chunk-N7BJS6LI.cjs.map
247
+ //# sourceMappingURL=chunk-XEQEQWDB.cjs.map
248
+ //# sourceMappingURL=chunk-XEQEQWDB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http/context.ts","../../src/http/cancel.ts","../../src/http/client.ts"],"names":["axios","isAxiosError"],"mappings":"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","file":"chunk-XEQEQWDB.cjs","sourcesContent":["import axios from 'axios'\nimport type { ContextInfo } from './types'\n\n/**\n * globalThis 上的标志位 key,由 `Debugger.init()` 写入。\n * `Context.load()` 无参数调用时,若检测到此标志则跳过自动加载,\n * 由 Debugger 负责在用户选择服务后调用 `Context.load(origin)`。\n */\nexport const DEBUGGER_ACTIVE_KEY = '__snackkit_debugger__active'\n\n/** 网关 `/ngw/context` 原始响应格式(包含路由映射和 `$info` 元数据) */\ninterface ContextResponse {\n $info?: ContextInfo\n [key: string]: string | ContextInfo | undefined\n}\n\n/**\n * 管理服务地址映射的上下文单例\n *\n * 支持三种加载方式:\n * - **不传参数**:生产环境自动以当前页面 Origin 为网关,开发环境由 `Debugger` 接管\n * - **远程加载**:传入网关 URL,自动请求 `GET /ngw/context` 获取映射表\n * - **本地注入**:直接传入键值对象,不发起网络请求\n *\n * @example 生产环境不传参(推荐)\n * ```ts\n * import { Context } from '@snack-kit/lib/http'\n *\n * await Context.load()\n * Context.get('ngw') // 'https://app.example.com/ngw'\n * ```\n *\n * @example 远程加载(指定网关)\n * ```ts\n * await Context.load('http://172.16.32.155:20000')\n * Context.get('ngw') // 'http://172.16.32.155:20000/ngw'\n * Context.info // { version: '4.6.2-r10', domain: '...', ... }\n * ```\n *\n * @example 本地注入\n * ```ts\n * await Context.load({\n * 'user-svc': 'http://user.api.com',\n * 'order-svc': 'http://order.api.com',\n * })\n * ```\n */\nexport class HttpContext {\n private _store = new Map<string, string>()\n private _loaded = false\n private _info: ContextInfo | undefined\n\n /**\n * 加载服务地址映射\n *\n * 支持三种调用方式:\n * - **传入字符串**:作为网关地址,自动请求 `GET /ngw/context` 获取映射表\n * - **传入对象**:直接注入键值映射,不发起网络请求\n * - **不传参数**:\n * - 生产环境(`NODE_ENV === 'production'`):以当前页面 `Origin` 为网关地址自动加载\n * - 开发环境:立即返回,不做任何操作(应由 `Debugger.init()` 接管加载流程)\n *\n * 远程加载时,响应中的 `$info` 元数据字段会被单独存储,不计入路由映射表。\n *\n * @param source 网关 URL / 键值对象 / 省略\n * @param timeout 远程加载超时(ms),默认 5000\n *\n * @example 不传参——生产环境自动使用当前页面 Origin\n * ```ts\n * await Context.load()\n * ```\n *\n * @example 传入网关地址\n * ```ts\n * await Context.load('http://172.16.32.155:20000', 3000)\n * ```\n *\n * @example 本地注入\n * ```ts\n * await Context.load({ 'user-svc': 'http://user.api.com' })\n * ```\n */\n async load(source?: string | Record<string, string>, timeout = 5000): Promise<void> {\n if (source === undefined) {\n // Debugger 已激活时,由其负责加载,此处跳过\n if ((globalThis as Record<string, unknown>)[DEBUGGER_ACTIVE_KEY]) return\n // 生产环境:以当前页面 Origin 为网关地址\n if (!Origin) return\n source = Origin\n }\n if (typeof source === 'string') {\n const url = `${source}/ngw/context`\n const res = await axios.get<ContextResponse>(url, { timeout })\n const data = res.data\n if (data && typeof data === 'object') {\n this._store.clear()\n for (const [k, v] of Object.entries(data)) {\n if (k === '$info') {\n // 保存元数据,不计入路由映射\n this._info = v as ContextInfo\n } else if (typeof v === 'string') {\n this._store.set(k, v)\n }\n }\n }\n } else {\n this._store.clear()\n for (const [k, v] of Object.entries(source)) {\n this._store.set(k, v)\n }\n }\n this._loaded = true\n }\n\n /**\n * 获取指定 ctx key 对应的服务地址\n * @param key ctx key,例如 `'ngw'`、`'osc'`\n * @returns 服务地址,未找到时返回空字符串\n *\n * @example\n * ```ts\n * await Context.load('http://172.16.32.155:20000')\n * Context.get('osc') // 'http://172.16.32.155:20000/osc'\n * Context.get('none') // ''\n * ```\n */\n get(key: string): string {\n return this._store.get(key) ?? ''\n }\n\n /**\n * 网关元数据(仅远程加载后可用)\n *\n * @example\n * ```ts\n * await Context.load('http://172.16.32.155:20000')\n * Context.info?.version // '4.6.2-r10'\n * Context.info?.domain // 'http://172.16.32.155:20000'\n * ```\n */\n get info(): ContextInfo | undefined {\n return this._info\n }\n\n /**\n * Context 是否已加载\n *\n * @example\n * ```ts\n * Context.loaded // false\n * await Context.load({ 'user-svc': 'http://user.api.com' })\n * Context.loaded // true\n * ```\n */\n get loaded(): boolean {\n return this._loaded\n }\n\n /**\n * 清空所有映射并重置加载状态\n *\n * @example\n * ```ts\n * Context.clear()\n * Context.loaded // false\n * ```\n */\n clear(): void {\n this._store.clear()\n this._loaded = false\n this._info = undefined\n }\n}\n\n/** 模块级单例,避免全局 window 污染 */\nconst _instance = new HttpContext()\n\n/**\n * HttpContext 全局单例\n *\n * @example\n * ```ts\n * import { Context } from '@snack-kit/lib/http'\n *\n * await Context.load('http://172.16.32.155:20000')\n * Context.get('osc') // 'http://172.16.32.155:20000/osc'\n * ```\n */\nexport const Context: HttpContext = _instance\n\n/** 浏览器 location 对象(兼容 Node/SSR 环境) */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _loc: { protocol?: string; host?: string; pathname?: string } | undefined =\n typeof globalThis !== 'undefined'\n ? ((globalThis as Record<string, unknown>)['location'] as typeof _loc)\n : undefined\n\n/**\n * 当前页面的 origin(`protocol + host`)\n *\n * 在非浏览器环境(如 SSR/Node)返回空字符串。\n *\n * @example\n * ```ts\n * import { Origin } from '@snack-kit/lib/http'\n * // 浏览器中:'https://app.example.com'\n * // Node 环境:''\n * ```\n */\nexport const Origin: string =\n _loc?.protocol && _loc?.host ? `${_loc.protocol}//${_loc.host}` : ''\n\n/**\n * 当前页面路径的首段,可直接用作 `ctx` 参数\n *\n * 例如 `/osc/employee` → `'osc'`,在非浏览器环境返回空字符串。\n *\n * @example\n * ```ts\n * import { Ctx, Get } from '@snack-kit/lib/http'\n *\n * // 当前路径为 /osc/... 时,Ctx === 'osc'\n * const result = await Get('/employee', { ctx: Ctx })\n * ```\n */\nexport const Ctx: string = _loc?.pathname ? (_loc.pathname.split('/')[1] ?? '') : ''\n","/** 模块私有注册表,避免全局 window 污染 */\nconst registry = new Map<string, AbortController>()\n\n/**\n * 注册一个请求取消控制器\n *\n * 若已存在相同 id 的控制器,先取消旧请求再注册新的。\n *\n * @param id 请求唯一标识\n * @returns 新创建的 AbortController\n *\n * @example\n * ```ts\n * import { Register, Cancel } from '@snack-kit/lib/http'\n *\n * const ctrl = Register('my-req')\n * // 请求进行中时手动取消\n * Cancel('my-req')\n * ```\n */\nexport function Register(id: string): AbortController {\n if (registry.has(id)) {\n registry.get(id)!.abort()\n }\n const controller = new AbortController()\n registry.set(id, controller)\n return controller\n}\n\n/**\n * 取消指定 id 的请求并从注册表移除\n *\n * @param id 请求唯一标识\n * @returns 是否找到并取消了请求\n *\n * @example\n * ```ts\n * import { Get, Cancel } from '@snack-kit/lib/http'\n *\n * let cancelId = ''\n * Get('/api/data', { onCancelId: (id) => { cancelId = id } })\n *\n * // 需要时取消\n * Cancel(cancelId)\n * ```\n */\nexport function Cancel(id: string): boolean {\n const controller = registry.get(id)\n if (!controller) return false\n controller.abort()\n registry.delete(id)\n return true\n}\n\n/**\n * 取消所有已注册的请求并清空注册表\n *\n * @example\n * ```ts\n * import { CancelAll } from '@snack-kit/lib/http'\n *\n * // 页面卸载时取消所有进行中的请求\n * window.addEventListener('beforeunload', () => CancelAll())\n * ```\n */\nexport function CancelAll(): void {\n for (const controller of registry.values()) {\n controller.abort()\n }\n registry.clear()\n}\n\n/**\n * 从注册表中移除指定 id(不触发取消,用于请求完成后内部清理)\n *\n * @param id 请求唯一标识\n */\nexport function Unregister(id: string): void {\n registry.delete(id)\n}\n","import axios, { isAxiosError } from 'axios'\nimport { Context } from './context'\nimport { Register, Unregister } from './cancel'\nimport type { HttpRequestConfig, HttpMethodConfig, HttpResult } from './types'\n\n/** 生成请求唯一 ID */\nfunction generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n\n/**\n * 核心请求函数,所有快捷方法基于此实现\n *\n * 自动处理:\n * - `ctx` → 从 HttpContext 查询 baseURL 并注入\n * - `cache: false`(默认)→ URL 附加 `?_=timestamp` 防缓存\n * - 请求取消 → 自动注册 AbortController,完成后自动清理\n * - 错误捕获 → 统一返回 `{ error }` 而非 throw\n *\n * @param config 请求配置\n * @returns 请求结果\n *\n * @example 基础用法\n * ```ts\n * import { Request } from '@snack-kit/lib/http'\n *\n * const result = await Request<{ id: number }>({ url: '/api/user', method: 'GET' })\n * if (result.error) {\n * console.error(result.error.message)\n * } else {\n * console.log(result.data)\n * }\n * ```\n *\n * @example 使用 ctx 自动注入 baseURL\n * ```ts\n * import { context, Request } from '@snack-kit/lib/http'\n *\n * await context.load({ 'user-svc': 'http://user.api.com' })\n * const result = await Request({ url: '/profile', method: 'GET', ctx: 'user-svc' })\n * // 实际请求:GET http://user.api.com/profile\n * ```\n */\nexport async function Request<T>(config: HttpRequestConfig): Promise<HttpResult<T>> {\n const { ctx, cancelId: customCancelId, onCancelId, cache = false, ...axiosConfig } = config\n\n // ctx 自动注入 baseURL\n if (ctx && Context.loaded) {\n const base = Context.get(ctx)\n if (base) {\n axiosConfig.baseURL = base\n }\n }\n\n // 防缓存:默认添加时间戳参数\n if (!cache) {\n const sep = (axiosConfig.url ?? '').includes('?') ? '&' : '?'\n axiosConfig.url = `${axiosConfig.url ?? ''}${sep}_=${Date.now()}`\n }\n\n // 注册取消控制器\n const cancelId = customCancelId ?? generateId()\n const controller = Register(cancelId)\n axiosConfig.signal = controller.signal\n onCancelId?.(cancelId)\n\n try {\n const response = await axios.request<T>({ ...axiosConfig })\n return response\n } catch (err) {\n if (isAxiosError(err)) {\n return {\n error: {\n status: err.response?.status,\n message: err.message,\n data: err.response?.data,\n },\n }\n }\n // AbortError 或其他非 axios 错误\n const message = err instanceof Error ? err.message : String(err)\n return { error: { message } }\n } finally {\n Unregister(cancelId)\n }\n}\n\n/**\n * 发起 GET 请求\n *\n * 支持两种调用方式:\n * - `Get(url, config?)` — 位置参数形式\n * - `Get(config)` — 纯配置对象形式(`method` 已预置,无需传入)\n *\n * @example 位置参数\n * ```ts\n * const { data, error } = await Get<{ name: string }>('/api/user/1')\n * ```\n *\n * @example 配置对象\n * ```ts\n * const { data } = await Get({ url: '/api/user/1', ctx: 'user-svc' })\n * ```\n *\n * @example 获取 cancelId 以便主动取消\n * ```ts\n * let cancelId = ''\n * Get('/api/list', { onCancelId: (id) => { cancelId = id } })\n * Cancel(cancelId)\n * ```\n */\nexport function Get<T>(url: string, config?: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Get<T>(config: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Get<T>(\n urlOrConfig: string | HttpMethodConfig,\n config?: HttpMethodConfig,\n): Promise<HttpResult<T>> {\n if (typeof urlOrConfig === 'string') {\n return Request<T>({ ...config, method: 'GET', url: urlOrConfig })\n }\n return Request<T>({ ...urlOrConfig, method: 'GET' })\n}\n\n/**\n * 发起 POST 请求\n *\n * 支持两种调用方式:\n * - `Post(url, data?, config?)` — 位置参数形式\n * - `Post(config)` — 纯配置对象形式(`data` 通过 `config.data` 传入,`method` 已预置)\n *\n * @example 位置参数\n * ```ts\n * const { data, error } = await Post<{ token: string }>('/api/login', {\n * username: 'admin',\n * password: '123456',\n * })\n * ```\n *\n * @example 配置对象\n * ```ts\n * const { data } = await Post({\n * url: '/api/login',\n * data: { username: 'admin', password: '123456' },\n * ctx: 'user-svc',\n * })\n * ```\n */\nexport function Post<T>(url: string, data?: unknown, config?: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Post<T>(config: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Post<T>(\n urlOrConfig: string | HttpMethodConfig,\n data?: unknown,\n config?: HttpMethodConfig,\n): Promise<HttpResult<T>> {\n if (typeof urlOrConfig === 'string') {\n return Request<T>({ ...config, method: 'POST', url: urlOrConfig, data })\n }\n return Request<T>({ ...urlOrConfig, method: 'POST' })\n}\n\n/**\n * 发起 PUT 请求\n *\n * 支持两种调用方式:\n * - `Put(url, data?, config?)` — 位置参数形式\n * - `Put(config)` — 纯配置对象形式(`data` 通过 `config.data` 传入,`method` 已预置)\n *\n * @example 位置参数\n * ```ts\n * await Put('/api/user/1', { name: 'Alice' })\n * ```\n *\n * @example 配置对象\n * ```ts\n * await Put({ url: '/api/user/1', data: { name: 'Alice' }, ctx: 'user-svc' })\n * ```\n */\nexport function Put<T>(url: string, data?: unknown, config?: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Put<T>(config: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Put<T>(\n urlOrConfig: string | HttpMethodConfig,\n data?: unknown,\n config?: HttpMethodConfig,\n): Promise<HttpResult<T>> {\n if (typeof urlOrConfig === 'string') {\n return Request<T>({ ...config, method: 'PUT', url: urlOrConfig, data })\n }\n return Request<T>({ ...urlOrConfig, method: 'PUT' })\n}\n\n/**\n * 发起 PATCH 请求\n *\n * 支持两种调用方式:\n * - `Patch(url, data?, config?)` — 位置参数形式\n * - `Patch(config)` — 纯配置对象形式(`data` 通过 `config.data` 传入,`method` 已预置)\n *\n * @example 位置参数\n * ```ts\n * await Patch('/api/user/1', { avatar: 'https://...' })\n * ```\n *\n * @example 配置对象\n * ```ts\n * await Patch({ url: '/api/user/1', data: { avatar: 'https://...' }, ctx: 'user-svc' })\n * ```\n */\nexport function Patch<T>(url: string, data?: unknown, config?: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Patch<T>(config: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Patch<T>(\n urlOrConfig: string | HttpMethodConfig,\n data?: unknown,\n config?: HttpMethodConfig,\n): Promise<HttpResult<T>> {\n if (typeof urlOrConfig === 'string') {\n return Request<T>({ ...config, method: 'PATCH', url: urlOrConfig, data })\n }\n return Request<T>({ ...urlOrConfig, method: 'PATCH' })\n}\n\n/**\n * 发起 DELETE 请求\n *\n * 支持两种调用方式:\n * - `Del(url, config?)` — 位置参数形式\n * - `Del(config)` — 纯配置对象形式(`method` 已预置)\n *\n * @example 位置参数\n * ```ts\n * await Del('/api/user/1')\n * ```\n *\n * @example 配置对象\n * ```ts\n * await Del({ url: '/api/user/1', ctx: 'user-svc' })\n * ```\n */\nexport function Del<T>(url: string, config?: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Del<T>(config: HttpMethodConfig): Promise<HttpResult<T>>\nexport function Del<T>(\n urlOrConfig: string | HttpMethodConfig,\n config?: HttpMethodConfig,\n): Promise<HttpResult<T>> {\n if (typeof urlOrConfig === 'string') {\n return Request<T>({ ...config, method: 'DELETE', url: urlOrConfig })\n }\n return Request<T>({ ...urlOrConfig, method: 'DELETE' })\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkN7BJS6LI_cjs = require('./chunk-N7BJS6LI.cjs');
3
+ var chunkXEQEQWDB_cjs = require('./chunk-XEQEQWDB.cjs');
4
4
 
5
5
  // src/debugger/debugger.ts
6
6
  var STORAGE_PREFIX = "__snackkit_debugger__";
@@ -572,6 +572,7 @@ var Debugger = class _Debugger {
572
572
  * ```
573
573
  */
574
574
  static async init(options) {
575
+ globalThis[chunkXEQEQWDB_cjs.DEBUGGER_ACTIVE_KEY] = true;
575
576
  const instance = new _Debugger({ timeout: 1e4, ...options });
576
577
  instance.injectStyle();
577
578
  instance.buildDOM();
@@ -722,7 +723,7 @@ var Debugger = class _Debugger {
722
723
  async loadServers(gwUrl) {
723
724
  this.setHeader("loading");
724
725
  this.setFooter(T.loading(), "");
725
- const result = await chunkN7BJS6LI_cjs.Get(`${gwUrl}/web-debug/host/list`, {
726
+ const result = await chunkXEQEQWDB_cjs.Get(`${gwUrl}/web-debug/host/list`, {
726
727
  cache: true,
727
728
  timeout: this.options.timeout
728
729
  });
@@ -763,14 +764,14 @@ var Debugger = class _Debugger {
763
764
  if (!server) return;
764
765
  this.setFooter(T.switching(), "");
765
766
  try {
766
- await chunkN7BJS6LI_cjs.Context.load(server.origin, this.options.timeout);
767
+ await chunkXEQEQWDB_cjs.Context.load(server.origin, this.options.timeout);
767
768
  const res = await fetch(`${server.origin}/ngw/context`);
768
769
  const raw = res.ok ? await res.json() : {};
769
770
  const ctxMap = {};
770
771
  for (const [k, v] of Object.entries(raw)) {
771
772
  if (k !== "$info" && typeof v === "string") ctxMap[k] = v;
772
773
  }
773
- const info = chunkN7BJS6LI_cjs.Context.info;
774
+ const info = chunkXEQEQWDB_cjs.Context.info;
774
775
  if (info) this.gwVersion.textContent = `v${info.version}`;
775
776
  this.renderCtxList(ctxMap);
776
777
  const count = Object.keys(ctxMap).length;
@@ -864,5 +865,5 @@ var Debugger = class _Debugger {
864
865
  };
865
866
 
866
867
  exports.Debugger = Debugger;
867
- //# sourceMappingURL=chunk-YOWLTZM5.cjs.map
868
- //# sourceMappingURL=chunk-YOWLTZM5.cjs.map
868
+ //# sourceMappingURL=chunk-ZJMTV2GJ.cjs.map
869
+ //# sourceMappingURL=chunk-ZJMTV2GJ.cjs.map