@route-forge/core 1.3.1 → 2.0.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.
@@ -1,2 +1,2 @@
1
- var RouteForge=(function(exports){'use strict';var Ee="route-forge:";function He(o){return o==="memory"||typeof globalThis>"u"?null:o==="sessionStorage"?globalThis.sessionStorage??null:o==="localStorage"?globalThis.localStorage??null:null}var Z=class{constructor(t){this.memory=new Map;this.storage=t.storage,this.fallbackTtl=t.ttl,this.backend=He(t.storage);}key(t){return `${Ee}${t}`}get(t){if(this.storage==="memory"||!this.backend)return this.getFromMemory(t);let n=this.backend.getItem(this.key(t));if(n)try{let r=JSON.parse(n);if(this.isExpired(r)){this.del(t);return}return r}catch{return}return this.getFromMemory(t)}getFromMemory(t){let n=this.memory.get(t);if(n){if(this.isExpired(n)){this.memory.delete(t);return}return n}}set(t){let n;t.cache!==void 0&&t.cache!==null?n=t.cache>0?Math.min(t.cache,this.fallbackTtl):t.cache:n=this.fallbackTtl;let r={level:t.level,routes:t.routes,ttl:n,cachedAt:Date.now()};if(this.storage==="memory"||!this.backend){this.memory.set(t.level,r);return}try{this.backend.setItem(this.key(t.level),JSON.stringify(r));}catch{this.memory.set(t.level,r);}}del(t){if(this.memory.delete(t),this.backend)try{this.backend.removeItem(this.key(t));}catch{}}clear(){if(this.memory.clear(),this.backend)try{let t=[];for(let n=0;n<this.backend.length;n++){let r=this.backend.key(n);r&&r.startsWith(Ee)&&t.push(r);}for(let n of t)this.backend.removeItem(n);}catch{}}isExpired(t){return t.ttl===null||t.ttl===0?false:Date.now()-t.cachedAt>t.ttl*1e3}};var v=class extends Error{constructor(t,n){super(t),this.name=this.constructor.name,this.code=n.code,n.route!==void 0&&(this.route=n.route),n.level!==void 0&&(this.level=n.level),n.context!==void 0&&(this.context=n.context),n.cause!==void 0&&(this.cause=n.cause);}},A=class extends v{constructor(t,n){super(`Route "${t}" not found${n?` in level "${n}"`:""}`,{code:"RF_FE_001",route:t,level:n});}},W=class extends v{constructor(t){super(`Level "${t}" not declared in options.levels`,{code:"RF_FE_002",level:t});}},K=class extends v{constructor(t,n){super(`Missing path parameter(s) ${n.join(", ")} for route "${t}"`,{code:"RF_FE_003",route:t,context:{missingParams:n}});}},j=class extends v{constructor(t){super(`Adapter "${t}" not available; install axios or use 'builtin'`,{code:"RF_FE_005",context:{adapter:t}});}},X=class extends v{constructor(t){super("Request interceptor must return a RequestConfig object",{code:"RF_FE_006",route:t});}},_=class extends v{constructor(t,n,r,l){super(t,{code:"RF_FE_007",route:n,level:r,cause:l});}},S=class extends v{constructor(t,n){super(t,{code:"RF_FE_008",route:n.route,level:n.level,context:{status:n.status,url:n.url,method:n.method},cause:n.cause});}},D=class extends v{constructor(t,n,r){super(`Request aborted${t?` for route "${t}"`:""}`,{code:"RF_FE_009",route:t,level:n,cause:r});}};var O=class{constructor(){this.handlers=[];this.nextId=0;}use(t,n){let r=this.nextId++;return this.handlers.push({id:r,onFulfilled:t,onRejected:n}),r}eject(t){let n=this.handlers.findIndex(r=>r.id===t);n>=0&&this.handlers.splice(n,1);}clear(){this.handlers=[];}forEach(t){for(let n of this.handlers)t(n);}get size(){return this.handlers.length}};async function ne(o,t){let n=[];o.forEach(l=>n.push(l)),n.reverse();let r=Promise.resolve(t);for(let l of n){let d=l.onFulfilled,m=l.onRejected;r=r.then(async f=>{if(!d)return f;let x=await d(f);if(x===null||typeof x!="object")throw new X;return x},f=>m?m(f):Promise.reject(f));}return r}async function re(o,t){let n=[];o.forEach(l=>n.push(l));let r=t;for(let l of n){let d=l.onFulfilled,m=l.onRejected;r=r.then(f=>d?d(f):f,f=>m?m(f):Promise.reject(f));}return r}function oe(){return new O}function Ne(o){return o===null?false:typeof FormData<"u"&&o instanceof FormData||typeof URLSearchParams<"u"&&o instanceof URLSearchParams||typeof Blob<"u"&&o instanceof Blob||typeof ArrayBuffer<"u"&&(o instanceof ArrayBuffer||ArrayBuffer.isView(o))||typeof ReadableStream<"u"&&o instanceof ReadableStream}function We(o){let t=o;return !!t&&t.name==="AbortError"}function Je(...o){let t=o.filter(r=>!!r);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal<"u"&&typeof AbortSignal.any=="function")return AbortSignal.any(t);let n=new AbortController;for(let r of t){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:true});}return n.signal}function le(o){let t=o?.request??oe(),n=o?.response??oe();async function r(R){let a=await ne(t,R),C=Je(a.signal,a.timeout&&a.timeout>0?AbortSignal.timeout(a.timeout):void 0),w=a.url;if(a.paramsSerializer&&a.params){let k=a.paramsSerializer(a.params);k&&(w=w.includes("?")?`${w}&${k}`:`${w}?${k}`);}let J=new Headers(a.headers),q={method:a.method,headers:J};C&&(q.signal=C),a.body!==void 0&&!["GET","HEAD"].includes(a.method.toUpperCase())&&(typeof a.body=="string"||Ne(a.body)?q.body=a.body:(q.body=JSON.stringify(a.body),J.has("Content-Type")||J.set("Content-Type","application/json")));let y;try{y=await fetch(w,q);}catch(k){throw We(k)?k:new _(k instanceof Error?k.message:String(k),a.route,a.level,k)}let L=await y.text(),M=L;if((y.headers.get("content-type")??"").includes("application/json"))try{M=JSON.parse(L);}catch{}let U={route:a.route,level:a.level,method:a.method,url:w,status:y.status,headers:y.headers,data:M,config:a},G=y.status>=200&&y.status<300?Promise.resolve(U):Promise.reject(new S(`HTTP ${y.status} for route "${a.route}" (${a.method} ${w})`,{route:a.route,level:a.level,status:y.status,url:w,method:a.method}));return re(n,G)}return {request:r,interceptors:{request:t,response:n},runsInterceptors:true,get:(R,a)=>r({...a,url:R,method:"GET"}),post:(R,a)=>r({...a,url:R,method:"POST"}),put:(R,a)=>r({...a,url:R,method:"PUT"}),patch:(R,a)=>r({...a,url:R,method:"PATCH"}),delete:(R,a)=>r({...a,url:R,method:"DELETE"})}}function qe(o){if(!o)return new Headers;let t=typeof o.toJSON=="function"?o.toJSON():o;try{return new Headers(t)}catch{return new Headers}}async function fe(){let o,t="axios";try{let r=await import(t);o=r.default??r;}catch{typeof globalThis<"u"&&globalThis.axios&&(o=globalThis.axios);}if(!o||typeof o.request!="function")return null;async function n(r){let l={...r.headers};try{let d=await o.request({url:r.url,method:r.method,headers:l,data:r.body,timeout:r.timeout,signal:r.signal});return {route:r.route,level:r.level,method:r.method,url:r.url,status:d.status,headers:qe(d.headers),data:d.data,config:r}}catch(d){if(d&&d.response){let m=d.response;return {route:r.route,level:r.level,method:r.method,url:r.url,status:m.status,headers:qe(m.headers),data:m.data,config:r}}throw d}}return {request:n,interceptors:void 0}}async function ge(o){let{adapter:t}=o;if(t&&typeof t=="object")return {request:r=>t.request(r),interceptors:t.interceptors};if(t==="builtin")return le(o.forgeInterceptors);if(t==="axios"){let r=await fe();if(!r)throw new j("axios");return r}let n=await fe().catch(()=>null);return n||le(o.forgeInterceptors)}async function pe(o,t,n,r,l="."){if(!r)return n;let d=`${n}${l}${r}`;if(!r.startsWith(`${n}${l}`)||(await o.load(t),o.hasRoute(t,d)))return d;if(o.hasRoute(t,r))return r;throw new A(d,t)}function se(o,t,n,r,l="."){if(!r)return n;let d=`${n}${l}${r}`;if(!r.startsWith(`${n}${l}`)||o.hasRoute(t,d))return d;if(o.hasRoute(t,r))return r;throw new A(d,t)}function Ae(o,t){for(let n of Object.keys(t)){let r=t[n];Object.defineProperty(o,n,{value:r!==null&&typeof r=="object"?Object.freeze(r):r,writable:false,enumerable:false,configurable:false});}return o}var Y=class{constructor(){this.count=0;this.subscribers=new Set;}start(){this.count++,this.notify();}stop(){this.count=Math.max(0,this.count-1),this.notify();}isLoading(){return this.count>0}getCount(){return this.count}subscribe(t){return this.subscribers.add(t),()=>{this.subscribers.delete(t);}}notify(){let t={loading:this.count>0,count:this.count};for(let n of this.subscribers)try{n(t);}catch{}}};var Ge=3e4,ze=3600,ee="unassigned";function Ve(o){if(!o.endpoint)throw new TypeError("options.endpoint is required");let {adapter:t="auto",timeout:n=Ge,baseURL:r="",interceptors:l,cache:d={}}=o,m=new Y,f=o.levels,x=o.eager,R=o.strict??false,a=o.endpoint,C=f??[],w=x??[],q=a,y="",L,M=false,U=(async()=>{try{let e=a,s=await fetch(e,{method:"GET"});return s.ok?await s.json():(console.warn(`[route-forge] summary endpoint ${e} unreachable (HTTP ${s.status}); falling back to explicit options`),null)}catch(e){if(f&&f.length>0)return console.warn(`[route-forge] summary endpoint unreachable: ${e.message}; using explicit levels`),null;throw new W("(auto-discovery)")}})().then(e=>{if(e===null)return;let s=e.schemaVersion??1;s>1&&console.warn(`[route-forge] backend schemaVersion=${s} > client supported 1; some features may be unavailable`),e.config.endpoint_prefix&&e.config.endpoint_prefix!==a&&(console.warn(`[route-forge] backend endpoint_prefix "${e.config.endpoint_prefix}" overrides frontend endpoint "${a}"`),q=e.config.endpoint_prefix),e.config.url_prefix&&(y=e.config.url_prefix.endsWith("/")?e.config.url_prefix.slice(0,-1):e.config.url_prefix),e.config.strict_mode&&!R&&(console.warn("[route-forge] backend strict_mode=true overrides frontend strict=false; forcing strict=true"),true);let u=Object.keys(e.levels);M=u.includes(ee),Array.isArray(e.unassigned)&&e.unassigned.length>0&&!M&&(L=e.unassigned);let i=u.slice();if(L&&!M&&i.push(ee),f&&f.length>0){let c=f.filter(P=>i.includes(P)),p=f.filter(P=>!i.includes(P));p.length>0&&console.warn(`[route-forge] levels not in backend summary and dropped: ${p.join(", ")}`),C=c;}else C=i;let g=u.filter(c=>e.levels[c]?.load==="eager");x?w=[...new Set([...g,...x])]:w=g;}),G=null;U.catch(e=>{G=e;});let k=false,he,me=new Promise(e=>{he=e;}),Te=d.ttl??ze,$e=d.storage??"memory",E=new Z({storage:$e,ttl:Te}),z=new O,V=new O;if(l?.request)for(let e of l.request)if(typeof e=="function")z.use(e);else {let[s,u]=e;z.use(s,u);}if(l?.response)for(let e of l.response)if(typeof e=="function")V.use(e);else {let[s,u]=e;V.use(s,u);}let Se=ge({adapter:t,forgeInterceptors:{request:z,response:V}}),Re=false,ye=null;async function be(){return Re||(ye=await Se.catch(e=>{if(e instanceof j)throw e;return ge({adapter:"builtin"})}),Re=true),ye}let B=new Map,I=new Map;function Le(e){if(!C.includes(e))throw new W(e)}function we(){if(!k&&!f?.length)throw new v("Route data not available. Auto-discovery has not completed. Use forge.ready() or forge.use(level) first.",{code:"RF_FE_010"})}function ie(e){let s=r.endsWith("/")?r.slice(0,-1):r,u=q.startsWith("/")?q:`/${q}`;return `${s}${u}/${encodeURIComponent(e)}`}async function Me(e){let s=await be(),u={route:`__forge__.load.${e}`,level:e,method:"GET",url:ie(e),headers:{Accept:"application/json"},params:{},timeout:n,meta:{name:`__forge__.load.${e}`,uri:ie(e),methods:["GET"],parameters:[],level:e}},i=await s.request(u);if(!i||i.status<200||i.status>=300)throw new S(`Failed to load level "${e}": HTTP ${i?.status}`,{level:e,status:i?.status,url:ie(e),method:"GET"});return i.data}async function je(e){if(G)throw G;if(Le(e),E.get(e))return;let s=B.get(e);if(s)return s;let u=I.get(e)??0,i=(async()=>{try{if(e===ee&&!M&&L){let c={};for(let p of L)c[p.name]={...p,level:ee};E.set({level:ee,routes:c,cache:null});return}let g=await Me(e);(I.get(e)??0)===u&&E.set(g);}finally{B.delete(e);}})();return B.set(e,i),i}async function H(e){await U;let s=Array.isArray(e)?e:[e];await Promise.all(s.map(je));}function N(e,s,u){we();let i=ae(e,s);if(!i)throw new A(s,e);return ve(i,u??{})}function ve(e,s){let u=e.parameter_defaults??{},i=[],g={};for(let b of e.parameters){let F=s[b];F==null&&b in u&&(F=u[b]),F==null?e.uri.includes(`{${b}?}`)||i.push(b):g[b]=F;}if(i.length>0)throw new K(e.name,i);let c=e.uri.replace(/\{([^{}]+)\}/g,(b,F)=>{let Q=F.endsWith("?"),T=Q?F.slice(0,-1):F;if(g[T]!==void 0){let $=g[T];if(typeof $=="object")throw new v(`Path parameter "${T}" must be a primitive value (string, number, boolean), got ${typeof $}`,{code:"RF_FE_003",route:e.name,context:{param:T,value:$}});return encodeURIComponent(String($))}return Q?"":b});if(c=c.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(y)){let b=y.endsWith("/")?y.slice(0,-1):y;return c.startsWith("/")?`${b}${c}`:`${b}/${c}`}let p=r.endsWith("/")?r.slice(0,-1):r,P=y;return c.startsWith("/")?`${p}${P}${c}`:`${p}${P}/${c}`}function ae(e,s){let i=E.get(e)?.routes[s];if(i)return {...i,level:e}}function ue(e,s,u={}){let i,g=false,c,P=(async()=>{i=new AbortController,g&&i.abort(c),await U,await H(e);let b=ae(e,s);if(!b)throw new A(s,e);return _e(b,u,i.signal)})();return P.abort=()=>{i?i.abort():g=true;},P}async function _e(e,s,u){let{pathParams:i,query:g,body:c,headers:p,timeout:P}=Ke(s);if(u?.aborted)throw new D(e.name,e.level,u.reason);let b=Qe(e),F=Ze(ve(e,i),g),Q={route:e.name,level:e.level??"",method:b,url:F,headers:{Accept:"application/json",...p??{}},body:c,params:i,timeout:P??n,signal:u,meta:e},T=await be(),$=T.runsInterceptors?Q:await ne(z,Q);if($.signal?.aborted)throw new D(e.name,e.level,$.signal.reason);m.start();try{let xe=T.request($).then(h=>{if(h.status<200||h.status>=300)throw new S(`HTTP ${h.status} for route "${h.route}" (${h.method} ${h.url})`,{route:h.route,level:h.level,status:h.status,url:h.url,method:h.method});return h},h=>{throw h instanceof v?h:Xe(h,u)?new D(e.name,e.level,h):new _(h instanceof Error?h.message:String(h),e.name,e.level,h)});return T.runsInterceptors?await xe:await re(V,xe)}finally{m.stop();}}function Ce(e){if(e===void 0){E.clear(),B.clear();for(let s of C)I.set(s,(I.get(s)??0)+1);}else if(Array.isArray(e))for(let s of e)E.del(s),B.delete(s),I.set(s,(I.get(s)??0)+1);else E.del(e),B.delete(e),I.set(e,(I.get(e)??0)+1);}function ke(e){return e?E.get(e)!==void 0:C.length>0&&C.every(s=>E.get(s)!==void 0)}function ce(e,s){return we(),ae(e,s)!==void 0}function Pe(e){if(e!==void 0){let i=E.get(e)?.routes??{},g={};for(let[c,p]of Object.entries(i))g[c]=JSON.parse(JSON.stringify(p));return g}let s={};for(let u of C){let i=E.get(u);if(i){let g={};for(let[c,p]of Object.entries(i.routes))g[c]=JSON.parse(JSON.stringify(p));s[u]=g;}}return s}U.then(()=>{if(k=true,o.onSummaryReady?.(),w.length>0)return Promise.all(w.map(e=>H(e))).catch(e=>{console.warn(`[route-forge] eager load failed: ${e.message}`);})}).then(()=>{he(te);}).catch(()=>{});function De(e,s){return e?me.then(e,s).then(()=>te):me}let de={load:H,hasRoute:ce};function Oe(e,s){let u=H(e).catch(()=>{}),i=s?(c,p)=>pe(de,e,s,c).then(P=>ue(e,P,p)):(c,p)=>ue(e,c,p),g=i;return Ae(g,{level:e,...s!==void 0?{prefix:s}:{},api:i,route:s?(c,p)=>N(e,se(de,e,s,c),p):(c,p)=>N(e,c,p),url:s?(c,p)=>N(e,se(de,e,s,c),p):(c,p)=>N(e,c,p),hasRoute:c=>ce(e,c),getRoutes:()=>Pe(e),load:()=>H(e),invalidate:()=>Ce(e),isLoaded:()=>ke(e),isLoading:()=>m.isLoading(),onLoadingChange:c=>m.subscribe(c)}),Object.defineProperty(g,"levelLoaded",{value:u,writable:false,enumerable:true,configurable:true}),g}function Ue(e,s,u,i){let g=s.then(()=>e);return u?g.then(u,i).then(()=>e):g}function Be(e,s,u){Object.defineProperty(e,"onLevelLoaded",{value:(i,g)=>Ue(e,s,i,g),writable:false,enumerable:false,configurable:false}),Object.defineProperty(e,"useRoutePrefix",{value:i=>Fe(u,i),writable:false,enumerable:false,configurable:false});}function Fe(e,s){let u=Oe(e,s),i=u.levelLoaded;return Be(u,i,e),u}let te={api:ue,load:H,route:N,url:N,invalidate:Ce,isLoaded:ke,hasRoute:ce,getRoutes:Pe,isLoading:()=>m.isLoading(),onLoadingChange:e=>m.subscribe(e),interceptors:{request:z,response:V},ready:De,use(e,s){return e===void 0?te:Fe(e,s)}};return te}function Qe(o){return (o.methods.find(n=>n.toUpperCase()!=="HEAD")??o.methods[0]??"GET").toUpperCase()}function Ze(o,t){if(!t)return o;let n=new URLSearchParams;for(let[l,d]of Object.entries(t))d!=null&&n.append(l,String(d));let r=n.toString();return r?o.includes("?")?`${o}&${r}`:`${o}?${r}`:o}function Ke(o){let{params:t,query:n,body:r,headers:l,timeout:d,...m}=o,f=t?{...t}:{};for(let[C,w]of Object.entries(m))C in f||(f[C]=w);let x,R,a;return n!==void 0&&(typeof n=="object"&&n!==null?x=n:"query"in f||(f.query=n)),r!==void 0&&(typeof r!="string"&&typeof r!="number"?R=r:"body"in f||(f.body=r)),l!==void 0&&(typeof l=="object"&&l!==null?a=l:"headers"in f||(f.headers=l)),{pathParams:f,query:x,body:R,headers:a,timeout:d}}function Xe(o,t){if(t?.aborted)return true;let n=o;return n?n.name==="AbortError"||n.code==="ERR_CANCELED":false}
2
- exports.AdapterNotFoundError=j;exports.ForgeError=v;exports.HTTPError=S;exports.InterceptorManagerImpl=O;exports.InvalidInterceptorReturnError=X;exports.LoadingTracker=Y;exports.MissingRouteParamError=K;exports.NetworkError=_;exports.RequestAbortedError=D;exports.RouteCache=Z;exports.UnknownLevelError=W;exports.UnknownRouteError=A;exports.createInterceptorManager=oe;exports.createRouteForge=Ve;exports.resolveRouteName=pe;exports.resolveRouteNameSync=se;return exports;})({});
1
+ var RouteForge=(function(exports){'use strict';var X="route-forge:";function Ge(r){return r==="memory"||typeof globalThis>"u"?null:r==="sessionStorage"?globalThis.sessionStorage??null:r==="localStorage"?globalThis.localStorage??null:null}var N=class{constructor(t){this.memory=new Map;this.onStorageEvent=t=>{t.key&&t.key.startsWith(X)&&this.memory.delete(t.key.slice(X.length));};this.storage=t.storage,this.fallbackTtl=t.ttl,this.backend=Ge(t.storage),this.backend&&typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("storage",this.onStorageEvent);}key(t){return `${X}${t}`}get(t){if(this.storage==="memory"||!this.backend)return this.getFromMemory(t);let n=this.getFromMemory(t);if(n)return n;let o=this.backend.getItem(this.key(t));if(o)try{let i=JSON.parse(o);if(this.isExpired(i)){this.del(t);return}return this.memory.set(t,i),i}catch{return}}getFromMemory(t){let n=this.memory.get(t);if(n){if(this.isExpired(n)){this.memory.delete(t);return}return n}}set(t){let n;t.cache!==void 0&&t.cache!==null?n=t.cache>0?Math.min(t.cache,this.fallbackTtl):t.cache:n=this.fallbackTtl;let o={level:t.level,routes:t.routes,ttl:n,cachedAt:Date.now()};if(this.memory.set(t.level,o),!(this.storage==="memory"||!this.backend))try{this.backend.setItem(this.key(t.level),JSON.stringify(o));}catch{}}del(t){if(this.memory.delete(t),this.backend)try{this.backend.removeItem(this.key(t));}catch{}}clear(){if(this.memory.clear(),this.backend)try{let t=[];for(let n=0;n<this.backend.length;n++){let o=this.backend.key(n);o&&o.startsWith(X)&&t.push(o);}for(let n of t)this.backend.removeItem(n);}catch{}}isExpired(t){return t.ttl===null||t.ttl===0?false:Date.now()-t.cachedAt>t.ttl*1e3}};var b=class extends Error{constructor(t,n){super(t),this.name=this.constructor.name,this.code=n.code,n.route!==void 0&&(this.route=n.route),n.level!==void 0&&(this.level=n.level),n.context!==void 0&&(this.context=n.context),n.cause!==void 0&&(this.cause=n.cause);}},P=class extends b{constructor(t,n){super(`Route "${t}" not found${n?` in level "${n}"`:""}`,{code:"RF_FE_001",route:t,level:n});}},B=class extends b{constructor(t){super(`Level "${t}" not declared in options.levels`,{code:"RF_FE_002",level:t});}},W=class extends b{constructor(t,n){super(`Missing path parameter(s) ${n.join(", ")} for route "${t}"`,{code:"RF_FE_003",route:t,context:{missingParams:n}});}},T=class extends b{constructor(t){super(`Adapter "${t}" not available; install axios or use 'builtin'`,{code:"RF_FE_005",context:{adapter:t}});}},J=class extends b{constructor(t){super("Request interceptor must return a RequestConfig object",{code:"RF_FE_006",route:t});}},S=class extends b{constructor(t,n,o,i){super(t,{code:"RF_FE_007",route:n,level:o,cause:i});}},I=class extends b{constructor(t,n){super(t,{code:"RF_FE_008",route:n.route,level:n.level,context:{status:n.status,url:n.url,method:n.method},cause:n.cause});}},$=class extends b{constructor(t,n,o){super(`Request aborted${t?` for route "${t}"`:""}`,{code:"RF_FE_009",route:t,level:n,cause:o});}};var _=class{constructor(){this.handlers=[];this.nextId=0;}use(t,n){let o=this.nextId++;return this.handlers.push({id:o,onFulfilled:t,onRejected:n}),o}eject(t){let n=this.handlers.findIndex(o=>o.id===t);n>=0&&this.handlers.splice(n,1);}clear(){this.handlers=[];}forEach(t){for(let n of this.handlers)t(n);}get size(){return this.handlers.length}};async function Y(r,t){let n=[];r.forEach(i=>n.push(i)),n.reverse();let o=Promise.resolve(t);for(let i of n){let c=i.onFulfilled,h=i.onRejected;o=o.then(async l=>{if(!c)return l;let v=await c(l);if(v===null||typeof v!="object")throw new J;return v},l=>h?h(l):Promise.reject(l));}return o}async function ee(r,t){let n=[];r.forEach(i=>n.push(i));let o=t;for(let i of n){let c=i.onFulfilled,h=i.onRejected;o=o.then(l=>c?c(l):l,l=>h?h(l):Promise.reject(l));}return o}function te(){return new _}function de(r,t){if(t?.aborted)return true;let n=r;return n?n.name==="AbortError"||n.code==="ERR_CANCELED":false}function ze(...r){let t=r.filter(o=>!!o);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal<"u"&&typeof AbortSignal.any=="function")return AbortSignal.any(t);let n=new AbortController;for(let o of t){if(o.aborted)return n.abort(o.reason),n.signal;o.addEventListener("abort",()=>n.abort(o.reason),{once:true});}return n.signal}function Ve(r){return r===null?false:typeof FormData<"u"&&r instanceof FormData||typeof URLSearchParams<"u"&&r instanceof URLSearchParams||typeof Blob<"u"&&r instanceof Blob||typeof ArrayBuffer<"u"&&(r instanceof ArrayBuffer||ArrayBuffer.isView(r))||typeof ReadableStream<"u"&&r instanceof ReadableStream}async function Ie(r){let t=ze(r.signal,r.timeout&&r.timeout>0?AbortSignal.timeout(r.timeout):void 0),n=r.url;if(r.paramsSerializer&&r.params){let g=r.paramsSerializer(r.params);g&&(n=n.includes("?")?`${n}&${g}`:`${n}?${g}`);}let o=new Headers(r.headers),i={method:r.method,headers:o};t&&(i.signal=t),r.body!==void 0&&!["GET","HEAD"].includes(r.method.toUpperCase())&&(typeof r.body=="string"||Ve(r.body)?i.body=r.body:(i.body=JSON.stringify(r.body),o.has("Content-Type")||o.set("Content-Type","application/json")));let c;try{c=await fetch(n,i);}catch(g){throw de(g)?g:new S(g instanceof Error?g.message:String(g),r.route,r.level,g)}let h=await c.text(),l=h;if((c.headers.get("content-type")??"").includes("application/json"))try{l=JSON.parse(h);}catch{}let C={route:r.route,level:r.level,method:r.method,url:n,status:c.status,headers:c.headers,data:l,config:r};if(c.status>=200&&c.status<300)return C;throw new I(`HTTP ${c.status} for route "${r.route}" (${r.method} ${n})`,{route:r.route,level:r.level,status:c.status,url:n,method:r.method})}function le(r){let t=r?.request??te(),n=r?.response??te(),o=Ie;async function i(g){let R=await Y(t,g),E=Promise.resolve(R).then(o);return ee(n,E)}return {request:i,requestRaw:o,interceptors:{request:t,response:n},runsInterceptors:true,get:(g,R)=>i({...R,url:g,method:"GET"}),post:(g,R)=>i({...R,url:g,method:"POST"}),put:(g,R)=>i({...R,url:g,method:"PUT"}),patch:(g,R)=>i({...R,url:g,method:"PATCH"}),delete:(g,R)=>i({...R,url:g,method:"DELETE"})}}function Te(r){if(!r)return new Headers;let t=typeof r.toJSON=="function"?r.toJSON():r;try{return new Headers(t)}catch{return new Headers}}async function fe(){let r,t="axios";try{let o=await import(t);r=o.default??o;}catch{typeof globalThis<"u"&&globalThis.axios&&(r=globalThis.axios);}if(!r||typeof r.request!="function")return null;async function n(o){let i={...o.headers};try{let c=await r.request({url:o.url,method:o.method,headers:i,data:o.body,timeout:o.timeout,signal:o.signal});return {route:o.route,level:o.level,method:o.method,url:o.url,status:c.status,headers:Te(c.headers),data:c.data,config:o}}catch(c){if(c&&c.response){let h=c.response;return {route:o.route,level:o.level,method:o.method,url:o.url,status:h.status,headers:Te(h.headers),data:h.data,config:o}}throw c}}return {request:n,interceptors:void 0}}async function ge(r){let{adapter:t}=r;if(t&&typeof t=="object")return {request:o=>t.request(o),interceptors:t.interceptors};if(t==="builtin")return le(r.forgeInterceptors);if(t==="axios"){let o=await fe();if(!o)throw new T("axios");return o}let n=await fe().catch(()=>null);return n||le(r.forgeInterceptors)}async function pe(r,t,n,o,i="."){if(!o)return n;let c=`${n}${i}${o}`;if(!o.startsWith(`${n}${i}`)||(await r.load(t),r.hasRoute(t,c)))return c;if(r.hasRoute(t,o))return o;throw new P(c,t)}function ne(r,t,n,o,i="."){if(!o)return n;let c=`${n}${i}${o}`;if(!o.startsWith(`${n}${i}`)||r.hasRoute(t,c))return c;if(r.hasRoute(t,o))return o;throw new P(c,t)}function Se(r,t){for(let n of Object.keys(t)){let o=t[n];Object.defineProperty(r,n,{value:o!==null&&typeof o=="object"?Object.freeze(o):o,writable:false,enumerable:false,configurable:false});}return r}var G=class{constructor(){this.count=0;this.subscribers=new Set;}start(){this.count++,this.notify();}stop(){this.count=Math.max(0,this.count-1),this.notify();}isLoading(){return this.count>0}getCount(){return this.count}subscribe(t){return this.subscribers.add(t),()=>{this.subscribers.delete(t);}}notify(){let t={loading:this.count>0,count:this.count};for(let n of this.subscribers)try{n(t);}catch{}}};var Qe=3e4,Ze=3600,z="unassigned";function Ke(r){if(!r.endpoint)throw new TypeError("options.endpoint is required");let{adapter:t="auto",timeout:n=Qe,baseURL:o="",interceptors:i,cache:c={}}=r,h=new G,l=r.levels,v=r.eager,C=r.endpoint,g=l??[],R=v??[],E=C,L="",V,Q=false,$e=async()=>{try{let e=o.endsWith("/")?o.slice(0,-1):o,s=C.startsWith("/")?C:`/${C}`;return await Fe("__forge__.summary",`${e}${s}`)}catch(e){if(l&&l.length>0)return console.warn(`[route-forge] summary endpoint unreachable: ${e.message}; using explicit levels`),null;throw new B("(auto-discovery)")}},re,he=[],Z=(re??new Promise(e=>he.push(e))).then(e=>{if(e===null)return;let s=e.schemaVersion??1;s>1&&console.warn(`[route-forge] backend schemaVersion=${s} > client supported 1; some features may be unavailable`),e.config.endpoint_prefix&&e.config.endpoint_prefix!==C&&(console.warn(`[route-forge] backend endpoint_prefix "${e.config.endpoint_prefix}" overrides frontend endpoint "${C}"`),E=e.config.endpoint_prefix),e.config.url_prefix&&(L=e.config.url_prefix.endsWith("/")?e.config.url_prefix.slice(0,-1):e.config.url_prefix);let a=Object.keys(e.levels);Q=a.includes(z),Array.isArray(e.unassigned)&&e.unassigned.length>0&&!Q&&(V=e.unassigned);let u=a.slice();if(V&&!Q&&u.push(z),l&&l.length>0){let d=l.filter(w=>u.includes(w)),f=l.filter(w=>!u.includes(w));f.length>0&&console.warn(`[route-forge] levels not in backend summary and dropped: ${f.join(", ")}`),g=d;}else g=u;let p=a.filter(d=>e.levels[d]?.load==="eager");v?R=[...new Set([...p,...v])]:R=p;}),oe=null;Z.catch(e=>{oe=e;});let me=false,Re,ye,se=new Promise((e,s)=>{Re=e,ye=s;});se.catch(()=>{});let _e=c.ttl??Ze,Le=c.storage??"memory",k=new N({storage:Le,ttl:_e}),M=new _,j=new _;if(i?.request)for(let e of i.request)if(typeof e=="function")M.use(e);else {let[s,a]=e;M.use(s,a);}if(i?.response)for(let e of i.response)if(typeof e=="function")j.use(e);else {let[s,a]=e;j.use(s,a);}let Me=ge({adapter:t,forgeInterceptors:{request:M,response:j}});Promise.resolve().then(()=>{re=$e();for(let e of he)e(re);});let be=false,we=null;async function ve(){return be||(we=await Me.catch(e=>{if(e instanceof T)throw e;return ge({adapter:"builtin",forgeInterceptors:{request:M,response:j}})}),be=true),we}let D=new Map,q=new Map;function je(e){if(!g.includes(e))throw new B(e)}function Ce(){if(!me&&!l?.length)throw new b("Route data not available. Auto-discovery has not completed. Use forge.ready() or forge.use(level) first.",{code:"RF_FE_010"})}function De(e){let s=o.endsWith("/")?o.slice(0,-1):o,a=E.startsWith("/")?E:`/${E}`;return `${s}${a}/${encodeURIComponent(e)}`}async function Fe(e,s,a=""){let u=await ve(),p={route:e,level:a,method:"GET",url:s,headers:{Accept:"application/json"},params:{},timeout:n,meta:{name:e,uri:s,methods:["GET"],parameters:[],level:a}},f=await(u.requestRaw??u.request)(p);if(!f||f.status<200||f.status>=300)throw new I(`Failed to fetch "${e}": HTTP ${f?.status}`,{level:a,status:f?.status,url:s,method:"GET"});return f.data}async function Oe(e){return await Fe(`__forge__.load.${e}`,De(e),e)}async function Ue(e){if(oe)throw oe;if(je(e),k.get(e))return;let s=D.get(e);if(s)return s;let a=q.get(e)??0,u=(async()=>{try{if(e===z&&!Q&&V){let d={};for(let f of V)d[f.name]={...f,level:z};k.set({level:z,routes:d,cache:null});return}let p=await Oe(e);(q.get(e)??0)===a&&k.set(p);}finally{D.delete(e);}})();return D.set(e,u),u}async function O(e){await Z;let s=Array.isArray(e)?e:[e];await Promise.all(s.map(Ue));}function U(e,s,a){Ce();let u=ie(e,s);if(!u)throw new P(s,e);return ke(u,a??{})}function ke(e,s){let a=e.parameter_defaults??{},u=[],p={};for(let y of e.parameters){let F=s[y];F==null&&y in a&&(F=a[y]),F==null?e.uri.includes(`{${y}?}`)||u.push(y):p[y]=F;}if(u.length>0)throw new W(e.name,u);let d=e.uri.replace(/\{([^{}]+)\}/g,(y,F)=>{let H=F.endsWith("?"),x=H?F.slice(0,-1):F;if(p[x]!==void 0){let A=p[x];if(typeof A=="object")throw new b(`Path parameter "${x}" must be a primitive value (string, number, boolean), got ${typeof A}`,{code:"RF_FE_003",route:e.name,context:{param:x,value:A}});return encodeURIComponent(String(A))}return H?"":y});if(d=d.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(L)){let y=L.endsWith("/")?L.slice(0,-1):L;return d.startsWith("/")?`${y}${d}`:`${y}/${d}`}let f=o.endsWith("/")?o.slice(0,-1):o,w=L;return d.startsWith("/")?`${f}${w}${d}`:`${f}${w}/${d}`}function ie(e,s){let u=k.get(e)?.routes[s];if(u)return {...u,level:e}}function ae(e,s,a={}){let u,p=false,d,w=(async()=>{u=new AbortController,p&&u.abort(d),await Z,await O(e);let y=ie(e,s);if(!y)throw new P(s,e);return Be(y,a,u.signal)})();return w.abort=()=>{u?u.abort():p=true;},w}async function Be(e,s,a){let{pathParams:u,query:p,body:d,headers:f,timeout:w}=et(s);if(a?.aborted)throw new $(e.name,e.level,a.reason);let y=Xe(e),F=Ye(ke(e,u),p),H={route:e.name,level:e.level??"",method:y,url:F,headers:{Accept:"application/json",...f??{}},body:d,params:u,timeout:w??n,signal:a,meta:e},x=await ve(),A=x.runsInterceptors?H:await Y(M,H);if(A.signal?.aborted)throw new $(e.name,e.level,A.signal.reason);h.start();try{let Ae=x.request(A).then(m=>{if(m.status<200||m.status>=300)throw new I(`HTTP ${m.status} for route "${m.route}" (${m.method} ${m.url})`,{route:m.route,level:m.level,status:m.status,url:m.url,method:m.method});return m},m=>{throw m instanceof b?m:de(m,a)?new $(e.name,e.level,m):new S(m instanceof Error?m.message:String(m),e.name,e.level,m)});return x.runsInterceptors?await Ae:await ee(j,Ae)}finally{h.stop();}}function Pe(e){if(e===void 0){k.clear(),D.clear();for(let s of g)q.set(s,(q.get(s)??0)+1);}else if(Array.isArray(e))for(let s of e)k.del(s),D.delete(s),q.set(s,(q.get(s)??0)+1);else k.del(e),D.delete(e),q.set(e,(q.get(e)??0)+1);}function Ee(e){return e?k.get(e)!==void 0:g.length>0&&g.every(s=>k.get(s)!==void 0)}function ue(e,s){return Ce(),ie(e,s)!==void 0}function qe(e){if(e!==void 0){let u=k.get(e)?.routes??{},p={};for(let[d,f]of Object.entries(u))p[d]=JSON.parse(JSON.stringify(f));return p}let s={};for(let a of g){let u=k.get(a);if(u){let p={};for(let[d,f]of Object.entries(u.routes))p[d]=JSON.parse(JSON.stringify(f));s[a]=p;}}return s}Z.then(()=>{if(me=true,R.length>0)return Promise.allSettled(R.map(e=>O(e))).then(e=>{e.forEach((s,a)=>{s.status==="rejected"&&console.error(`[route-forge] eager load failed for level "${R[a]}":`,s.reason);});})}).then(()=>{Re(K);}).catch(e=>{ye(e);});function He(e,s){return e?se.then(e,s).then(()=>K):se}let ce={load:O,hasRoute:ue};function Ne(e,s){let a=O(e);a.catch(()=>{});let u=s?(d,f)=>pe(ce,e,s,d).then(w=>ae(e,w,f)):(d,f)=>ae(e,d,f),p=u;return Se(p,{level:e,...s!==void 0?{prefix:s}:{},api:u,route:s?(d,f)=>U(e,ne(ce,e,s,d),f):(d,f)=>U(e,d,f),url:s?(d,f)=>U(e,ne(ce,e,s,d),f):(d,f)=>U(e,d,f),hasRoute:d=>ue(e,d),getRoutes:()=>qe(e),load:()=>O(e),invalidate:()=>Pe(e),isLoaded:()=>Ee(e),isLoading:()=>h.isLoading(),onLoadingChange:d=>h.subscribe(d)}),Object.defineProperty(p,"levelLoaded",{value:a,writable:false,enumerable:true,configurable:true}),p}function We(e,s,a,u){let p=s.then(()=>e);return a?p.then(a,u).then(()=>e):p}function Je(e,s,a){Object.defineProperty(e,"onLevelLoaded",{value:(u,p)=>We(e,s,u,p),writable:false,enumerable:false,configurable:false}),Object.defineProperty(e,"useRoutePrefix",{value:u=>xe(a,u),writable:false,enumerable:false,configurable:false});}function xe(e,s){let a=Ne(e,s),u=a.levelLoaded;return Je(a,u,e),a}let K={api:ae,load:O,route:U,url:U,invalidate:Pe,isLoaded:Ee,hasRoute:ue,getRoutes:qe,isLoading:()=>h.isLoading(),onLoadingChange:e=>h.subscribe(e),interceptors:{request:M,response:j},ready:He,use(e,s){return e===void 0?K:xe(e,s)}};return K}function Xe(r){return (r.methods.find(n=>n.toUpperCase()!=="HEAD")??r.methods[0]??"GET").toUpperCase()}function Ye(r,t){if(!t)return r;let n=new URLSearchParams;for(let[i,c]of Object.entries(t))c!=null&&n.append(i,String(c));let o=n.toString();return o?r.includes("?")?`${r}&${o}`:`${r}?${o}`:r}function et(r){let{params:t,query:n,body:o,headers:i,timeout:c,...h}=r,l=t?{...t}:{};for(let[R,E]of Object.entries(h))R in l||(l[R]=E);let v,C,g;return n!==void 0&&(typeof n=="object"&&n!==null?v=n:"query"in l||(l.query=n)),o!==void 0&&(typeof o!="string"&&typeof o!="number"?C=o:"body"in l||(l.body=o)),i!==void 0&&(typeof i=="object"&&i!==null?g=i:"headers"in l||(l.headers=i)),{pathParams:l,query:v,body:C,headers:g,timeout:c}}
2
+ exports.AdapterNotFoundError=T;exports.ForgeError=b;exports.HTTPError=I;exports.InterceptorManagerImpl=_;exports.InvalidInterceptorReturnError=J;exports.LoadingTracker=G;exports.MissingRouteParamError=W;exports.NetworkError=S;exports.RequestAbortedError=$;exports.RouteCache=N;exports.UnknownLevelError=B;exports.UnknownRouteError=P;exports.createInterceptorManager=te;exports.createRouteForge=Ke;exports.resolveRouteName=pe;exports.resolveRouteNameSync=ne;return exports;})({});
@@ -75,7 +75,11 @@ interface RouteMeta {
75
75
  parameter_defaults?: Record<string, unknown>;
76
76
  /** 所属层级(前端填充,便于隔离缓存) */
77
77
  level?: string;
78
- /** 后端下发的缓存 TTL(秒),优先级高于本地 cache.ttl */
78
+ /**
79
+ * 后端 manifest 契约字段:路由级缓存 TTL(秒)。
80
+ * 当前前端按层级消费 TTL(LevelRoutesResponse.cache,见 cache.ts),
81
+ * 路由级字段为后端契约预留——将来支持路由级缓存时无需改类型。
82
+ */
79
83
  cache?: number | null;
80
84
  }
