@route-forge/core 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cache.ts","../src/errors.ts","../src/interceptors.ts","../src/adapters/builtin-http.ts","../src/adapters/axios.ts","../src/adapters/index.ts","../src/loading.ts","../src/forge.ts","../src/resolveRouteName.ts"],"names":["wrapped","prefix","isAbortError","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 按层级隔离的路由表缓存\n * @see .docs/SPEC.md §4.1.2\n *\n * 规则:\n * - 每层级独立条目,互不污染(cache key = `route-forge:${level}`)\n * - TTL 优先用后端响应里的 cache 字段,本地 cache.ttl 仅作兜底\n * - storage: 'memory' | 'sessionStorage' | 'localStorage'\n */\n\nimport type { CacheStorage, LevelRoutesResponse, RouteMeta } from './types.js';\n\ninterface CacheEntry {\n level: string;\n routes: Record<string, RouteMeta>;\n ttl: number | null;\n cachedAt: number;\n}\n\nconst KEY_PREFIX = 'route-forge:';\n\nfunction pickStorage(storage: CacheStorage): Storage | null {\n if (storage === 'memory') return null;\n if (typeof globalThis === 'undefined') return null;\n if (storage === 'sessionStorage') {\n return globalThis.sessionStorage ?? null;\n }\n if (storage === 'localStorage') {\n return globalThis.localStorage ?? null;\n }\n return null;\n}\n\nexport class RouteCache {\n private readonly storage: CacheStorage;\n private readonly fallbackTtl: number;\n private readonly backend: Storage | null;\n private readonly memory = new Map<string, CacheEntry>();\n\n constructor(opts: { storage: CacheStorage; ttl: number }) {\n this.storage = opts.storage;\n this.fallbackTtl = opts.ttl;\n this.backend = pickStorage(opts.storage);\n }\n\n private key(level: string): string {\n return `${KEY_PREFIX}${level}`;\n }\n\n get(level: string): CacheEntry | undefined {\n if (this.storage === 'memory' || !this.backend) {\n return this.getFromMemory(level);\n }\n const raw = this.backend.getItem(this.key(level));\n if (raw) {\n try {\n const entry = JSON.parse(raw) as CacheEntry;\n if (this.isExpired(entry)) {\n this.del(level);\n return undefined;\n }\n return entry;\n } catch {\n return undefined;\n }\n }\n // storage 写入曾失败(如配额满/被禁用)时,条目可能仅存在于内存回退中,需兼顾读取\n return this.getFromMemory(level);\n }\n\n private getFromMemory(level: string): CacheEntry | undefined {\n const entry = this.memory.get(level);\n if (!entry) return undefined;\n if (this.isExpired(entry)) {\n this.memory.delete(level);\n return undefined;\n }\n return entry;\n }\n\n set(resp: LevelRoutesResponse): void {\n // SPEC §5.3:后端 cache 为上限,前端可缩短但不能延长\n let ttl: number | null;\n if (resp.cache !== undefined && resp.cache !== null) {\n // 后端有值:取 min(后端, 前端兜底),确保前端不能延长后端设定的 TTL\n ttl = resp.cache > 0 ? Math.min(resp.cache, this.fallbackTtl) : resp.cache;\n } else {\n // 后端未下发:使用前端兜底 TTL\n ttl = this.fallbackTtl;\n }\n const entry: CacheEntry = {\n level: resp.level,\n routes: resp.routes,\n ttl,\n cachedAt: Date.now(),\n };\n if (this.storage === 'memory' || !this.backend) {\n this.memory.set(resp.level, entry);\n return;\n }\n try {\n this.backend.setItem(this.key(resp.level), JSON.stringify(entry));\n } catch {\n // 容量满或被禁用:回退内存\n this.memory.set(resp.level, entry);\n }\n }\n\n del(level: string): void {\n this.memory.delete(level);\n if (this.backend) {\n try {\n this.backend.removeItem(this.key(level));\n } catch {\n /* noop */\n }\n }\n }\n\n clear(): void {\n this.memory.clear();\n if (this.backend) {\n try {\n const toRemove: string[] = [];\n for (let i = 0; i < this.backend.length; i++) {\n const k = this.backend.key(i);\n if (k && k.startsWith(KEY_PREFIX)) toRemove.push(k);\n }\n for (const k of toRemove) this.backend.removeItem(k);\n } catch {\n /* noop */\n }\n }\n }\n\n private isExpired(entry: CacheEntry): boolean {\n if (entry.ttl === null) return false;\n if (entry.ttl === 0) return false; // 0 表示永久\n return Date.now() - entry.cachedAt > entry.ttl * 1000;\n }\n}\n","/**\n * Route Forge 错误基类与具体错误类\n * @see .docs/SPEC.md §6\n */\n\nexport interface ForgeErrorContext {\n [key: string]: unknown;\n}\n\nexport class ForgeError extends Error {\n readonly code: string;\n readonly route?: string;\n readonly level?: string;\n readonly context?: ForgeErrorContext;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n opts: {\n code: string;\n route?: string;\n level?: string;\n context?: ForgeErrorContext;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = opts.code;\n if (opts.route !== undefined) this.route = opts.route;\n if (opts.level !== undefined) this.level = opts.level;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/** RF_FE_001:路由名不存在于已加载层级中 */\nexport class UnknownRouteError extends ForgeError {\n constructor(route: string, level?: string) {\n super(`Route \"${route}\" not found${level ? ` in level \"${level}\"` : ''}`, {\n code: 'RF_FE_001',\n route,\n level,\n });\n }\n}\n\n/** RF_FE_002:路由所在层级未在 levels 声明 */\nexport class UnknownLevelError extends ForgeError {\n constructor(level: string) {\n super(`Level \"${level}\" not declared in options.levels`, {\n code: 'RF_FE_002',\n level,\n });\n }\n}\n\n/** RF_FE_003:路径参数缺失(strict=true 时) */\nexport class MissingRouteParamError extends ForgeError {\n constructor(route: string, missingParams: string[]) {\n super(`Missing path parameter(s) ${missingParams.join(', ')} for route \"${route}\"`, {\n code: 'RF_FE_003',\n route,\n context: { missingParams },\n });\n }\n}\n\n/** RF_FE_005:adapter: 'axios' 但未检测到 axios */\nexport class AdapterNotFoundError extends ForgeError {\n constructor(adapter: string) {\n super(`Adapter \"${adapter}\" not available; install axios or use 'builtin'`, {\n code: 'RF_FE_005',\n context: { adapter },\n });\n }\n}\n\n/** RF_FE_006:请求拦截器返回非 RequestConfig */\nexport class InvalidInterceptorReturnError extends ForgeError {\n constructor(route?: string) {\n super(`Request interceptor must return a RequestConfig object`, {\n code: 'RF_FE_006',\n route,\n });\n }\n}\n\n/** RF_FE_007:adapter 抛出的网络错误(DNS、连接超时等) */\nexport class NetworkError extends ForgeError {\n constructor(message: string, route?: string, level?: string, cause?: unknown) {\n super(message, { code: 'RF_FE_007', route, level, cause });\n }\n}\n\n/** RF_FE_008:HTTP 非 2xx 且未被 onRejected 拦截器恢复 */\nexport class HTTPError extends ForgeError {\n constructor(\n message: string,\n opts: { route?: string; level?: string; status?: number; url?: string; method?: string; cause?: unknown },\n ) {\n super(message, {\n code: 'RF_FE_008',\n route: opts.route,\n level: opts.level,\n context: { status: opts.status, url: opts.url, method: opts.method },\n cause: opts.cause,\n });\n }\n}\n\n/** RF_FE_009:请求被 AbortSignal 取消 */\nexport class RequestAbortedError extends ForgeError {\n constructor(route?: string, level?: string, cause?: unknown) {\n super(`Request aborted${route ? ` for route \"${route}\"` : ''}`, {\n code: 'RF_FE_009',\n route,\n level,\n cause,\n });\n }\n}\n","/**\n * 拦截器管理器实现\n * @see .docs/SPEC.md §4.1.3a, §4.1.1\n *\n * 执行顺序约定(对齐 axios):\n * - 请求拦截器:LIFO(后注册先执行),onRejected 与 onFulfilled 同序\n * - 响应拦截器:FIFO(先注册先执行),onRejected 与 onFulfilled 同序\n *\n * 实现策略:\n * - InterceptorManagerImpl.forEach 保持正序迭代(与 use/eject 语义一致)\n * - runRequestInterceptors 收集 handlers 后 reverse() 再串联 Promise 链,实现 LIFO\n * - runResponseInterceptors 直接正序串联,实现 FIFO\n *\n * 串联实现:采用标准 Promise 链语义\n * `Promise.resolve(initial).then(f0, r0).then(f1, r1).then(f2, r2)...`\n * - onFulfilled 抛错 → 下一组 onRejected 接住\n * - onRejected 返回值 → 后续 onFulfilled 继续执行(恢复为正常流程)\n * - onRejected 抛错 → 下一组 onRejected 接住 / 进入调用方 catch\n */\n\nimport type {\n InterceptorHandler,\n InterceptorManager,\n RequestConfig,\n ResponseData,\n} from './types.js';\nimport { InvalidInterceptorReturnError } from './errors.js';\n\nexport class InterceptorManagerImpl<TIn, TOut = TIn> implements InterceptorManager<TIn, TOut> {\n private handlers: InterceptorHandler<TIn, TOut>[] = [];\n private nextId = 0;\n\n use(\n onFulfilled?: (value: TIn) => TOut | Promise<TOut>,\n onRejected?: (error: unknown) => unknown | Promise<unknown>,\n ): number {\n const id = this.nextId++;\n this.handlers.push({ id, onFulfilled, onRejected });\n return id;\n }\n\n eject(id: number): void {\n const idx = this.handlers.findIndex((h) => h.id === id);\n if (idx >= 0) this.handlers.splice(idx, 1);\n }\n\n clear(): void {\n this.handlers = [];\n }\n\n forEach(fn: (handler: InterceptorHandler<TIn, TOut>) => void): void {\n for (const h of this.handlers) fn(h);\n }\n\n /** 测试用:当前注册数量 */\n get size(): number {\n return this.handlers.length;\n }\n}\n\n/**\n * 串联请求拦截器(LIFO,对齐 axios)。\n *\n * - onFulfilled 必须返回对象(RequestConfig);非对象抛 InvalidInterceptorReturnError\n * - onFulfilled 抛错 → 同管理器的 onRejected 链;某段 onRejected 返回值则恢复正序流程\n * - 仍未消化则向上抛,不发请求\n */\nexport async function runRequestInterceptors(\n manager: InterceptorManager<RequestConfig, RequestConfig>,\n initial: RequestConfig,\n): Promise<RequestConfig> {\n const handlers: InterceptorHandler<RequestConfig, RequestConfig>[] = [];\n manager.forEach((h) => handlers.push(h));\n // 请求拦截器 LIFO(对齐 axios):后注册先执行\n handlers.reverse();\n\n let p: Promise<unknown> = Promise.resolve(initial);\n for (const h of handlers) {\n const onF = h.onFulfilled;\n const onR = h.onRejected;\n p = p.then(\n async (v) => {\n if (!onF) return v;\n const result = await onF(v as RequestConfig);\n if (result === null || typeof result !== 'object') {\n throw new InvalidInterceptorReturnError();\n }\n return result;\n },\n (e) => (onR ? onR(e) : Promise.reject(e)),\n );\n }\n return p as Promise<RequestConfig>;\n}\n\n/**\n * 串联响应拦截器(FIFO,对齐 axios)。\n *\n * - HTTP 非 2xx 或任一 onFulfilled 抛错 → onRejected 链;onRejected 返回值则恢复正序流程\n * - 首段 onFulfilled 接收 ResponseData;后续段接收上一段返回值(类型由用户约束)\n * - 末段返回值即 forge.api() 的 resolve 值\n *\n * @param source 已包含 HTTP 错误转换逻辑的 ResponseData Promise\n * (HTTP 非 2xx 时 reject 为 HTTPError;网络层错误 reject 为 NetworkError)\n */\nexport async function runResponseInterceptors(\n manager: InterceptorManager<ResponseData, unknown>,\n source: Promise<ResponseData>,\n): Promise<unknown> {\n const handlers: InterceptorHandler<ResponseData, unknown>[] = [];\n manager.forEach((h) => handlers.push(h));\n\n let p: Promise<unknown> = source;\n for (const h of handlers) {\n const onF = h.onFulfilled;\n const onR = h.onRejected;\n p = p.then(\n (v) => (onF ? onF(v as ResponseData) : v),\n (e) => (onR ? onR(e) : Promise.reject(e)),\n );\n }\n return p;\n}\n\n/**\n * 工厂函数:供自定义 Fetcher 复用同一套拦截器实现\n * @see .docs/SPEC.md §4.3.3\n */\nexport function createInterceptorManager<TIn, TOut = TIn>(): InterceptorManager<TIn, TOut> {\n return new InterceptorManagerImpl<TIn, TOut>();\n}\n","/**\n * 内置类 axios 精简实现(builtin adapter)\n * @see .docs/SPEC.md §4.3.1\n *\n * 设计目标:\n * - API 兼容 axios(use/eject/clear、request/get/post/...)便于业务代码零成本切换\n * - 拦截器执行顺序对齐 axios(请求 LIFO、响应 FIFO),与 SPEC §4.1.3a 一致\n * - 仅实现 Route Forge 调用链需要的能力:拦截器、JSON、超时、取消\n * - 零依赖,仅基于宿主原生 fetch(Node 18+ / 现代浏览器原生支持)\n * - 体积目标:min+gzip < 3KB,仅作为兜底,不追求覆盖 axios 全部 API\n */\n\nimport type { InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport {\n createInterceptorManager,\n runRequestInterceptors,\n runResponseInterceptors,\n} from '../interceptors.js';\nimport { HTTPError, NetworkError } from '../errors.js';\n\n/**\n * 判断 body 是否为宿主原生可直接传输的类型(跳过 JSON 序列化)。\n */\nfunction isPassthroughBody(body: unknown): boolean {\n if (body === null) return false;\n return (\n (typeof FormData !== 'undefined' && body instanceof FormData) ||\n (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) ||\n (typeof Blob !== 'undefined' && body instanceof Blob) ||\n (typeof ArrayBuffer !== 'undefined' &&\n (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) ||\n (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)\n );\n}\n\n/**\n * 判断错误是否为请求取消错误(AbortSignal 触发)\n */\nfunction isAbortError(err: unknown): boolean {\n const e = err as { name?: string } | null;\n return !!e && e.name === 'AbortError';\n}\n\n/**\n * 合并多个 AbortSignal:任一 signal abort 即返回合并后的 signal abort。\n * 优先使用 AbortSignal.any(Node 20.3+ / 现代浏览器),否则回退到手动监听。\n */\nfunction combineSignals(...signals: (AbortSignal | undefined)[]): AbortSignal | undefined {\n const valid = signals.filter((s): s is AbortSignal => !!s);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n // AbortSignal.any 可用时直接使用(Node 20.3+ / 现代浏览器)\n if (typeof AbortSignal !== 'undefined' && typeof (AbortSignal as any).any === 'function') {\n return (AbortSignal as any).any(valid);\n }\n // 回退:手动构造 AbortController,监听任一 signal abort\n const controller = new AbortController();\n for (const s of valid) {\n if (s.aborted) {\n controller.abort(s.reason);\n return controller.signal;\n }\n s.addEventListener('abort', () => controller.abort(s.reason), { once: true });\n }\n return controller.signal;\n}\n\nexport function createBuiltinHttp(forgeInterceptors?: {\n request: InterceptorManager<RequestConfig, RequestConfig>;\n response: InterceptorManager<ResponseData, unknown>;\n}) {\n const requestMgr = forgeInterceptors?.request ?? createInterceptorManager<RequestConfig>();\n const responseMgr = forgeInterceptors?.response ?? createInterceptorManager<ResponseData>();\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n // 1. 执行请求拦截器(LIFO,对齐 axios)\n const finalConfig = await runRequestInterceptors(requestMgr, config);\n\n // 2. 超时控制:timeout > 0 时用 AbortSignal.timeout\n // 若同时有用户 signal,合并两者(任一 abort 即取消请求)\n const signal = combineSignals(\n finalConfig.signal,\n finalConfig.timeout && finalConfig.timeout > 0\n ? AbortSignal.timeout(finalConfig.timeout)\n : undefined,\n );\n\n // 3. paramsSerializer:自定义 query 序列化\n let url = finalConfig.url;\n if (finalConfig.paramsSerializer && finalConfig.params) {\n const qs = finalConfig.paramsSerializer(finalConfig.params);\n if (qs) {\n url = url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n }\n }\n\n // 4. 构建 fetchInit(body 序列化 + JSON Content-Type 自动补齐)\n const headers = new Headers(finalConfig.headers);\n const fetchInit: RequestInit = {\n method: finalConfig.method,\n headers,\n };\n if (signal) fetchInit.signal = signal;\n if (\n finalConfig.body !== undefined &&\n !['GET', 'HEAD'].includes(finalConfig.method.toUpperCase())\n ) {\n if (typeof finalConfig.body === 'string' || isPassthroughBody(finalConfig.body)) {\n fetchInit.body = finalConfig.body as BodyInit;\n } else {\n fetchInit.body = JSON.stringify(finalConfig.body);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n }\n }\n\n // 5. 调用 fetch(网络层错误转 NetworkError,便于独立使用 adapter 时错误语义一致)\n // 请求取消(AbortError)不包装,保留原始错误以便上层转换为 RequestAbortedError\n let res: Response;\n try {\n res = await fetch(url, fetchInit);\n } catch (e) {\n if (isAbortError(e)) throw e;\n throw new NetworkError(\n e instanceof Error ? e.message : String(e),\n finalConfig.route,\n finalConfig.level,\n e,\n );\n }\n const text = await res.text();\n let data: unknown = text;\n const contentType = res.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n data = JSON.parse(text);\n } catch {\n /* 保留原始文本 */\n }\n }\n\n // 6. 构建 ResponseData\n const responseData: ResponseData = {\n route: finalConfig.route,\n level: finalConfig.level,\n method: finalConfig.method,\n url,\n status: res.status,\n headers: res.headers,\n data,\n config: finalConfig,\n };\n\n // 7. 执行响应拦截器(FIFO,对齐 axios);末段返回值即 request() 的 resolve 值\n // HTTP 非 2xx → 转 HTTPError 后进入响应拦截器 onRejected 链(SPEC §4.1.3a 步骤 9)\n const source: Promise<ResponseData> =\n res.status >= 200 && res.status < 300\n ? Promise.resolve(responseData)\n : Promise.reject(\n new HTTPError(\n `HTTP ${res.status} for route \"${finalConfig.route}\" (${finalConfig.method} ${url})`,\n {\n route: finalConfig.route,\n level: finalConfig.level,\n status: res.status,\n url,\n method: finalConfig.method,\n },\n ),\n );\n return runResponseInterceptors(\n responseMgr,\n source,\n ) as Promise<ResponseData>;\n }\n\n // 便捷方法\n const get = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'GET' } as RequestConfig);\n const post = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'POST' } as RequestConfig);\n const put = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'PUT' } as RequestConfig);\n const patch = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'PATCH' } as RequestConfig);\n const del = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'DELETE' } as RequestConfig);\n\n return {\n request,\n interceptors: {\n request: requestMgr,\n response: responseMgr,\n },\n runsInterceptors: true,\n get,\n post,\n put,\n patch,\n delete: del,\n };\n}\n","/**\n * 把宿主项目的 axios 实例包装为 Fetcher adapter\n * @see .docs/SPEC.md §4.3.2, §4.3.4\n *\n * 设计约定:\n * - 不接管或修改宿主 axios 已有拦截器/defaults 配置,仅调用其 request 入口\n * - 宿主 axios 的 defaults.baseURL/defaults.headers 自动生效\n * - 宿主已注册的拦截器会先执行;Route Forge 自身拦截器在宿主拦截器之后执行\n * (由 forge.interceptors 注入到宿主 axios 时序)后续阶段填充\n * - 未检测到 axios 时返回 null(让 'auto' 自动降级到 builtin)\n */\n\nimport type { RequestConfig, ResponseData } from '../types.js';\nimport type { ResolvedAdapter } from './index.js';\n\n/** 把 axios 响应头(可能是 AxiosHeaders 实例)安全转为标准 Headers */\nfunction toHeaders(raw: unknown): Headers {\n if (!raw) return new Headers();\n const init =\n typeof (raw as any).toJSON === 'function' ? (raw as any).toJSON() : raw;\n try {\n return new Headers(init);\n } catch {\n return new Headers();\n }\n}\n\nexport async function wrapAxiosAdapter(): Promise<ResolvedAdapter | null> {\n // ESM 友好的动态探测:尝试 import('axios'),失败则查全局 window.axios\n // 使用变量引用模块名,避免打包工具(rollup/esbuild)静态分析并打包 axios\n let axios: any;\n const axiosModule = 'axios';\n try {\n const mod = await import(/* @vite-ignore */ axiosModule);\n axios = mod.default ?? mod;\n } catch {\n if (typeof globalThis !== 'undefined' && (globalThis as any).axios) {\n axios = (globalThis as any).axios;\n }\n }\n if (!axios || typeof axios.request !== 'function') return null;\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n const headers: Record<string, string> = { ...config.headers };\n try {\n const res = await axios.request({\n url: config.url,\n method: config.method,\n headers,\n data: config.body,\n // axios 会处理 baseURL/transformRequest 等 defaults;timeout 透传保证超时语义与 builtin 一致\n timeout: config.timeout,\n signal: config.signal, // 请求取消信号(AbortSignal)\n });\n\n return {\n route: config.route,\n level: config.level,\n method: config.method,\n url: config.url,\n status: res.status,\n headers: toHeaders(res.headers),\n data: res.data,\n config,\n };\n } catch (e: any) {\n // axios 默认 validateStatus 对非 2xx 抛错:携带响应时转为 ResponseData 返回,\n // 由上层统一转 HTTPError 并触发响应拦截器 onRejected 链(与 builtin 行为一致);\n // 无响应(网络错误/超时)则原样重抛,由上层转 NetworkError。\n if (e && e.response) {\n const resp = e.response;\n return {\n route: config.route,\n level: config.level,\n method: config.method,\n url: config.url,\n status: resp.status,\n headers: toHeaders(resp.headers),\n data: resp.data,\n config,\n };\n }\n throw e;\n }\n }\n\n // 不暴露宿主 axios 的 interceptors manager(避免覆盖 Route Forge 的统一时序);\n // Route Forge 调用链由 forge.interceptors 控制,宿主拦截器先执行由 axios 内部保证。\n return { request, interceptors: undefined };\n}\n","/**\n * Adapter 入口\n * @see .docs/SPEC.md §4.3\n *\n * Route Forge 提供三种 adapter:\n * 1. 'auto'(默认):检测到宿主 axios 则用之;否则用内置 builtin adapter\n * 2. 'axios':强制宿主 axios,未安装抛 AdapterNotFoundError\n * 3. 'builtin':强制内置实现\n * 自定义 Fetcher 接口直接传入即可(绕过 auto 检测)。\n */\n\nimport type { Fetcher, InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport { AdapterNotFoundError } from '../errors.js';\nimport { createBuiltinHttp } from './builtin-http.js';\nimport { wrapAxiosAdapter } from './axios.js';\n\nexport type ResolvedAdapter = {\n request: (config: RequestConfig) => Promise<ResponseData>;\n interceptors?: Fetcher['interceptors'];\n runsInterceptors?: boolean;\n /**\n * 便捷方法(可选)。\n * - builtin adapter 提供全部 5 个方法\n * - axios / 自定义 Fetcher 可不提供(调用方需先判断存在性)\n * @see .docs/SPEC.md §4.3.1\n */\n get?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n post?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n put?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n patch?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n delete?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n};\n\nexport interface ResolveAdapterOptions {\n adapter: 'auto' | 'axios' | 'builtin' | Fetcher;\n forgeInterceptors?: {\n request: InterceptorManager<RequestConfig, RequestConfig>;\n response: InterceptorManager<ResponseData, unknown>;\n };\n}\n\n/**\n * 解析 adapter 配置;同步阶段尝试 import('axios'),失败则降级。\n * 注意:实际 axios 探测在生产实现里需要 lazy import;此处仅为框架占位。\n */\nexport async function resolveAdapter(opts: ResolveAdapterOptions): Promise<ResolvedAdapter> {\n const { adapter } = opts;\n\n if (adapter && typeof adapter === 'object') {\n return {\n request: (config: RequestConfig) => adapter.request(config),\n interceptors: adapter.interceptors,\n };\n }\n\n if (adapter === 'builtin') {\n return createBuiltinHttp(opts.forgeInterceptors);\n }\n\n if (adapter === 'axios') {\n const wrapped = await wrapAxiosAdapter();\n if (!wrapped) throw new AdapterNotFoundError('axios');\n return wrapped;\n }\n\n // auto: 优先尝试 axios,失败则 builtin\n const wrapped = await wrapAxiosAdapter().catch(() => null);\n if (wrapped) return wrapped;\n return createBuiltinHttp(opts.forgeInterceptors);\n}\n","/**\n * LoadingTracker:加载中标识状态管理\n *\n * 通过引用计数器跟踪并发请求数。\n * - start():计数器 +1,进入加载状态\n * - stop():计数器 -1,归零时退出加载状态\n * - isLoading():查询当前是否处于加载中\n * - subscribe(cb):监听状态变化,返回取消订阅函数\n *\n * @see .docs/SPEC.md §4.1.8\n */\n\n/** 状态变更回调签名 */\nexport type LoadingChangeCallback = (event: LoadingChangeEvent) => void;\n\n/** 状态变更事件 */\nexport interface LoadingChangeEvent {\n /** 当前是否仍处于加载中 */\n loading: boolean;\n /** 当前并发请求数 */\n count: number;\n}\n\n/**\n * 加载状态跟踪器\n *\n * 单一计数器,跟踪所有 API 请求的并发数。\n * 不绑定任何 UI 样式,仅提供状态供框架层或业务层消费。\n */\nexport class LoadingTracker {\n /** 当前并发请求计数 */\n private count = 0;\n /** 订阅者集合 */\n private subscribers = new Set<LoadingChangeCallback>();\n\n /**\n * 开始一次加载(计数器 +1)\n */\n start(): void {\n this.count++;\n this.notify();\n }\n\n /**\n * 结束一次加载(计数器 -1)\n */\n stop(): void {\n this.count = Math.max(0, this.count - 1);\n this.notify();\n }\n\n /**\n * 查询当前是否处于加载中\n */\n isLoading(): boolean {\n return this.count > 0;\n }\n\n /**\n * 获取当前并发计数\n */\n getCount(): number {\n return this.count;\n }\n\n /**\n * 订阅加载状态变更\n * @returns 取消订阅函数\n */\n subscribe(cb: LoadingChangeCallback): () => void {\n this.subscribers.add(cb);\n return () => {\n this.subscribers.delete(cb);\n };\n }\n\n /** 通知所有订阅者 */\n private notify(): void {\n const event: LoadingChangeEvent = {\n loading: this.count > 0,\n count: this.count,\n };\n for (const cb of this.subscribers) {\n try {\n cb(event);\n } catch {\n // 订阅者回调异常不影响其他订阅者及请求流程\n }\n }\n }\n}\n","/**\n * Route Forge 主入口:createRouteForge\n * @see .docs/SPEC.md §4.1.1 ~ §4.1.4\n *\n * 能力清单(v1.0 MVP):\n * - 按层级懒加载与隔离缓存(§4.1.2)\n * - 并发去重(§4.1.4)\n * - 通过路由名调用 API(§4.1.3)\n * - 拦截器(§4.1.3a)\n * - Adapter auto 检测 / builtin / axios / 自定义 Fetcher(§4.3)\n */\n\nimport { RouteCache } from './cache.js';\nimport {\n createInterceptorManager,\n InterceptorManagerImpl,\n runRequestInterceptors,\n runResponseInterceptors,\n} from './interceptors.js';\nimport { resolveAdapter } from './adapters/index.js';\nimport type { LoadingChangeCallback } from './loading.js';\nimport { LoadingTracker } from './loading.js';\nimport {\n AdapterNotFoundError,\n ForgeError,\n HTTPError,\n MissingRouteParamError,\n NetworkError,\n RequestAbortedError,\n UnknownLevelError,\n UnknownRouteError,\n} from './errors.js';\nimport type {\n ApiCallParams,\n InterceptorManager,\n LevelRoutesResponse,\n RequestConfig,\n ResponseData,\n RouteForge,\n RouteForgeOptions,\n RouteMeta,\n SummaryResponse,\n} from './types.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_CACHE_TTL = 3600;\n\n/**\n * 后端摘要端点返回的未分配层级路由,前端作为虚拟层级 \"unassigned\" 消费\n * @see .docs/SPEC.md §3.1.6\n */\nconst UNASSIGNED_LEVEL = 'unassigned';\n\nexport function createRouteForge(options: RouteForgeOptions): RouteForge {\n if (!options.endpoint) throw new TypeError('options.endpoint is required');\n\n const {\n adapter = 'auto',\n timeout = DEFAULT_TIMEOUT,\n baseURL = '',\n interceptors: declarativeInterceptors,\n cache: cacheOpts = {},\n } = options;\n\n // --- 加载中标识跟踪器(始终跟踪,用户不监听即可)---\n const loadingTracker = new LoadingTracker();\n\n // --- 自动发现(SPEC §4.1.1 + §5.3)---\n const explicitLevels = options.levels;\n const explicitEager = options.eager;\n const explicitStrict = options.strict ?? false;\n const explicitEndpoint = options.endpoint;\n\n // effective* 状态:在摘要端点响应到达后被填充\n let effectiveLevels: string[] = explicitLevels ?? [];\n let effectiveEager: string[] = explicitEager ?? [];\n let effectiveStrict = explicitStrict;\n let effectiveEndpoint = explicitEndpoint;\n let effectiveUrlPrefix = ''; // 后端下发的 URL 前缀,默认为空\n\n // 未分配层级路由:来自摘要端点的 unassigned 字段,前端作为虚拟层级 \"unassigned\" 消费\n // @see .docs/SPEC.md §3.1.6\n let summaryUnassigned: SummaryResponse['unassigned'] | undefined;\n // 后端是否将 unassigned 作为真实层级注册(在 levels 中);若是则走正常 HTTP 拉取,不走虚拟层级\n let backendHasUnassignedLevel = false;\n\n // 拉取摘要端点(用于 strict_mode / endpoint / levels / eager 自动发现)\n const summaryPromise = (async (): Promise<SummaryResponse | null> => {\n try {\n const summaryUrl = explicitEndpoint; // GET {endpoint} = 摘要端点\n const resp = await fetch(summaryUrl, { method: 'GET' });\n if (!resp.ok) {\n console.warn(\n `[route-forge] summary endpoint ${summaryUrl} unreachable (HTTP ${resp.status}); falling back to explicit options`,\n );\n return null;\n }\n return (await resp.json()) as SummaryResponse;\n } catch (e) {\n if (explicitLevels && explicitLevels.length > 0) {\n console.warn(\n `[route-forge] summary endpoint unreachable: ${(e as Error).message}; using explicit levels`,\n );\n return null;\n }\n // 未传 levels 且摘要端点不可达 → 抛 UnknownLevelError\n throw new UnknownLevelError('(auto-discovery)');\n }\n })();\n\n // 自动发现异步填充(不阻塞 createRouteForge 返回)\n const autoDiscoveryPromise = summaryPromise.then((summary) => {\n if (summary === null) {\n return;\n }\n\n // 0. schemaVersion 向前兼容(DESIGN.md §6.3)\n const schemaVersion = summary.schemaVersion ?? 1;\n if (schemaVersion > 1) {\n console.warn(\n `[route-forge] backend schemaVersion=${schemaVersion} > client supported 1; some features may be unavailable`,\n );\n }\n\n // 1. endpoint 后端权威\n if (summary.config.endpoint_prefix && summary.config.endpoint_prefix !== explicitEndpoint) {\n console.warn(\n `[route-forge] backend endpoint_prefix \"${summary.config.endpoint_prefix}\" overrides frontend endpoint \"${explicitEndpoint}\"`,\n );\n effectiveEndpoint = summary.config.endpoint_prefix;\n }\n\n // 1a. url_prefix 后端权威:后端下发时覆盖\n if (summary.config.url_prefix) {\n effectiveUrlPrefix = summary.config.url_prefix.endsWith('/')\n ? summary.config.url_prefix.slice(0, -1)\n : summary.config.url_prefix;\n }\n\n // 2. strict_mode 后端权威:不能放宽,可收紧\n if (summary.config.strict_mode && !explicitStrict) {\n console.warn(\n '[route-forge] backend strict_mode=true overrides frontend strict=false; forcing strict=true',\n );\n effectiveStrict = true;\n }\n\n // 3. levels 取交集或自动发现\n const backendLevels = Object.keys(summary.levels);\n\n // 3a. 捕获摘要端点的 unassigned 字段,作为虚拟层级 \"unassigned\" 消费(SPEC §3.1.6)\n // 仅当后端未将 unassigned 作为真实层级注册时才启用虚拟层级\n backendHasUnassignedLevel = backendLevels.includes(UNASSIGNED_LEVEL);\n if (Array.isArray(summary.unassigned) && summary.unassigned.length > 0 && !backendHasUnassignedLevel) {\n summaryUnassigned = summary.unassigned;\n }\n\n // 可用层级 = 后端真实层级 + 虚拟 unassigned 层级(若有未分配路由)\n const availableLevels = backendLevels.slice();\n if (summaryUnassigned && !backendHasUnassignedLevel) {\n availableLevels.push(UNASSIGNED_LEVEL);\n }\n\n if (explicitLevels && explicitLevels.length > 0) {\n const intersection = explicitLevels.filter((l) => availableLevels.includes(l));\n const removed = explicitLevels.filter((l) => !availableLevels.includes(l));\n if (removed.length > 0) {\n console.warn(\n `[route-forge] levels not in backend summary and dropped: ${removed.join(', ')}`,\n );\n }\n effectiveLevels = intersection;\n } else {\n effectiveLevels = availableLevels;\n }\n\n // 4. eager:未传时取后端 load:'eager' 层级;显式传入时取并集(SPEC §5.3)\n const backendEager = backendLevels.filter((lvl) => summary.levels[lvl]?.load === 'eager');\n if (!explicitEager) {\n effectiveEager = backendEager;\n } else {\n // 并集:后端 eager + 前端显式声明,去重\n const union = new Set([...backendEager, ...explicitEager]);\n effectiveEager = [...union];\n }\n });\n\n // 防止 autoDiscoveryPromise 未被 await 时产生 unhandled rejection\n // 存储错误以便在 load/api 调用时重新抛出,保留原始错误信息\n let autoDiscoveryError: unknown = null;\n autoDiscoveryPromise.catch((e) => {\n autoDiscoveryError = e;\n });\n\n // --- Auto-discovery 完成状态 + ready Promise + level 加载订阅 ---\n let autoDiscoveryCompleted = false;\n let resolveReady!: () => void;\n const readyPromise = new Promise<void>((resolve) => {\n resolveReady = resolve;\n });\n const levelLoadedListeners = new Map<string, Set<() => void>>();\n\n const cacheTtl = cacheOpts.ttl ?? DEFAULT_CACHE_TTL;\n const cacheStorage = cacheOpts.storage ?? 'memory';\n const cache = new RouteCache({ storage: cacheStorage, ttl: cacheTtl });\n\n const requestInterceptors: InterceptorManager<RequestConfig, RequestConfig> = new InterceptorManagerImpl();\n const responseInterceptors: InterceptorManager<ResponseData, unknown> = new InterceptorManagerImpl();\n\n // 声明式拦截器先注册(按数组顺序),随后允许运行时 use() 追加\n // 支持两种形式:单函数(视为 onFulfilled)或 [onFulfilled?, onRejected?] 元组(SPEC §4.1.1)\n if (declarativeInterceptors?.request) {\n for (const entry of declarativeInterceptors.request) {\n if (typeof entry === 'function') {\n requestInterceptors.use(entry);\n } else {\n const [onFulfilled, onRejected] = entry;\n requestInterceptors.use(onFulfilled, onRejected);\n }\n }\n }\n if (declarativeInterceptors?.response) {\n for (const entry of declarativeInterceptors.response) {\n if (typeof entry === 'function') {\n responseInterceptors.use(entry);\n } else {\n const [onFulfilled, onRejected] = entry;\n responseInterceptors.use(onFulfilled, onRejected);\n }\n }\n }\n\n const adapterPromise = resolveAdapter({\n adapter,\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n let adapterResolved = false;\n let adapterObj: Awaited<ReturnType<typeof resolveAdapter>> | null = null;\n\n async function ensureAdapter() {\n if (!adapterResolved) {\n adapterObj = await adapterPromise.catch((e) => {\n if (e instanceof AdapterNotFoundError) throw e;\n // 其他错误降级到 builtin(避免初始化失败)\n return resolveAdapter({ adapter: 'builtin' });\n });\n adapterResolved = true;\n }\n return adapterObj!;\n }\n\n const inflight = new Map<string, Promise<void>>();\n // 每个层级的失效代数,用于检测 loadOne 期间是否发生了 invalidate\n const invalidationGens = new Map<string, number>();\n\n function assertLevelDeclared(level: string): void {\n if (!effectiveLevels.includes(level)) {\n throw new UnknownLevelError(level);\n }\n }\n\n function assertDiscoveryReady(): void {\n if (!autoDiscoveryCompleted && !explicitLevels?.length) {\n throw new ForgeError(\n 'Route data not available. Auto-discovery has not completed. ' +\n 'Use onSummaryReady callback to mount app, or await forge.ready / forge.load(level) first.',\n { code: 'RF_FE_010' },\n );\n }\n }\n\n function buildUrl(level: string): string {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const ep = effectiveEndpoint.startsWith('/') ? effectiveEndpoint : `/${effectiveEndpoint}`;\n return `${base}${ep}/${encodeURIComponent(level)}`;\n }\n\n async function fetchLevel(level: string): Promise<LevelRoutesResponse> {\n const adp = await ensureAdapter();\n const config: RequestConfig = {\n route: `__forge__.load.${level}`,\n level,\n method: 'GET',\n url: buildUrl(level),\n headers: { Accept: 'application/json' },\n params: {},\n timeout,\n meta: {\n name: `__forge__.load.${level}`,\n uri: buildUrl(level),\n methods: ['GET'],\n parameters: [],\n level,\n },\n };\n // 拉取元信息直接走 adapter(不走 forge.interceptors 链,避免与业务调用混淆)\n const resp = await adp.request(config);\n if (!resp || resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `Failed to load level \"${level}\": HTTP ${resp?.status}`,\n { level, status: resp?.status, url: buildUrl(level), method: 'GET' },\n );\n }\n const data = resp.data as LevelRoutesResponse;\n // 后端可能下发 cache 字段,让 RouteCache 优先采用\n return data;\n }\n\n async function loadOne(level: string): Promise<void> {\n if (autoDiscoveryError) throw autoDiscoveryError;\n assertLevelDeclared(level);\n\n // 缓存命中直接返回\n if (cache.get(level)) return;\n\n // inflight 去重\n const existing = inflight.get(level);\n if (existing) return existing;\n\n const gen = invalidationGens.get(level) ?? 0;\n const p = (async () => {\n try {\n // 虚拟层级 unassigned:直接从摘要数据构建响应,不发 HTTP 请求(SPEC §3.1.6)\n if (level === UNASSIGNED_LEVEL && !backendHasUnassignedLevel && summaryUnassigned) {\n const routes: Record<string, RouteMeta> = {};\n for (const r of summaryUnassigned) {\n routes[r.name] = { ...r, level: UNASSIGNED_LEVEL };\n }\n cache.set({ level: UNASSIGNED_LEVEL, routes, cache: null });\n // 通知 level 加载完成订阅者\n const listeners = levelLoadedListeners.get(level);\n if (listeners) listeners.forEach((cb) => cb());\n return;\n }\n const resp = await fetchLevel(level);\n // 仅在缓存未被 invalidate 清除时写入,防止旧数据回写\n if ((invalidationGens.get(level) ?? 0) === gen) {\n cache.set(resp);\n // 通知 level 加载完成订阅者\n const listeners = levelLoadedListeners.get(level);\n if (listeners) listeners.forEach((cb) => cb());\n }\n } finally {\n inflight.delete(level);\n }\n })();\n inflight.set(level, p);\n return p;\n }\n\n async function load(level: string | string[]): Promise<void> {\n await autoDiscoveryPromise;\n const list = Array.isArray(level) ? level : [level];\n await Promise.all(list.map(loadOne));\n }\n\n function route(level: string, name: string, params?: Record<string, unknown>): string {\n assertDiscoveryReady();\n // 静态生成 URL:仅查已加载缓存,未加载时抛 UnknownRouteError\n const meta = findRouteMeta(level, name);\n if (!meta) {\n throw new UnknownRouteError(name, level);\n }\n return buildRequestUrl(meta, params ?? {});\n }\n\n function buildRequestUrl(meta: RouteMeta, params: Record<string, unknown>): string {\n const defaults = meta.parameter_defaults ?? {};\n const missingRequired: string[] = [];\n\n // 1. 预解析每个声明参数的最终值(显式传参 > 后端默认值),并收集缺失的必填参数\n const values: Record<string, unknown> = {};\n for (const p of meta.parameters) {\n let v = params[p];\n // 参数未传时回退到后端下发的默认值\n if ((v === undefined || v === null) && p in defaults) {\n v = defaults[p];\n }\n if (v === undefined || v === null) {\n // 可选参数(URI 中 {param?}):稍后替换为空字符串;其余记为缺失\n if (!meta.uri.includes(`{${p}?}`)) {\n missingRequired.push(p);\n }\n } else {\n values[p] = v;\n }\n }\n if (missingRequired.length > 0) {\n throw new MissingRouteParamError(meta.name, missingRequired);\n }\n\n // 2. 单次遍历替换所有占位符:避免参数值中的 \"{other}\" 文本被后续参数二次替换(占位符注入)\n let uri = meta.uri.replace(/\\{([^{}]+)\\}/g, (match, raw: string) => {\n const optional = raw.endsWith('?');\n const name = optional ? raw.slice(0, -1) : raw;\n if (values[name] !== undefined) {\n const val = values[name];\n if (typeof val === 'object') {\n throw new ForgeError(\n `Path parameter \"${name}\" must be a primitive value (string, number, boolean), got ${typeof val}`,\n { code: 'RF_FE_003', route: meta.name, context: { param: name, value: val } },\n );\n }\n return encodeURIComponent(String(val));\n }\n // 值缺失:可选参数替换为空,未声明的占位符保持原样(不在 parameters 中)\n return optional ? '' : match;\n });\n // 清理可选参数移除后残留的连续 / 或尾部 /\n uri = uri.replace(/\\/+/g, '/').replace(/\\/$/, '');\n // url_prefix 含协议(如 https://api.example.com)时直接作为完整基础 URL,跳过 baseURL\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(effectiveUrlPrefix)) {\n const prefix = effectiveUrlPrefix.endsWith('/') ? effectiveUrlPrefix.slice(0, -1) : effectiveUrlPrefix;\n return uri.startsWith('/') ? `${prefix}${uri}` : `${prefix}/${uri}`;\n }\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const prefix = effectiveUrlPrefix;\n return uri.startsWith('/') ? `${base}${prefix}${uri}` : `${base}${prefix}/${uri}`;\n }\n\n function findRouteMeta(level: string, name: string): RouteMeta | undefined {\n const entry = cache.get(level);\n const meta = entry?.routes[name];\n if (meta) {\n return { ...meta, level };\n }\n return undefined;\n }\n\n async function api(level: string, name: string, params: ApiCallParams = {}): Promise<unknown> {\n await autoDiscoveryPromise;\n // 确保指定层级的路由元信息已加载\n await load(level);\n const meta = findRouteMeta(level, name);\n if (!meta) {\n throw new UnknownRouteError(name, level);\n }\n return doApiCall(meta, params);\n }\n\n async function doApiCall(meta: RouteMeta, params: ApiCallParams): Promise<unknown> {\n const {\n pathParams,\n query,\n body,\n headers,\n timeout: perCallTimeout,\n signal,\n } = resolveApiParams(params);\n\n // 请求前检查:signal 已 abort 则直接抛错,不发请求\n if (signal?.aborted) {\n throw new RequestAbortedError(meta.name, meta.level, signal.reason);\n }\n\n const method = pickMethod(meta);\n const urlWithQuery = appendQuery(buildRequestUrl(meta, pathParams), query);\n const config: RequestConfig = {\n route: meta.name,\n level: meta.level ?? '',\n method,\n url: urlWithQuery,\n headers: { Accept: 'application/json', ...(headers ?? {}) },\n body,\n params: pathParams,\n timeout: perCallTimeout ?? timeout,\n signal,\n meta,\n };\n\n const adp = await ensureAdapter();\n\n // 5. 请求拦截链(LIFO,对齐 axios);任段抛错且 onRejected 未消化 → 进入调用方 catch,不发请求\n // builtin.adapter 内部已执行 forge 拦截器(同一管理器对象引用,runsInterceptors=true)→ 跳过\n const finalConfig = adp.runsInterceptors\n ? config\n : await runRequestInterceptors(requestInterceptors, config);\n\n // 拦截链后再次检查:拦截器可能修改了 signal 或已 abort\n if (finalConfig.signal?.aborted) {\n throw new RequestAbortedError(meta.name, meta.level, finalConfig.signal.reason);\n }\n\n // 6. adapter 调用 → 7/8 的错误转换 + 响应拦截链\n // HTTP 非 2xx 转 HTTPError;底层网络错误(非 ForgeError)转 NetworkError\n // 注意:source 始终构造(含错误转换逻辑),runsInterceptors=true 时直接返回 source\n // 加载中标识:始终跟踪,用户不监听即可\n loadingTracker.start();\n try {\n const source: Promise<ResponseData> = adp.request(finalConfig).then(\n (resp) => {\n if (resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `HTTP ${resp.status} for route \"${resp.route}\" (${resp.method} ${resp.url})`,\n {\n route: resp.route,\n level: resp.level,\n status: resp.status,\n url: resp.url,\n method: resp.method,\n },\n );\n }\n return resp;\n },\n (err) => {\n // 已经是 ForgeError(如拦截器内重新抛的)→ 原样抛\n if (err instanceof ForgeError) throw err;\n // 请求被取消 → 转 RequestAbortedError\n if (isAbortError(err, finalConfig.signal)) {\n throw new RequestAbortedError(meta.name, meta.level, err);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n meta.name,\n meta.level,\n err,\n );\n },\n );\n\n // 响应拦截链(FIFO,对齐 axios);末段返回值即 api() resolve 值\n // builtin.adapter 内部已执行 forge 响应拦截器(runsInterceptors=true)→ 直接返回 source\n const result = adp.runsInterceptors\n ? await source\n : await runResponseInterceptors(responseInterceptors, source);\n return result;\n } finally {\n loadingTracker.stop();\n }\n }\n\n function invalidate(level?: string | string[]): void {\n if (level === undefined) {\n cache.clear();\n // 清除所有进行中的加载,防止旧数据回写\n inflight.clear();\n for (const lvl of effectiveLevels) {\n invalidationGens.set(lvl, (invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else if (Array.isArray(level)) {\n for (const lvl of level) {\n cache.del(lvl);\n inflight.delete(lvl);\n invalidationGens.set(lvl, (invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else {\n cache.del(level);\n inflight.delete(level);\n invalidationGens.set(level, (invalidationGens.get(level) ?? 0) + 1);\n }\n }\n\n function isLoaded(level?: string): boolean {\n if (level) return cache.get(level) !== undefined;\n // 无任何已声明层级(如自动发现未完成)时不应谎报全部已加载\n return effectiveLevels.length > 0 && effectiveLevels.every((lvl) => cache.get(lvl) !== undefined);\n }\n\n function hasRoute(level: string, name: string): boolean {\n assertDiscoveryReady();\n return findRouteMeta(level, name) !== undefined;\n }\n\n function getRoutes(level: string): Record<string, RouteMeta>;\n function getRoutes(): Record<string, Record<string, RouteMeta>>;\n function getRoutes(level?: string): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n if (level !== undefined) {\n const entry = cache.get(level);\n const routes = entry?.routes ?? {};\n const result: Record<string, RouteMeta> = {};\n for (const [k, v] of Object.entries(routes)) {\n // 深拷贝:避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n result[k] = JSON.parse(JSON.stringify(v));\n }\n return result;\n }\n const result: Record<string, Record<string, RouteMeta>> = {};\n for (const lvl of effectiveLevels) {\n const entry = cache.get(lvl);\n if (entry) {\n const levelRoutes: Record<string, RouteMeta> = {};\n for (const [k, v] of Object.entries(entry.routes)) {\n // 深拷贝:避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n levelRoutes[k] = JSON.parse(JSON.stringify(v));\n }\n result[lvl] = levelRoutes;\n }\n }\n return result;\n }\n\n // eager 层级自动加载 + onSummaryReady 回调 + ready Promise resolve\n // 不阻塞 createRouteForge 返回;在自动发现完成后触发\n void autoDiscoveryPromise\n .then(() => {\n // 摘要处理完成,触发 onSummaryReady(eager load 之前)\n options.onSummaryReady?.();\n // eager load\n if (effectiveEager.length > 0) {\n return Promise.all(effectiveEager.map((lvl) => load(lvl))).catch((e) => {\n console.warn(`[route-forge] eager load failed: ${(e as Error).message}`);\n });\n }\n })\n .then(() => {\n autoDiscoveryCompleted = true;\n resolveReady();\n })\n .catch(() => {\n /* 自动发现失败时不触发 eager / ready */\n });\n\n return {\n api,\n load,\n route,\n url: route,\n invalidate,\n isLoaded,\n hasRoute,\n getRoutes,\n isLoading: () => loadingTracker.isLoading(),\n onLoadingChange: (cb: LoadingChangeCallback) => loadingTracker.subscribe(cb),\n interceptors: {\n request: requestInterceptors,\n response: responseInterceptors,\n },\n ready: readyPromise,\n onLevelLoaded(level: string, cb: () => void): () => void {\n if (!levelLoadedListeners.has(level)) {\n levelLoadedListeners.set(level, new Set());\n }\n levelLoadedListeners.get(level)!.add(cb);\n return () => levelLoadedListeners.get(level)?.delete(cb);\n },\n };\n}\n\nfunction pickMethod(meta: RouteMeta): string {\n const m = meta.methods.find((x) => x.toUpperCase() !== 'HEAD');\n return (m ?? meta.methods[0] ?? 'GET').toUpperCase();\n}\n\nfunction appendQuery(url: string, query?: Record<string, unknown>): string {\n if (!query) return url;\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n usp.append(k, String(v));\n }\n const qs = usp.toString();\n if (!qs) return url;\n return url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n}\n\n/**\n * 智能解析 ApiCallParams,分离路径参数 / query / body / headers。\n *\n * 规则:\n * 1. `params` 显式指定路径参数 → 优先级最高\n * 2. 平铺的 string | number 值(含与 query/body/headers 同名的 key)→ 路径参数\n * 3. `query` (对象) → 查询参数;`body` (非 string/number) → 请求体;`headers` (对象) → 请求头\n *\n * @see .docs/SPEC.md §4.1.3\n */\nfunction resolveApiParams(input: ApiCallParams): {\n pathParams: Record<string, unknown>;\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n signal?: AbortSignal;\n} {\n const {\n params: explicitParams,\n query: rawQuery,\n body: rawBody,\n headers: rawHeaders,\n timeout: perCallTimeout,\n signal,\n ...flatRest\n } = input;\n\n // 1. params 显式指定 → 作为路径参数基础\n const pathParams: Record<string, unknown> = explicitParams\n ? { ...explicitParams }\n : {};\n\n // 2. 其余平铺 key → 路径参数(params 优先,不覆盖已存在的 key)\n for (const [k, v] of Object.entries(flatRest)) {\n if (!(k in pathParams)) {\n pathParams[k] = v;\n }\n }\n\n // 3. 固定 key 智能消解:string/number → 路径参数;对象 → 固定用途\n let query: Record<string, unknown> | undefined;\n let body: unknown;\n let headers: Record<string, string> | undefined;\n\n // query: 对象类型 → 查询参数;string/number → 路径参数\n if (rawQuery !== undefined) {\n if (typeof rawQuery === 'object' && rawQuery !== null) {\n query = rawQuery as Record<string, unknown>;\n } else if (!('query' in pathParams)) {\n pathParams.query = rawQuery;\n }\n }\n\n // body: 非 string/number → 请求体;string/number → 路径参数\n if (rawBody !== undefined) {\n if (typeof rawBody !== 'string' && typeof rawBody !== 'number') {\n body = rawBody;\n } else if (!('body' in pathParams)) {\n pathParams.body = rawBody;\n }\n }\n\n // headers: 对象类型 → 请求头;string/number → 路径参数\n if (rawHeaders !== undefined) {\n if (typeof rawHeaders === 'object' && rawHeaders !== null) {\n headers = rawHeaders as Record<string, string>;\n } else if (!('headers' in pathParams)) {\n pathParams.headers = rawHeaders;\n }\n }\n\n return { pathParams, query, body, headers, timeout: perCallTimeout, signal };\n}\n\n/**\n * 判断错误是否为请求取消错误(AbortSignal 触发)\n * 兼容 fetch 的 DOMException AbortError 与 axios 的 CanceledError\n */\nfunction isAbortError(err: unknown, signal?: AbortSignal): boolean {\n // signal 已 abort → 无论错误类型,均视为取消\n if (signal?.aborted) return true;\n const e = err as { name?: string; code?: string } | null;\n if (!e) return false;\n // fetch 取消抛 DOMException (name === 'AbortError')\n if (e.name === 'AbortError') return true;\n // axios 取消抛 CanceledError (code === 'ERR_CANCELED')\n if (e.code === 'ERR_CANCELED') return true;\n return false;\n}\n\n// 显式重导出,便于业务代码按需导入工具件\nexport { createInterceptorManager } from './interceptors.js';\nexport { RouteCache } from './cache.js';\nexport { ForgeError } from './errors.js';\n","/**\n * 智能路由名前缀解析\n *\n * 当前缀与后缀拼接产生歧义时(后缀本身已以前缀开头),\n * 通过查询已加载路由表来判定正确名称:\n * - 优先尝试 prefix + sep + suffix(完整拼接)\n * - 若不存在则回退到 suffix(视为已含前缀)\n * - 均不存在则抛 UnknownRouteError\n *\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { UnknownRouteError } from './errors.js';\n\n/**\n * 路由名解析所需的最小 forge 接口。\n * 仅依赖 load() 和 hasRoute(),不依赖拦截器等完整能力。\n * 兼容 RouteForge、BoundForgeTyped、ForgeInstanceTyped 等所有形态。\n */\nexport interface RouteResolver {\n load(level: string | string[]): Promise<void>;\n\n hasRoute(level: string, name: string): boolean;\n}\n\n/**\n * 异步版本:先确保层级已加载,再做歧义消解。\n * 适用于 api() 调用路径。\n */\nexport async function resolveRouteName(\n forge: RouteResolver,\n level: string,\n prefix: string,\n suffix: string,\n separator = '.',\n): Promise<string> {\n // 后缀为空 → 直接返回前缀\n if (!suffix) return prefix;\n\n const joined = `${prefix}${separator}${suffix}`;\n\n // 后缀不以前缀开头 → 无歧义,直接拼接\n if (!suffix.startsWith(`${prefix}${separator}`)) return joined;\n\n // 歧义场景:先确保层级已加载\n await forge.load(level);\n\n // 优先尝试完整拼接\n if (forge.hasRoute(level, joined)) return joined;\n // 回退到后缀本身(视为已含前缀)\n if (forge.hasRoute(level, suffix)) return suffix;\n\n // 均不存在 → 报错\n throw new UnknownRouteError(joined, level);\n}\n\n/**\n * 同步版本:基于已加载缓存做歧义消解。\n * 适用于 route() / url() 调用路径(要求层级已加载)。\n */\nexport function resolveRouteNameSync(\n forge: RouteResolver,\n level: string,\n prefix: string,\n suffix: string,\n separator = '.',\n): string {\n if (!suffix) return prefix;\n\n const joined = `${prefix}${separator}${suffix}`;\n if (!suffix.startsWith(`${prefix}${separator}`)) return joined;\n\n // 歧义场景:基于已加载缓存判定\n if (forge.hasRoute(level, joined)) return joined;\n if (forge.hasRoute(level, suffix)) return suffix;\n\n throw new UnknownRouteError(joined, level);\n}\n"]}
1
+ {"version":3,"sources":["../src/cache.ts","../src/errors.ts","../src/interceptors.ts","../src/adapters/builtin-http.ts","../src/adapters/axios.ts","../src/adapters/index.ts","../src/resolveRouteName.ts","../src/defineImmutableProps.ts","../src/loading.ts","../src/forge.ts"],"names":["wrapped","prefix","isAbortError","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 按层级隔离的路由表缓存\n * @see .docs/SPEC.md §4.1.2\n *\n * 规则:\n * - 每层级独立条目,互不污染(cache key = `route-forge:${level}`)\n * - TTL 优先用后端响应里的 cache 字段,本地 cache.ttl 仅作兜底\n * - storage: 'memory' | 'sessionStorage' | 'localStorage'\n */\n\nimport type { CacheStorage, LevelRoutesResponse, RouteMeta } from './types.js';\n\ninterface CacheEntry {\n level: string;\n routes: Record<string, RouteMeta>;\n ttl: number | null;\n cachedAt: number;\n}\n\nconst KEY_PREFIX = 'route-forge:';\n\nfunction pickStorage(storage: CacheStorage): Storage | null {\n if (storage === 'memory') return null;\n if (typeof globalThis === 'undefined') return null;\n if (storage === 'sessionStorage') {\n return globalThis.sessionStorage ?? null;\n }\n if (storage === 'localStorage') {\n return globalThis.localStorage ?? null;\n }\n return null;\n}\n\nexport class RouteCache {\n private readonly storage: CacheStorage;\n private readonly fallbackTtl: number;\n private readonly backend: Storage | null;\n private readonly memory = new Map<string, CacheEntry>();\n\n constructor(opts: { storage: CacheStorage; ttl: number }) {\n this.storage = opts.storage;\n this.fallbackTtl = opts.ttl;\n this.backend = pickStorage(opts.storage);\n }\n\n private key(level: string): string {\n return `${KEY_PREFIX}${level}`;\n }\n\n get(level: string): CacheEntry | undefined {\n if (this.storage === 'memory' || !this.backend) {\n return this.getFromMemory(level);\n }\n const raw = this.backend.getItem(this.key(level));\n if (raw) {\n try {\n const entry = JSON.parse(raw) as CacheEntry;\n if (this.isExpired(entry)) {\n this.del(level);\n return undefined;\n }\n return entry;\n } catch {\n return undefined;\n }\n }\n // storage 写入曾失败(如配额满/被禁用)时,条目可能仅存在于内存回退中,需兼顾读取\n return this.getFromMemory(level);\n }\n\n private getFromMemory(level: string): CacheEntry | undefined {\n const entry = this.memory.get(level);\n if (!entry) return undefined;\n if (this.isExpired(entry)) {\n this.memory.delete(level);\n return undefined;\n }\n return entry;\n }\n\n set(resp: LevelRoutesResponse): void {\n // SPEC §5.3:后端 cache 为上限,前端可缩短但不能延长\n let ttl: number | null;\n if (resp.cache !== undefined && resp.cache !== null) {\n // 后端有值:取 min(后端, 前端兜底),确保前端不能延长后端设定的 TTL\n ttl = resp.cache > 0 ? Math.min(resp.cache, this.fallbackTtl) : resp.cache;\n } else {\n // 后端未下发:使用前端兜底 TTL\n ttl = this.fallbackTtl;\n }\n const entry: CacheEntry = {\n level: resp.level,\n routes: resp.routes,\n ttl,\n cachedAt: Date.now(),\n };\n if (this.storage === 'memory' || !this.backend) {\n this.memory.set(resp.level, entry);\n return;\n }\n try {\n this.backend.setItem(this.key(resp.level), JSON.stringify(entry));\n } catch {\n // 容量满或被禁用:回退内存\n this.memory.set(resp.level, entry);\n }\n }\n\n del(level: string): void {\n this.memory.delete(level);\n if (this.backend) {\n try {\n this.backend.removeItem(this.key(level));\n } catch {\n /* noop */\n }\n }\n }\n\n clear(): void {\n this.memory.clear();\n if (this.backend) {\n try {\n const toRemove: string[] = [];\n for (let i = 0; i < this.backend.length; i++) {\n const k = this.backend.key(i);\n if (k && k.startsWith(KEY_PREFIX)) toRemove.push(k);\n }\n for (const k of toRemove) this.backend.removeItem(k);\n } catch {\n /* noop */\n }\n }\n }\n\n private isExpired(entry: CacheEntry): boolean {\n if (entry.ttl === null) return false;\n if (entry.ttl === 0) return false; // 0 表示永久\n return Date.now() - entry.cachedAt > entry.ttl * 1000;\n }\n}\n","/**\n * Route Forge 错误基类与具体错误类\n * @see .docs/SPEC.md §6\n */\n\nexport interface ForgeErrorContext {\n [key: string]: unknown;\n}\n\nexport class ForgeError extends Error {\n readonly code: string;\n readonly route?: string;\n readonly level?: string;\n readonly context?: ForgeErrorContext;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n opts: {\n code: string;\n route?: string;\n level?: string;\n context?: ForgeErrorContext;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = opts.code;\n if (opts.route !== undefined) this.route = opts.route;\n if (opts.level !== undefined) this.level = opts.level;\n if (opts.context !== undefined) this.context = opts.context;\n if (opts.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/** RF_FE_001:路由名不存在于已加载层级中 */\nexport class UnknownRouteError extends ForgeError {\n constructor(route: string, level?: string) {\n super(`Route \"${route}\" not found${level ? ` in level \"${level}\"` : ''}`, {\n code: 'RF_FE_001',\n route,\n level,\n });\n }\n}\n\n/** RF_FE_002:路由所在层级未在 levels 声明 */\nexport class UnknownLevelError extends ForgeError {\n constructor(level: string) {\n super(`Level \"${level}\" not declared in options.levels`, {\n code: 'RF_FE_002',\n level,\n });\n }\n}\n\n/** RF_FE_003:路径参数缺失(strict=true 时) */\nexport class MissingRouteParamError extends ForgeError {\n constructor(route: string, missingParams: string[]) {\n super(`Missing path parameter(s) ${missingParams.join(', ')} for route \"${route}\"`, {\n code: 'RF_FE_003',\n route,\n context: { missingParams },\n });\n }\n}\n\n/** RF_FE_005:adapter: 'axios' 但未检测到 axios */\nexport class AdapterNotFoundError extends ForgeError {\n constructor(adapter: string) {\n super(`Adapter \"${adapter}\" not available; install axios or use 'builtin'`, {\n code: 'RF_FE_005',\n context: { adapter },\n });\n }\n}\n\n/** RF_FE_006:请求拦截器返回非 RequestConfig */\nexport class InvalidInterceptorReturnError extends ForgeError {\n constructor(route?: string) {\n super(`Request interceptor must return a RequestConfig object`, {\n code: 'RF_FE_006',\n route,\n });\n }\n}\n\n/** RF_FE_007:adapter 抛出的网络错误(DNS、连接超时等) */\nexport class NetworkError extends ForgeError {\n constructor(message: string, route?: string, level?: string, cause?: unknown) {\n super(message, { code: 'RF_FE_007', route, level, cause });\n }\n}\n\n/** RF_FE_008:HTTP 非 2xx 且未被 onRejected 拦截器恢复 */\nexport class HTTPError extends ForgeError {\n constructor(\n message: string,\n opts: { route?: string; level?: string; status?: number; url?: string; method?: string; cause?: unknown },\n ) {\n super(message, {\n code: 'RF_FE_008',\n route: opts.route,\n level: opts.level,\n context: { status: opts.status, url: opts.url, method: opts.method },\n cause: opts.cause,\n });\n }\n}\n\n/** RF_FE_009:请求被 AbortSignal 取消 */\nexport class RequestAbortedError extends ForgeError {\n constructor(route?: string, level?: string, cause?: unknown) {\n super(`Request aborted${route ? ` for route \"${route}\"` : ''}`, {\n code: 'RF_FE_009',\n route,\n level,\n cause,\n });\n }\n}\n","/**\n * 拦截器管理器实现\n * @see .docs/SPEC.md §4.1.3a, §4.1.1\n *\n * 执行顺序约定(对齐 axios):\n * - 请求拦截器:LIFO(后注册先执行),onRejected 与 onFulfilled 同序\n * - 响应拦截器:FIFO(先注册先执行),onRejected 与 onFulfilled 同序\n *\n * 实现策略:\n * - InterceptorManagerImpl.forEach 保持正序迭代(与 use/eject 语义一致)\n * - runRequestInterceptors 收集 handlers 后 reverse() 再串联 Promise 链,实现 LIFO\n * - runResponseInterceptors 直接正序串联,实现 FIFO\n *\n * 串联实现:采用标准 Promise 链语义\n * `Promise.resolve(initial).then(f0, r0).then(f1, r1).then(f2, r2)...`\n * - onFulfilled 抛错 → 下一组 onRejected 接住\n * - onRejected 返回值 → 后续 onFulfilled 继续执行(恢复为正常流程)\n * - onRejected 抛错 → 下一组 onRejected 接住 / 进入调用方 catch\n */\n\nimport type {\n InterceptorHandler,\n InterceptorManager,\n RequestConfig,\n ResponseData,\n} from './types.js';\nimport { InvalidInterceptorReturnError } from './errors.js';\n\nexport class InterceptorManagerImpl<TIn, TOut = TIn> implements InterceptorManager<TIn, TOut> {\n private handlers: InterceptorHandler<TIn, TOut>[] = [];\n private nextId = 0;\n\n use(\n onFulfilled?: (value: TIn) => TOut | Promise<TOut>,\n onRejected?: (error: unknown) => unknown | Promise<unknown>,\n ): number {\n const id = this.nextId++;\n this.handlers.push({ id, onFulfilled, onRejected });\n return id;\n }\n\n eject(id: number): void {\n const idx = this.handlers.findIndex((h) => h.id === id);\n if (idx >= 0) this.handlers.splice(idx, 1);\n }\n\n clear(): void {\n this.handlers = [];\n }\n\n forEach(fn: (handler: InterceptorHandler<TIn, TOut>) => void): void {\n for (const h of this.handlers) fn(h);\n }\n\n /** 测试用:当前注册数量 */\n get size(): number {\n return this.handlers.length;\n }\n}\n\n/**\n * 串联请求拦截器(LIFO,对齐 axios)。\n *\n * - onFulfilled 必须返回对象(RequestConfig);非对象抛 InvalidInterceptorReturnError\n * - onFulfilled 抛错 → 同管理器的 onRejected 链;某段 onRejected 返回值则恢复正序流程\n * - 仍未消化则向上抛,不发请求\n */\nexport async function runRequestInterceptors(\n manager: InterceptorManager<RequestConfig, RequestConfig>,\n initial: RequestConfig,\n): Promise<RequestConfig> {\n const handlers: InterceptorHandler<RequestConfig, RequestConfig>[] = [];\n manager.forEach((h) => handlers.push(h));\n // 请求拦截器 LIFO(对齐 axios):后注册先执行\n handlers.reverse();\n\n let p: Promise<unknown> = Promise.resolve(initial);\n for (const h of handlers) {\n const onF = h.onFulfilled;\n const onR = h.onRejected;\n p = p.then(\n async (v) => {\n if (!onF) return v;\n const result = await onF(v as RequestConfig);\n if (result === null || typeof result !== 'object') {\n throw new InvalidInterceptorReturnError();\n }\n return result;\n },\n (e) => (onR ? onR(e) : Promise.reject(e)),\n );\n }\n return p as Promise<RequestConfig>;\n}\n\n/**\n * 串联响应拦截器(FIFO,对齐 axios)。\n *\n * - HTTP 非 2xx 或任一 onFulfilled 抛错 → onRejected 链;onRejected 返回值则恢复正序流程\n * - 首段 onFulfilled 接收 ResponseData;后续段接收上一段返回值(类型由用户约束)\n * - 末段返回值即 forge.api() 的 resolve 值\n *\n * @param source 已包含 HTTP 错误转换逻辑的 ResponseData Promise\n * (HTTP 非 2xx 时 reject 为 HTTPError;网络层错误 reject 为 NetworkError)\n */\nexport async function runResponseInterceptors(\n manager: InterceptorManager<ResponseData, unknown>,\n source: Promise<ResponseData>,\n): Promise<unknown> {\n const handlers: InterceptorHandler<ResponseData, unknown>[] = [];\n manager.forEach((h) => handlers.push(h));\n\n let p: Promise<unknown> = source;\n for (const h of handlers) {\n const onF = h.onFulfilled;\n const onR = h.onRejected;\n p = p.then(\n (v) => (onF ? onF(v as ResponseData) : v),\n (e) => (onR ? onR(e) : Promise.reject(e)),\n );\n }\n return p;\n}\n\n/**\n * 工厂函数:供自定义 Fetcher 复用同一套拦截器实现\n * @see .docs/SPEC.md §4.3.3\n */\nexport function createInterceptorManager<TIn, TOut = TIn>(): InterceptorManager<TIn, TOut> {\n return new InterceptorManagerImpl<TIn, TOut>();\n}\n","/**\n * 内置类 axios 精简实现(builtin adapter)\n * @see .docs/SPEC.md §4.3.1\n *\n * 设计目标:\n * - API 兼容 axios(use/eject/clear、request/get/post/...)便于业务代码零成本切换\n * - 拦截器执行顺序对齐 axios(请求 LIFO、响应 FIFO),与 SPEC §4.1.3a 一致\n * - 仅实现 Route Forge 调用链需要的能力:拦截器、JSON、超时、取消\n * - 零依赖,仅基于宿主原生 fetch(Node 18+ / 现代浏览器原生支持)\n * - 体积目标:min+gzip < 3KB,仅作为兜底,不追求覆盖 axios 全部 API\n */\n\nimport type { InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport {\n createInterceptorManager,\n runRequestInterceptors,\n runResponseInterceptors,\n} from '../interceptors.js';\nimport { HTTPError, NetworkError } from '../errors.js';\n\n/**\n * 判断 body 是否为宿主原生可直接传输的类型(跳过 JSON 序列化)。\n */\nfunction isPassthroughBody(body: unknown): boolean {\n if (body === null) return false;\n return (\n (typeof FormData !== 'undefined' && body instanceof FormData) ||\n (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) ||\n (typeof Blob !== 'undefined' && body instanceof Blob) ||\n (typeof ArrayBuffer !== 'undefined' &&\n (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) ||\n (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)\n );\n}\n\n/**\n * 判断错误是否为请求取消错误(AbortSignal 触发)\n */\nfunction isAbortError(err: unknown): boolean {\n const e = err as { name?: string } | null;\n return !!e && e.name === 'AbortError';\n}\n\n/**\n * 合并多个 AbortSignal:任一 signal abort 即返回合并后的 signal abort。\n * 优先使用 AbortSignal.any(Node 20.3+ / 现代浏览器),否则回退到手动监听。\n */\nfunction combineSignals(...signals: (AbortSignal | undefined)[]): AbortSignal | undefined {\n const valid = signals.filter((s): s is AbortSignal => !!s);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n // AbortSignal.any 可用时直接使用(Node 20.3+ / 现代浏览器)\n if (typeof AbortSignal !== 'undefined' && typeof (AbortSignal as any).any === 'function') {\n return (AbortSignal as any).any(valid);\n }\n // 回退:手动构造 AbortController,监听任一 signal abort\n const controller = new AbortController();\n for (const s of valid) {\n if (s.aborted) {\n controller.abort(s.reason);\n return controller.signal;\n }\n s.addEventListener('abort', () => controller.abort(s.reason), { once: true });\n }\n return controller.signal;\n}\n\nexport function createBuiltinHttp(forgeInterceptors?: {\n request: InterceptorManager<RequestConfig, RequestConfig>;\n response: InterceptorManager<ResponseData, unknown>;\n}) {\n const requestMgr = forgeInterceptors?.request ?? createInterceptorManager<RequestConfig>();\n const responseMgr = forgeInterceptors?.response ?? createInterceptorManager<ResponseData>();\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n // 1. 执行请求拦截器(LIFO,对齐 axios)\n const finalConfig = await runRequestInterceptors(requestMgr, config);\n\n // 2. 超时控制:timeout > 0 时用 AbortSignal.timeout\n // 若同时有用户 signal,合并两者(任一 abort 即取消请求)\n const signal = combineSignals(\n finalConfig.signal,\n finalConfig.timeout && finalConfig.timeout > 0\n ? AbortSignal.timeout(finalConfig.timeout)\n : undefined,\n );\n\n // 3. paramsSerializer:自定义 query 序列化\n let url = finalConfig.url;\n if (finalConfig.paramsSerializer && finalConfig.params) {\n const qs = finalConfig.paramsSerializer(finalConfig.params);\n if (qs) {\n url = url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n }\n }\n\n // 4. 构建 fetchInit(body 序列化 + JSON Content-Type 自动补齐)\n const headers = new Headers(finalConfig.headers);\n const fetchInit: RequestInit = {\n method: finalConfig.method,\n headers,\n };\n if (signal) fetchInit.signal = signal;\n if (\n finalConfig.body !== undefined &&\n !['GET', 'HEAD'].includes(finalConfig.method.toUpperCase())\n ) {\n if (typeof finalConfig.body === 'string' || isPassthroughBody(finalConfig.body)) {\n fetchInit.body = finalConfig.body as BodyInit;\n } else {\n fetchInit.body = JSON.stringify(finalConfig.body);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n }\n }\n\n // 5. 调用 fetch(网络层错误转 NetworkError,便于独立使用 adapter 时错误语义一致)\n // 请求取消(AbortError)不包装,保留原始错误以便上层转换为 RequestAbortedError\n let res: Response;\n try {\n res = await fetch(url, fetchInit);\n } catch (e) {\n if (isAbortError(e)) throw e;\n throw new NetworkError(\n e instanceof Error ? e.message : String(e),\n finalConfig.route,\n finalConfig.level,\n e,\n );\n }\n const text = await res.text();\n let data: unknown = text;\n const contentType = res.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n data = JSON.parse(text);\n } catch {\n /* 保留原始文本 */\n }\n }\n\n // 6. 构建 ResponseData\n const responseData: ResponseData = {\n route: finalConfig.route,\n level: finalConfig.level,\n method: finalConfig.method,\n url,\n status: res.status,\n headers: res.headers,\n data,\n config: finalConfig,\n };\n\n // 7. 执行响应拦截器(FIFO,对齐 axios);末段返回值即 request() 的 resolve 值\n // HTTP 非 2xx → 转 HTTPError 后进入响应拦截器 onRejected 链(SPEC §4.1.3a 步骤 9)\n const source: Promise<ResponseData> =\n res.status >= 200 && res.status < 300\n ? Promise.resolve(responseData)\n : Promise.reject(\n new HTTPError(\n `HTTP ${res.status} for route \"${finalConfig.route}\" (${finalConfig.method} ${url})`,\n {\n route: finalConfig.route,\n level: finalConfig.level,\n status: res.status,\n url,\n method: finalConfig.method,\n },\n ),\n );\n return runResponseInterceptors(\n responseMgr,\n source,\n ) as Promise<ResponseData>;\n }\n\n // 便捷方法\n const get = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'GET' } as RequestConfig);\n const post = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'POST' } as RequestConfig);\n const put = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'PUT' } as RequestConfig);\n const patch = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'PATCH' } as RequestConfig);\n const del = (url: string, config?: Partial<RequestConfig>) =>\n request({ ...config, url, method: 'DELETE' } as RequestConfig);\n\n return {\n request,\n interceptors: {\n request: requestMgr,\n response: responseMgr,\n },\n runsInterceptors: true,\n get,\n post,\n put,\n patch,\n delete: del,\n };\n}\n","/**\n * 把宿主项目的 axios 实例包装为 Fetcher adapter\n * @see .docs/SPEC.md §4.3.2, §4.3.4\n *\n * 设计约定:\n * - 不接管或修改宿主 axios 已有拦截器/defaults 配置,仅调用其 request 入口\n * - 宿主 axios 的 defaults.baseURL/defaults.headers 自动生效\n * - 宿主已注册的拦截器会先执行;Route Forge 自身拦截器在宿主拦截器之后执行\n * (由 forge.interceptors 注入到宿主 axios 时序)后续阶段填充\n * - 未检测到 axios 时返回 null(让 'auto' 自动降级到 builtin)\n */\n\nimport type { RequestConfig, ResponseData } from '../types.js';\nimport type { ResolvedAdapter } from './index.js';\n\n/** 把 axios 响应头(可能是 AxiosHeaders 实例)安全转为标准 Headers */\nfunction toHeaders(raw: unknown): Headers {\n if (!raw) return new Headers();\n const init =\n typeof (raw as any).toJSON === 'function' ? (raw as any).toJSON() : raw;\n try {\n return new Headers(init);\n } catch {\n return new Headers();\n }\n}\n\nexport async function wrapAxiosAdapter(): Promise<ResolvedAdapter | null> {\n // ESM 友好的动态探测:尝试 import('axios'),失败则查全局 window.axios\n // 使用变量引用模块名,避免打包工具(rollup/esbuild)静态分析并打包 axios\n let axios: any;\n const axiosModule = 'axios';\n try {\n const mod = await import(/* @vite-ignore */ axiosModule);\n axios = mod.default ?? mod;\n } catch {\n if (typeof globalThis !== 'undefined' && (globalThis as any).axios) {\n axios = (globalThis as any).axios;\n }\n }\n if (!axios || typeof axios.request !== 'function') return null;\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n const headers: Record<string, string> = { ...config.headers };\n try {\n const res = await axios.request({\n url: config.url,\n method: config.method,\n headers,\n data: config.body,\n // axios 会处理 baseURL/transformRequest 等 defaults;timeout 透传保证超时语义与 builtin 一致\n timeout: config.timeout,\n signal: config.signal, // 请求取消信号(AbortSignal)\n });\n\n return {\n route: config.route,\n level: config.level,\n method: config.method,\n url: config.url,\n status: res.status,\n headers: toHeaders(res.headers),\n data: res.data,\n config,\n };\n } catch (e: any) {\n // axios 默认 validateStatus 对非 2xx 抛错:携带响应时转为 ResponseData 返回,\n // 由上层统一转 HTTPError 并触发响应拦截器 onRejected 链(与 builtin 行为一致);\n // 无响应(网络错误/超时)则原样重抛,由上层转 NetworkError。\n if (e && e.response) {\n const resp = e.response;\n return {\n route: config.route,\n level: config.level,\n method: config.method,\n url: config.url,\n status: resp.status,\n headers: toHeaders(resp.headers),\n data: resp.data,\n config,\n };\n }\n throw e;\n }\n }\n\n // 不暴露宿主 axios 的 interceptors manager(避免覆盖 Route Forge 的统一时序);\n // Route Forge 调用链由 forge.interceptors 控制,宿主拦截器先执行由 axios 内部保证。\n return { request, interceptors: undefined };\n}\n","/**\n * Adapter 入口\n * @see .docs/SPEC.md §4.3\n *\n * Route Forge 提供三种 adapter:\n * 1. 'auto'(默认):检测到宿主 axios 则用之;否则用内置 builtin adapter\n * 2. 'axios':强制宿主 axios,未安装抛 AdapterNotFoundError\n * 3. 'builtin':强制内置实现\n * 自定义 Fetcher 接口直接传入即可(绕过 auto 检测)。\n */\n\nimport type { Fetcher, InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport { AdapterNotFoundError } from '../errors.js';\nimport { createBuiltinHttp } from './builtin-http.js';\nimport { wrapAxiosAdapter } from './axios.js';\n\nexport type ResolvedAdapter = {\n request: (config: RequestConfig) => Promise<ResponseData>;\n interceptors?: Fetcher['interceptors'];\n runsInterceptors?: boolean;\n /**\n * 便捷方法(可选)。\n * - builtin adapter 提供全部 5 个方法\n * - axios / 自定义 Fetcher 可不提供(调用方需先判断存在性)\n * @see .docs/SPEC.md §4.3.1\n */\n get?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n post?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n put?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n patch?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n delete?: (url: string, config?: Partial<RequestConfig>) => Promise<ResponseData>;\n};\n\nexport interface ResolveAdapterOptions {\n adapter: 'auto' | 'axios' | 'builtin' | Fetcher;\n forgeInterceptors?: {\n request: InterceptorManager<RequestConfig, RequestConfig>;\n response: InterceptorManager<ResponseData, unknown>;\n };\n}\n\n/**\n * 解析 adapter 配置;同步阶段尝试 import('axios'),失败则降级。\n * 注意:实际 axios 探测在生产实现里需要 lazy import;此处仅为框架占位。\n */\nexport async function resolveAdapter(opts: ResolveAdapterOptions): Promise<ResolvedAdapter> {\n const { adapter } = opts;\n\n if (adapter && typeof adapter === 'object') {\n return {\n request: (config: RequestConfig) => adapter.request(config),\n interceptors: adapter.interceptors,\n };\n }\n\n if (adapter === 'builtin') {\n return createBuiltinHttp(opts.forgeInterceptors);\n }\n\n if (adapter === 'axios') {\n const wrapped = await wrapAxiosAdapter();\n if (!wrapped) throw new AdapterNotFoundError('axios');\n return wrapped;\n }\n\n // auto: 优先尝试 axios,失败则 builtin\n const wrapped = await wrapAxiosAdapter().catch(() => null);\n if (wrapped) return wrapped;\n return createBuiltinHttp(opts.forgeInterceptors);\n}\n","/**\n * 智能路由名前缀解析\n *\n * 当前缀与后缀拼接产生歧义时(后缀本身已以前缀开头),\n * 通过查询已加载路由表来判定正确名称:\n * - 优先尝试 prefix + sep + suffix(完整拼接)\n * - 若不存在则回退到 suffix(视为已含前缀)\n * - 均不存在则抛 UnknownRouteError\n *\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { UnknownRouteError } from './errors.js';\n\n/**\n * 路由名解析所需的最小 forge 接口。\n * 仅依赖 load() 和 hasRoute(),不依赖拦截器等完整能力。\n * 兼容 RouteForge、BoundForgeTyped、ForgeInstanceTyped 等所有形态。\n */\nexport interface RouteResolver {\n load(level: string | string[]): Promise<void>;\n\n hasRoute(level: string, name: string): boolean;\n}\n\n/**\n * 异步版本:先确保层级已加载,再做歧义消解。\n * 适用于 api() 调用路径。\n */\nexport async function resolveRouteName(\n forge: RouteResolver,\n level: string,\n prefix: string,\n suffix: string,\n separator = '.',\n): Promise<string> {\n // 后缀为空 → 直接返回前缀\n if (!suffix) return prefix;\n\n const joined = `${prefix}${separator}${suffix}`;\n\n // 后缀不以前缀开头 → 无歧义,直接拼接\n if (!suffix.startsWith(`${prefix}${separator}`)) return joined;\n\n // 歧义场景:先确保层级已加载\n await forge.load(level);\n\n // 优先尝试完整拼接\n if (forge.hasRoute(level, joined)) return joined;\n // 回退到后缀本身(视为已含前缀)\n if (forge.hasRoute(level, suffix)) return suffix;\n\n // 均不存在 → 报错\n throw new UnknownRouteError(joined, level);\n}\n\n/**\n * 同步版本:基于已加载缓存做歧义消解。\n * 适用于 route() / url() 调用路径(要求层级已加载)。\n */\nexport function resolveRouteNameSync(\n forge: RouteResolver,\n level: string,\n prefix: string,\n suffix: string,\n separator = '.',\n): string {\n if (!suffix) return prefix;\n\n const joined = `${prefix}${separator}${suffix}`;\n if (!suffix.startsWith(`${prefix}${separator}`)) return joined;\n\n // 歧义场景:基于已加载缓存判定\n if (forge.hasRoute(level, joined)) return joined;\n if (forge.hasRoute(level, suffix)) return suffix;\n\n throw new UnknownRouteError(joined, level);\n}\n","/**\n * 以不可变、不可枚举、不可重配置的方式将属性挂载到目标对象上。\n * 相比 Object.assign 更安全——外部无法通过遍历/删除/重写篡改这些方法。\n * 对象类型的值会浅冻结(Object.freeze),防止内部键被增删改。\n *\n * @internal 仅供框架适配层(vue/react)内部使用,不作为公共 API 导出\n */\nexport function defineImmutableProps<T extends object>(target: T, props: Record<string, unknown>): T {\n for (const key of Object.keys(props)) {\n const val = props[key];\n Object.defineProperty(target, key, {\n value: val !== null && typeof val === 'object' ? Object.freeze(val) : val,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n return target;\n}\n","/**\n * LoadingTracker:加载中标识状态管理\n *\n * 通过引用计数器跟踪并发请求数。\n * - start():计数器 +1,进入加载状态\n * - stop():计数器 -1,归零时退出加载状态\n * - isLoading():查询当前是否处于加载中\n * - subscribe(cb):监听状态变化,返回取消订阅函数\n *\n * @see .docs/SPEC.md §4.1.8\n */\n\n/** 状态变更回调签名 */\nexport type LoadingChangeCallback = (event: LoadingChangeEvent) => void;\n\n/** 状态变更事件 */\nexport interface LoadingChangeEvent {\n /** 当前是否仍处于加载中 */\n loading: boolean;\n /** 当前并发请求数 */\n count: number;\n}\n\n/**\n * 加载状态跟踪器\n *\n * 单一计数器,跟踪所有 API 请求的并发数。\n * 不绑定任何 UI 样式,仅提供状态供框架层或业务层消费。\n */\nexport class LoadingTracker {\n /** 当前并发请求计数 */\n private count = 0;\n /** 订阅者集合 */\n private subscribers = new Set<LoadingChangeCallback>();\n\n /**\n * 开始一次加载(计数器 +1)\n */\n start(): void {\n this.count++;\n this.notify();\n }\n\n /**\n * 结束一次加载(计数器 -1)\n */\n stop(): void {\n this.count = Math.max(0, this.count - 1);\n this.notify();\n }\n\n /**\n * 查询当前是否处于加载中\n */\n isLoading(): boolean {\n return this.count > 0;\n }\n\n /**\n * 获取当前并发计数\n */\n getCount(): number {\n return this.count;\n }\n\n /**\n * 订阅加载状态变更\n * @returns 取消订阅函数\n */\n subscribe(cb: LoadingChangeCallback): () => void {\n this.subscribers.add(cb);\n return () => {\n this.subscribers.delete(cb);\n };\n }\n\n /** 通知所有订阅者 */\n private notify(): void {\n const event: LoadingChangeEvent = {\n loading: this.count > 0,\n count: this.count,\n };\n for (const cb of this.subscribers) {\n try {\n cb(event);\n } catch {\n // 订阅者回调异常不影响其他订阅者及请求流程\n }\n }\n }\n}\n","/**\n * Route Forge 主入口:createRouteForge\n * @see .docs/SPEC.md §4.1.1 ~ §4.1.4\n *\n * 能力清单(v1.0 MVP):\n * - 按层级懒加载与隔离缓存(§4.1.2)\n * - 并发去重(§4.1.4)\n * - 通过路由名调用 API(§4.1.3)\n * - 拦截器(§4.1.3a)\n * - Adapter auto 检测 / builtin / axios / 自定义 Fetcher(§4.3)\n */\n\nimport { RouteCache } from './cache.js';\nimport {\n createInterceptorManager,\n InterceptorManagerImpl,\n runRequestInterceptors,\n runResponseInterceptors,\n} from './interceptors.js';\nimport { resolveAdapter } from './adapters/index.js';\nimport { resolveRouteName, resolveRouteNameSync } from './resolveRouteName.js';\nimport { defineImmutableProps } from './defineImmutableProps.js';\nimport type { LoadingChangeCallback } from './loading.js';\nimport { LoadingTracker } from './loading.js';\nimport {\n AdapterNotFoundError,\n ForgeError,\n HTTPError,\n MissingRouteParamError,\n NetworkError,\n RequestAbortedError,\n UnknownLevelError,\n UnknownRouteError,\n} from './errors.js';\nimport type {\n ApiCallParams,\n BoundForge,\n InterceptorManager,\n LevelRoutesResponse,\n RequestConfig,\n ResponseData,\n RouteForge,\n RouteForgeOptions,\n RouteMeta,\n SummaryResponse,\n} from './types.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_CACHE_TTL = 3600;\n\n/**\n * 后端摘要端点返回的未分配层级路由,前端作为虚拟层级 \"unassigned\" 消费\n * @see .docs/SPEC.md §3.1.6\n */\nconst UNASSIGNED_LEVEL = 'unassigned';\n\nexport function createRouteForge(options: RouteForgeOptions): RouteForge {\n if (!options.endpoint) throw new TypeError('options.endpoint is required');\n\n const {\n adapter = 'auto',\n timeout = DEFAULT_TIMEOUT,\n baseURL = '',\n interceptors: declarativeInterceptors,\n cache: cacheOpts = {},\n } = options;\n\n // --- 加载中标识跟踪器(始终跟踪,用户不监听即可)---\n const loadingTracker = new LoadingTracker();\n\n // --- 自动发现(SPEC §4.1.1 + §5.3)---\n const explicitLevels = options.levels;\n const explicitEager = options.eager;\n const explicitStrict = options.strict ?? false;\n const explicitEndpoint = options.endpoint;\n\n // effective* 状态:在摘要端点响应到达后被填充\n let effectiveLevels: string[] = explicitLevels ?? [];\n let effectiveEager: string[] = explicitEager ?? [];\n let effectiveStrict = explicitStrict;\n let effectiveEndpoint = explicitEndpoint;\n let effectiveUrlPrefix = ''; // 后端下发的 URL 前缀,默认为空\n\n // 未分配层级路由:来自摘要端点的 unassigned 字段,前端作为虚拟层级 \"unassigned\" 消费\n // @see .docs/SPEC.md §3.1.6\n let summaryUnassigned: SummaryResponse['unassigned'] | undefined;\n // 后端是否将 unassigned 作为真实层级注册(在 levels 中);若是则走正常 HTTP 拉取,不走虚拟层级\n let backendHasUnassignedLevel = false;\n\n // 拉取摘要端点(用于 strict_mode / endpoint / levels / eager 自动发现)\n const summaryPromise = (async (): Promise<SummaryResponse | null> => {\n try {\n const summaryUrl = explicitEndpoint; // GET {endpoint} = 摘要端点\n const resp = await fetch(summaryUrl, { method: 'GET' });\n if (!resp.ok) {\n console.warn(\n `[route-forge] summary endpoint ${summaryUrl} unreachable (HTTP ${resp.status}); falling back to explicit options`,\n );\n return null;\n }\n return (await resp.json()) as SummaryResponse;\n } catch (e) {\n if (explicitLevels && explicitLevels.length > 0) {\n console.warn(\n `[route-forge] summary endpoint unreachable: ${(e as Error).message}; using explicit levels`,\n );\n return null;\n }\n // 未传 levels 且摘要端点不可达 → 抛 UnknownLevelError\n throw new UnknownLevelError('(auto-discovery)');\n }\n })();\n\n // 自动发现异步填充(不阻塞 createRouteForge 返回)\n const autoDiscoveryPromise = summaryPromise.then((summary) => {\n if (summary === null) {\n return;\n }\n\n // 0. schemaVersion 向前兼容(DESIGN.md §6.3)\n const schemaVersion = summary.schemaVersion ?? 1;\n if (schemaVersion > 1) {\n console.warn(\n `[route-forge] backend schemaVersion=${schemaVersion} > client supported 1; some features may be unavailable`,\n );\n }\n\n // 1. endpoint 后端权威\n if (summary.config.endpoint_prefix && summary.config.endpoint_prefix !== explicitEndpoint) {\n console.warn(\n `[route-forge] backend endpoint_prefix \"${summary.config.endpoint_prefix}\" overrides frontend endpoint \"${explicitEndpoint}\"`,\n );\n effectiveEndpoint = summary.config.endpoint_prefix;\n }\n\n // 1a. url_prefix 后端权威:后端下发时覆盖\n if (summary.config.url_prefix) {\n effectiveUrlPrefix = summary.config.url_prefix.endsWith('/')\n ? summary.config.url_prefix.slice(0, -1)\n : summary.config.url_prefix;\n }\n\n // 2. strict_mode 后端权威:不能放宽,可收紧\n if (summary.config.strict_mode && !explicitStrict) {\n console.warn(\n '[route-forge] backend strict_mode=true overrides frontend strict=false; forcing strict=true',\n );\n effectiveStrict = true;\n }\n\n // 3. levels 取交集或自动发现\n const backendLevels = Object.keys(summary.levels);\n\n // 3a. 捕获摘要端点的 unassigned 字段,作为虚拟层级 \"unassigned\" 消费(SPEC §3.1.6)\n // 仅当后端未将 unassigned 作为真实层级注册时才启用虚拟层级\n backendHasUnassignedLevel = backendLevels.includes(UNASSIGNED_LEVEL);\n if (Array.isArray(summary.unassigned) && summary.unassigned.length > 0 && !backendHasUnassignedLevel) {\n summaryUnassigned = summary.unassigned;\n }\n\n // 可用层级 = 后端真实层级 + 虚拟 unassigned 层级(若有未分配路由)\n const availableLevels = backendLevels.slice();\n if (summaryUnassigned && !backendHasUnassignedLevel) {\n availableLevels.push(UNASSIGNED_LEVEL);\n }\n\n if (explicitLevels && explicitLevels.length > 0) {\n const intersection = explicitLevels.filter((l) => availableLevels.includes(l));\n const removed = explicitLevels.filter((l) => !availableLevels.includes(l));\n if (removed.length > 0) {\n console.warn(\n `[route-forge] levels not in backend summary and dropped: ${removed.join(', ')}`,\n );\n }\n effectiveLevels = intersection;\n } else {\n effectiveLevels = availableLevels;\n }\n\n // 4. eager:未传时取后端 load:'eager' 层级;显式传入时取并集(SPEC §5.3)\n const backendEager = backendLevels.filter((lvl) => summary.levels[lvl]?.load === 'eager');\n if (!explicitEager) {\n effectiveEager = backendEager;\n } else {\n // 并集:后端 eager + 前端显式声明,去重\n const union = new Set([...backendEager, ...explicitEager]);\n effectiveEager = [...union];\n }\n });\n\n // 防止 autoDiscoveryPromise 未被 await 时产生 unhandled rejection\n // 存储错误以便在 load/api 调用时重新抛出,保留原始错误信息\n let autoDiscoveryError: unknown = null;\n autoDiscoveryPromise.catch((e) => {\n autoDiscoveryError = e;\n });\n\n // --- Auto-discovery 完成状态 + ready Promise ---\n let autoDiscoveryCompleted = false;\n let resolveReady!: (value: RouteForge) => void;\n const readyPromise = new Promise<RouteForge>((resolve) => {\n resolveReady = resolve;\n });\n\n const cacheTtl = cacheOpts.ttl ?? DEFAULT_CACHE_TTL;\n const cacheStorage = cacheOpts.storage ?? 'memory';\n const cache = new RouteCache({ storage: cacheStorage, ttl: cacheTtl });\n\n const requestInterceptors: InterceptorManager<RequestConfig, RequestConfig> = new InterceptorManagerImpl();\n const responseInterceptors: InterceptorManager<ResponseData, unknown> = new InterceptorManagerImpl();\n\n // 声明式拦截器先注册(按数组顺序),随后允许运行时 use() 追加\n // 支持两种形式:单函数(视为 onFulfilled)或 [onFulfilled?, onRejected?] 元组(SPEC §4.1.1)\n if (declarativeInterceptors?.request) {\n for (const entry of declarativeInterceptors.request) {\n if (typeof entry === 'function') {\n requestInterceptors.use(entry);\n } else {\n const [onFulfilled, onRejected] = entry;\n requestInterceptors.use(onFulfilled, onRejected);\n }\n }\n }\n if (declarativeInterceptors?.response) {\n for (const entry of declarativeInterceptors.response) {\n if (typeof entry === 'function') {\n responseInterceptors.use(entry);\n } else {\n const [onFulfilled, onRejected] = entry;\n responseInterceptors.use(onFulfilled, onRejected);\n }\n }\n }\n\n const adapterPromise = resolveAdapter({\n adapter,\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n let adapterResolved = false;\n let adapterObj: Awaited<ReturnType<typeof resolveAdapter>> | null = null;\n\n async function ensureAdapter() {\n if (!adapterResolved) {\n adapterObj = await adapterPromise.catch((e) => {\n if (e instanceof AdapterNotFoundError) throw e;\n // 其他错误降级到 builtin(避免初始化失败)\n return resolveAdapter({ adapter: 'builtin' });\n });\n adapterResolved = true;\n }\n return adapterObj!;\n }\n\n const inflight = new Map<string, Promise<void>>();\n // 每个层级的失效代数,用于检测 loadOne 期间是否发生了 invalidate\n const invalidationGens = new Map<string, number>();\n\n function assertLevelDeclared(level: string): void {\n if (!effectiveLevels.includes(level)) {\n throw new UnknownLevelError(level);\n }\n }\n\n function assertDiscoveryReady(): void {\n if (!autoDiscoveryCompleted && !explicitLevels?.length) {\n throw new ForgeError(\n 'Route data not available. Auto-discovery has not completed. ' +\n 'Use forge.ready() or forge.use(level) first.',\n { code: 'RF_FE_010' },\n );\n }\n }\n\n function buildUrl(level: string): string {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const ep = effectiveEndpoint.startsWith('/') ? effectiveEndpoint : `/${effectiveEndpoint}`;\n return `${base}${ep}/${encodeURIComponent(level)}`;\n }\n\n async function fetchLevel(level: string): Promise<LevelRoutesResponse> {\n const adp = await ensureAdapter();\n const config: RequestConfig = {\n route: `__forge__.load.${level}`,\n level,\n method: 'GET',\n url: buildUrl(level),\n headers: { Accept: 'application/json' },\n params: {},\n timeout,\n meta: {\n name: `__forge__.load.${level}`,\n uri: buildUrl(level),\n methods: ['GET'],\n parameters: [],\n level,\n },\n };\n // 拉取元信息直接走 adapter(不走 forge.interceptors 链,避免与业务调用混淆)\n const resp = await adp.request(config);\n if (!resp || resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `Failed to load level \"${level}\": HTTP ${resp?.status}`,\n { level, status: resp?.status, url: buildUrl(level), method: 'GET' },\n );\n }\n const data = resp.data as LevelRoutesResponse;\n // 后端可能下发 cache 字段,让 RouteCache 优先采用\n return data;\n }\n\n async function loadOne(level: string): Promise<void> {\n if (autoDiscoveryError) throw autoDiscoveryError;\n assertLevelDeclared(level);\n\n // 缓存命中直接返回\n if (cache.get(level)) return;\n\n // inflight 去重\n const existing = inflight.get(level);\n if (existing) return existing;\n\n const gen = invalidationGens.get(level) ?? 0;\n const p = (async () => {\n try {\n // 虚拟层级 unassigned:直接从摘要数据构建响应,不发 HTTP 请求(SPEC §3.1.6)\n if (level === UNASSIGNED_LEVEL && !backendHasUnassignedLevel && summaryUnassigned) {\n const routes: Record<string, RouteMeta> = {};\n for (const r of summaryUnassigned) {\n routes[r.name] = { ...r, level: UNASSIGNED_LEVEL };\n }\n cache.set({ level: UNASSIGNED_LEVEL, routes, cache: null });\n return;\n }\n const resp = await fetchLevel(level);\n // 仅在缓存未被 invalidate 清除时写入,防止旧数据回写\n if ((invalidationGens.get(level) ?? 0) === gen) {\n cache.set(resp);\n }\n } finally {\n inflight.delete(level);\n }\n })();\n inflight.set(level, p);\n return p;\n }\n\n async function load(level: string | string[]): Promise<void> {\n await autoDiscoveryPromise;\n const list = Array.isArray(level) ? level : [level];\n await Promise.all(list.map(loadOne));\n }\n\n function route(level: string, name: string, params?: Record<string, unknown>): string {\n assertDiscoveryReady();\n // 静态生成 URL:仅查已加载缓存,未加载时抛 UnknownRouteError\n const meta = findRouteMeta(level, name);\n if (!meta) {\n throw new UnknownRouteError(name, level);\n }\n return buildRequestUrl(meta, params ?? {});\n }\n\n function buildRequestUrl(meta: RouteMeta, params: Record<string, unknown>): string {\n const defaults = meta.parameter_defaults ?? {};\n const missingRequired: string[] = [];\n\n // 1. 预解析每个声明参数的最终值(显式传参 > 后端默认值),并收集缺失的必填参数\n const values: Record<string, unknown> = {};\n for (const p of meta.parameters) {\n let v = params[p];\n // 参数未传时回退到后端下发的默认值\n if ((v === undefined || v === null) && p in defaults) {\n v = defaults[p];\n }\n if (v === undefined || v === null) {\n // 可选参数(URI 中 {param?}):稍后替换为空字符串;其余记为缺失\n if (!meta.uri.includes(`{${p}?}`)) {\n missingRequired.push(p);\n }\n } else {\n values[p] = v;\n }\n }\n if (missingRequired.length > 0) {\n throw new MissingRouteParamError(meta.name, missingRequired);\n }\n\n // 2. 单次遍历替换所有占位符:避免参数值中的 \"{other}\" 文本被后续参数二次替换(占位符注入)\n let uri = meta.uri.replace(/\\{([^{}]+)\\}/g, (match, raw: string) => {\n const optional = raw.endsWith('?');\n const name = optional ? raw.slice(0, -1) : raw;\n if (values[name] !== undefined) {\n const val = values[name];\n if (typeof val === 'object') {\n throw new ForgeError(\n `Path parameter \"${name}\" must be a primitive value (string, number, boolean), got ${typeof val}`,\n { code: 'RF_FE_003', route: meta.name, context: { param: name, value: val } },\n );\n }\n return encodeURIComponent(String(val));\n }\n // 值缺失:可选参数替换为空,未声明的占位符保持原样(不在 parameters 中)\n return optional ? '' : match;\n });\n // 清理可选参数移除后残留的连续 / 或尾部 /\n uri = uri.replace(/\\/+/g, '/').replace(/\\/$/, '');\n // url_prefix 含协议(如 https://api.example.com)时直接作为完整基础 URL,跳过 baseURL\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(effectiveUrlPrefix)) {\n const prefix = effectiveUrlPrefix.endsWith('/') ? effectiveUrlPrefix.slice(0, -1) : effectiveUrlPrefix;\n return uri.startsWith('/') ? `${prefix}${uri}` : `${prefix}/${uri}`;\n }\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const prefix = effectiveUrlPrefix;\n return uri.startsWith('/') ? `${base}${prefix}${uri}` : `${base}${prefix}/${uri}`;\n }\n\n function findRouteMeta(level: string, name: string): RouteMeta | undefined {\n const entry = cache.get(level);\n const meta = entry?.routes[name];\n if (meta) {\n return { ...meta, level };\n }\n return undefined;\n }\n\n async function api(level: string, name: string, params: ApiCallParams = {}): Promise<unknown> {\n await autoDiscoveryPromise;\n // 确保指定层级的路由元信息已加载\n await load(level);\n const meta = findRouteMeta(level, name);\n if (!meta) {\n throw new UnknownRouteError(name, level);\n }\n return doApiCall(meta, params);\n }\n\n async function doApiCall(meta: RouteMeta, params: ApiCallParams): Promise<unknown> {\n const {\n pathParams,\n query,\n body,\n headers,\n timeout: perCallTimeout,\n signal,\n } = resolveApiParams(params);\n\n // 请求前检查:signal 已 abort 则直接抛错,不发请求\n if (signal?.aborted) {\n throw new RequestAbortedError(meta.name, meta.level, signal.reason);\n }\n\n const method = pickMethod(meta);\n const urlWithQuery = appendQuery(buildRequestUrl(meta, pathParams), query);\n const config: RequestConfig = {\n route: meta.name,\n level: meta.level ?? '',\n method,\n url: urlWithQuery,\n headers: { Accept: 'application/json', ...(headers ?? {}) },\n body,\n params: pathParams,\n timeout: perCallTimeout ?? timeout,\n signal,\n meta,\n };\n\n const adp = await ensureAdapter();\n\n // 5. 请求拦截链(LIFO,对齐 axios);任段抛错且 onRejected 未消化 → 进入调用方 catch,不发请求\n // builtin.adapter 内部已执行 forge 拦截器(同一管理器对象引用,runsInterceptors=true)→ 跳过\n const finalConfig = adp.runsInterceptors\n ? config\n : await runRequestInterceptors(requestInterceptors, config);\n\n // 拦截链后再次检查:拦截器可能修改了 signal 或已 abort\n if (finalConfig.signal?.aborted) {\n throw new RequestAbortedError(meta.name, meta.level, finalConfig.signal.reason);\n }\n\n // 6. adapter 调用 → 7/8 的错误转换 + 响应拦截链\n // HTTP 非 2xx 转 HTTPError;底层网络错误(非 ForgeError)转 NetworkError\n // 注意:source 始终构造(含错误转换逻辑),runsInterceptors=true 时直接返回 source\n // 加载中标识:始终跟踪,用户不监听即可\n loadingTracker.start();\n try {\n const source: Promise<ResponseData> = adp.request(finalConfig).then(\n (resp) => {\n if (resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `HTTP ${resp.status} for route \"${resp.route}\" (${resp.method} ${resp.url})`,\n {\n route: resp.route,\n level: resp.level,\n status: resp.status,\n url: resp.url,\n method: resp.method,\n },\n );\n }\n return resp;\n },\n (err) => {\n // 已经是 ForgeError(如拦截器内重新抛的)→ 原样抛\n if (err instanceof ForgeError) throw err;\n // 请求被取消 → 转 RequestAbortedError\n if (isAbortError(err, finalConfig.signal)) {\n throw new RequestAbortedError(meta.name, meta.level, err);\n }\n throw new NetworkError(\n err instanceof Error ? err.message : String(err),\n meta.name,\n meta.level,\n err,\n );\n },\n );\n\n // 响应拦截链(FIFO,对齐 axios);末段返回值即 api() resolve 值\n // builtin.adapter 内部已执行 forge 响应拦截器(runsInterceptors=true)→ 直接返回 source\n const result = adp.runsInterceptors\n ? await source\n : await runResponseInterceptors(responseInterceptors, source);\n return result;\n } finally {\n loadingTracker.stop();\n }\n }\n\n function invalidate(level?: string | string[]): void {\n if (level === undefined) {\n cache.clear();\n // 清除所有进行中的加载,防止旧数据回写\n inflight.clear();\n for (const lvl of effectiveLevels) {\n invalidationGens.set(lvl, (invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else if (Array.isArray(level)) {\n for (const lvl of level) {\n cache.del(lvl);\n inflight.delete(lvl);\n invalidationGens.set(lvl, (invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else {\n cache.del(level);\n inflight.delete(level);\n invalidationGens.set(level, (invalidationGens.get(level) ?? 0) + 1);\n }\n }\n\n function isLoaded(level?: string): boolean {\n if (level) return cache.get(level) !== undefined;\n // 无任何已声明层级(如自动发现未完成)时不应谎报全部已加载\n return effectiveLevels.length > 0 && effectiveLevels.every((lvl) => cache.get(lvl) !== undefined);\n }\n\n function hasRoute(level: string, name: string): boolean {\n assertDiscoveryReady();\n return findRouteMeta(level, name) !== undefined;\n }\n\n function getRoutes(level: string): Record<string, RouteMeta>;\n function getRoutes(): Record<string, Record<string, RouteMeta>>;\n function getRoutes(level?: string): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n if (level !== undefined) {\n const entry = cache.get(level);\n const routes = entry?.routes ?? {};\n const result: Record<string, RouteMeta> = {};\n for (const [k, v] of Object.entries(routes)) {\n // 深拷贝:避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n result[k] = JSON.parse(JSON.stringify(v));\n }\n return result;\n }\n const result: Record<string, Record<string, RouteMeta>> = {};\n for (const lvl of effectiveLevels) {\n const entry = cache.get(lvl);\n if (entry) {\n const levelRoutes: Record<string, RouteMeta> = {};\n for (const [k, v] of Object.entries(entry.routes)) {\n // 深拷贝:避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n levelRoutes[k] = JSON.parse(JSON.stringify(v));\n }\n result[lvl] = levelRoutes;\n }\n }\n return result;\n }\n\n // eager 层级自动加载 + onSummaryReady 回调 + ready Promise resolve\n // 不阻塞 createRouteForge 返回;在自动发现完成后触发\n void autoDiscoveryPromise\n .then(() => {\n // 摘要处理完成 → auto-discovery 已完成(eager load 之前设置,确保 level 加载后 route() 可用)\n autoDiscoveryCompleted = true;\n // 触发 onSummaryReady(eager load 之前)\n options.onSummaryReady?.();\n // eager load\n if (effectiveEager.length > 0) {\n return Promise.all(effectiveEager.map((lvl) => load(lvl))).catch((e) => {\n console.warn(`[route-forge] eager load failed: ${(e as Error).message}`);\n });\n }\n })\n .then(() => {\n resolveReady(forgeInstance);\n })\n .catch(() => {\n /* 自动发现失败时不触发 eager / ready */\n });\n\n // --- ready() 方法:始终返回 Promise<this> ---\n function ready(): Promise<RouteForge>;\n function ready(onFulfilled: (forge: RouteForge) => void, onRejected?: (error: unknown) => void): Promise<RouteForge>;\n function ready(\n onFulfilled?: (forge: RouteForge) => void,\n onRejected?: (error: unknown) => void,\n ): Promise<RouteForge> {\n if (onFulfilled) {\n const p = readyPromise.then(onFulfilled, onRejected);\n // 回调模式下也返回 Promise,resolve 值为 forge 自身\n return p.then(() => forgeInstance);\n }\n return readyPromise;\n }\n\n // RouteResolver 接口实现(供 resolveRouteName/resolveRouteNameSync 使用)\n const forgeResolver = { load, hasRoute };\n\n // --- createBoundForge:构造绑定 level 的 BoundForge ---\n function createBoundForge(level: string, prefix?: string): BoundForge {\n // 自动触发 level 加载\n const levelLoadedPromise = load(level).catch(() => {\n /* 加载失败时 levelLoaded 保持 pending */\n });\n\n const apiFn = prefix\n ? (name: string, params?: ApiCallParams) =>\n resolveRouteName(forgeResolver, level, prefix, name).then(\n (resolved) => api(level, resolved, params),\n )\n : (name: string, params?: ApiCallParams) =>\n api(level, name, params);\n\n const callable = apiFn as unknown as BoundForge;\n defineImmutableProps(callable, {\n level,\n ...(prefix !== undefined ? { prefix } : {}),\n api: apiFn,\n route: prefix\n ? (name: string, params?: Record<string, unknown>) =>\n route(level, resolveRouteNameSync(forgeResolver, level, prefix, name), params)\n : (name: string, params?: Record<string, unknown>) =>\n route(level, name, params),\n url: prefix\n ? (name: string, params?: Record<string, unknown>) =>\n route(level, resolveRouteNameSync(forgeResolver, level, prefix, name), params)\n : (name: string, params?: Record<string, unknown>) =>\n route(level, name, params),\n hasRoute: (name: string) => hasRoute(level, name),\n getRoutes: () => getRoutes(level),\n load: () => load(level),\n invalidate: () => invalidate(level),\n isLoaded: () => isLoaded(level),\n isLoading: () => loadingTracker.isLoading(),\n onLoadingChange: (cb: LoadingChangeCallback) => loadingTracker.subscribe(cb),\n });\n // levelLoaded 单独挂载为 configurable: true,允许框架适配层(Vue/React)覆盖\n Object.defineProperty(callable, 'levelLoaded', {\n value: levelLoadedPromise,\n writable: false,\n enumerable: true,\n configurable: true,\n });\n return callable;\n }\n\n // BoundForge.onLevelLoaded() 实现\n function boundOnLevelLoaded(\n bound: BoundForge,\n levelLoadedPromise: Promise<void>,\n onFulfilled?: (bound: BoundForge) => void,\n onRejected?: (error: unknown) => void,\n ): Promise<BoundForge> {\n const p = levelLoadedPromise.then(() => bound);\n if (onFulfilled) {\n return p.then(onFulfilled, onRejected).then(() => bound);\n }\n return p;\n }\n\n // 为 BoundForge 挂载 onLevelLoaded 和 useRoutePrefix\n // (这两个方法需要闭包引用,不能通过 defineImmutableProps 冻结对象值)\n function attachBoundMethods(bound: BoundForge, levelLoadedPromise: Promise<void>, level: string): void {\n Object.defineProperty(bound, 'onLevelLoaded', {\n value: (\n onFulfilled?: (bound: BoundForge) => void,\n onRejected?: (error: unknown) => void,\n ) => boundOnLevelLoaded(bound, levelLoadedPromise, onFulfilled, onRejected),\n writable: false,\n enumerable: false,\n configurable: false,\n });\n Object.defineProperty(bound, 'useRoutePrefix', {\n value: (prefix: string) => createBoundForgeWithMethods(level, prefix),\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n\n function createBoundForgeWithMethods(level: string, prefix?: string): BoundForge {\n const bound = createBoundForge(level, prefix);\n const levelLoadedPromise = bound.levelLoaded as Promise<void>;\n attachBoundMethods(bound, levelLoadedPromise, level);\n return bound;\n }\n\n const forgeInstance = {\n api,\n load,\n route,\n url: route,\n invalidate,\n isLoaded,\n hasRoute,\n getRoutes,\n isLoading: () => loadingTracker.isLoading(),\n onLoadingChange: (cb: LoadingChangeCallback) => loadingTracker.subscribe(cb),\n interceptors: {\n request: requestInterceptors,\n response: responseInterceptors,\n },\n ready,\n use(level?: string, prefix?: string) {\n if (level === undefined) return forgeInstance as RouteForge;\n return createBoundForgeWithMethods(level, prefix);\n },\n } as RouteForge;\n\n return forgeInstance;\n}\n\nfunction pickMethod(meta: RouteMeta): string {\n const m = meta.methods.find((x) => x.toUpperCase() !== 'HEAD');\n return (m ?? meta.methods[0] ?? 'GET').toUpperCase();\n}\n\nfunction appendQuery(url: string, query?: Record<string, unknown>): string {\n if (!query) return url;\n const usp = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n usp.append(k, String(v));\n }\n const qs = usp.toString();\n if (!qs) return url;\n return url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n}\n\n/**\n * 智能解析 ApiCallParams,分离路径参数 / query / body / headers。\n *\n * 规则:\n * 1. `params` 显式指定路径参数 → 优先级最高\n * 2. 平铺的 string | number 值(含与 query/body/headers 同名的 key)→ 路径参数\n * 3. `query` (对象) → 查询参数;`body` (非 string/number) → 请求体;`headers` (对象) → 请求头\n *\n * @see .docs/SPEC.md §4.1.3\n */\nfunction resolveApiParams(input: ApiCallParams): {\n pathParams: Record<string, unknown>;\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n timeout?: number;\n signal?: AbortSignal;\n} {\n const {\n params: explicitParams,\n query: rawQuery,\n body: rawBody,\n headers: rawHeaders,\n timeout: perCallTimeout,\n signal,\n ...flatRest\n } = input;\n\n // 1. params 显式指定 → 作为路径参数基础\n const pathParams: Record<string, unknown> = explicitParams\n ? { ...explicitParams }\n : {};\n\n // 2. 其余平铺 key → 路径参数(params 优先,不覆盖已存在的 key)\n for (const [k, v] of Object.entries(flatRest)) {\n if (!(k in pathParams)) {\n pathParams[k] = v;\n }\n }\n\n // 3. 固定 key 智能消解:string/number → 路径参数;对象 → 固定用途\n let query: Record<string, unknown> | undefined;\n let body: unknown;\n let headers: Record<string, string> | undefined;\n\n // query: 对象类型 → 查询参数;string/number → 路径参数\n if (rawQuery !== undefined) {\n if (typeof rawQuery === 'object' && rawQuery !== null) {\n query = rawQuery as Record<string, unknown>;\n } else if (!('query' in pathParams)) {\n pathParams.query = rawQuery;\n }\n }\n\n // body: 非 string/number → 请求体;string/number → 路径参数\n if (rawBody !== undefined) {\n if (typeof rawBody !== 'string' && typeof rawBody !== 'number') {\n body = rawBody;\n } else if (!('body' in pathParams)) {\n pathParams.body = rawBody;\n }\n }\n\n // headers: 对象类型 → 请求头;string/number → 路径参数\n if (rawHeaders !== undefined) {\n if (typeof rawHeaders === 'object' && rawHeaders !== null) {\n headers = rawHeaders as Record<string, string>;\n } else if (!('headers' in pathParams)) {\n pathParams.headers = rawHeaders;\n }\n }\n\n return { pathParams, query, body, headers, timeout: perCallTimeout, signal };\n}\n\n/**\n * 判断错误是否为请求取消错误(AbortSignal 触发)\n * 兼容 fetch 的 DOMException AbortError 与 axios 的 CanceledError\n */\nfunction isAbortError(err: unknown, signal?: AbortSignal): boolean {\n // signal 已 abort → 无论错误类型,均视为取消\n if (signal?.aborted) return true;\n const e = err as { name?: string; code?: string } | null;\n if (!e) return false;\n // fetch 取消抛 DOMException (name === 'AbortError')\n if (e.name === 'AbortError') return true;\n // axios 取消抛 CanceledError (code === 'ERR_CANCELED')\n if (e.code === 'ERR_CANCELED') return true;\n return false;\n}\n\n// 显式重导出,便于业务代码按需导入工具件\nexport { createInterceptorManager } from './interceptors.js';\nexport { RouteCache } from './cache.js';\nexport { ForgeError } from './errors.js';\n"]}