@snack-kit/lib 0.4.0 → 0.6.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 +23 -0
- package/dist/cjs/{chunk-ZJMTV2GJ.cjs → chunk-HGUNPVKD.cjs} +23 -18
- package/dist/cjs/chunk-HGUNPVKD.cjs.map +1 -0
- package/dist/cjs/chunk-UM4J7HF4.cjs +123 -0
- package/dist/cjs/chunk-UM4J7HF4.cjs.map +1 -0
- package/dist/cjs/{chunk-XEQEQWDB.cjs → chunk-UNFUIZVY.cjs} +4 -109
- package/dist/cjs/chunk-UNFUIZVY.cjs.map +1 -0
- package/dist/cjs/debugger.cjs +4 -4
- package/dist/cjs/http.cjs +32 -24
- package/dist/cjs/index.cjs +40 -32
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/es/chunk-2YYI2T2B.js +105 -0
- package/dist/es/chunk-2YYI2T2B.js.map +1 -0
- package/dist/es/{chunk-4SGFAIRT.js → chunk-FB42OGY3.js} +16 -15
- package/dist/es/chunk-FB42OGY3.js.map +1 -0
- package/dist/es/{chunk-YV6SGXUJ.js → chunk-M5R2NQYU.js} +6 -103
- package/dist/es/chunk-M5R2NQYU.js.map +1 -0
- package/dist/es/debugger.js +2 -2
- package/dist/es/http.js +2 -2
- package/dist/es/index.js +4 -4
- package/dist/es/index.js.map +1 -1
- package/dist/types/http.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/umd/debugger.global.js +32 -93
- package/dist/umd/debugger.global.js.map +1 -1
- package/dist/umd/http.global.js +3 -1
- package/dist/umd/http.global.js.map +1 -1
- package/dist/umd/index.global.js +16 -13
- package/dist/umd/index.global.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/chunk-XEQEQWDB.cjs.map +0 -1
- package/dist/cjs/chunk-YY5WQN7B.cjs +0 -4
- package/dist/cjs/chunk-YY5WQN7B.cjs.map +0 -1
- package/dist/cjs/chunk-ZJMTV2GJ.cjs.map +0 -1
- package/dist/es/chunk-4SGFAIRT.js.map +0 -1
- package/dist/es/chunk-BEL6AFK4.js +0 -3
- package/dist/es/chunk-BEL6AFK4.js.map +0 -1
- package/dist/es/chunk-YV6SGXUJ.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import axios
|
|
1
|
+
import axios from 'axios';
|
|
2
2
|
|
|
3
3
|
// src/http/context.ts
|
|
4
|
+
var _http = axios.create();
|
|
4
5
|
var DEBUGGER_ACTIVE_KEY = "__snackkit_debugger__active";
|
|
5
6
|
var HttpContext = class {
|
|
6
7
|
constructor() {
|
|
@@ -45,7 +46,7 @@ var HttpContext = class {
|
|
|
45
46
|
}
|
|
46
47
|
if (typeof source === "string") {
|
|
47
48
|
const url = `${source}/ngw/context`;
|
|
48
|
-
const res = await
|
|
49
|
+
const res = await _http.get(url, { timeout });
|
|
49
50
|
const data = res.data;
|
|
50
51
|
if (data && typeof data === "object") {
|
|
51
52
|
this._store.clear();
|
|
@@ -127,104 +128,6 @@ var _loc = typeof globalThis !== "undefined" ? globalThis["location"] : void 0;
|
|
|
127
128
|
var Origin = _loc?.protocol && _loc?.host ? `${_loc.protocol}//${_loc.host}` : "";
|
|
128
129
|
var Ctx = _loc?.pathname ? _loc.pathname.split("/")[1] ?? "" : "";
|
|
129
130
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (registry.has(id)) {
|
|
134
|
-
registry.get(id).abort();
|
|
135
|
-
}
|
|
136
|
-
const controller = new AbortController();
|
|
137
|
-
registry.set(id, controller);
|
|
138
|
-
return controller;
|
|
139
|
-
}
|
|
140
|
-
function Cancel(id) {
|
|
141
|
-
const controller = registry.get(id);
|
|
142
|
-
if (!controller) return false;
|
|
143
|
-
controller.abort();
|
|
144
|
-
registry.delete(id);
|
|
145
|
-
return true;
|
|
146
|
-
}
|
|
147
|
-
function CancelAll() {
|
|
148
|
-
for (const controller of registry.values()) {
|
|
149
|
-
controller.abort();
|
|
150
|
-
}
|
|
151
|
-
registry.clear();
|
|
152
|
-
}
|
|
153
|
-
function Unregister(id) {
|
|
154
|
-
registry.delete(id);
|
|
155
|
-
}
|
|
156
|
-
function generateId() {
|
|
157
|
-
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
158
|
-
return crypto.randomUUID();
|
|
159
|
-
}
|
|
160
|
-
return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
161
|
-
}
|
|
162
|
-
async function Request(config) {
|
|
163
|
-
const { ctx, cancelId: customCancelId, onCancelId, cache = false, ...axiosConfig } = config;
|
|
164
|
-
if (ctx && Context.loaded) {
|
|
165
|
-
const base = Context.get(ctx);
|
|
166
|
-
if (base) {
|
|
167
|
-
axiosConfig.baseURL = base;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (!cache) {
|
|
171
|
-
const sep = (axiosConfig.url ?? "").includes("?") ? "&" : "?";
|
|
172
|
-
axiosConfig.url = `${axiosConfig.url ?? ""}${sep}_=${Date.now()}`;
|
|
173
|
-
}
|
|
174
|
-
const cancelId = customCancelId ?? generateId();
|
|
175
|
-
const controller = Register(cancelId);
|
|
176
|
-
axiosConfig.signal = controller.signal;
|
|
177
|
-
onCancelId?.(cancelId);
|
|
178
|
-
try {
|
|
179
|
-
const response = await axios.request({ ...axiosConfig });
|
|
180
|
-
return response;
|
|
181
|
-
} catch (err) {
|
|
182
|
-
if (isAxiosError(err)) {
|
|
183
|
-
return {
|
|
184
|
-
error: {
|
|
185
|
-
status: err.response?.status,
|
|
186
|
-
message: err.message,
|
|
187
|
-
data: err.response?.data
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
192
|
-
return { error: { message } };
|
|
193
|
-
} finally {
|
|
194
|
-
Unregister(cancelId);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
function Get(urlOrConfig, config) {
|
|
198
|
-
if (typeof urlOrConfig === "string") {
|
|
199
|
-
return Request({ ...config, method: "GET", url: urlOrConfig });
|
|
200
|
-
}
|
|
201
|
-
return Request({ ...urlOrConfig, method: "GET" });
|
|
202
|
-
}
|
|
203
|
-
function Post(urlOrConfig, data, config) {
|
|
204
|
-
if (typeof urlOrConfig === "string") {
|
|
205
|
-
return Request({ ...config, method: "POST", url: urlOrConfig, data });
|
|
206
|
-
}
|
|
207
|
-
return Request({ ...urlOrConfig, method: "POST" });
|
|
208
|
-
}
|
|
209
|
-
function Put(urlOrConfig, data, config) {
|
|
210
|
-
if (typeof urlOrConfig === "string") {
|
|
211
|
-
return Request({ ...config, method: "PUT", url: urlOrConfig, data });
|
|
212
|
-
}
|
|
213
|
-
return Request({ ...urlOrConfig, method: "PUT" });
|
|
214
|
-
}
|
|
215
|
-
function Patch(urlOrConfig, data, config) {
|
|
216
|
-
if (typeof urlOrConfig === "string") {
|
|
217
|
-
return Request({ ...config, method: "PATCH", url: urlOrConfig, data });
|
|
218
|
-
}
|
|
219
|
-
return Request({ ...urlOrConfig, method: "PATCH" });
|
|
220
|
-
}
|
|
221
|
-
function Del(urlOrConfig, config) {
|
|
222
|
-
if (typeof urlOrConfig === "string") {
|
|
223
|
-
return Request({ ...config, method: "DELETE", url: urlOrConfig });
|
|
224
|
-
}
|
|
225
|
-
return Request({ ...urlOrConfig, method: "DELETE" });
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export { Cancel, CancelAll, Context, Ctx, DEBUGGER_ACTIVE_KEY, Del, Get, HttpContext, Origin, Patch, Post, Put, Request };
|
|
229
|
-
//# sourceMappingURL=chunk-YV6SGXUJ.js.map
|
|
230
|
-
//# sourceMappingURL=chunk-YV6SGXUJ.js.map
|
|
131
|
+
export { Context, Ctx, DEBUGGER_ACTIVE_KEY, HttpContext, Origin };
|
|
132
|
+
//# sourceMappingURL=chunk-M5R2NQYU.js.map
|
|
133
|
+
//# sourceMappingURL=chunk-M5R2NQYU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/http/context.ts"],"names":[],"mappings":"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","file":"chunk-M5R2NQYU.js","sourcesContent":["import axios from 'axios'\nimport type { ContextInfo } from './types'\n\n/**\n * Context 专用的隔离 axios 实例,不受用户添加的外部拦截器影响。\n */\nconst _http = axios.create()\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 _http.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"]}
|
package/dist/es/debugger.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Debugger } from './chunk-
|
|
2
|
-
export { DEBUGGER_ACTIVE_KEY } from './chunk-
|
|
1
|
+
export { Debugger } from './chunk-FB42OGY3.js';
|
|
2
|
+
export { DEBUGGER_ACTIVE_KEY } from './chunk-M5R2NQYU.js';
|
|
3
3
|
//# sourceMappingURL=debugger.js.map
|
|
4
4
|
//# sourceMappingURL=debugger.js.map
|
package/dist/es/http.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
export { Cancel, CancelAll, Del, Get, Patch, Post, Put, Request, default as axios } from './chunk-2YYI2T2B.js';
|
|
2
|
+
export { Context, Ctx, HttpContext, Origin } from './chunk-M5R2NQYU.js';
|
|
3
3
|
//# sourceMappingURL=http.js.map
|
|
4
4
|
//# sourceMappingURL=http.js.map
|
package/dist/es/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export { Debugger } from './chunk-
|
|
3
|
-
export {
|
|
1
|
+
export { Cancel, CancelAll, Del, Get, Patch, Post, Put, Request, default as axios } from './chunk-2YYI2T2B.js';
|
|
2
|
+
export { Debugger } from './chunk-FB42OGY3.js';
|
|
3
|
+
export { Context, Ctx, DEBUGGER_ACTIVE_KEY, HttpContext, Origin } from './chunk-M5R2NQYU.js';
|
|
4
4
|
export { CleanObject, Debounce, DeepClone, Delay, FormatDate, GetDateOffset, GetDayRange, GetURLParam, GetURLParams, IsArray, IsBoolean, IsEmail, IsEqual, IsFunction, IsInteger, IsIpv4, IsNull, IsNumber, IsObject, IsPhone, IsPositiveInteger, IsRealNumber, IsString, IsUrl, Minus, ObjectToQuery, Omit, Pick, QueryToObject, REGEX, Throttle, UUID, Unique, UniqueByKey } from './chunk-WJX5Q3WL.js';
|
|
5
5
|
|
|
6
6
|
// package.json
|
|
7
|
-
var version = "0.
|
|
7
|
+
var version = "0.6.0";
|
|
8
8
|
|
|
9
9
|
export { version as VERSION };
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/dist/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json"],"names":[],"mappings":";;;;;;AAEE,IAAA,OAAA,GAAW","file":"index.js","sourcesContent":["{\n \"name\": \"@snack-kit/lib\",\n \"version\": \"0.
|
|
1
|
+
{"version":3,"sources":["../../package.json"],"names":[],"mappings":";;;;;;AAEE,IAAA,OAAA,GAAW","file":"index.js","sourcesContent":["{\n \"name\": \"@snack-kit/lib\",\n \"version\": \"0.6.0\",\n \"description\": \"Enterprise-grade utility library\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/types/index.d.ts\",\n \"import\": \"./dist/es/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./http\": {\n \"types\": \"./dist/types/http.d.ts\",\n \"import\": \"./dist/es/http.js\",\n \"require\": \"./dist/cjs/http.cjs\"\n },\n \"./debugger\": {\n \"types\": \"./dist/types/debugger.d.ts\",\n \"import\": \"./dist/es/debugger.js\",\n \"require\": \"./dist/cjs/debugger.cjs\"\n },\n \"./utils\": {\n \"types\": \"./dist/types/utils.d.ts\",\n \"import\": \"./dist/es/utils.js\",\n \"require\": \"./dist/cjs/utils.cjs\"\n }\n },\n \"main\": \"./dist/cjs/index.cjs\",\n \"module\": \"./dist/es/index.js\",\n \"types\": \"./dist/types/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"build:watch\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"docs\": \"typedoc && cp -r docs/demo docs/api/demo\",\n \"docs:watch\": \"typedoc --watch\",\n \"lint\": \"tsc --noEmit\",\n \"prepublishOnly\": \"npm run build\",\n \"release\": \"npm run build && npm publish --access public\"\n },\n \"devDependencies\": {\n \"@vitest/coverage-v8\": \"^2.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typedoc\": \"^0.26.0\",\n \"typescript\": \"^5.5.3\",\n \"vitest\": \"^2.0.0\"\n },\n \"dependencies\": {\n \"axios\": \"^1.13.6\"\n }\n}\n"]}
|
package/dist/types/http.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { d as HttpMethodConfig, f as HttpResult, e as HttpRequestConfig } from './context-C4dFUDbw.js';
|
|
2
2
|
export { C as Context, a as ContextInfo, b as Ctx, H as HttpContext, c as HttpError, O as Origin, S as ServerItem } from './context-C4dFUDbw.js';
|
|
3
|
-
|
|
3
|
+
export { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, default as axios } from 'axios';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* 取消指定 id 的请求并从注册表移除
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { C as Context, a as ContextInfo, b as Ctx, D as DEBUGGER_ACTIVE_KEY, H as HttpContext, c as HttpError, d as HttpMethodConfig, e as HttpRequestConfig, f as HttpResult, O as Origin, S as ServerItem } from './context-C4dFUDbw.js';
|
|
2
2
|
export { Cancel, CancelAll, Del, Get, Patch, Post, Put, Request } from './http.js';
|
|
3
|
+
export { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, default as axios } from 'axios';
|
|
3
4
|
export { Debugger, DebuggerOptions } from './debugger.js';
|
|
4
5
|
export { CleanObject, Debounce, DeepClone, Delay, FormatDate, GetDateOffset, GetDayRange, GetURLParam, GetURLParams, IsArray, IsBoolean, IsEmail, IsEqual, IsFunction, IsInteger, IsIpv4, IsNull, IsNumber, IsObject, IsPhone, IsPositiveInteger, IsRealNumber, IsString, IsUrl, Minus, ObjectToQuery, Omit, Pick, QueryToObject, REGEX, Throttle, UUID, Unique, UniqueByKey } from './utils.js';
|
|
5
|
-
import 'axios';
|
|
6
6
|
|
|
7
|
-
var version = "0.
|
|
7
|
+
var version = "0.6.0";
|
|
8
8
|
|
|
9
9
|
export { version as VERSION };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var SnackKit = (function (exports,
|
|
1
|
+
var SnackKit = (function (exports, crypto, url, http, https, http2, util2, zlib, stream3, events) {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
7
7
|
var url__default = /*#__PURE__*/_interopDefault(url);
|
|
8
8
|
var http__default = /*#__PURE__*/_interopDefault(http);
|
|
9
9
|
var https__default = /*#__PURE__*/_interopDefault(https);
|
|
@@ -9971,7 +9971,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
9971
9971
|
var parseUrl = __require("url").parse;
|
|
9972
9972
|
var fs = __require("fs");
|
|
9973
9973
|
var Stream = __require("stream").Stream;
|
|
9974
|
-
var
|
|
9974
|
+
var crypto2 = __require("crypto");
|
|
9975
9975
|
var mime = require_mime_types();
|
|
9976
9976
|
var asynckit = require_asynckit();
|
|
9977
9977
|
var setToStringTag = require_es_set_tostringtag();
|
|
@@ -10177,7 +10177,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
10177
10177
|
return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]);
|
|
10178
10178
|
};
|
|
10179
10179
|
FormData3.prototype._generateBoundary = function() {
|
|
10180
|
-
this._boundary = "--------------------------" +
|
|
10180
|
+
this._boundary = "--------------------------" + crypto2.randomBytes(12).toString("hex");
|
|
10181
10181
|
};
|
|
10182
10182
|
FormData3.prototype.getLengthSync = function() {
|
|
10183
10183
|
var knownLength = this._overheadLength + this._valueLength;
|
|
@@ -12403,7 +12403,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
12403
12403
|
let str = "";
|
|
12404
12404
|
const { length } = alphabet;
|
|
12405
12405
|
const randomValues = new Uint32Array(size);
|
|
12406
|
-
|
|
12406
|
+
crypto__default.default.randomFillSync(randomValues);
|
|
12407
12407
|
for (let i = 0; i < size; i++) {
|
|
12408
12408
|
str += alphabet[randomValues[i] % length];
|
|
12409
12409
|
}
|
|
@@ -14552,8 +14552,8 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14552
14552
|
// node_modules/axios/lib/adapters/fetch.js
|
|
14553
14553
|
var DEFAULT_CHUNK_SIZE = 64 * 1024;
|
|
14554
14554
|
var { isFunction: isFunction2 } = utils_default;
|
|
14555
|
-
var globalFetchAPI = (({ Request
|
|
14556
|
-
Request
|
|
14555
|
+
var globalFetchAPI = (({ Request, Response }) => ({
|
|
14556
|
+
Request,
|
|
14557
14557
|
Response
|
|
14558
14558
|
}))(utils_default.global);
|
|
14559
14559
|
var { ReadableStream: ReadableStream2, TextEncoder: TextEncoder2 } = utils_default.global;
|
|
@@ -14572,18 +14572,18 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14572
14572
|
globalFetchAPI,
|
|
14573
14573
|
env
|
|
14574
14574
|
);
|
|
14575
|
-
const { fetch: envFetch, Request
|
|
14575
|
+
const { fetch: envFetch, Request, Response } = env;
|
|
14576
14576
|
const isFetchSupported = envFetch ? isFunction2(envFetch) : typeof fetch === "function";
|
|
14577
|
-
const isRequestSupported = isFunction2(
|
|
14577
|
+
const isRequestSupported = isFunction2(Request);
|
|
14578
14578
|
const isResponseSupported = isFunction2(Response);
|
|
14579
14579
|
if (!isFetchSupported) {
|
|
14580
14580
|
return false;
|
|
14581
14581
|
}
|
|
14582
14582
|
const isReadableStreamSupported = isFetchSupported && isFunction2(ReadableStream2);
|
|
14583
|
-
const encodeText = isFetchSupported && (typeof TextEncoder2 === "function" ? /* @__PURE__ */ ((encoder) => (str) => encoder.encode(str))(new TextEncoder2()) : async (str) => new Uint8Array(await new
|
|
14583
|
+
const encodeText = isFetchSupported && (typeof TextEncoder2 === "function" ? /* @__PURE__ */ ((encoder) => (str) => encoder.encode(str))(new TextEncoder2()) : async (str) => new Uint8Array(await new Request(str).arrayBuffer()));
|
|
14584
14584
|
const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {
|
|
14585
14585
|
let duplexAccessed = false;
|
|
14586
|
-
const hasContentType = new
|
|
14586
|
+
const hasContentType = new Request(platform_default.origin, {
|
|
14587
14587
|
body: new ReadableStream2(),
|
|
14588
14588
|
method: "POST",
|
|
14589
14589
|
get duplex() {
|
|
@@ -14620,7 +14620,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14620
14620
|
return body.size;
|
|
14621
14621
|
}
|
|
14622
14622
|
if (utils_default.isSpecCompliantForm(body)) {
|
|
14623
|
-
const _request = new
|
|
14623
|
+
const _request = new Request(platform_default.origin, {
|
|
14624
14624
|
method: "POST",
|
|
14625
14625
|
body
|
|
14626
14626
|
});
|
|
@@ -14668,7 +14668,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14668
14668
|
let requestContentLength;
|
|
14669
14669
|
try {
|
|
14670
14670
|
if (onUploadProgress && supportsRequestStream && method !== "get" && method !== "head" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) {
|
|
14671
|
-
let _request = new
|
|
14671
|
+
let _request = new Request(url2, {
|
|
14672
14672
|
method: "POST",
|
|
14673
14673
|
body: data,
|
|
14674
14674
|
duplex: "half"
|
|
@@ -14688,7 +14688,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14688
14688
|
if (!utils_default.isString(withCredentials)) {
|
|
14689
14689
|
withCredentials = withCredentials ? "include" : "omit";
|
|
14690
14690
|
}
|
|
14691
|
-
const isCredentialsSupported = isRequestSupported && "credentials" in
|
|
14691
|
+
const isCredentialsSupported = isRequestSupported && "credentials" in Request.prototype;
|
|
14692
14692
|
const resolvedOptions = {
|
|
14693
14693
|
...fetchOptions,
|
|
14694
14694
|
signal: composedSignal,
|
|
@@ -14698,7 +14698,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14698
14698
|
duplex: "half",
|
|
14699
14699
|
credentials: isCredentialsSupported ? withCredentials : void 0
|
|
14700
14700
|
};
|
|
14701
|
-
request = isRequestSupported && new
|
|
14701
|
+
request = isRequestSupported && new Request(url2, resolvedOptions);
|
|
14702
14702
|
let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url2, resolvedOptions));
|
|
14703
14703
|
const isStreamResponse = supportsResponseStream && (responseType === "stream" || responseType === "response");
|
|
14704
14704
|
if (supportsResponseStream && (onDownloadProgress || isStreamResponse && unsubscribe)) {
|
|
@@ -14758,8 +14758,8 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
14758
14758
|
var seedCache = /* @__PURE__ */ new Map();
|
|
14759
14759
|
var getFetch = (config) => {
|
|
14760
14760
|
let env = config && config.env || {};
|
|
14761
|
-
const { fetch: fetch2, Request
|
|
14762
|
-
const seeds = [
|
|
14761
|
+
const { fetch: fetch2, Request, Response } = env;
|
|
14762
|
+
const seeds = [Request, Response, fetch2];
|
|
14763
14763
|
let len = seeds.length, i = len, seed, target, map = seedCache;
|
|
14764
14764
|
while (i--) {
|
|
14765
14765
|
seed = seeds[i];
|
|
@@ -15373,6 +15373,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
15373
15373
|
} = axios_default;
|
|
15374
15374
|
|
|
15375
15375
|
// src/http/context.ts
|
|
15376
|
+
var _http = axios_default.create();
|
|
15376
15377
|
var DEBUGGER_ACTIVE_KEY = "__snackkit_debugger__active";
|
|
15377
15378
|
var HttpContext = class {
|
|
15378
15379
|
constructor() {
|
|
@@ -15417,7 +15418,7 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
15417
15418
|
}
|
|
15418
15419
|
if (typeof source === "string") {
|
|
15419
15420
|
const url2 = `${source}/ngw/context`;
|
|
15420
|
-
const res = await
|
|
15421
|
+
const res = await _http.get(url2, { timeout });
|
|
15421
15422
|
const data = res.data;
|
|
15422
15423
|
if (data && typeof data === "object") {
|
|
15423
15424
|
this._store.clear();
|
|
@@ -15499,70 +15500,8 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
15499
15500
|
var Origin = _loc?.protocol && _loc?.host ? `${_loc.protocol}//${_loc.host}` : "";
|
|
15500
15501
|
_loc?.pathname ? _loc.pathname.split("/")[1] ?? "" : "";
|
|
15501
15502
|
|
|
15502
|
-
// src/http/cancel.ts
|
|
15503
|
-
var registry = /* @__PURE__ */ new Map();
|
|
15504
|
-
function Register(id) {
|
|
15505
|
-
if (registry.has(id)) {
|
|
15506
|
-
registry.get(id).abort();
|
|
15507
|
-
}
|
|
15508
|
-
const controller = new AbortController();
|
|
15509
|
-
registry.set(id, controller);
|
|
15510
|
-
return controller;
|
|
15511
|
-
}
|
|
15512
|
-
function Unregister(id) {
|
|
15513
|
-
registry.delete(id);
|
|
15514
|
-
}
|
|
15515
|
-
|
|
15516
|
-
// src/http/client.ts
|
|
15517
|
-
function generateId() {
|
|
15518
|
-
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
15519
|
-
return crypto.randomUUID();
|
|
15520
|
-
}
|
|
15521
|
-
return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
15522
|
-
}
|
|
15523
|
-
async function Request(config) {
|
|
15524
|
-
const { ctx, cancelId: customCancelId, onCancelId, cache = false, ...axiosConfig } = config;
|
|
15525
|
-
if (ctx && Context.loaded) {
|
|
15526
|
-
const base = Context.get(ctx);
|
|
15527
|
-
if (base) {
|
|
15528
|
-
axiosConfig.baseURL = base;
|
|
15529
|
-
}
|
|
15530
|
-
}
|
|
15531
|
-
if (!cache) {
|
|
15532
|
-
const sep = (axiosConfig.url ?? "").includes("?") ? "&" : "?";
|
|
15533
|
-
axiosConfig.url = `${axiosConfig.url ?? ""}${sep}_=${Date.now()}`;
|
|
15534
|
-
}
|
|
15535
|
-
const cancelId = customCancelId ?? generateId();
|
|
15536
|
-
const controller = Register(cancelId);
|
|
15537
|
-
axiosConfig.signal = controller.signal;
|
|
15538
|
-
onCancelId?.(cancelId);
|
|
15539
|
-
try {
|
|
15540
|
-
const response = await axios_default.request({ ...axiosConfig });
|
|
15541
|
-
return response;
|
|
15542
|
-
} catch (err) {
|
|
15543
|
-
if (isAxiosError2(err)) {
|
|
15544
|
-
return {
|
|
15545
|
-
error: {
|
|
15546
|
-
status: err.response?.status,
|
|
15547
|
-
message: err.message,
|
|
15548
|
-
data: err.response?.data
|
|
15549
|
-
}
|
|
15550
|
-
};
|
|
15551
|
-
}
|
|
15552
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
15553
|
-
return { error: { message } };
|
|
15554
|
-
} finally {
|
|
15555
|
-
Unregister(cancelId);
|
|
15556
|
-
}
|
|
15557
|
-
}
|
|
15558
|
-
function Get(urlOrConfig, config) {
|
|
15559
|
-
if (typeof urlOrConfig === "string") {
|
|
15560
|
-
return Request({ ...config, method: "GET", url: urlOrConfig });
|
|
15561
|
-
}
|
|
15562
|
-
return Request({ ...urlOrConfig, method: "GET" });
|
|
15563
|
-
}
|
|
15564
|
-
|
|
15565
15503
|
// src/debugger/debugger.ts
|
|
15504
|
+
var _http2 = axios_default.create();
|
|
15566
15505
|
var STORAGE_PREFIX = "__snackkit_debugger__";
|
|
15567
15506
|
var KEY_GATEWAY = `${STORAGE_PREFIX}gateway`;
|
|
15568
15507
|
var KEY_TYPE = `${STORAGE_PREFIX}type`;
|
|
@@ -16283,19 +16222,19 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
16283
16222
|
async loadServers(gwUrl) {
|
|
16284
16223
|
this.setHeader("loading");
|
|
16285
16224
|
this.setFooter(T.loading(), "");
|
|
16286
|
-
|
|
16287
|
-
|
|
16288
|
-
|
|
16289
|
-
|
|
16290
|
-
|
|
16225
|
+
try {
|
|
16226
|
+
const res = await _http2.get(`${gwUrl}/web-debug/host/list`, {
|
|
16227
|
+
timeout: this.options.timeout
|
|
16228
|
+
});
|
|
16229
|
+
this.servers = res.data ?? [];
|
|
16230
|
+
this.renderTypeOptions();
|
|
16231
|
+
this.setHeader("ok");
|
|
16232
|
+
this.setFooter(T.loaded(this.servers.length), "ok");
|
|
16233
|
+
} catch (err) {
|
|
16234
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
16291
16235
|
this.setHeader("err");
|
|
16292
|
-
this.setFooter(T.loadFailed(
|
|
16293
|
-
return;
|
|
16236
|
+
this.setFooter(T.loadFailed(message), "err");
|
|
16294
16237
|
}
|
|
16295
|
-
this.servers = result.data ?? [];
|
|
16296
|
-
this.renderTypeOptions();
|
|
16297
|
-
this.setHeader("ok");
|
|
16298
|
-
this.setFooter(T.loaded(this.servers.length), "ok");
|
|
16299
16238
|
}
|
|
16300
16239
|
/** 渲染标签选项 */
|
|
16301
16240
|
renderTypeOptions() {
|
|
@@ -16447,6 +16386,6 @@ var SnackKit = (function (exports, crypto2, url, http, https, http2, util2, zlib
|
|
|
16447
16386
|
|
|
16448
16387
|
return exports;
|
|
16449
16388
|
|
|
16450
|
-
})({},
|
|
16389
|
+
})({}, crypto, url, http, https, http2, util2, zlib, stream3, events);
|
|
16451
16390
|
//# sourceMappingURL=debugger.global.js.map
|
|
16452
16391
|
//# sourceMappingURL=debugger.global.js.map
|