81
85
  /**
@@ -324,19 +328,16 @@ interface RouteForgeOptions {
324
328
  */
325
329
  response?: Array<((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
326
330
  };
331
+ /**
332
+ * @deprecated 前端校验始终开启,此选项不再被消费。
333
+ * 前端在层级未声明时始终抛 `UnknownLevelError`、路由名不存在始终抛 `UnknownRouteError`、
334
+ * 必填路径参数缺失始终抛 `MissingRouteParamError` —— 校验行为与 strict 无关,静默忽略会掩盖拼写错误、难以排查。
335
+ * 后端 `strict_mode` 的宽松/严格语义(未命中层级路由是否归入 unassigned/fallback)由后端在生成 manifest 时决定。
336
+ * 字段保留仅为向后兼容,传入不会有任何效果。
337
+ */
327
338
  strict?: boolean;
328
339
  timeout?: number;
329
340
  baseURL?: string;
330
- /**
331
- * 摘要端点(auto-discovery)完成后的回调。
332
- * 推荐用法:在回调中 mount 应用,确保 route() / hasRoute() 等同步方法可用。
333
- * @example
334
- * createRouteForgePlugin({
335
- * endpoint: '/_forge/routes',
336
- * onSummaryReady: () => app.mount('#app'),
337
- * });
338
- */
339
- onSummaryReady?: () => void;
340
341
  }
