@route-forge/core 2.2.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -23
- package/README_zh.md +30 -23
- package/dist/codegen.cjs +96 -69
- package/dist/codegen.cjs.map +1 -1
- package/dist/codegen.d.cts +23 -15
- package/dist/codegen.d.ts +23 -15
- package/dist/codegen.js +96 -69
- package/dist/codegen.js.map +1 -1
- package/dist/index.cjs +465 -210
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +522 -24
- package/dist/index.d.ts +522 -24
- package/dist/index.js +463 -211
- package/dist/index.js.map +1 -1
- package/dist/manifest-bjy4P_B4.d.cts +76 -0
- package/dist/manifest-bjy4P_B4.d.ts +76 -0
- package/dist/route-forge.global.js +465 -210
- package/dist/route-forge.global.js.map +1 -1
- package/dist/route-forge.global.min.js +2 -2
- package/package.json +4 -1
- package/dist/types-CDKE8rw-.d.cts +0 -462
- package/dist/types-CDKE8rw-.d.ts +0 -462
package/dist/index.cjs.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/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.cjs","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/cache.ts","../src/interceptors/manager.ts","../src/errors.ts","../src/interceptors/runner.ts","../src/interceptors/normalize.ts","../src/adapters/fetch-core.ts","../src/adapters/builtin-http.ts","../src/adapters/axios.ts","../src/adapters/index.ts","../src/adapter-bootstrap.ts","../src/ready-latch.ts","../src/loading.ts","../src/route-change.ts","../src/url/utils.ts","../src/url/endpoint.ts","../src/url/params.ts","../src/url/request.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.cjs","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 * 拦截器管理器实现:use/eject/clear/forEach 的注册与快照存储(不含执行编排)。\n * @see .docs/SPEC.md §4.1.3a\n *\n * 执行顺序编排见 interceptors/runner.ts;创建时声明式入参归一见 interceptors/normalize.ts。\n */\n\nimport type { InterceptorHandler, InterceptorManager } from '../types.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 * 工厂函数:供自定义 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 * Route Forge 错误基类与具体错误类\n * @see .docs/SPEC.md §6\n */\n\nimport type { ResponseData } from './types.js';\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/** 候选值格式化:列出可用取值帮助排查拼写错误(超过 5 个截断显示 +N more) */\nfunction formatCandidates(candidates?: string[]): string {\n if (!candidates || candidates.length === 0) return '';\n const MAX = 5;\n const shown = candidates.slice(0, MAX).join(', ');\n const more = candidates.length > MAX ? ` (+${candidates.length - MAX} more)` : '';\n return ` Available: ${shown}${more}`;\n}\n\n/** RF_FE_001:路由名不存在于已加载层级中 */\nexport class UnknownRouteError extends ForgeError {\n constructor(route: string, level?: string, candidates?: string[]) {\n super(\n `Route \"${route}\" not found${level ? ` in level \"${level}\"` : ''}.${formatCandidates(candidates)}`,\n {\n code: 'RF_FE_001',\n route,\n level,\n context: candidates && candidates.length > 0 ? { candidates } : undefined,\n },\n );\n }\n}\n\n/** RF_FE_002:路由所在层级未在 levels 声明 */\nexport class UnknownLevelError extends ForgeError {\n constructor(level: string, candidates?: string[]) {\n super(\n `Level \"${level}\" not declared in options.levels.${formatCandidates(candidates)}`,\n {\n code: 'RF_FE_002',\n level,\n context: candidates && candidates.length > 0 ? { candidates } : undefined,\n },\n );\n }\n}\n\n/** RF_FE_003:必填路径参数缺失(无后端 default 时,前端校验恒开) */\nexport class MissingRouteParamError extends ForgeError {\n constructor(route: string, missingParams: string[], uri?: string) {\n super(\n `Missing path parameter(s) ${missingParams.join(', ')} for route \"${route}\"` +\n `${uri ? ` (${uri})` : ''}`,\n {\n code: 'RF_FE_003',\n route,\n context: { missingParams, ...(uri !== undefined ? { uri } : {}) },\n },\n );\n }\n}\n\n/** RF_FE_003:路径参数收到非原始值(对象/数组等,无法安全插入 URI) */\nexport class InvalidPathParamError extends ForgeError {\n constructor(route: string, param: string, value: unknown) {\n super(\n `Path parameter \"${param}\" must be a primitive value (string, number, boolean), got ${typeof value}`,\n { code: 'RF_FE_003', route, context: { param, value } },\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/**\n * RF_FE_008:HTTP 非 2xx 且未被 onRejected 拦截器恢复。\n *\n * `response` 携带完整的 ResponseData(status/headers/data/config),\n * 供响应拦截器 onRejected 链与最终 catch 逐段检查响应体——典型场景:\n * Laravel 422 校验错误回显(`err.response.data.errors`)。\n */\nexport class HTTPError extends ForgeError {\n readonly response?: ResponseData;\n constructor(\n message: string,\n opts: { route?: string; level?: string; status?: number; url?: string; method?: string; cause?: unknown; response?: ResponseData },\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 if (opts.response !== undefined) this.response = opts.response;\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/** RF_FE_010:auto-discovery 未完成时调用 route()/hasRoute() 的同步守卫(api() 内部 await discovery,不受此限) */\nexport class DiscoveryNotReadyError extends ForgeError {\n constructor() {\n super(\n 'Route data not available. Auto-discovery has not completed. ' +\n 'Use forge.ready() or forge.use(level) first, or await ready() before calling route()/hasRoute().',\n { code: 'RF_FE_010' },\n );\n }\n}\n","/**\n * 拦截器执行编排(对齐 axios):请求 LIFO、响应 FIFO。\n * @see .docs/SPEC.md §4.1.3a\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 * 与存储层(manager.ts)解耦:本文件只消费 InterceptorManager.forEach 快照。\n */\n\nimport type {\n InterceptorHandler,\n InterceptorManager,\n RequestConfig,\n ResponseData,\n} from '../types.js';\nimport { InvalidInterceptorReturnError } from '../errors.js';\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 * 创建时声明式拦截器归一(SPEC §4.1.1):把「单拦截器三写法」规整为 onFulfilled/onRejected 钩子对。\n * @see .docs/SPEC.md §4.1.1\n *\n * 与运行时存储(manager.ts)、执行编排(runner.ts)解耦——本文件只做入参形状归一。\n */\n\n/**\n * 声明式入口只描述**一个**拦截器,支持三种写法:\n * - `resolve`(函数) → onFulfilled\n * - `[resolve, reject]`(数组) → 按位置映射 onFulfilled / onRejected;允许缺位\n * (`[resolve]` 仅成功、`[undefined, reject]` 仅失败)\n * - `{ resolve?, reject? }`(对象) → 具名映射 onFulfilled / onRejected\n *\n * 需要注册多个拦截器请改用运行时 `forge.interceptors.request/response.use()`(可多次调用)。\n *\n * @returns 归一后的钩子对;`{}`(两字段皆缺)表示未提供任何有效钩子。\n * @throws TypeError 值为不支持的类型,或 resolve/reject 存在但非函数时。\n */\nexport function normalizeInterceptorDeclaration<TIn, TOut = TIn>(\n value: unknown,\n): {\n onFulfilled?: (value: TIn) => TOut | Promise<TOut>;\n onRejected?: (error: unknown) => unknown | Promise<unknown>;\n} {\n if (value === null || value === undefined) return {};\n\n let rawResolve: unknown;\n let rawReject: unknown;\n\n if (typeof value === 'function') {\n rawResolve = value;\n } else if (Array.isArray(value)) {\n rawResolve = value[0];\n rawReject = value[1];\n } else if (typeof value === 'object') {\n const obj = value as { resolve?: unknown; reject?: unknown };\n rawResolve = obj.resolve;\n rawReject = obj.reject;\n } else {\n throw new TypeError(\n `Interceptor declaration must be a function, a [resolve, reject] tuple, or a { resolve, reject } object; received ${typeof value}.`,\n );\n }\n\n const handler: {\n onFulfilled?: (value: TIn) => TOut | Promise<TOut>;\n onRejected?: (error: unknown) => unknown | Promise<unknown>;\n } = {};\n\n if (rawResolve !== undefined && rawResolve !== null) {\n if (typeof rawResolve !== 'function') {\n throw new TypeError(\n `Interceptor \"resolve\" (onFulfilled) must be a function; received ${typeof rawResolve}.`,\n );\n }\n handler.onFulfilled = rawResolve as (value: TIn) => TOut | Promise<TOut>;\n }\n\n if (rawReject !== undefined && rawReject !== null) {\n if (typeof rawReject !== 'function') {\n throw new TypeError(\n `Interceptor \"reject\" (onRejected) must be a function; received ${typeof rawReject}.`,\n );\n }\n handler.onRejected = rawReject as (error: unknown) => unknown | Promise<unknown>;\n }\n\n return handler;\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 // 完整 ResponseData 随错误逐段传递(响应拦截器 onRejected 链 → 最终 catch),\n // 供调用方检查响应体,如 Laravel 422 校验错误 err.response.data.errors\n response: responseData,\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 自身请求拦截器先执行(core 先跑完 forge 请求链再调 axios.request),宿主请求拦截器在其后;\n * 响应链:宿主响应拦截器在 axios 内部先行,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 请求拦截链在调用 axios.request 前执行、响应拦截链在返回后执行,\n // 宿主拦截器的相对位置由 axios 内部决定(请求链在 forge 后、响应链在 forge 前)。\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 * Adapter 引导:解析配置的 adapter(auto / axios / builtin / 自定义 Fetcher),\n * 惰性 await 并附带「非 AdapterNotFoundError 的初始化失败 → 降级 builtin」的响亮告警。\n *\n * 从 createRouteForge 抽出,隔离初始化时序细节;返回的 ensureAdapter 幂等(只解析一次)。\n */\n\nimport { resolveAdapter, type ResolvedAdapter } from './adapters/index.js';\nimport { AdapterNotFoundError } from './errors.js';\nimport type { InterceptorManager, RequestConfig, ResponseData, AdapterOption } from './types.js';\n\nexport interface AdapterBootstrapDeps {\n adapter: AdapterOption;\n requestInterceptors: InterceptorManager<RequestConfig, RequestConfig>;\n responseInterceptors: InterceptorManager<ResponseData, unknown>;\n /** 非致命警告开关:adapter 显式指定却降级为 builtin 时是否 console.warn */\n warnings: boolean;\n}\n\n/** 创建 ensureAdapter():首次调用 await 解析结果并缓存,后续直接返回。 */\nexport function createAdapterBootstrap(\n deps: AdapterBootstrapDeps,\n): () => Promise<ResolvedAdapter> {\n const { adapter, requestInterceptors, responseInterceptors, warnings } = deps;\n\n const adapterPromise = resolveAdapter({\n adapter,\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n\n let adapterResolved = false;\n let adapterObj: ResolvedAdapter | null = null;\n\n return async function ensureAdapter(): Promise<ResolvedAdapter> {\n if (!adapterResolved) {\n adapterObj = await adapterPromise.catch((e) => {\n if (e instanceof AdapterNotFoundError) throw e;\n // 其他错误降级到 builtin(避免初始化失败);\n // 传入 forge 拦截器管理器,确保降级后拦截链语义不变。\n // 降级必须响亮:用户显式指定了 adapter/Fetcher,实际却运行 builtin,静默会掩盖行为差异\n if (warnings) {\n console.warn(\n `[route-forge] adapter initialization failed (${(e as Error)?.message ?? String(e)}); falling back to builtin`,\n );\n }\n return resolveAdapter({\n adapter: 'builtin',\n forgeInterceptors: { request: requestInterceptors, response: responseInterceptors },\n });\n });\n adapterResolved = true;\n }\n return adapterObj!;\n };\n}\n","/**\n * ready() 门闩:封装 ready Promise 的构造、resolve/reject、isReady 同步标记,\n * 以及「无人订阅时防 unhandled rejection」的两个兜底 catch。\n *\n * 语义(从 createRouteForge 抽出,逐字保留):\n * - 成功 resolve 后 isReady() 才为 true;reject 不算就绪(保持 false)。\n * - 原始 readyPromise 挂一个吞掉的 catch,防无人调用 ready() 时冒泡 unhandled rejection;\n * isSettledOk 跟踪另挂 then 的两个分支,reject 分支就地消化避免衍生 promise 再次 unhandled。\n * - ready() 有回调形态时仍返回 Promise<this>,resolve 值为门闩持有的实例本身。\n */\n\nexport interface ReadyLatch<T> {\n /** 供内部串联:discovery/eager 完成后 resolve、失败时 reject */\n resolve(value: T): void;\n reject(reason?: unknown): void;\n /** ready() 是否已成功 resolve(同步查询) */\n isReady(): boolean;\n /** 对外 ready() 门面(无参返回 Promise;有参走 then/catch 仍返回 Promise<T>) */\n ready(): Promise<T>;\n ready(onFulfilled: (value: T) => void, onRejected?: (error: unknown) => void): Promise<T>;\n}\n\nexport function createReadyLatch<T>(): ReadyLatch<T> {\n let resolveReady!: (value: T) => void;\n let rejectReady!: (reason?: unknown) => void;\n const readyPromise = new Promise<T>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n // 记录成功 resolve 的值:ready() 回调模式末段映射回该值(等价旧行为——resolve 为实例本身)\n let settledValue: T | undefined;\n // 无人调用 ready() 时防 unhandled rejection;不改变 reject 语义,订阅者仍能收到错误\n readyPromise.catch(() => {});\n // 就绪标记(isReady 同步查询用):仅成功 resolve 后置 true;reject 不算就绪。\n // onRejected 必须就地消化——否则衍生 promise 在 reject 时成为 unhandled rejection\n let readySettledOk = false;\n readyPromise.then(\n (value) => {\n settledValue = value;\n readySettledOk = true;\n },\n () => {\n /* reject 不算就绪;原始错误由 readyPromise.catch 兜底,订阅者仍能收到 */\n },\n );\n\n function ready(\n onFulfilled?: (value: T) => void,\n onRejected?: (error: unknown) => void,\n ): Promise<T> {\n if (onFulfilled) {\n // 回调内部走 then/catch;末段映射回门闩持有的实例(即便 onRejected 已消化错误也解析为值,\n // 绝不回返 readyPromise——否则会在 reject 时重新采纳 rejection,产生无人处理的 unhandled rejection)\n return readyPromise.then(onFulfilled, onRejected).then(() => settledValue as T);\n }\n return readyPromise;\n }\n\n return {\n resolve: (value) => resolveReady(value),\n reject: (reason) => rejectReady(reason),\n isReady: () => readySettledOk,\n ready: ready as ReadyLatch<T>['ready'],\n };\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 * RouteChangeTracker:路由表数据变更订阅(供框架层在缓存刷新后重算响应式 URL)\n *\n * 与 LoadingTracker(跟踪在途请求数)正交:本跟踪器表达的是「某层级的路由元信息内容已变化」\n * ——发生在层级数据成功写入缓存(首次 load / revalidate)或失效(invalidate)之后。\n *\n * - notify(level):广播某层级数据已变更(带 level,订阅者按自身绑定的 level 过滤,避免全量重渲染)\n * - subscribe(cb):订阅变更,返回取消订阅函数\n *\n * @see .docs/SPEC.md §4.1.8\n */\n\n/** 路由表数据变更回调签名;level 为发生变化的层级 */\nexport type RouteChangeCallback = (level: string) => void;\n\n/**\n * 路由数据变更广播器:微任务合批投递,避免同一 tick 内多次变更(invalidate-all、并发 load)\n * 触发同步惊群,并把订阅者回调移出 cache.write 的关键路径。\n */\nexport class RouteChangeTracker {\n private readonly subscribers = new Set<RouteChangeCallback>();\n /** 本微任务周期内累积的变更层级(去重) */\n private readonly pending = new Set<string>();\n /** 是否已排定一次微任务 flush */\n private scheduled = false;\n\n /** 订阅路由表数据变更;返回取消订阅函数 */\n subscribe(cb: RouteChangeCallback): () => void {\n this.subscribers.add(cb);\n return () => {\n this.subscribers.delete(cb);\n };\n }\n\n /** 记录某层级数据已变更;同一 tick 多次调用合并为一次投递(每层级各投一次) */\n notify(level: string): void {\n // 无订阅者时完全不排队,省掉微任务与集合开销\n if (this.subscribers.size === 0) return;\n this.pending.add(level);\n if (this.scheduled) return;\n this.scheduled = true;\n queueMicrotask(() => this.flush());\n }\n\n /** 一次性投递本周期累积的所有变更层级;单订阅者抛错不影响其它 */\n private flush(): void {\n this.scheduled = false;\n const levels = [...this.pending];\n this.pending.clear();\n for (const level of levels) {\n for (const cb of this.subscribers) {\n try {\n cb(level);\n } catch {\n // 订阅者回调异常不影响其他订阅者及缓存/请求流程\n }\n }\n }\n }\n}\n","/**\n * URL 基础拼接工具:统一「base + path」的斜杠规范化。\n *\n * 语义:\n * - base 去掉一个结尾 `/`(若有)\n * - path 补一个开头 `/`(若缺)\n * - 结果 = 规范化 base + 规范化 path\n */\n\n/** 去掉结尾的一个 `/`(若有)。 */\nexport function trimTrailingSlash(s: string): string {\n return s.endsWith('/') ? s.slice(0, -1) : s;\n}\n\n/** 保证开头有一个 `/`(若缺则补)。 */\nexport function withLeadingSlash(s: string): string {\n return s.startsWith('/') ? s : `/${s}`;\n}\n\n/** 规范化 base(去尾斜杠)与 path(补头斜杠)后拼接。 */\nexport function joinBaseAndPath(base: string, path: string): string {\n return `${trimTrailingSlash(base)}${withLeadingSlash(path)}`;\n}\n","/**\n * 层级元信息端点 URL 构建(baseURL + endpoint + /{level})。\n * @see .docs/SPEC.md §4.1.2\n */\n\nimport { joinBaseAndPath, withLeadingSlash } from './utils.js';\n\n/** 层级元信息端点上下文(buildUrl 用) */\nexport interface EndpointContext {\n baseURL: string;\n endpoint: string;\n}\n\n/** 层级路由元信息拉取端点 URL:baseURL + endpoint + /level */\nexport function buildUrl(level: string, ctx: EndpointContext): string {\n return `${joinBaseAndPath(ctx.baseURL, withLeadingSlash(ctx.endpoint))}/${encodeURIComponent(level)}`;\n}\n","/**\n * ApiCallParams 智能解析:分离路径参数 / query / body / headers。\n * @see .docs/SPEC.md §4.1.3 参数智能解析\n *\n * 与 URL 拼接(url/request.ts)解耦——本文件只负责把一次 api() 调用的入参归一为\n * buildRequestUrl/appendQuery 可直接消费的分组。\n */\n\nimport type { ApiCallParams } from '../types.js';\n\n/**\n * 智能解析 ApiCallParams,分离路径参数 / query / body / headers / signal。\n *\n * 规则:\n * 1. `params` 显式指定路径参数 → 优先级最高\n * 2. 平铺的 string | number 值(含与 query/body/headers 同名的 key)→ 路径参数\n * 3. `query` (对象) → 查询参数;`body` (非 string/number) → 请求体;`headers` (对象) → 请求头;\n * `signal` (AbortSignal) → 外部取消信号(保留 key,恒不参与路径参数)\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 signal?: AbortSignal;\n} {\n const {\n params: explicitParams,\n query: rawQuery,\n body: rawBody,\n headers: rawHeaders,\n timeout: perCallTimeout,\n signal: rawSignal,\n ...flatRest\n } = input;\n\n // 1. params 显式指定 → 作为路径参数基础\n const pathParams: Record<string, unknown> = explicitParams\n ? { ...explicitParams }\n : {};\n\n // 2. 其余平铺 key → 路径参数(params 优先,不覆盖已存在的 key)\n for (const [k, v] of Object.entries(flatRest)) {\n if (!(k in pathParams)) {\n pathParams[k] = v;\n }\n }\n\n // 3. 固定 key 智能消解:string/number → 路径参数;对象 → 固定用途\n let query: Record<string, unknown> | undefined;\n let body: unknown;\n let headers: Record<string, string> | undefined;\n\n // query: 对象类型 → 查询参数;string/number → 路径参数\n if (rawQuery !== undefined) {\n if (typeof rawQuery === 'object' && rawQuery !== null) {\n query = rawQuery as Record<string, unknown>;\n } else if (!('query' in pathParams)) {\n pathParams.query = rawQuery;\n }\n }\n\n // body: 非 string/number → 请求体;string/number → 路径参数\n if (rawBody !== undefined) {\n if (typeof rawBody !== 'string' && typeof rawBody !== 'number') {\n body = rawBody;\n } else if (!('body' in pathParams)) {\n pathParams.body = rawBody;\n }\n }\n\n // headers: 对象类型 → 请求头;string/number → 路径参数\n if (rawHeaders !== undefined) {\n if (typeof rawHeaders === 'object' && rawHeaders !== null) {\n headers = rawHeaders as Record<string, string>;\n } else if (!('headers' in pathParams)) {\n pathParams.headers = rawHeaders;\n }\n }\n\n return { pathParams, query, body, headers, timeout: perCallTimeout, signal: rawSignal };\n}\n","/**\n * 业务请求 URL 构建:由路由元信息 + 传参拼最终请求 URL,并选方法、追加 query。\n *\n * 均为纯函数(不读取工厂闭包状态):需要 baseURL / urlPrefix 的通过 ctx 在调用时传入,\n * 由调用方实时读取(含自动发现回填后的值),避免快照冻结。\n * @see .docs/SPEC.md §4.1.3\n */\n\nimport { InvalidPathParamError, MissingRouteParamError } from '../errors.js';\nimport type { ApiCallParams, RouteMeta } from '../types.js';\nimport { joinBaseAndPath, trimTrailingSlash, withLeadingSlash } from './utils.js';\nimport { resolveApiParams } from './params.js';\n\n/** 业务请求 URL 上下文(buildRequestUrl 用);urlPrefix 为后端下发的实时值 */\nexport interface RequestUrlContext {\n baseURL: string;\n urlPrefix: string;\n}\n\n/**\n * 由路由元信息 + 传参构建最终请求 URL(含路径参数替换、可选参数清理、前缀拼接)。\n * 抛错语义:缺失必填参数 → MissingRouteParamError;路径参数为对象 → InvalidPathParamError(同为 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 // 附 URI 模板:用户无需翻缓存即可对照该传哪些参数\n throw new MissingRouteParamError(meta.name, missingRequired, meta.uri);\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 InvalidPathParamError(meta.name, name, val);\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 = trimTrailingSlash(ctx.urlPrefix);\n return uri.startsWith('/') ? `${prefix}${uri}` : `${prefix}/${uri}`;\n }\n const base = trimTrailingSlash(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/** resolveApiParams 视为固定/保留 key 的字段名;均不出现时 = 纯路径参数,可走快路径。 */\nconst RESERVED_API_KEYS = ['params', 'query', 'body', 'headers', 'timeout', 'signal'] as const;\n\n/**\n * 由路由元信息 + 传参生成最终 URL(含路径参数替换与 query 追加),供 `route()` / `url()` 使用。\n *\n * 复用 `api()` 同一套入参解析(`resolveApiParams`):`params` 里 `query` 为固定 key → 序列化为\n * query string,其余按路径参数处理——因此 `route()` 与 `api()` 共享同一\"保留 key\"语义。\n * `body` / `headers` / `timeout` 对纯 URL 生成无意义,解析出后直接忽略。\n *\n * 快路径:`route()`/`url()` 是渲染期热点,且多数链接只有路径参数、没有 query 等保留 key。\n * 此时直接把 params 交给 buildRequestUrl,跳过 resolveApiParams 的对象拆分/副本,零额外开销;\n * 仅当出现任一保留 key 才走完整解析路径(语义不变)。\n */\nexport function buildRouteUrl(\n meta: RouteMeta,\n params: ApiCallParams | Record<string, unknown> | undefined,\n ctx: RequestUrlContext,\n): string {\n if (params) {\n const hasReservedKey = RESERVED_API_KEYS.some((k) => k in params);\n if (!hasReservedKey) {\n return buildRequestUrl(meta, params, ctx);\n }\n } else {\n return buildRequestUrl(meta, {}, ctx);\n }\n const { pathParams, query } = resolveApiParams(params);\n return appendQuery(buildRequestUrl(meta, pathParams, ctx), query);\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 { NetworkError } from './errors.js';\nimport { joinBaseAndPath } from './url-utils.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/**\n * 与后端约定的默认摘要端点:`options.endpoint` 省略、且无内嵌/配置摘要时,\n * 网络引导回退拉取此路径(相对 baseURL)。与 route-forge-laravel 默认 manifest 路由对齐。\n */\nexport const DEFAULT_ENDPOINT = '/_forge/routes';\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 /** 非致命警告开关(默认 true);false 时降级提示静音 */\n warnings: boolean;\n}\n\n/** 元信息拉取通道(由工厂注入 fetchMeta:走 adapter 原始通道,获得 timeout/降级/自定义 Fetcher 兼容) */\nexport type MetaFetcher = (routeTag: string, url: string, level?: string) => Promise<unknown>;\n\n/**\n * 拉取摘要端点(网络级联来源)。URL = baseURL + endpoint;endpoint 缺省时回退 DEFAULT_ENDPOINT。\n * 失败语义:显式传了 levels → 降级(warn + 返回 null,effective* 保持显式初值);\n * 未传 levels → 无可用降级,抛 NetworkError(message 含实际请求 URL 与原始原因,cause 携带原始错误),\n * ready() 将 reject——绝不伪装成层级声明错误误导排查。\n */\nexport async function fetchSummary(\n inputs: DiscoveryInputs,\n baseURL: string,\n fetchMeta: MetaFetcher,\n): Promise<SummaryResponse | null> {\n const { explicitLevels, explicitEndpoint, warnings } = inputs;\n // endpoint 缺省时回退到与后端约定的默认摘要端点(用户显式指定则优先其值)\n const endpoint = explicitEndpoint ?? DEFAULT_ENDPOINT;\n const url = joinBaseAndPath(baseURL, endpoint);\n try {\n const data = await fetchMeta('__forge__.summary', url);\n return data as SummaryResponse;\n } catch (e) {\n if (explicitLevels && explicitLevels.length > 0) {\n if (warnings) {\n console.warn(\n `[route-forge] summary endpoint unreachable: ${(e as Error).message}; using explicit levels`,\n );\n }\n return null;\n }\n throw new NetworkError(\n `Failed to fetch route summary from \"${url}\": ${(e as Error)?.message ?? String(e)}; ` +\n 'check the backend manifest endpoint or options.endpoint',\n undefined,\n undefined,\n e,\n );\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, warnings } = inputs;\n\n // 0. schemeVersion 向前兼容(DESIGN.md §6.3;拼写为 scheme 非 schema)\n const schemeVersion = summary.schemeVersion ?? 1;\n if (schemeVersion > 1 && warnings) {\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 && warnings) {\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 && warnings) {\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 / revalidate / invalidate / isLoaded\n * 以及缓存读取(findRouteMeta / getRoutes)与虚拟 unassigned 层级构建。\n *\n * 依赖通过构造参数注入:DiscoveryState 与自动发现错误均按引用 / getter\n * 实时读取,避免快照冻结自动发现回填结果;fetchMeta 为工厂提供的元信息传输通道;\n * onChange 在路由数据提交(load/revalidate 写入)或失效(invalidate)后广播变更层级。\n */\n\nimport { RouteCache } from './cache.js';\nimport { UnknownLevelError } from './errors.js';\nimport { buildUrl } from './url-builder.js';\nimport { joinBaseAndPath } from './url-utils.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 /** 路由数据提交(load/revalidate 写入)或失效(invalidate)后回调,携带变更层级 */\n onChange?: (level: string) => void;\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 private readonly onChange: ((level: string) => void) | undefined;\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 this.onChange = deps.onChange;\n }\n\n assertLevelDeclared(level: string): void {\n if (!this.state.levels.includes(level)) {\n throw new UnknownLevelError(level, this.state.levels);\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 ? 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 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 this.onChange?.(level);\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 /**\n * 强制刷新:跳过缓存命中短路重新拉取指定层级,成功后覆盖缓存、失败保留旧值。\n * 与 invalidate→load 的区别——全程不清空缓存,故读取旧数据不受影响、无空窗。\n */\n async revalidate(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.revalidateOne(l)));\n }\n\n private async revalidateOne(level: string): Promise<void> {\n const autoDiscoveryError = this.getAutoDiscoveryError();\n if (autoDiscoveryError) throw autoDiscoveryError;\n this.assertLevelDeclared(level);\n\n // 已有在途 load/revalidate → 直接搭车(它拉的就是最新数据),避免重复请求\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 // 强制拉取(revalidate 的语义即\"不看缓存命中\");失败时错误上抛、旧缓存原样保留\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 this.onChange?.(level);\n }\n } finally {\n this.inflight.delete(level);\n }\n })();\n this.inflight.set(level, p);\n return p;\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 for (const lvl of this.state.levels) this.onChange?.(lvl);\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 for (const lvl of level) this.onChange?.(lvl);\n } else {\n this.cache.del(level);\n this.inflight.delete(level);\n this.invalidationGens.set(level, (this.invalidationGens.get(level) ?? 0) + 1);\n this.onChange?.(level);\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 /**\n * 该层级当前已加载的路由名列表(不深拷贝,仅读键名)。\n * 供错误候选与 prefix 解析使用——避免为取名字而 getRoutes 深拷贝整表。\n * 层级未声明抛 UnknownLevelError(与 getRoutes/route 一致)。\n */\n routeNames(level: string): string[] {\n this.assertLevelDeclared(level);\n const entry = this.cache.get(level);\n return entry ? Object.keys(entry.routes) : [];\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 // 层级校验:未声明层级拼错时响亮报错(对齐 route()/loadOne() 口径),不与空层级混淆\n this.assertLevelDeclared(level);\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 // 深拷贝(structuredClone:快且保 undefined):避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n result[k] = structuredClone(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 // 深拷贝(structuredClone:快且保 undefined):避免嵌套对象(如 parameter_defaults)与内部缓存共享引用\n levelRoutes[k] = structuredClone(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 /** 该层级当前已加载的路由名列表(UnknownRouteError 附候选值用) */\n getRouteNames: (level: string) => string[];\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 getRouteNames,\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 // 完整 ResponseData 随错误逐段传递(响应拦截器 onRejected 链 → 最终 catch),\n // 供调用方检查响应体,如 Laravel 422 校验错误 err.response.data.errors\n response: resp,\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 // 若入参带外部 signal(params.signal),则与内部 controller 联合——任一触发即取消。\n let ctrl: AbortController | undefined;\n let abortedBeforeInit = false;\n let abortReason: unknown;\n const externalSignal = params.signal;\n\n const onExternalAbort = (): void => {\n if (ctrl) {\n ctrl.abort(externalSignal?.reason);\n } else {\n abortedBeforeInit = true;\n abortReason = externalSignal?.reason;\n }\n };\n // 外部 signal 已 abort → 直接置预中止态(work 起始即短路,不发请求);否则挂一次性监听\n if (externalSignal?.aborted) {\n abortedBeforeInit = true;\n abortReason = externalSignal.reason;\n } else {\n externalSignal?.addEventListener('abort', onExternalAbort, { once: true });\n }\n\n const work = (async (): Promise<unknown> => {\n try {\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, getRouteNames(level));\n }\n return await doApiCall(meta, params, ctrl.signal);\n } finally {\n // 请求落定后回收外部监听:长期存活的 signal 被多次复用也不泄漏\n externalSignal?.removeEventListener('abort', onExternalAbort);\n }\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 /** 可选:该层级当前已加载的路由名列表(UnknownRouteError 附候选值用) */\n getRouteNames?(level: string): string[];\n}\n\n/**\n * 剥掉 prefix 尾部的 separator(可能多个),避免拼接出 `a..b` 这类重复分隔符。\n * 例:prefix='api.manage.' + suffix='a' → 'api.manage.a' 而非 'api.manage..a'。\n */\nfunction stripTrailingSeparator(prefix: string, separator: string): string {\n let normalized = prefix;\n while (normalized.endsWith(separator)) {\n normalized = normalized.slice(0, -separator.length);\n }\n return normalized;\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 // 归一化前缀:尾部 separator 剥掉后再参与拼接与歧义判断\n const normalized = stripTrailingSeparator(prefix, separator);\n // 后缀为空 → 直接返回(归一化后的)前缀\n if (!suffix) return normalized;\n\n const joined = `${normalized}${separator}${suffix}`;\n\n // 后缀不以前缀开头 → 无歧义,直接拼接\n if (!suffix.startsWith(`${normalized}${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, forge.getRouteNames?.(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 const normalized = stripTrailingSeparator(prefix, separator);\n if (!suffix) return normalized;\n\n const joined = `${normalized}${separator}${suffix}`;\n if (!suffix.startsWith(`${normalized}${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, forge.getRouteNames?.(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/getRouteNames/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 /** 只读取某层级已加载路由名(不深拷贝),供 prefix 解析的候选匹配用 */\n getRouteNames: (level: string) => string[];\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, getRouteNames, invalidate, isLoaded, loadingTracker } = deps;\n\n // RouteResolver 接口实现(供 resolveRouteName/resolveRouteNameSync 使用)\n const resolver: RouteResolver = { load, hasRoute, getRouteNames };\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, normalizeInterceptorDeclaration } from './interceptors.js';\nimport { createAdapterBootstrap } from './adapter-bootstrap.js';\nimport { createReadyLatch } from './ready-latch.js';\nimport type { LoadingChangeCallback } from './loading.js';\nimport { LoadingTracker } from './loading.js';\nimport { RouteChangeTracker, type RouteChangeCallback } from './route-change.js';\nimport {\n DiscoveryNotReadyError,\n HTTPError,\n UnknownRouteError,\n} from './errors.js';\nimport { buildRouteUrl } from './url-builder.js';\nimport {\n applySummaryToState,\n DEFAULT_ENDPOINT,\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 // endpoint 省略时不再抛错:三者皆无则网络拉取回退到与后端约定的默认摘要端点(DEFAULT_ENDPOINT)。\n const bootstrapSummary = readEmbeddedSummary() ?? options.summary ?? null;\n\n const {\n adapter = 'auto',\n timeout = DEFAULT_TIMEOUT,\n baseURL = '',\n interceptors: declarativeInterceptors,\n cache: cacheOpts = {},\n } = options;\n // 非致命警告开关(默认 true):控制 core 的 console.warn;错误级(console.error)不受影响\n const warnings = options.warnings ?? true;\n\n // --- 加载中标识跟踪器(始终跟踪,用户不监听即可)---\n const loadingTracker = new LoadingTracker();\n\n // --- 路由数据变更跟踪器(load/revalidate 提交、invalidate 后广播层级变更,供框架层重算)---\n const routesTracker = new RouteChangeTracker();\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 ?? DEFAULT_ENDPOINT,\n urlPrefix: '',\n cacheTtl: undefined,\n levelRoutes: {},\n };\n const discoveryInputs: DiscoveryInputs = { explicitLevels, explicitEager, explicitEndpoint, warnings };\n\n // --- Auto-discovery 完成状态 + ready() 门闩(Promise/isReady/unhandled-rejection 细节见 ready-latch.ts)---\n let autoDiscoveryCompleted = false;\n const latch = createReadyLatch<RouteForge>();\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 // 声明式拦截器先注册(只描述一个拦截器:函数 / [resolve, reject] 元组 / { resolve, reject } 对象,SPEC §4.1.1)\n // 需要注册多个拦截器请改用运行时 forge.interceptors.request/response.use()\n const reqDecl = normalizeInterceptorDeclaration<RequestConfig, RequestConfig>(\n declarativeInterceptors?.request,\n );\n if (reqDecl.onFulfilled || reqDecl.onRejected) {\n requestInterceptors.use(reqDecl.onFulfilled, reqDecl.onRejected);\n }\n const resDecl = normalizeInterceptorDeclaration<ResponseData, unknown>(\n declarativeInterceptors?.response,\n );\n if (resDecl.onFulfilled || resDecl.onRejected) {\n responseInterceptors.use(resDecl.onFulfilled, resDecl.onRejected);\n }\n\n // --- Adapter 引导(auto 探测 / 显式指定 / 初始化失败响亮降级 builtin,见 adapter-bootstrap.ts)---\n const ensureAdapter = createAdapterBootstrap({\n adapter,\n requestInterceptors,\n responseInterceptors,\n warnings,\n });\n\n function assertDiscoveryReady(): void {\n if (!autoDiscoveryCompleted && !explicitLevels?.length) {\n throw new DiscoveryNotReadyError();\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 // message 带 URL:控制台看到 404/500 无需再猜是哪个端点(与业务路径 HTTPError 口径一致)\n throw new HTTPError(\n `Failed to fetch \"${routeTag}\" (${url}): HTTP ${resp?.status}`,\n { level, status: resp?.status, url, method: 'GET', response: resp ?? undefined },\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 onChange: (level) => routesTracker.notify(level),\n });\n const load = (level: string | string[]): Promise<void> => store.load(level);\n const revalidate = (level: string | string[]): Promise<void> => store.revalidate(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 // store.getRoutes 本身即按 level===undefined 分支,与工厂旧转发完全同形;bind 保留 this,\n // 再断言回 RouteForge['getRoutes'] 恢复重载调用签名(bind/箭头会把重载塌成单一签名)。\n const getRoutes = store.getRoutes.bind(store) as RouteForge['getRoutes'];\n\n function getLevels(): string[] {\n return [...discoveryState.levels];\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, store.routeNames(level));\n }\n return buildRouteUrl(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 getRouteNames: (lvl) => store.routeNames(lvl),\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 latch.resolve(forgeInstance);\n })\n .catch((e) => {\n // 自动发现失败(无可用降级)→ ready() reject 携带原始错误,不再永久挂起\n latch.reject(e);\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 getRouteNames: (lvl) => store.routeNames(lvl),\n invalidate,\n isLoaded,\n loadingTracker,\n });\n\n const forgeInstance = {\n api,\n load,\n revalidate,\n route,\n url: route,\n invalidate,\n isLoaded,\n hasRoute,\n getRoutes,\n getLevels,\n warnings,\n isLoading: () => loadingTracker.isLoading(),\n isReady: () => latch.isReady(),\n onLoadingChange: (cb: LoadingChangeCallback) => loadingTracker.subscribe(cb),\n onRoutesChange: (cb: RouteChangeCallback) => routesTracker.subscribe(cb),\n interceptors: {\n request: requestInterceptors,\n response: responseInterceptors,\n },\n ready: latch.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"]}
|