@route-forge/core 2.1.0 → 2.2.1

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/fetch-core.ts","../src/adapters/builtin-http.ts","../src/adapters/axios.ts","../src/adapters/index.ts","../src/loading.ts","../src/url-builder.ts","../src/auto-discovery.ts","../src/route-store.ts","../src/http-runner.ts","../src/resolveRouteName.ts","../src/defineImmutableProps.ts","../src/bound-forge.ts","../src/forge.ts"],"names":["wrapped","prefix","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 * - storage 模式下维护内存镜像:首次读盘解析后驻留内存,后续 get 直接命中\n * (读盘 + JSON.parse 整层路由表是同步阻塞操作,热路径重复执行代价高);\n * 写操作(set/del/clear)同步更新镜像,并通过 storage 事件感知其他\n * tab 的写入/失效,保证跨 tab 新鲜度与无镜像时一致\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 /** 其他 tab 修改 storage 时失效对应镜像(storage 事件:自己的写不触发,自己的写经 set/del 已同步) */\n private readonly onStorageEvent = (e: StorageEvent): void => {\n if (!e.key) return; // key 为 null 表示 clear() 清空了整个 storage\n if (!e.key.startsWith(KEY_PREFIX)) return;\n // 去掉前缀得到 level(key 构造无 encode,反向切片即可)\n this.memory.delete(e.key.slice(KEY_PREFIX.length));\n };\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 // 仅 storage 模式需要监听跨 tab 变更;typeof 防御 SSR/非浏览器环境\n if (this.backend && typeof globalThis.addEventListener === 'function') {\n globalThis.addEventListener('storage', this.onStorageEvent);\n }\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 // 1. 内存镜像优先:命中则免读盘+解析(getFromMemory 内含 TTL 检查,过期自动剔除)\n const mirrored = this.getFromMemory(level);\n if (mirrored) return mirrored;\n // 2. 镜像 miss(首次读取 / TTL 过期 / 跨 tab 失效后)→ 读盘解析\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 // 3. 写入镜像,后续 get 直接走内存\n this.memory.set(level, entry);\n return entry;\n } catch {\n return undefined;\n }\n }\n return undefined;\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 // 无条件先写内存镜像:写入方自己立刻享受内存命中(不再每次 get 重新读盘解析)\n this.memory.set(resp.level, entry);\n if (this.storage === 'memory' || !this.backend) {\n return;\n }\n try {\n this.backend.setItem(this.key(resp.level), JSON.stringify(entry));\n } catch {\n // 容量满或被禁用:镜像已写入,backend 跳过(读取路径仍可命中内存)\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\n/**\n * Route Forge 错误码字面量联合。\n * 用户侧 `switch (e.code)` 可获得穷尽检查(漏分支编译报错)。\n */\nexport type ForgeErrorCode =\n | 'RF_FE_001' // 路由名不存在\n | 'RF_FE_002' // 层级未声明\n | 'RF_FE_003' // 必填路径参数缺失\n | 'RF_FE_005' // adapter:'axios' 但未检测到 axios\n | 'RF_FE_006' // 请求拦截器返回非 RequestConfig\n | 'RF_FE_007' // 网络错误\n | 'RF_FE_008' // HTTP 非 2xx\n | 'RF_FE_009' // 请求被取消\n | 'RF_FE_010'; // auto-discovery 未完成守卫\n\nexport class ForgeError extends Error {\n readonly code: ForgeErrorCode;\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: ForgeErrorCode;\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 * 纯 fetch 底座(无状态工具层)\n * @see .docs/SPEC.md §4.3.1\n *\n * 职责:超时/取消合并、query/body 序列化、fetch 调用、JSON 解析、\n * ResponseData 组装、非 2xx 转 HTTPError。不持有任何状态。\n *\n * 消费方:\n * - builtin-http 的 requestRaw(拦截器编排层的底座)\n * - forge.ts 的元信息拉取(fetchLevel + 摘要端点,经 adapter requestRaw 通道)\n */\n\nimport type { RequestConfig, ResponseData } from '../types.js';\nimport { HTTPError, NetworkError } from '../errors.js';\n\n/**\n * 判断错误是否为请求取消错误。\n * 兼容 fetch 的 DOMException AbortError 与 axios 的 CanceledError;\n * 传入 signal 且已 abort 时,无论错误类型均视为取消。\n */\nexport function 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/**\n * 合并多个 AbortSignal:任一 signal abort 即返回合并后的 signal abort。\n * 优先使用 AbortSignal.any(Node 20.3+ / 现代浏览器),否则回退到手动监听。\n */\nexport function 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\n/**\n * 判断 body 是否为宿主原生可直接传输的类型(跳过 JSON 序列化)。\n */\nexport function 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 * 原始请求:不经过任何拦截链。\n * 超时控制(timeout > 0 用 AbortSignal.timeout,与用户 signal 合并)、\n * paramsSerializer、body 序列化 + JSON Content-Type 自动补齐、\n * 网络层错误转 NetworkError、非 2xx 抛 HTTPError。\n * 请求取消(AbortError)不包装,保留原始错误以便上层转换为 RequestAbortedError。\n */\nexport async function rawFetch(config: RequestConfig): Promise<ResponseData> {\n // 超时控制:timeout > 0 时用 AbortSignal.timeout\n // 若同时有用户 signal,合并两者(任一 abort 即取消请求)\n const signal = combineSignals(\n config.signal,\n config.timeout && config.timeout > 0\n ? AbortSignal.timeout(config.timeout)\n : undefined,\n );\n\n // paramsSerializer:自定义 query 序列化\n let url = config.url;\n if (config.paramsSerializer && config.params) {\n const qs = config.paramsSerializer(config.params);\n if (qs) {\n url = url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n }\n }\n\n // 构建 fetchInit(body 序列化 + JSON Content-Type 自动补齐)\n const headers = new Headers(config.headers);\n const fetchInit: RequestInit = {\n method: config.method,\n headers,\n };\n if (signal) fetchInit.signal = signal;\n if (\n config.body !== undefined &&\n !['GET', 'HEAD'].includes(config.method.toUpperCase())\n ) {\n if (typeof config.body === 'string' || isPassthroughBody(config.body)) {\n fetchInit.body = config.body as BodyInit;\n } else {\n fetchInit.body = JSON.stringify(config.body);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n }\n }\n\n // 调用 fetch(网络层错误转 NetworkError,便于独立使用 adapter 时错误语义一致)\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 config.route,\n config.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 // 构建 ResponseData\n const responseData: ResponseData = {\n route: config.route,\n level: config.level,\n method: config.method,\n url,\n status: res.status,\n headers: res.headers,\n data,\n config,\n };\n\n // HTTP 非 2xx → 抛 HTTPError(由调用方决定拦截/恢复)\n if (res.status >= 200 && res.status < 300) {\n return responseData;\n }\n throw new HTTPError(\n `HTTP ${res.status} for route \"${config.route}\" (${config.method} ${url})`,\n {\n route: config.route,\n level: config.level,\n status: res.status,\n url,\n method: config.method,\n },\n );\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 * 结构:纯 fetch 底座(超时/序列化/非 2xx 转换)提取在 fetch-core.ts,\n * 本文件只负责拦截器编排 + axios 兼容门面。\n */\n\nimport type { InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport {\n createInterceptorManager,\n runRequestInterceptors,\n runResponseInterceptors,\n} from '../interceptors.js';\nimport { rawFetch } from './fetch-core.js';\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 /**\n * 原始请求:不经过请求/响应拦截链。\n * 供元信息拉取使用(forge.ts 的 fetchLevel / 摘要端点)——元信息解析不能被\n * 业务拦截器(如解包 resp.data 的响应拦截器)干扰,与 axios 路径\n * 「元信息不走 forge 拦截链」的行为保持一致。\n */\n const requestRaw = rawFetch;\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n // 1. 执行请求拦截器(LIFO,对齐 axios)\n const finalConfig = await runRequestInterceptors(requestMgr, config);\n\n // 2. 原始请求(超时/序列化/fetch/解析/非 2xx 转 HTTPError)\n const source: Promise<ResponseData> = Promise.resolve(finalConfig).then(requestRaw);\n\n // 3. 执行响应拦截器(FIFO,对齐 axios);末段返回值即 request() 的 resolve 值\n // HTTP 非 2xx → HTTPError 进入响应拦截器 onRejected 链(SPEC §4.1.3a 步骤 9)\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 requestRaw,\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 * - 未检测到 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'(默认):动态 import 探测宿主 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 /**\n * 原始请求(跳过拦截链),可选。\n * 供层级元信息拉取使用:元信息解析不应被业务拦截器干扰。\n * 未提供时 forge.fetchLevel 回退到 request()。\n */\n requestRaw?: (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 */\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 * URL 构建与调用参数解析:全部为纯函数(不读取工厂闭包状态)。\n *\n * 需要 baseURL / endpoint / urlPrefix 的函数通过 ctx 参数在调用时传入,\n * 由调用方实时读取(含自动发现回填后的值),避免快照冻结。\n *\n * @see .docs/SPEC.md §4.1.3\n */\n\nimport { ForgeError, MissingRouteParamError } from './errors.js';\nimport type { ApiCallParams, RouteMeta } from './types.js';\n\n/** 层级元信息端点上下文(buildUrl 用) */\nexport interface EndpointContext {\n baseURL: string;\n endpoint: string;\n}\n\n/** 业务请求 URL 上下文(buildRequestUrl 用);urlPrefix 为后端下发的实时值 */\nexport interface RequestUrlContext {\n baseURL: string;\n urlPrefix: string;\n}\n\n/** 层级路由元信息拉取端点 URL:baseURL + endpoint + /level */\nexport function buildUrl(level: string, ctx: EndpointContext): string {\n const base = ctx.baseURL.endsWith('/') ? ctx.baseURL.slice(0, -1) : ctx.baseURL;\n const ep = ctx.endpoint.startsWith('/') ? ctx.endpoint : `/${ctx.endpoint}`;\n return `${base}${ep}/${encodeURIComponent(level)}`;\n}\n\n/**\n * 由路由元信息 + 传参构建最终请求 URL(含路径参数替换、可选参数清理、前缀拼接)。\n * 抛错语义:缺失必填参数 → MissingRouteParamError;路径参数为对象 → ForgeError(RF_FE_003)。\n */\nexport function buildRequestUrl(\n meta: RouteMeta,\n params: Record<string, unknown>,\n ctx: RequestUrlContext,\n): 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(ctx.urlPrefix)) {\n const prefix = ctx.urlPrefix.endsWith('/') ? ctx.urlPrefix.slice(0, -1) : ctx.urlPrefix;\n return uri.startsWith('/') ? `${prefix}${uri}` : `${prefix}/${uri}`;\n }\n const base = ctx.baseURL.endsWith('/') ? ctx.baseURL.slice(0, -1) : ctx.baseURL;\n const prefix = ctx.urlPrefix;\n return uri.startsWith('/') ? `${base}${prefix}${uri}` : `${base}${prefix}/${uri}`;\n}\n\n/** 选取实际请求方法:跳过 HEAD,取首个非 HEAD 方法,兜底 GET。 */\nexport function pickMethod(meta: RouteMeta): string {\n const m = meta.methods.find((x) => x.toUpperCase() !== 'HEAD');\n return (m ?? meta.methods[0] ?? 'GET').toUpperCase();\n}\n\n/** 追加查询参数到 URL(跳过 undefined/null,无有效参数时原样返回)。 */\nexport function 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 */\nexport function 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} {\n const {\n params: explicitParams,\n query: rawQuery,\n body: rawBody,\n headers: rawHeaders,\n timeout: perCallTimeout,\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 };\n}\n","/**\n * 自动发现(SPEC §4.1.1 + §5.3):从后端摘要端点折算出前端运行时有效配置。\n *\n * 摘要端点回填的有效值(endpoint / urlPrefix / levels / eager / 虚拟 unassigned\n * 层级)集中在一个可变的 DiscoveryState 上,由工厂持有并在后续按属性实时读取,\n * 避免按值快照冻结自动发现结果。\n *\n * 本模块只提供纯计算函数(fetchSummary / applySummaryToState),\n * 不介入工厂的启动时序(由工厂侧的 whenSummary 挂起队列 + 微任务启动负责)。\n */\n\nimport { UnknownLevelError } from './errors.js';\nimport type { SummaryResponse } from './types.js';\n\n/**\n * 后端摘要端点返回的未分配层级路由,前端作为虚拟层级 \"unassigned\" 消费\n * @see .docs/SPEC.md §3.1.6\n */\nexport const UNASSIGNED_LEVEL = 'unassigned';\n\n/** 自动发现回填的有效状态(工厂持有并实时读取) */\nexport interface DiscoveryState {\n /** 可用层级 = 后端真实层级(∩ 显式 levels)+ 虚拟 unassigned 层级 */\n levels: string[];\n /** 需预加载的 eager 层级 */\n eager: string[];\n /** 层级路由表端点前缀(后端 endpoint_prefix 权威覆盖) */\n endpoint: string;\n /** 后端下发的 URL 前缀,生成业务 URL 时拼接(默认为空) */\n urlPrefix: string;\n /** 摘要端点的 unassigned 路由;仅虚拟层级启用时有值 */\n summaryUnassigned?: SummaryResponse['unassigned'];\n /** 后端是否将 unassigned 作为真实层级注册;若是则走正常 HTTP 拉取,不走虚拟层级 */\n backendHasUnassignedLevel: boolean;\n}\n\n/** 用户显式声明的发现输入 */\nexport interface DiscoveryInputs {\n explicitLevels?: string[];\n explicitEager?: string[];\n explicitEndpoint: string;\n}\n\n/** 元信息拉取通道(由工厂注入 fetchMeta:走 adapter 原始通道,获得 timeout/降级/自定义 Fetcher 兼容) */\nexport type MetaFetcher = (routeTag: string, url: string, level?: string) => Promise<unknown>;\n\n/**\n * 拉取摘要端点(用于 endpoint / levels / eager 自动发现)。\n * URL = baseURL + 显式 endpoint(此时后端权威 endpoint 尚未获取,用用户显式配置)。\n * 失败语义:显式传了 levels → 降级(warn + 返回 null,effective* 保持显式初值);\n * 未传 levels → 无可用降级,抛 UnknownLevelError(ready() 将 reject)。\n */\nexport async function fetchSummary(\n inputs: DiscoveryInputs,\n baseURL: string,\n fetchMeta: MetaFetcher,\n): Promise<SummaryResponse | null> {\n const { explicitLevels, explicitEndpoint } = inputs;\n try {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const ep = explicitEndpoint.startsWith('/') ? explicitEndpoint : `/${explicitEndpoint}`;\n const data = await fetchMeta('__forge__.summary', `${base}${ep}`);\n return data 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 throw new UnknownLevelError('(auto-discovery)');\n }\n}\n\n/**\n * 把摘要响应折算进可变的 state(就地写回 endpoint/urlPrefix/levels/eager/unassigned)。\n * summary 为 null(显式 levels 降级路径)时由调用方短路,不进入此函数。\n */\nexport function applySummaryToState(\n summary: SummaryResponse,\n state: DiscoveryState,\n inputs: DiscoveryInputs,\n): void {\n const { explicitLevels, explicitEager, explicitEndpoint } = inputs;\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 state.endpoint = summary.config.endpoint_prefix;\n }\n\n // 1a. url_prefix 后端权威:后端下发时覆盖\n if (summary.config.url_prefix) {\n state.urlPrefix = summary.config.url_prefix.endsWith('/')\n ? summary.config.url_prefix.slice(0, -1)\n : summary.config.url_prefix;\n }\n\n // 2. levels 取交集或自动发现\n const backendLevels = Object.keys(summary.levels);\n\n // 3a. 捕获摘要端点的 unassigned 字段,作为虚拟层级 \"unassigned\" 消费(SPEC §3.1.6)\n // 仅当后端未将 unassigned 作为真实层级注册时才启用虚拟层级\n state.backendHasUnassignedLevel = backendLevels.includes(UNASSIGNED_LEVEL);\n if (\n Array.isArray(summary.unassigned) &&\n summary.unassigned.length > 0 &&\n !state.backendHasUnassignedLevel\n ) {\n state.summaryUnassigned = summary.unassigned;\n }\n\n // 可用层级 = 后端真实层级 + 虚拟 unassigned 层级(若有未分配路由)\n const availableLevels = backendLevels.slice();\n if (state.summaryUnassigned && !state.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 state.levels = intersection;\n } else {\n state.levels = 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 state.eager = backendEager;\n } else {\n // 并集:后端 eager + 前端显式声明,去重\n const union = new Set([...backendEager, ...explicitEager]);\n state.eager = [...union];\n }\n}\n","/**\n * 层级路由元信息的存储与加载(SPEC §4.1.2 / §4.1.4)。\n *\n * 封装按层级懒加载所需的可变状态:\n * - RouteCache(懒加载缓存)\n * - inflight(并发去重)\n * - invalidationGens(失效代数,防止 invalidate 后旧数据回写)\n * 并在此之上实现 fetchLevel / loadOne / load / invalidate / isLoaded\n * 以及缓存读取(findRouteMeta / getRoutes)与虚拟 unassigned 层级构建。\n *\n * 依赖通过构造参数注入:DiscoveryState 与自动发现错误均按引用 / getter\n * 实时读取,避免快照冻结自动发现回填结果;fetchMeta 为工厂提供的元信息传输通道。\n */\n\nimport { RouteCache } from './cache.js';\nimport { UnknownLevelError } from './errors.js';\nimport { buildUrl } from './url-builder.js';\nimport { UNASSIGNED_LEVEL, type DiscoveryState, type MetaFetcher } from './auto-discovery.js';\nimport type { LevelRoutesResponse, RouteMeta } from './types.js';\n\nexport interface RouteStoreDeps {\n cache: RouteCache;\n state: DiscoveryState;\n baseURL: string;\n fetchMeta: MetaFetcher;\n /** 自动发现完成 Promise(load 前 await) */\n autoDiscoveryPromise: Promise<void>;\n /** 自动发现错误读取器(loadOne 起始处重抛,保留原始错误) */\n getAutoDiscoveryError: () => unknown;\n}\n\nexport class RouteStore {\n private readonly cache: RouteCache;\n private readonly state: DiscoveryState;\n private readonly baseURL: string;\n private readonly fetchMeta: MetaFetcher;\n private readonly autoDiscoveryPromise: Promise<void>;\n private readonly getAutoDiscoveryError: () => unknown;\n\n private readonly inflight = new Map<string, Promise<void>>();\n /** 每个层级的失效代数,用于检测 loadOne 期间是否发生了 invalidate */\n private readonly invalidationGens = new Map<string, number>();\n\n constructor(deps: RouteStoreDeps) {\n this.cache = deps.cache;\n this.state = deps.state;\n this.baseURL = deps.baseURL;\n this.fetchMeta = deps.fetchMeta;\n this.autoDiscoveryPromise = deps.autoDiscoveryPromise;\n this.getAutoDiscoveryError = deps.getAutoDiscoveryError;\n }\n\n assertLevelDeclared(level: string): void {\n if (!this.state.levels.includes(level)) {\n throw new UnknownLevelError(level);\n }\n }\n\n private async fetchLevel(level: string): Promise<LevelRoutesResponse> {\n // 后端可能下发 cache 字段,让 RouteCache 优先采用\n return (await this.fetchMeta(\n `__forge__.load.${level}`,\n buildUrl(level, { baseURL: this.baseURL, endpoint: this.state.endpoint }),\n level,\n )) as LevelRoutesResponse;\n }\n\n async loadOne(level: string): Promise<void> {\n const autoDiscoveryError = this.getAutoDiscoveryError();\n if (autoDiscoveryError) throw autoDiscoveryError;\n this.assertLevelDeclared(level);\n\n // 缓存命中直接返回\n if (this.cache.get(level)) return;\n\n // inflight 去重\n const existing = this.inflight.get(level);\n if (existing) return existing;\n\n const gen = this.invalidationGens.get(level) ?? 0;\n const p = (async () => {\n try {\n // 虚拟层级 unassigned:直接从摘要数据构建响应,不发 HTTP 请求(SPEC §3.1.6)\n if (level === UNASSIGNED_LEVEL && !this.state.backendHasUnassignedLevel && this.state.summaryUnassigned) {\n const routes: Record<string, RouteMeta> = {};\n for (const r of this.state.summaryUnassigned) {\n routes[r.name] = { ...r, level: UNASSIGNED_LEVEL };\n }\n this.cache.set({ level: UNASSIGNED_LEVEL, routes, cache: null });\n return;\n }\n const resp = await this.fetchLevel(level);\n // 仅在缓存未被 invalidate 清除时写入,防止旧数据回写\n if ((this.invalidationGens.get(level) ?? 0) === gen) {\n this.cache.set(resp);\n }\n } finally {\n this.inflight.delete(level);\n }\n })();\n this.inflight.set(level, p);\n return p;\n }\n\n async load(level: string | string[]): Promise<void> {\n await this.autoDiscoveryPromise;\n const list = Array.isArray(level) ? level : [level];\n await Promise.all(list.map((l) => this.loadOne(l)));\n }\n\n invalidate(level?: string | string[]): void {\n if (level === undefined) {\n this.cache.clear();\n // 清除所有进行中的加载,防止旧数据回写\n this.inflight.clear();\n for (const lvl of this.state.levels) {\n this.invalidationGens.set(lvl, (this.invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else if (Array.isArray(level)) {\n for (const lvl of level) {\n this.cache.del(lvl);\n this.inflight.delete(lvl);\n this.invalidationGens.set(lvl, (this.invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else {\n this.cache.del(level);\n this.inflight.delete(level);\n this.invalidationGens.set(level, (this.invalidationGens.get(level) ?? 0) + 1);\n }\n }\n\n isLoaded(level?: string): boolean {\n if (level) return this.cache.get(level) !== undefined;\n // 无任何已声明层级(如自动发现未完成)时不应谎报全部已加载\n return this.state.levels.length > 0 && this.state.levels.every((lvl) => this.cache.get(lvl) !== undefined);\n }\n\n findRouteMeta(level: string, name: string): RouteMeta | undefined {\n const entry = this.cache.get(level);\n const meta = entry?.routes[name];\n if (meta) {\n return { ...meta, level };\n }\n return undefined;\n }\n\n getRoutes(level: string): Record<string, RouteMeta>;\n getRoutes(): Record<string, Record<string, RouteMeta>>;\n getRoutes(level?: string): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n if (level !== undefined) {\n const entry = this.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 this.state.levels) {\n const entry = this.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","/**\n * 业务请求执行层(SPEC §4.1.3 / §4.1.4 / §4.1.7)。\n *\n * 由工厂提供的依赖(adapter 解析、拦截器管理器、store 的 load/findRouteMeta、\n * 加载跟踪器、自动发现完成 Promise、默认 timeout、URL 前缀状态)组装出\n * api(level, name, params) —— 返回可 abort 的 ForgeRequest,内部串起:\n * 自动发现就绪 → 层级加载 → 命中路由 → 参数解析 → 请求/响应拦截链\n * → adapter 调用 → HTTP/网络/取消错误转换 → 加载中标识。\n */\n\nimport { isAbortError } from './adapters/fetch-core.js';\nimport type { ResolvedAdapter } from './adapters/index.js';\nimport { runRequestInterceptors, runResponseInterceptors } from './interceptors.js';\nimport {\n appendQuery,\n buildRequestUrl,\n pickMethod,\n resolveApiParams,\n} from './url-builder.js';\nimport { HTTPError, NetworkError, RequestAbortedError, UnknownRouteError, ForgeError } from './errors.js';\nimport type { LoadingTracker } from './loading.js';\nimport type { DiscoveryState } from './auto-discovery.js';\nimport type {\n ApiCallParams,\n ForgeRequest,\n InterceptorManager,\n RequestConfig,\n ResponseData,\n RouteMeta,\n} from './types.js';\n\nexport interface HttpRunnerDeps {\n ensureAdapter: () => Promise<ResolvedAdapter>;\n requestInterceptors: InterceptorManager<RequestConfig, RequestConfig>;\n responseInterceptors: InterceptorManager<ResponseData, unknown>;\n load: (level: string | string[]) => Promise<void>;\n findRouteMeta: (level: string, name: string) => RouteMeta | undefined;\n baseURL: string;\n /** 实时读取自动发现回填的 URL 前缀(按引用,勿快照) */\n state: DiscoveryState;\n timeout: number;\n loadingTracker: LoadingTracker;\n autoDiscoveryPromise: Promise<void>;\n}\n\n/** 创建 api(level, name, params) 工厂函数。 */\nexport function createHttpRunner(deps: HttpRunnerDeps): (\n level: string,\n name: string,\n params?: ApiCallParams,\n) => ForgeRequest {\n const {\n ensureAdapter,\n requestInterceptors,\n responseInterceptors,\n load,\n findRouteMeta,\n baseURL,\n state,\n timeout,\n loadingTracker,\n autoDiscoveryPromise,\n } = deps;\n\n async function doApiCall(\n meta: RouteMeta,\n params: ApiCallParams,\n signal?: AbortSignal,\n ): Promise<unknown> {\n const {\n pathParams,\n query,\n body,\n headers,\n timeout: perCallTimeout,\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(\n buildRequestUrl(meta, pathParams, { baseURL, urlPrefix: state.urlPrefix }),\n query,\n );\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, 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 return function api(level: string, name: string, params: ApiCallParams = {}): ForgeRequest {\n // 内部创建 AbortController,用户通过返回值的 abort() 方法取消请求\n let ctrl: AbortController | undefined;\n let abortedBeforeInit = false;\n let abortReason: unknown;\n\n const work = (async (): Promise<unknown> => {\n ctrl = new AbortController();\n if (abortedBeforeInit) {\n ctrl.abort(abortReason);\n }\n await autoDiscoveryPromise;\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, ctrl.signal);\n })();\n\n const request = work as ForgeRequest;\n request.abort = (): void => {\n if (ctrl) {\n ctrl.abort();\n } else {\n abortedBeforeInit = true;\n }\n };\n return request;\n };\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 * 绑定层级的 BoundForge 构造(SPEC §4.1.6 use(level, prefix))。\n *\n * 由工厂注入层级维度的操作(load/api/route/hasRoute/getRoutes/invalidate/isLoaded)\n * 与加载跟踪器,构造出一个「可作为函数调用(api 语法糖)+ 携带命名方法」的 BoundForge,\n * 并挂载 onLevelLoaded / useRoutePrefix 两个需要闭包引用的方法。\n */\n\nimport { resolveRouteName, resolveRouteNameSync, type RouteResolver } from './resolveRouteName.js';\nimport { defineImmutableProps } from './defineImmutableProps.js';\nimport type { LoadingTracker, LoadingChangeCallback } from './loading.js';\nimport type { ApiCallParams, BoundForge, RouteMeta } from './types.js';\n\nexport interface BoundForgeDeps {\n load: (level: string | string[]) => Promise<void>;\n api: (level: string, name: string, params?: ApiCallParams) => unknown;\n route: (level: string, name: string, params?: Record<string, unknown>) => string;\n hasRoute: (level: string, name: string) => boolean;\n getRoutes: (level: string) => Record<string, RouteMeta>;\n invalidate: (level: string | string[]) => void;\n isLoaded: (level: string) => boolean;\n loadingTracker: LoadingTracker;\n}\n\n/** 创建 (level, prefix?) => BoundForge 的构造函数(对应 forge.use 的绑定层级分支)。 */\nexport function createBoundForgeFactory(deps: BoundForgeDeps): (\n level: string,\n prefix?: string,\n) => BoundForge {\n const { load, api, route, hasRoute, getRoutes, invalidate, isLoaded, loadingTracker } = deps;\n\n // RouteResolver 接口实现(供 resolveRouteName/resolveRouteNameSync 使用)\n const resolver: RouteResolver = { load, hasRoute };\n\n function createBoundForge(level: string, prefix?: string): BoundForge {\n // 自动触发 level 加载;失败时 levelLoaded 保持 reject 语义\n //(onLevelLoaded 的 onRejected 依赖它;框架层各自在 catch 中保持未加载状态)\n const levelLoadedPromise = load(level);\n // 附加空 catch 防止无人订阅时的 unhandled rejection(不改变原 Promise 的 reject 状态)\n levelLoadedPromise.catch(() => {});\n\n const apiFn = prefix\n ? (name: string, params?: ApiCallParams) =>\n resolveRouteName(resolver, 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(resolver, 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(resolver, 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 return createBoundForgeWithMethods;\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 { InterceptorManagerImpl } 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 UnknownRouteError,\n} from './errors.js';\nimport { buildRequestUrl } from './url-builder.js';\nimport {\n applySummaryToState,\n fetchSummary,\n type DiscoveryInputs,\n type DiscoveryState,\n} from './auto-discovery.js';\nimport { RouteStore } from './route-store.js';\nimport { createHttpRunner } from './http-runner.js';\nimport { createBoundForgeFactory } from './bound-forge.js';\nimport type {\n InterceptorManager,\n RequestConfig,\n ResponseData,\n RouteForge,\n RouteForgeOptions,\n RouteMeta,\n} from './types.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_CACHE_TTL = 3600;\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 explicitEndpoint = options.endpoint;\n\n // 自动发现有效状态:初始取用户显式配置,摘要端点响应到达后由 applySummaryToState 就地回填\n const discoveryState: DiscoveryState = {\n levels: explicitLevels ?? [],\n eager: explicitEager ?? [],\n endpoint: explicitEndpoint,\n urlPrefix: '',\n summaryUnassigned: undefined,\n backendHasUnassignedLevel: false,\n };\n const discoveryInputs: DiscoveryInputs = { explicitLevels, explicitEager, explicitEndpoint };\n\n // --- Auto-discovery 完成状态 + ready Promise ---\n let autoDiscoveryCompleted = false;\n let resolveReady!: (value: RouteForge) => void;\n let rejectReady!: (reason?: unknown) => void;\n const readyPromise = new Promise<RouteForge>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n // 无人调用 ready() 时防 unhandled rejection;不改变 reject 语义,订阅者仍能收到错误\n readyPromise.catch(() => {});\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 // 传入 forge 拦截器管理器,确保降级后拦截链语义不变\n return resolveAdapter({\n adapter: 'builtin',\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n });\n adapterResolved = true;\n }\n return adapterObj!;\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 /**\n * 元信息拉取统一通道:摘要端点与层级路由表共用。\n * 走 adapter 原始通道(不走 forge.interceptors 链,避免与业务调用混淆):\n * builtin 提供 requestRaw(跳过拦截链);axios/自定义 Fetcher 未提供时回退 request()。\n * 获得 timeout、adapter 检测/降级、自定义 Fetcher 兼容。\n * @param routeTag 请求标识(`__forge__.summary` / `__forge__.load.${level}`),用于错误信息与追踪\n * @param url 完整请求 URL\n * @param level 所属层级(摘要请求无层级,传 undefined)\n */\n async function fetchMeta(routeTag: string, url: string, level = ''): Promise<unknown> {\n const adp = await ensureAdapter();\n const config: RequestConfig = {\n route: routeTag,\n level,\n method: 'GET',\n url,\n headers: { Accept: 'application/json' },\n params: {},\n timeout,\n meta: {\n name: routeTag,\n uri: url,\n methods: ['GET'],\n parameters: [],\n level,\n },\n };\n const doRawRequest = adp.requestRaw ?? adp.request;\n const resp = await doRawRequest(config);\n if (!resp || resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `Failed to fetch \"${routeTag}\": HTTP ${resp?.status}`,\n { level, status: resp?.status, url, method: 'GET' },\n );\n }\n return resp.data;\n }\n\n // 自动发现:摘要拉取经 adapter 通道(fetchSummary → fetchMeta → ensureAdapter 均已在上方就绪),\n // 就地折算进 discoveryState。fetchSummary 为 async,首个 await 即让出,不阻塞 createRouteForge 返回。\n const autoDiscoveryPromise = fetchSummary(discoveryInputs, baseURL, fetchMeta).then((summary) => {\n // summary === null:显式 levels 降级路径,effective* 保持初值,无需折算\n if (summary === null) {\n return;\n }\n applySummaryToState(summary, discoveryState, discoveryInputs);\n });\n // 防止 autoDiscoveryPromise 未被 await 时产生 unhandled rejection;\n // 存储错误以便在 load/api 调用时重新抛出,保留原始错误信息\n let autoDiscoveryError: unknown = null;\n autoDiscoveryPromise.catch((e) => {\n autoDiscoveryError = e;\n });\n\n // --- 层级路由存储与加载(RouteStore 封装 cache/inflight/失效代数/虚拟 unassigned 层级)---\n const store = new RouteStore({\n cache,\n state: discoveryState,\n baseURL,\n fetchMeta,\n autoDiscoveryPromise,\n getAutoDiscoveryError: () => autoDiscoveryError,\n });\n const load = (level: string | string[]): Promise<void> => store.load(level);\n const findRouteMeta = (level: string, name: string): RouteMeta | undefined =>\n store.findRouteMeta(level, name);\n const invalidate = (level?: string | string[]): void => store.invalidate(level);\n const isLoaded = (level?: string): boolean => store.isLoaded(level);\n function getRoutes(level: string): Record<string, RouteMeta>;\n function getRoutes(): Record<string, Record<string, RouteMeta>>;\n function getRoutes(\n level?: string,\n ): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n return level === undefined ? store.getRoutes() : store.getRoutes(level);\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 ?? {}, { baseURL, urlPrefix: discoveryState.urlPrefix });\n }\n\n // --- 业务请求执行(http-runner 封装:参数解析 / 拦截链 / 错误转换 / 加载跟踪 / 可 abort)---\n const api = createHttpRunner({\n ensureAdapter,\n requestInterceptors,\n responseInterceptors,\n load,\n findRouteMeta,\n baseURL,\n state: discoveryState,\n timeout,\n loadingTracker,\n autoDiscoveryPromise,\n });\n\n function hasRoute(level: string, name: string): boolean {\n assertDiscoveryReady();\n return findRouteMeta(level, name) !== undefined;\n }\n\n // eager 层级自动加载 + ready Promise settle\n // 不阻塞 createRouteForge 返回;在自动发现完成后触发\n void autoDiscoveryPromise\n .then(() => {\n // 摘要处理完成 → auto-discovery 已完成(eager load 之前设置,确保 level 加载后 route() 可用)\n autoDiscoveryCompleted = true;\n // eager load:单个层级失败不阻塞 ready(SPEC §4.1.9)。\n // 失败以完整异常(含堆栈)抛出到控制台,且不缓存失败态——\n // 后续 load()/api() 直接调用时会重试该层级,再失败时向调用方抛出\n if (discoveryState.eager.length > 0) {\n return Promise.allSettled(discoveryState.eager.map((lvl) => load(lvl))).then((results) => {\n results.forEach((r, i) => {\n if (r.status === 'rejected') {\n console.error(\n `[route-forge] eager load failed for level \"${discoveryState.eager[i]}\":`,\n r.reason,\n );\n }\n });\n });\n }\n })\n .then(() => {\n resolveReady(forgeInstance);\n })\n .catch((e) => {\n // 自动发现失败(无可用降级)→ ready() reject 携带原始错误,不再永久挂起\n rejectReady(e);\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 // --- 绑定层级 BoundForge 构造(bound-forge 封装 api/route/url/onLevelLoaded/useRoutePrefix)---\n const createBoundForgeWithMethods = createBoundForgeFactory({\n load,\n api,\n route,\n hasRoute,\n getRoutes,\n invalidate,\n isLoaded,\n loadingTracker,\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"]}
1
+ {"version":3,"sources":["../src/cache.ts","../src/errors.ts","../src/interceptors.ts","../src/adapters/fetch-core.ts","../src/adapters/builtin-http.ts","../src/adapters/axios.ts","../src/adapters/index.ts","../src/loading.ts","../src/url-builder.ts","../src/auto-discovery.ts","../src/embedded-summary.ts","../src/route-store.ts","../src/http-runner.ts","../src/resolveRouteName.ts","../src/defineImmutableProps.ts","../src/bound-forge.ts","../src/forge.ts"],"names":["wrapped","prefix","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 唯一来源为摘要 config.cache_ttl(全局,经 set 的 backendTtl 参数传入):\n * null=不缓存(只留内存镜像、不落存储)、0=永久、正整数=min(后端, 前端 cache.ttl 兜底)\n * - storage: 'memory' | 'sessionStorage' | 'localStorage'\n * - storage 模式下维护内存镜像:首次读盘解析后驻留内存,后续 get 直接命中\n * (读盘 + JSON.parse 整层路由表是同步阻塞操作,热路径重复执行代价高);\n * 写操作(set/del/clear)同步更新镜像,并通过 storage 事件感知其他\n * tab 的写入/失效,保证跨 tab 新鲜度与无镜像时一致\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 /** 其他 tab 修改 storage 时失效对应镜像(storage 事件:自己的写不触发,自己的写经 set/del 已同步) */\n private readonly onStorageEvent = (e: StorageEvent): void => {\n if (!e.key) return; // key 为 null 表示 clear() 清空了整个 storage\n if (!e.key.startsWith(KEY_PREFIX)) return;\n // 去掉前缀得到 level(key 构造无 encode,反向切片即可)\n this.memory.delete(e.key.slice(KEY_PREFIX.length));\n };\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 // 仅 storage 模式需要监听跨 tab 变更;typeof 防御 SSR/非浏览器环境\n if (this.backend && typeof globalThis.addEventListener === 'function') {\n globalThis.addEventListener('storage', this.onStorageEvent);\n }\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 // 1. 内存镜像优先:命中则免读盘+解析(getFromMemory 内含 TTL 检查,过期自动剔除)\n const mirrored = this.getFromMemory(level);\n if (mirrored) return mirrored;\n // 2. 镜像 miss(首次读取 / TTL 过期 / 跨 tab 失效后)→ 读盘解析\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 // 3. 写入镜像,后续 get 直接走内存\n this.memory.set(level, entry);\n return entry;\n } catch {\n return undefined;\n }\n }\n return undefined;\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 /**\n * 写入某层级缓存。后端 TTL 唯一来源为摘要 config.cache_ttl(全局),经参数 backendTtl 传入:\n * - null → 后端声明\"不缓存\":不写 storage,仅留内存镜像供 route() 同步读(load 层\"每次重取\"由调用方跳过 get 短路实现)\n * - 0 → 永久缓存(内存 + storage)\n * - undefined → 后端未下发该字段:用前端兜底 TTL(options.cache.ttl)\n * - 正整数 → min(后端, 前端兜底):后端为上限,前端只能缩短不能延长(SPEC §5.3)\n */\n set(resp: LevelRoutesResponse, backendTtl: number | null | undefined): void {\n let ttl: number;\n let persist: boolean;\n if (backendTtl === null) {\n ttl = 0; // 内存镜像视为不过期,供 route() 读取;但不落 storage\n persist = false;\n } else if (backendTtl === undefined) {\n ttl = this.fallbackTtl; // 后端未表态 → 前端兜底\n persist = true;\n } else if (backendTtl === 0) {\n ttl = 0; // 永久\n persist = true;\n } else {\n ttl = Math.min(backendTtl, this.fallbackTtl); // 后端上限,前端可缩短\n persist = true;\n }\n const entry: CacheEntry = {\n level: resp.level,\n routes: resp.routes,\n ttl,\n cachedAt: Date.now(),\n };\n // 无条件先写内存镜像:写入方自己立刻享受内存命中(不再每次 get 重新读盘解析)\n this.memory.set(resp.level, entry);\n if (!persist || this.storage === 'memory' || !this.backend) {\n return;\n }\n try {\n this.backend.setItem(this.key(resp.level), JSON.stringify(entry));\n } catch {\n // 容量满或被禁用:镜像已写入,backend 跳过(读取路径仍可命中内存)\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\n/**\n * Route Forge 错误码字面量联合。\n * 用户侧 `switch (e.code)` 可获得穷尽检查(漏分支编译报错)。\n */\nexport type ForgeErrorCode =\n | 'RF_FE_001' // 路由名不存在\n | 'RF_FE_002' // 层级未声明\n | 'RF_FE_003' // 必填路径参数缺失\n | 'RF_FE_005' // adapter:'axios' 但未检测到 axios\n | 'RF_FE_006' // 请求拦截器返回非 RequestConfig\n | 'RF_FE_007' // 网络错误\n | 'RF_FE_008' // HTTP 非 2xx\n | 'RF_FE_009' // 请求被取消\n | 'RF_FE_010'; // auto-discovery 未完成守卫\n\nexport class ForgeError extends Error {\n readonly code: ForgeErrorCode;\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: ForgeErrorCode;\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 * 纯 fetch 底座(无状态工具层)\n * @see .docs/SPEC.md §4.3.1\n *\n * 职责:超时/取消合并、query/body 序列化、fetch 调用、JSON 解析、\n * ResponseData 组装、非 2xx 转 HTTPError。不持有任何状态。\n *\n * 消费方:\n * - builtin-http 的 requestRaw(拦截器编排层的底座)\n * - forge.ts 的元信息拉取(fetchLevel + 摘要端点,经 adapter requestRaw 通道)\n */\n\nimport type { RequestConfig, ResponseData } from '../types.js';\nimport { HTTPError, NetworkError } from '../errors.js';\n\n/**\n * 判断错误是否为请求取消错误。\n * 兼容 fetch 的 DOMException AbortError 与 axios 的 CanceledError;\n * 传入 signal 且已 abort 时,无论错误类型均视为取消。\n */\nexport function 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/**\n * 合并多个 AbortSignal:任一 signal abort 即返回合并后的 signal abort。\n * 优先使用 AbortSignal.any(Node 20.3+ / 现代浏览器),否则回退到手动监听。\n */\nexport function 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\n/**\n * 判断 body 是否为宿主原生可直接传输的类型(跳过 JSON 序列化)。\n */\nexport function 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 * 原始请求:不经过任何拦截链。\n * 超时控制(timeout > 0 用 AbortSignal.timeout,与用户 signal 合并)、\n * paramsSerializer、body 序列化 + JSON Content-Type 自动补齐、\n * 网络层错误转 NetworkError、非 2xx 抛 HTTPError。\n * 请求取消(AbortError)不包装,保留原始错误以便上层转换为 RequestAbortedError。\n */\nexport async function rawFetch(config: RequestConfig): Promise<ResponseData> {\n // 超时控制:timeout > 0 时用 AbortSignal.timeout\n // 若同时有用户 signal,合并两者(任一 abort 即取消请求)\n const signal = combineSignals(\n config.signal,\n config.timeout && config.timeout > 0\n ? AbortSignal.timeout(config.timeout)\n : undefined,\n );\n\n // paramsSerializer:自定义 query 序列化\n let url = config.url;\n if (config.paramsSerializer && config.params) {\n const qs = config.paramsSerializer(config.params);\n if (qs) {\n url = url.includes('?') ? `${url}&${qs}` : `${url}?${qs}`;\n }\n }\n\n // 构建 fetchInit(body 序列化 + JSON Content-Type 自动补齐)\n const headers = new Headers(config.headers);\n const fetchInit: RequestInit = {\n method: config.method,\n headers,\n };\n if (signal) fetchInit.signal = signal;\n if (\n config.body !== undefined &&\n !['GET', 'HEAD'].includes(config.method.toUpperCase())\n ) {\n if (typeof config.body === 'string' || isPassthroughBody(config.body)) {\n fetchInit.body = config.body as BodyInit;\n } else {\n fetchInit.body = JSON.stringify(config.body);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n }\n }\n\n // 调用 fetch(网络层错误转 NetworkError,便于独立使用 adapter 时错误语义一致)\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 config.route,\n config.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 // 构建 ResponseData\n const responseData: ResponseData = {\n route: config.route,\n level: config.level,\n method: config.method,\n url,\n status: res.status,\n headers: res.headers,\n data,\n config,\n };\n\n // HTTP 非 2xx → 抛 HTTPError(由调用方决定拦截/恢复)\n if (res.status >= 200 && res.status < 300) {\n return responseData;\n }\n throw new HTTPError(\n `HTTP ${res.status} for route \"${config.route}\" (${config.method} ${url})`,\n {\n route: config.route,\n level: config.level,\n status: res.status,\n url,\n method: config.method,\n },\n );\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 * 结构:纯 fetch 底座(超时/序列化/非 2xx 转换)提取在 fetch-core.ts,\n * 本文件只负责拦截器编排 + axios 兼容门面。\n */\n\nimport type { InterceptorManager, RequestConfig, ResponseData } from '../types.js';\nimport {\n createInterceptorManager,\n runRequestInterceptors,\n runResponseInterceptors,\n} from '../interceptors.js';\nimport { rawFetch } from './fetch-core.js';\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 /**\n * 原始请求:不经过请求/响应拦截链。\n * 供元信息拉取使用(forge.ts 的 fetchLevel / 摘要端点)——元信息解析不能被\n * 业务拦截器(如解包 resp.data 的响应拦截器)干扰,与 axios 路径\n * 「元信息不走 forge 拦截链」的行为保持一致。\n */\n const requestRaw = rawFetch;\n\n async function request(config: RequestConfig): Promise<ResponseData> {\n // 1. 执行请求拦截器(LIFO,对齐 axios)\n const finalConfig = await runRequestInterceptors(requestMgr, config);\n\n // 2. 原始请求(超时/序列化/fetch/解析/非 2xx 转 HTTPError)\n const source: Promise<ResponseData> = Promise.resolve(finalConfig).then(requestRaw);\n\n // 3. 执行响应拦截器(FIFO,对齐 axios);末段返回值即 request() 的 resolve 值\n // HTTP 非 2xx → HTTPError 进入响应拦截器 onRejected 链(SPEC §4.1.3a 步骤 9)\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 requestRaw,\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 * - 未检测到 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'(默认):动态 import 探测宿主 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 /**\n * 原始请求(跳过拦截链),可选。\n * 供层级元信息拉取使用:元信息解析不应被业务拦截器干扰。\n * 未提供时 forge.fetchLevel 回退到 request()。\n */\n requestRaw?: (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 */\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 * URL 构建与调用参数解析:全部为纯函数(不读取工厂闭包状态)。\n *\n * 需要 baseURL / endpoint / urlPrefix 的函数通过 ctx 参数在调用时传入,\n * 由调用方实时读取(含自动发现回填后的值),避免快照冻结。\n *\n * @see .docs/SPEC.md §4.1.3\n */\n\nimport { ForgeError, MissingRouteParamError } from './errors.js';\nimport type { ApiCallParams, RouteMeta } from './types.js';\n\n/** 层级元信息端点上下文(buildUrl 用) */\nexport interface EndpointContext {\n baseURL: string;\n endpoint: string;\n}\n\n/** 业务请求 URL 上下文(buildRequestUrl 用);urlPrefix 为后端下发的实时值 */\nexport interface RequestUrlContext {\n baseURL: string;\n urlPrefix: string;\n}\n\n/** 层级路由元信息拉取端点 URL:baseURL + endpoint + /level */\nexport function buildUrl(level: string, ctx: EndpointContext): string {\n const base = ctx.baseURL.endsWith('/') ? ctx.baseURL.slice(0, -1) : ctx.baseURL;\n const ep = ctx.endpoint.startsWith('/') ? ctx.endpoint : `/${ctx.endpoint}`;\n return `${base}${ep}/${encodeURIComponent(level)}`;\n}\n\n/**\n * 由路由元信息 + 传参构建最终请求 URL(含路径参数替换、可选参数清理、前缀拼接)。\n * 抛错语义:缺失必填参数 → MissingRouteParamError;路径参数为对象 → ForgeError(RF_FE_003)。\n */\nexport function buildRequestUrl(\n meta: RouteMeta,\n params: Record<string, unknown>,\n ctx: RequestUrlContext,\n): 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(ctx.urlPrefix)) {\n const prefix = ctx.urlPrefix.endsWith('/') ? ctx.urlPrefix.slice(0, -1) : ctx.urlPrefix;\n return uri.startsWith('/') ? `${prefix}${uri}` : `${prefix}/${uri}`;\n }\n const base = ctx.baseURL.endsWith('/') ? ctx.baseURL.slice(0, -1) : ctx.baseURL;\n const prefix = ctx.urlPrefix;\n return uri.startsWith('/') ? `${base}${prefix}${uri}` : `${base}${prefix}/${uri}`;\n}\n\n/** 选取实际请求方法:跳过 HEAD,取首个非 HEAD 方法,兜底 GET。 */\nexport function pickMethod(meta: RouteMeta): string {\n const m = meta.methods.find((x) => x.toUpperCase() !== 'HEAD');\n return (m ?? meta.methods[0] ?? 'GET').toUpperCase();\n}\n\n/** 追加查询参数到 URL(跳过 undefined/null,无有效参数时原样返回)。 */\nexport function 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 */\nexport function 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} {\n const {\n params: explicitParams,\n query: rawQuery,\n body: rawBody,\n headers: rawHeaders,\n timeout: perCallTimeout,\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 };\n}\n","/**\n * 自动发现(SPEC §4.1.1 + §5.3):把摘要(网络拉取 / 页面内嵌 / 配置直供)折算出前端运行时有效配置。\n *\n * 摘要折算出的有效值(endpoint 兜底前缀 / urlPrefix / levels / eager / 各层级 route.uri / 全局 cache_ttl)\n * 集中在一个可变的 DiscoveryState 上,由工厂持有并在后续按属性实时读取,避免按值快照冻结结果。\n *\n * 本模块只提供纯计算函数(fetchSummary / applySummaryToState),不介入工厂启动时序。\n */\n\nimport { UnknownLevelError } from './errors.js';\nimport type { SummaryResponse } from './types.js';\n\n/**\n * 特殊层级名:未命中任何层级的命名路由归此层级。后端始终在摘要 `levels` 中注入该层级,\n * 前端按其 route.uri 走正常 HTTP 懒加载(不再是\"从顶层数组建虚拟层级\")。\n * @see .docs/SPEC.md §3.1.6\n */\nexport const UNASSIGNED_LEVEL = 'unassigned';\n\n/** 层级明细端点自描述(来自摘要 levels[].route) */\nexport interface LevelRouteDescriptor {\n uri: string;\n methods: string[];\n}\n\n/** 摘要折算后的有效状态(工厂持有并实时读取) */\nexport interface DiscoveryState {\n /** 可用层级 = 后端真实层级(∩ 显式 levels);含恒存在的 unassigned 层级 */\n levels: string[];\n /** 需预加载的 eager 层级 */\n eager: string[];\n /** 摘要/层级端点兜底前缀(后端 endpoint_prefix 权威覆盖);层级懒加载优先用 levelRoutes[].uri */\n endpoint: string;\n /** 后端下发的 URL 前缀,生成业务 URL 时拼接(默认为空) */\n urlPrefix: string;\n /**\n * 全局缓存 TTL(秒),来自摘要 config.cache_ttl:\n * null = 不缓存;0 = 永久;正整数 = N 秒;undefined = 后端未下发该字段(用前端兜底 TTL)。\n */\n cacheTtl: number | null | undefined;\n /** 各层级明细端点自描述(level → {uri, methods}),供懒加载拼 URL */\n levelRoutes: Record<string, LevelRouteDescriptor>;\n}\n\n/** 用户显式声明的发现输入 */\nexport interface DiscoveryInputs {\n explicitLevels?: string[];\n explicitEager?: string[];\n /** 网络拉取来源时用户显式配置的摘要端点;内嵌/配置摘要下可为 undefined */\n explicitEndpoint: string | undefined;\n}\n\n/** 元信息拉取通道(由工厂注入 fetchMeta:走 adapter 原始通道,获得 timeout/降级/自定义 Fetcher 兼容) */\nexport type MetaFetcher = (routeTag: string, url: string, level?: string) => Promise<unknown>;\n\n/**\n * 拉取摘要端点(网络级联来源)。URL = baseURL + 显式 endpoint。\n * 失败语义:显式传了 levels → 降级(warn + 返回 null,effective* 保持显式初值);\n * 未传 levels → 无可用降级,抛 UnknownLevelError(ready() 将 reject)。\n */\nexport async function fetchSummary(\n inputs: DiscoveryInputs,\n baseURL: string,\n fetchMeta: MetaFetcher,\n): Promise<SummaryResponse | null> {\n const { explicitLevels, explicitEndpoint } = inputs;\n if (!explicitEndpoint) {\n // 网络拉取要求有 endpoint;无 endpoint 的引导(内嵌/配置摘要)不会走到这里\n throw new UnknownLevelError('(auto-discovery)');\n }\n try {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const ep = explicitEndpoint.startsWith('/') ? explicitEndpoint : `/${explicitEndpoint}`;\n const data = await fetchMeta('__forge__.summary', `${base}${ep}`);\n return data 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 throw new UnknownLevelError('(auto-discovery)');\n }\n}\n\n/** config.cache_ttl 归一:负值降级为不缓存(null),与后端 RouteCache 口径一致。 */\nfunction normalizeCacheTtl(raw: number | null | undefined): number | null | undefined {\n if (typeof raw === 'number' && raw < 0) return null;\n return raw;\n}\n\n/**\n * 把摘要折算进可变的 state(就地写回 endpoint/urlPrefix/levels/eager/levelRoutes/cacheTtl)。\n * 摘要来源可为网络拉取、页面内嵌或配置直供,折算逻辑一致。\n * summary 为 null(显式 levels 降级路径)时由调用方短路,不进入此函数。\n */\nexport function applySummaryToState(\n summary: SummaryResponse,\n state: DiscoveryState,\n inputs: DiscoveryInputs,\n): void {\n const { explicitLevels, explicitEager, explicitEndpoint } = inputs;\n\n // 0. schemeVersion 向前兼容(DESIGN.md §6.3;拼写为 scheme 非 schema)\n const schemeVersion = summary.schemeVersion ?? 1;\n if (schemeVersion > 1) {\n console.warn(\n `[route-forge] backend schemeVersion=${schemeVersion} > client supported 1; some features may be unavailable`,\n );\n }\n\n // 1. endpoint 后端权威(层级懒加载优先用 route.uri,此值仅作兜底前缀)\n if (summary.config.endpoint_prefix && summary.config.endpoint_prefix !== explicitEndpoint) {\n if (explicitEndpoint) {\n console.warn(\n `[route-forge] backend endpoint_prefix \"${summary.config.endpoint_prefix}\" overrides frontend endpoint \"${explicitEndpoint}\"`,\n );\n }\n state.endpoint = summary.config.endpoint_prefix;\n }\n\n // 1a. url_prefix 后端权威:后端下发(非 null)时覆盖\n if (summary.config.url_prefix) {\n state.urlPrefix = summary.config.url_prefix.endsWith('/')\n ? summary.config.url_prefix.slice(0, -1)\n : summary.config.url_prefix;\n }\n\n // 1b. 全局 cache_ttl(后端权威)\n state.cacheTtl = normalizeCacheTtl(summary.config.cache_ttl);\n\n // 2. levels 概览:真实层级(含恒存在的 unassigned)+ 各层级 route.uri 自描述\n const backendLevels = Object.keys(summary.levels);\n const levelRoutes: Record<string, LevelRouteDescriptor> = {};\n for (const lvl of backendLevels) {\n const r = summary.levels[lvl]?.route;\n if (r && typeof r.uri === 'string') {\n levelRoutes[lvl] = { uri: r.uri, methods: r.methods ?? ['GET', 'HEAD'] };\n }\n }\n state.levelRoutes = levelRoutes;\n\n if (explicitLevels && explicitLevels.length > 0) {\n const intersection = explicitLevels.filter((l) => backendLevels.includes(l));\n const removed = explicitLevels.filter((l) => !backendLevels.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 state.levels = intersection;\n } else {\n state.levels = backendLevels.slice();\n }\n\n // 3. eager:未传时取后端 load:'eager' 层级;显式传入时取并集(SPEC §5.3)\n const backendEager = backendLevels.filter((lvl) => summary.levels[lvl]?.load === 'eager');\n if (!explicitEager) {\n state.eager = backendEager;\n } else {\n // 并集:后端 eager + 前端显式声明,去重\n const union = new Set([...backendEager, ...explicitEager]);\n state.eager = [...union];\n }\n}\n","/**\n * 页面内嵌摘要(Blade hydration)读取层(SPEC §4.1.1 / §3.1.8)。\n *\n * route-forge-laravel 的 `@forgeSummary` 指令在 SSR 的 HTML `<head>` 内,用\n * `Object.defineProperty(window, '__ROUTE_FORGE__', { get, enumerable:false, configurable:true })`\n * 注入一次性访问器:值 = 与摘要端点逐字段一致的 SummaryResponse,读后立即 `delete`。\n * 目的是让 core 在浏览器初始化时直接吃这份数据、省掉首屏的一次摘要 HTTP 往返。\n *\n * 本模块负责消费侧:读一次 + 触发全局自删 + module 级 memo 兜住\"同页多实例\"\n * (React StrictMode 双调用、第二个 RouteForgeProvider 会各自 new 一个 forge)。\n */\n\nimport type { SummaryResponse } from './types.js';\n\n/** 与后端 route-forge-laravel `ForgeSummaryRenderer::GLOBAL_KEY` 对齐,勿单方面改。 */\nexport const EMBEDDED_GLOBAL_KEY = '__ROUTE_FORGE__';\n\n/** undefined = 尚未读取;null = 无内嵌;对象 = 已读到的内嵌摘要。 */\nlet memo: SummaryResponse | null | undefined;\n\n/**\n * 读取页面内嵌摘要。命中优先级由工厂决定(内嵌 > 配置 summary > 网络),本函数只负责\"内嵌\"这一层。\n * - 非浏览器(`typeof window === 'undefined'`)或无内嵌或值非对象 → 返回 null;\n * - 首次读取会触发后端注入的 getter(读后 `delete`,window 上不再残留);结果 memo 化,\n * 后续同 realm 内再次调用直接复用缓存,解决多实例下的\"一次性\"冲突。\n */\nexport function readEmbeddedSummary(): SummaryResponse | null {\n if (memo !== undefined) return memo;\n if (typeof window === 'undefined') {\n memo = null;\n return null;\n }\n let raw: unknown;\n try {\n raw = (window as unknown as Record<string, unknown>)[EMBEDDED_GLOBAL_KEY];\n } catch {\n raw = undefined;\n }\n memo = raw !== null && typeof raw === 'object' ? (raw as SummaryResponse) : null;\n return memo;\n}\n\n/** 仅测试用:重置 memo,模拟新页面 / 新 JS realm。 */\nexport function __resetEmbeddedSummaryForTest(): void {\n memo = undefined;\n}\n","/**\n * 层级路由元信息的存储与加载(SPEC §4.1.2 / §4.1.4)。\n *\n * 封装按层级懒加载所需的可变状态:\n * - RouteCache(懒加载缓存)\n * - inflight(并发去重)\n * - invalidationGens(失效代数,防止 invalidate 后旧数据回写)\n * 并在此之上实现 fetchLevel / loadOne / load / invalidate / isLoaded\n * 以及缓存读取(findRouteMeta / getRoutes)与虚拟 unassigned 层级构建。\n *\n * 依赖通过构造参数注入:DiscoveryState 与自动发现错误均按引用 / getter\n * 实时读取,避免快照冻结自动发现回填结果;fetchMeta 为工厂提供的元信息传输通道。\n */\n\nimport { RouteCache } from './cache.js';\nimport { UnknownLevelError } from './errors.js';\nimport { buildUrl } from './url-builder.js';\nimport { type DiscoveryState, type MetaFetcher } from './auto-discovery.js';\nimport type { LevelRoutesResponse, RouteMeta } from './types.js';\n\nexport interface RouteStoreDeps {\n cache: RouteCache;\n state: DiscoveryState;\n baseURL: string;\n fetchMeta: MetaFetcher;\n /** 自动发现完成 Promise(load 前 await) */\n autoDiscoveryPromise: Promise<void>;\n /** 自动发现错误读取器(loadOne 起始处重抛,保留原始错误) */\n getAutoDiscoveryError: () => unknown;\n}\n\nexport class RouteStore {\n private readonly cache: RouteCache;\n private readonly state: DiscoveryState;\n private readonly baseURL: string;\n private readonly fetchMeta: MetaFetcher;\n private readonly autoDiscoveryPromise: Promise<void>;\n private readonly getAutoDiscoveryError: () => unknown;\n\n private readonly inflight = new Map<string, Promise<void>>();\n /** 每个层级的失效代数,用于检测 loadOne 期间是否发生了 invalidate */\n private readonly invalidationGens = new Map<string, number>();\n\n constructor(deps: RouteStoreDeps) {\n this.cache = deps.cache;\n this.state = deps.state;\n this.baseURL = deps.baseURL;\n this.fetchMeta = deps.fetchMeta;\n this.autoDiscoveryPromise = deps.autoDiscoveryPromise;\n this.getAutoDiscoveryError = deps.getAutoDiscoveryError;\n }\n\n assertLevelDeclared(level: string): void {\n if (!this.state.levels.includes(level)) {\n throw new UnknownLevelError(level);\n }\n }\n\n private async fetchLevel(level: string): Promise<LevelRoutesResponse> {\n // 层级明细端点优先用摘要自描述的 route.uri(baseURL + uri);缺省时兜底 endpoint_prefix 拼接\n const uri = this.state.levelRoutes[level]?.uri;\n const url = uri\n ? this.joinBaseAndPath(this.baseURL, uri)\n : buildUrl(level, { baseURL: this.baseURL, endpoint: this.state.endpoint });\n return (await this.fetchMeta(`route-forge.${level}`, url, level)) as LevelRoutesResponse;\n }\n\n /** baseURL 与后端下发的绝对 path 拼接(规范化斜杠),与 buildUrl 的 base 处理一致 */\n private joinBaseAndPath(baseURL: string, path: string): string {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const p = path.startsWith('/') ? path : `/${path}`;\n return `${base}${p}`;\n }\n\n async loadOne(level: string): Promise<void> {\n const autoDiscoveryError = this.getAutoDiscoveryError();\n if (autoDiscoveryError) throw autoDiscoveryError;\n this.assertLevelDeclared(level);\n\n // cacheTtl===null(后端声明\"不缓存\")→ 跳过缓存命中短路,每次 load 重新拉取;否则命中即返回\n const noCache = this.state.cacheTtl === null;\n if (!noCache && this.cache.get(level)) return;\n\n // inflight 去重\n const existing = this.inflight.get(level);\n if (existing) return existing;\n\n const gen = this.invalidationGens.get(level) ?? 0;\n const p = (async () => {\n try {\n // unassigned 是摘要中的真实层级,与其它层级完全一致地按 route.uri 走 HTTP 懒加载(SPEC §3.1.6)\n const resp = await this.fetchLevel(level);\n // 仅在缓存未被 invalidate 清除时写入,防止旧数据回写\n if ((this.invalidationGens.get(level) ?? 0) === gen) {\n this.cache.set(resp, this.state.cacheTtl);\n }\n } finally {\n this.inflight.delete(level);\n }\n })();\n this.inflight.set(level, p);\n return p;\n }\n\n async load(level: string | string[]): Promise<void> {\n await this.autoDiscoveryPromise;\n const list = Array.isArray(level) ? level : [level];\n await Promise.all(list.map((l) => this.loadOne(l)));\n }\n\n invalidate(level?: string | string[]): void {\n if (level === undefined) {\n this.cache.clear();\n // 清除所有进行中的加载,防止旧数据回写\n this.inflight.clear();\n for (const lvl of this.state.levels) {\n this.invalidationGens.set(lvl, (this.invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else if (Array.isArray(level)) {\n for (const lvl of level) {\n this.cache.del(lvl);\n this.inflight.delete(lvl);\n this.invalidationGens.set(lvl, (this.invalidationGens.get(lvl) ?? 0) + 1);\n }\n } else {\n this.cache.del(level);\n this.inflight.delete(level);\n this.invalidationGens.set(level, (this.invalidationGens.get(level) ?? 0) + 1);\n }\n }\n\n isLoaded(level?: string): boolean {\n if (level) return this.cache.get(level) !== undefined;\n // 无任何已声明层级(如自动发现未完成)时不应谎报全部已加载\n return this.state.levels.length > 0 && this.state.levels.every((lvl) => this.cache.get(lvl) !== undefined);\n }\n\n findRouteMeta(level: string, name: string): RouteMeta | undefined {\n const entry = this.cache.get(level);\n const meta = entry?.routes[name];\n if (meta) {\n return { ...meta, level };\n }\n return undefined;\n }\n\n getRoutes(level: string): Record<string, RouteMeta>;\n getRoutes(): Record<string, Record<string, RouteMeta>>;\n getRoutes(level?: string): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n if (level !== undefined) {\n const entry = this.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 this.state.levels) {\n const entry = this.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","/**\n * 业务请求执行层(SPEC §4.1.3 / §4.1.4 / §4.1.7)。\n *\n * 由工厂提供的依赖(adapter 解析、拦截器管理器、store 的 load/findRouteMeta、\n * 加载跟踪器、自动发现完成 Promise、默认 timeout、URL 前缀状态)组装出\n * api(level, name, params) —— 返回可 abort 的 ForgeRequest,内部串起:\n * 自动发现就绪 → 层级加载 → 命中路由 → 参数解析 → 请求/响应拦截链\n * → adapter 调用 → HTTP/网络/取消错误转换 → 加载中标识。\n */\n\nimport { isAbortError } from './adapters/fetch-core.js';\nimport type { ResolvedAdapter } from './adapters/index.js';\nimport { runRequestInterceptors, runResponseInterceptors } from './interceptors.js';\nimport {\n appendQuery,\n buildRequestUrl,\n pickMethod,\n resolveApiParams,\n} from './url-builder.js';\nimport { HTTPError, NetworkError, RequestAbortedError, UnknownRouteError, ForgeError } from './errors.js';\nimport type { LoadingTracker } from './loading.js';\nimport type { DiscoveryState } from './auto-discovery.js';\nimport type {\n ApiCallParams,\n ForgeRequest,\n InterceptorManager,\n RequestConfig,\n ResponseData,\n RouteMeta,\n} from './types.js';\n\nexport interface HttpRunnerDeps {\n ensureAdapter: () => Promise<ResolvedAdapter>;\n requestInterceptors: InterceptorManager<RequestConfig, RequestConfig>;\n responseInterceptors: InterceptorManager<ResponseData, unknown>;\n load: (level: string | string[]) => Promise<void>;\n findRouteMeta: (level: string, name: string) => RouteMeta | undefined;\n baseURL: string;\n /** 实时读取自动发现回填的 URL 前缀(按引用,勿快照) */\n state: DiscoveryState;\n timeout: number;\n loadingTracker: LoadingTracker;\n autoDiscoveryPromise: Promise<void>;\n}\n\n/** 创建 api(level, name, params) 工厂函数。 */\nexport function createHttpRunner(deps: HttpRunnerDeps): (\n level: string,\n name: string,\n params?: ApiCallParams,\n) => ForgeRequest {\n const {\n ensureAdapter,\n requestInterceptors,\n responseInterceptors,\n load,\n findRouteMeta,\n baseURL,\n state,\n timeout,\n loadingTracker,\n autoDiscoveryPromise,\n } = deps;\n\n async function doApiCall(\n meta: RouteMeta,\n params: ApiCallParams,\n signal?: AbortSignal,\n ): Promise<unknown> {\n const {\n pathParams,\n query,\n body,\n headers,\n timeout: perCallTimeout,\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(\n buildRequestUrl(meta, pathParams, { baseURL, urlPrefix: state.urlPrefix }),\n query,\n );\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, 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 return function api(level: string, name: string, params: ApiCallParams = {}): ForgeRequest {\n // 内部创建 AbortController,用户通过返回值的 abort() 方法取消请求\n let ctrl: AbortController | undefined;\n let abortedBeforeInit = false;\n let abortReason: unknown;\n\n const work = (async (): Promise<unknown> => {\n ctrl = new AbortController();\n if (abortedBeforeInit) {\n ctrl.abort(abortReason);\n }\n await autoDiscoveryPromise;\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, ctrl.signal);\n })();\n\n const request = work as ForgeRequest;\n request.abort = (): void => {\n if (ctrl) {\n ctrl.abort();\n } else {\n abortedBeforeInit = true;\n }\n };\n return request;\n };\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 * 绑定层级的 BoundForge 构造(SPEC §4.1.6 use(level, prefix))。\n *\n * 由工厂注入层级维度的操作(load/api/route/hasRoute/getRoutes/invalidate/isLoaded)\n * 与加载跟踪器,构造出一个「可作为函数调用(api 语法糖)+ 携带命名方法」的 BoundForge,\n * 并挂载 onLevelLoaded / useRoutePrefix 两个需要闭包引用的方法。\n */\n\nimport { resolveRouteName, resolveRouteNameSync, type RouteResolver } from './resolveRouteName.js';\nimport { defineImmutableProps } from './defineImmutableProps.js';\nimport type { LoadingTracker, LoadingChangeCallback } from './loading.js';\nimport type { ApiCallParams, BoundForge, RouteMeta } from './types.js';\n\nexport interface BoundForgeDeps {\n load: (level: string | string[]) => Promise<void>;\n api: (level: string, name: string, params?: ApiCallParams) => unknown;\n route: (level: string, name: string, params?: Record<string, unknown>) => string;\n hasRoute: (level: string, name: string) => boolean;\n getRoutes: (level: string) => Record<string, RouteMeta>;\n invalidate: (level: string | string[]) => void;\n isLoaded: (level: string) => boolean;\n loadingTracker: LoadingTracker;\n}\n\n/** 创建 (level, prefix?) => BoundForge 的构造函数(对应 forge.use 的绑定层级分支)。 */\nexport function createBoundForgeFactory(deps: BoundForgeDeps): (\n level: string,\n prefix?: string,\n) => BoundForge {\n const { load, api, route, hasRoute, getRoutes, invalidate, isLoaded, loadingTracker } = deps;\n\n // RouteResolver 接口实现(供 resolveRouteName/resolveRouteNameSync 使用)\n const resolver: RouteResolver = { load, hasRoute };\n\n function createBoundForge(level: string, prefix?: string): BoundForge {\n // 自动触发 level 加载;失败时 levelLoaded 保持 reject 语义\n //(onLevelLoaded 的 onRejected 依赖它;框架层各自在 catch 中保持未加载状态)\n const levelLoadedPromise = load(level);\n // 附加空 catch 防止无人订阅时的 unhandled rejection(不改变原 Promise 的 reject 状态)\n levelLoadedPromise.catch(() => {});\n\n const apiFn = prefix\n ? (name: string, params?: ApiCallParams) =>\n resolveRouteName(resolver, 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(resolver, 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(resolver, 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 return createBoundForgeWithMethods;\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 { InterceptorManagerImpl } 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 UnknownRouteError,\n} from './errors.js';\nimport { buildRequestUrl } from './url-builder.js';\nimport {\n applySummaryToState,\n fetchSummary,\n type DiscoveryInputs,\n type DiscoveryState,\n} from './auto-discovery.js';\nimport { readEmbeddedSummary } from './embedded-summary.js';\nimport { RouteStore } from './route-store.js';\nimport { createHttpRunner } from './http-runner.js';\nimport { createBoundForgeFactory } from './bound-forge.js';\nimport type {\n InterceptorManager,\n RequestConfig,\n ResponseData,\n RouteForge,\n RouteForgeOptions,\n RouteMeta,\n} from './types.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_CACHE_TTL = 3600;\n\nexport function createRouteForge(options: RouteForgeOptions = {}): RouteForge {\n // 摘要数据源级联(SPEC §4.1.1):页面内嵌 > 配置 summary 字段 > 网络拉取 endpoint。\n const bootstrapSummary = readEmbeddedSummary() ?? options.summary ?? null;\n if (!bootstrapSummary && !options.endpoint) {\n throw new TypeError(\n 'createRouteForge: 需要 options.endpoint,或 options.summary,或页面内嵌 window.__ROUTE_FORGE__',\n );\n }\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 explicitEndpoint = options.endpoint;\n\n // 自动发现有效状态:初始取用户显式配置(endpoint 缺省时用内嵌/配置摘要的 endpoint_prefix 兜底),\n // 摘要折算(网络响应到达 / 内嵌/配置即时)后由 applySummaryToState 就地回填\n const discoveryState: DiscoveryState = {\n levels: explicitLevels ?? [],\n eager: explicitEager ?? [],\n endpoint: explicitEndpoint ?? bootstrapSummary?.config?.endpoint_prefix ?? '',\n urlPrefix: '',\n cacheTtl: undefined,\n levelRoutes: {},\n };\n const discoveryInputs: DiscoveryInputs = { explicitLevels, explicitEager, explicitEndpoint };\n\n // --- Auto-discovery 完成状态 + ready Promise ---\n let autoDiscoveryCompleted = false;\n let resolveReady!: (value: RouteForge) => void;\n let rejectReady!: (reason?: unknown) => void;\n const readyPromise = new Promise<RouteForge>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n // 无人调用 ready() 时防 unhandled rejection;不改变 reject 语义,订阅者仍能收到错误\n readyPromise.catch(() => {});\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 // 传入 forge 拦截器管理器,确保降级后拦截链语义不变\n return resolveAdapter({\n adapter: 'builtin',\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n });\n adapterResolved = true;\n }\n return adapterObj!;\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 /**\n * 元信息拉取统一通道:摘要端点与层级路由表共用。\n * 走 adapter 原始通道(不走 forge.interceptors 链,避免与业务调用混淆):\n * builtin 提供 requestRaw(跳过拦截链);axios/自定义 Fetcher 未提供时回退 request()。\n * 获得 timeout、adapter 检测/降级、自定义 Fetcher 兼容。\n * @param routeTag 请求标识(摘要 `__forge__.summary` / 层级 `route-forge.${level}`),用于错误信息与追踪\n * @param url 完整请求 URL\n * @param level 所属层级(摘要请求无层级,传 undefined)\n */\n async function fetchMeta(routeTag: string, url: string, level = ''): Promise<unknown> {\n const adp = await ensureAdapter();\n const config: RequestConfig = {\n route: routeTag,\n level,\n method: 'GET',\n url,\n headers: { Accept: 'application/json' },\n params: {},\n timeout,\n meta: {\n name: routeTag,\n uri: url,\n methods: ['GET'],\n parameters: [],\n level,\n },\n };\n const doRawRequest = adp.requestRaw ?? adp.request;\n const resp = await doRawRequest(config);\n if (!resp || resp.status < 200 || resp.status >= 300) {\n throw new HTTPError(\n `Failed to fetch \"${routeTag}\": HTTP ${resp?.status}`,\n { level, status: resp?.status, url, method: 'GET' },\n );\n }\n return resp.data;\n }\n\n // 自动发现:摘要拉取经 adapter 通道(fetchSummary → fetchMeta → ensureAdapter 均已在上方就绪),\n // 就地折算进 discoveryState。fetchSummary 为 async,首个 await 即让出,不阻塞 createRouteForge 返回。\n // 摘要级联:内嵌/配置命中 → 同步折算、跳过网络;否则走网络 fetchSummary(就地折算)。\n let autoDiscoveryPromise: Promise<void>;\n if (bootstrapSummary) {\n applySummaryToState(bootstrapSummary, discoveryState, discoveryInputs);\n // 内嵌/配置摘要即时可用:构造返回后 route()/hasRoute() 立即可用(首屏免闪烁、SSR 直出友好)\n autoDiscoveryCompleted = true;\n autoDiscoveryPromise = Promise.resolve();\n } else {\n autoDiscoveryPromise = fetchSummary(discoveryInputs, baseURL, fetchMeta).then((summary) => {\n // summary === null:显式 levels 降级路径,effective* 保持初值,无需折算\n if (summary === null) {\n return;\n }\n applySummaryToState(summary, discoveryState, discoveryInputs);\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 // --- 层级路由存储与加载(RouteStore 封装 cache/inflight/失效代数 + 按 route.uri 层级懒加载)---\n const store = new RouteStore({\n cache,\n state: discoveryState,\n baseURL,\n fetchMeta,\n autoDiscoveryPromise,\n getAutoDiscoveryError: () => autoDiscoveryError,\n });\n const load = (level: string | string[]): Promise<void> => store.load(level);\n const findRouteMeta = (level: string, name: string): RouteMeta | undefined =>\n store.findRouteMeta(level, name);\n const invalidate = (level?: string | string[]): void => store.invalidate(level);\n const isLoaded = (level?: string): boolean => store.isLoaded(level);\n function getRoutes(level: string): Record<string, RouteMeta>;\n function getRoutes(): Record<string, Record<string, RouteMeta>>;\n function getRoutes(\n level?: string,\n ): Record<string, RouteMeta> | Record<string, Record<string, RouteMeta>> {\n return level === undefined ? store.getRoutes() : store.getRoutes(level);\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 ?? {}, { baseURL, urlPrefix: discoveryState.urlPrefix });\n }\n\n // --- 业务请求执行(http-runner 封装:参数解析 / 拦截链 / 错误转换 / 加载跟踪 / 可 abort)---\n const api = createHttpRunner({\n ensureAdapter,\n requestInterceptors,\n responseInterceptors,\n load,\n findRouteMeta,\n baseURL,\n state: discoveryState,\n timeout,\n loadingTracker,\n autoDiscoveryPromise,\n });\n\n function hasRoute(level: string, name: string): boolean {\n assertDiscoveryReady();\n return findRouteMeta(level, name) !== undefined;\n }\n\n // eager 层级自动加载 + ready Promise settle\n // 不阻塞 createRouteForge 返回;在自动发现完成后触发\n void autoDiscoveryPromise\n .then(() => {\n // 摘要处理完成 → auto-discovery 已完成(eager load 之前设置,确保 level 加载后 route() 可用)\n autoDiscoveryCompleted = true;\n // eager load:单个层级失败不阻塞 ready(SPEC §4.1.9)。\n // 失败以完整异常(含堆栈)抛出到控制台,且不缓存失败态——\n // 后续 load()/api() 直接调用时会重试该层级,再失败时向调用方抛出\n if (discoveryState.eager.length > 0) {\n return Promise.allSettled(discoveryState.eager.map((lvl) => load(lvl))).then((results) => {\n results.forEach((r, i) => {\n if (r.status === 'rejected') {\n console.error(\n `[route-forge] eager load failed for level \"${discoveryState.eager[i]}\":`,\n r.reason,\n );\n }\n });\n });\n }\n })\n .then(() => {\n resolveReady(forgeInstance);\n })\n .catch((e) => {\n // 自动发现失败(无可用降级)→ ready() reject 携带原始错误,不再永久挂起\n rejectReady(e);\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 // --- 绑定层级 BoundForge 构造(bound-forge 封装 api/route/url/onLevelLoaded/useRoutePrefix)---\n const createBoundForgeWithMethods = createBoundForgeFactory({\n load,\n api,\n route,\n hasRoute,\n getRoutes,\n invalidate,\n isLoaded,\n loadingTracker,\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"]}