341
342
  /**
342
343
  * 二级路由类型映射(可由 codegen 生成或通过 module augmentation 增强)
@@ -438,10 +439,5 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
438
439
  error: ErrorType;
439
440
  call: UseForgeApiBoundCall<L>;
440
441
  }
441
- /** useForgeByPrefix 返回类型 */
442
- interface UseForgeByPrefixReturn {
443
- api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;
444
- route: (suffix: string, params?: Record<string, unknown>) => string;
445
- }
446
442
 
447
- export { type AdapterOption as A, type BoundForge as B, type CacheStorage as C, type Fetcher as F, type InterceptorManager as I, type LevelRoutesResponse as L, type RouteMeta as R, type SummaryResponse as S, type UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type ForgeApiParams as e, type ForgeApiResponse as f, type ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q, type UseForgeByPrefixReturn as r };
443
+ export { type AdapterOption as A, type BoundForge as B, type CacheStorage as C, type Fetcher as F, type InterceptorManager as I, type LevelRoutesResponse as L, type RouteMeta as R, type SummaryResponse as S, type UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type ForgeApiParams as e, type ForgeApiResponse as f, type ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q };
@@ -75,7 +75,11 @@ interface RouteMeta {
75
75
  parameter_defaults?: Record<string, unknown>;
76
76
  /** 所属层级(前端填充,便于隔离缓存) */
77
77
  level?: string;
78
- /** 后端下发的缓存 TTL(秒),优先级高于本地 cache.ttl */
78
+ /**
79
+ * 后端 manifest 契约字段:路由级缓存 TTL(秒)。
80
+ * 当前前端按层级消费 TTL(LevelRoutesResponse.cache,见 cache.ts),
81
+ * 路由级字段为后端契约预留——将来支持路由级缓存时无需改类型。
82
+ */
79
83
  cache?: number | null;
80
84
  }
81
85
  /**
@@ -324,19 +328,16 @@ interface RouteForgeOptions {
324
328
  */
325
329
  response?: Array<((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
326
330
  };
331
+ /**
332
+ * @deprecated 前端校验始终开启,此选项不再被消费。
333
+ * 前端在层级未声明时始终抛 `UnknownLevelError`、路由名不存在始终抛 `UnknownRouteError`、
334
+ * 必填路径参数缺失始终抛 `MissingRouteParamError` —— 校验行为与 strict 无关,静默忽略会掩盖拼写错误、难以排查。
335
+ * 后端 `strict_mode` 的宽松/严格语义(未命中层级路由是否归入 unassigned/fallback)由后端在生成 manifest 时决定。
336
+ * 字段保留仅为向后兼容,传入不会有任何效果。
337
+ */
327
338
  strict?: boolean;
328
339
  timeout?: number;
329
340
  baseURL?: string;
330
- /**
331
- * 摘要端点(auto-discovery)完成后的回调。
332
- * 推荐用法:在回调中 mount 应用,确保 route() / hasRoute() 等同步方法可用。
333
- * @example
334
- * createRouteForgePlugin({
335
- * endpoint: '/_forge/routes',
336
- * onSummaryReady: () => app.mount('#app'),
337
- * });
338
- */
339
- onSummaryReady?: () => void;
340
341
  }
341
342
  /**
342
343
  * 二级路由类型映射(可由 codegen 生成或通过 module augmentation 增强)
@@ -438,10 +439,5 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
438
439
  error: ErrorType;
439
440
  call: UseForgeApiBoundCall<L>;
440
441
  }
441
- /** useForgeByPrefix 返回类型 */
442
- interface UseForgeByPrefixReturn {
443
- api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;
444
- route: (suffix: string, params?: Record<string, unknown>) => string;
445
- }
446
442
 
447
- export { type AdapterOption as A, type BoundForge as B, type CacheStorage as C, type Fetcher as F, type InterceptorManager as I, type LevelRoutesResponse as L, type RouteMeta as R, type SummaryResponse as S, type UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type ForgeApiParams as e, type ForgeApiResponse as f, type ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q, type UseForgeByPrefixReturn as r };
443
+ export { type AdapterOption as A, type BoundForge as B, type CacheStorage as C, type Fetcher as F, type InterceptorManager as I, type LevelRoutesResponse as L, type RouteMeta as R, type SummaryResponse as S, type UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type ForgeApiParams as e, type ForgeApiResponse as f, type ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@route-forge/core",
3
- "version": "1.3.1",
3
+ "version": "2.0.0",
4
4
  "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",