@route-forge/core 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- var RouteForge=(function(exports){'use strict';var Fe="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 `${Fe}${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(Fe)&&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);}},I=class extends v{constructor(t,n){super(`Route "${t}" not found${n?` in level "${n}"`:""}`,{code:"RF_FE_001",route:t,level:n});}},J=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}});}},_=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});}},D=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});}},O=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 U=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 p=>{if(!d)return p;let R=await d(p);if(R===null||typeof R!="object")throw new X;return R},p=>m?m(p):Promise.reject(p));}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(p=>d?d(p):p,p=>m?m(p):Promise.reject(p));}return r}function oe(){return new U}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(y){let i=await ne(t,y),C=Je(i.signal,i.timeout&&i.timeout>0?AbortSignal.timeout(i.timeout):void 0),b=i.url;if(i.paramsSerializer&&i.params){let k=i.paramsSerializer(i.params);k&&(b=b.includes("?")?`${b}&${k}`:`${b}?${k}`);}let L=new Headers(i.headers),q={method:i.method,headers:L};C&&(q.signal=C),i.body!==void 0&&!["GET","HEAD"].includes(i.method.toUpperCase())&&(typeof i.body=="string"||Ne(i.body)?q.body=i.body:(q.body=JSON.stringify(i.body),L.has("Content-Type")||L.set("Content-Type","application/json")));let w;try{w=await fetch(b,q);}catch(k){throw We(k)?k:new D(k instanceof Error?k.message:String(k),i.route,i.level,k)}let M=await w.text(),j=M;if((w.headers.get("content-type")??"").includes("application/json"))try{j=JSON.parse(M);}catch{}let B={route:i.route,level:i.level,method:i.method,url:b,status:w.status,headers:w.headers,data:j,config:i},G=w.status>=200&&w.status<300?Promise.resolve(B):Promise.reject(new S(`HTTP ${w.status} for route "${i.route}" (${i.method} ${b})`,{route:i.route,level:i.level,status:w.status,url:b,method:i.method}));return re(n,G)}return {request:r,interceptors:{request:t,response:n},runsInterceptors:true,get:(y,i)=>r({...i,url:y,method:"GET"}),post:(y,i)=>r({...i,url:y,method:"POST"}),put:(y,i)=>r({...i,url:y,method:"PUT"}),patch:(y,i)=>r({...i,url:y,method:"PATCH"}),delete:(y,i)=>r({...i,url:y,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 _("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 I(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 I(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,p=o.levels,R=o.eager,y=o.strict??false,i=o.endpoint,C=p??[],b=R??[],q=i,w="",M,j=false,B=(async()=>{try{let e=i,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(p&&p.length>0)return console.warn(`[route-forge] summary endpoint unreachable: ${e.message}; using explicit levels`),null;throw new J("(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!==i&&(console.warn(`[route-forge] backend endpoint_prefix "${e.config.endpoint_prefix}" overrides frontend endpoint "${i}"`),q=e.config.endpoint_prefix),e.config.url_prefix&&(w=e.config.url_prefix.endsWith("/")?e.config.url_prefix.slice(0,-1):e.config.url_prefix),e.config.strict_mode&&!y&&(console.warn("[route-forge] backend strict_mode=true overrides frontend strict=false; forcing strict=true"),true);let u=Object.keys(e.levels);j=u.includes(ee),Array.isArray(e.unassigned)&&e.unassigned.length>0&&!j&&(M=e.unassigned);let a=u.slice();if(M&&!j&&a.push(ee),p&&p.length>0){let c=p.filter(x=>a.includes(x)),g=p.filter(x=>!a.includes(x));g.length>0&&console.warn(`[route-forge] levels not in backend summary and dropped: ${g.join(", ")}`),C=c;}else C=a;let f=u.filter(c=>e.levels[c]?.load==="eager");R?b=[...new Set([...f,...R])]:b=f;}),G=null;B.catch(e=>{G=e;});let k=false,he,me=new Promise(e=>{he=e;}),Te=d.ttl??ze,$e=d.storage??"memory",F=new Z({storage:$e,ttl:Te}),z=new U,V=new U;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 _)throw e;return ge({adapter:"builtin"})}),Re=true),ye}let H=new Map,T=new Map;function Le(e){if(!C.includes(e))throw new J(e)}function we(){if(!k&&!p?.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}},a=await s.request(u);if(!a||a.status<200||a.status>=300)throw new S(`Failed to load level "${e}": HTTP ${a?.status}`,{level:e,status:a?.status,url:ie(e),method:"GET"});return a.data}async function je(e){if(G)throw G;if(Le(e),F.get(e))return;let s=H.get(e);if(s)return s;let u=T.get(e)??0,a=(async()=>{try{if(e===ee&&!j&&M){let c={};for(let g of M)c[g.name]={...g,level:ee};F.set({level:ee,routes:c,cache:null});return}let f=await Me(e);(T.get(e)??0)===u&&F.set(f);}finally{H.delete(e);}})();return H.set(e,a),a}async function N(e){await B;let s=Array.isArray(e)?e:[e];await Promise.all(s.map(je));}function W(e,s,u){we();let a=ae(e,s);if(!a)throw new I(s,e);return ve(a,u??{})}function ve(e,s){let u=e.parameter_defaults??{},a=[],f={};for(let P of e.parameters){let E=s[P];E==null&&P in u&&(E=u[P]),E==null?e.uri.includes(`{${P}?}`)||a.push(P):f[P]=E;}if(a.length>0)throw new K(e.name,a);let c=e.uri.replace(/\{([^{}]+)\}/g,(P,E)=>{let Q=E.endsWith("?"),$=Q?E.slice(0,-1):E;if(f[$]!==void 0){let A=f[$];if(typeof A=="object")throw new v(`Path parameter "${$}" must be a primitive value (string, number, boolean), got ${typeof A}`,{code:"RF_FE_003",route:e.name,context:{param:$,value:A}});return encodeURIComponent(String(A))}return Q?"":P});if(c=c.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(w)){let P=w.endsWith("/")?w.slice(0,-1):w;return c.startsWith("/")?`${P}${c}`:`${P}/${c}`}let g=r.endsWith("/")?r.slice(0,-1):r,x=w;return c.startsWith("/")?`${g}${x}${c}`:`${g}${x}/${c}`}function ae(e,s){let a=F.get(e)?.routes[s];if(a)return {...a,level:e}}async function ue(e,s,u={}){await B,await N(e);let a=ae(e,s);if(!a)throw new I(s,e);return _e(a,u)}async function _e(e,s){let{pathParams:u,query:a,body:f,headers:c,timeout:g,signal:x}=Ke(s);if(x?.aborted)throw new O(e.name,e.level,x.reason);let P=Qe(e),E=Ze(ve(e,u),a),Q={route:e.name,level:e.level??"",method:P,url:E,headers:{Accept:"application/json",...c??{}},body:f,params:u,timeout:g??n,signal:x,meta:e},$=await be(),A=$.runsInterceptors?Q:await ne(z,Q);if(A.signal?.aborted)throw new O(e.name,e.level,A.signal.reason);m.start();try{let Ee=$.request(A).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,A.signal)?new O(e.name,e.level,h):new D(h instanceof Error?h.message:String(h),e.name,e.level,h)});return $.runsInterceptors?await Ee:await re(V,Ee)}finally{m.stop();}}function Ce(e){if(e===void 0){F.clear(),H.clear();for(let s of C)T.set(s,(T.get(s)??0)+1);}else if(Array.isArray(e))for(let s of e)F.del(s),H.delete(s),T.set(s,(T.get(s)??0)+1);else F.del(e),H.delete(e),T.set(e,(T.get(e)??0)+1);}function ke(e){return e?F.get(e)!==void 0:C.length>0&&C.every(s=>F.get(s)!==void 0)}function ce(e,s){return we(),ae(e,s)!==void 0}function Pe(e){if(e!==void 0){let a=F.get(e)?.routes??{},f={};for(let[c,g]of Object.entries(a))f[c]=JSON.parse(JSON.stringify(g));return f}let s={};for(let u of C){let a=F.get(u);if(a){let f={};for(let[c,g]of Object.entries(a.routes))f[c]=JSON.parse(JSON.stringify(g));s[u]=f;}}return s}B.then(()=>{if(k=true,o.onSummaryReady?.(),b.length>0)return Promise.all(b.map(e=>N(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:N,hasRoute:ce};function Oe(e,s){let u=N(e).catch(()=>{}),a=s?(c,g)=>pe(de,e,s,c).then(x=>ue(e,x,g)):(c,g)=>ue(e,c,g),f=a;return Ae(f,{level:e,...s!==void 0?{prefix:s}:{},api:a,route:s?(c,g)=>W(e,se(de,e,s,c),g):(c,g)=>W(e,c,g),url:s?(c,g)=>W(e,se(de,e,s,c),g):(c,g)=>W(e,c,g),hasRoute:c=>ce(e,c),getRoutes:()=>Pe(e),load:()=>N(e),invalidate:()=>Ce(e),isLoaded:()=>ke(e),isLoading:()=>m.isLoading(),onLoadingChange:c=>m.subscribe(c)}),Object.defineProperty(f,"levelLoaded",{value:u,writable:false,enumerable:true,configurable:true}),f}function Ue(e,s,u,a){let f=s.then(()=>e);return u?f.then(u,a).then(()=>e):f}function Be(e,s,u){Object.defineProperty(e,"onLevelLoaded",{value:(a,f)=>Ue(e,s,a,f),writable:false,enumerable:false,configurable:false}),Object.defineProperty(e,"useRoutePrefix",{value:a=>xe(u,a),writable:false,enumerable:false,configurable:false});}function xe(e,s){let u=Oe(e,s),a=u.levelLoaded;return Be(u,a,e),u}let te={api:ue,load:N,route:W,url:W,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:xe(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,signal:m,...p}=o,R=t?{...t}:{};for(let[b,L]of Object.entries(p))b in R||(R[b]=L);let y,i,C;return n!==void 0&&(typeof n=="object"&&n!==null?y=n:"query"in R||(R.query=n)),r!==void 0&&(typeof r!="string"&&typeof r!="number"?i=r:"body"in R||(R.body=r)),l!==void 0&&(typeof l=="object"&&l!==null?C=l:"headers"in R||(R.headers=l)),{pathParams:R,query:y,body:i,headers:C,timeout:d,signal:m}}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=_;exports.ForgeError=v;exports.HTTPError=S;exports.InterceptorManagerImpl=U;exports.InvalidInterceptorReturnError=X;exports.LoadingTracker=Y;exports.MissingRouteParamError=K;exports.NetworkError=D;exports.RequestAbortedError=O;exports.RouteCache=Z;exports.UnknownLevelError=J;exports.UnknownRouteError=I;exports.createInterceptorManager=oe;exports.createRouteForge=Ve;exports.resolveRouteName=pe;exports.resolveRouteNameSync=se;return exports;})({});
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;})({});
@@ -146,6 +146,15 @@ interface ResponseData {
146
146
  data: unknown;
147
147
  config: RequestConfig;
148
148
  }
149
+ /**
150
+ * forge.api() 返回的可取消请求对象。
151
+ * 继承 Promise,附加 abort() 方法用于取消请求。
152
+ * 内部自动创建 AbortController,用户无需手动管理。
153
+ */
154
+ interface ForgeRequest<T = unknown> extends Promise<T> {
155
+ /** 取消请求。调用后请求将被中止,Promise reject 为 RequestAbortedError */
156
+ abort(): void;
157
+ }
149
158
  /**
150
159
  * forge.api(level, name, params) 调用参数
151
160
  *
@@ -182,14 +191,6 @@ interface ApiCallParams {
182
191
  * 单次请求超时覆盖(毫秒);不传时使用 createRouteForge({ timeout }) 全局值
183
192
  */
184
193
  timeout?: number;
185
- /**
186
- * 请求取消信号(AbortSignal);调用 AbortController.abort() 即可取消请求
187
- * @example
188
- * const controller = new AbortController();
189
- * forge.api('admin', 'users.index', { signal: controller.signal });
190
- * controller.abort(); // 取消请求
191
- */
192
- signal?: AbortSignal;
193
194
  }
194
195
  /**
195
196
  * 缓存存储介质
@@ -238,7 +239,7 @@ interface InterceptorHandler<TIn, TOut = TIn> {
238
239
  */
239
240
  interface RouteForge {
240
241
  /** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
241
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
242
+ api(level: string, name: string, params?: ApiCallParams): ForgeRequest;
242
243
  /** 拉取一个或多个层级(自动并发去重) */
243
244
  load(level: string | string[]): Promise<void>;
244
245
  /** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
@@ -379,14 +380,14 @@ type ForgeApiResponse<L extends string, N extends string> = [
379
380
  */
380
381
  interface BoundForge<LL = Promise<void>> {
381
382
  /** 直接调用 = api 快捷方式,自动带绑定的 level */
382
- (name: string, params?: ApiCallParams): Promise<unknown>;
383
+ (name: string, params?: ApiCallParams): ForgeRequest;
383
384
  /** 当前绑定的 level */
384
385
  readonly level: string;
385
386
  /** 绑定的路由名前缀(仅传入 prefix 时存在) */
386
387
  readonly prefix?: string;
387
388
  /** level 加载状态(core: Promise<void>,Vue: Ref<boolean>) */
388
389
  levelLoaded: LL;
389
- api(name: string, params?: ApiCallParams): Promise<unknown>;
390
+ api(name: string, params?: ApiCallParams): ForgeRequest;
390
391
  route(name: string, params?: Record<string, unknown>): string;
391
392
  url(name: string, params?: Record<string, unknown>): string;
392
393
  hasRoute(name: string): boolean;
@@ -443,4 +444,4 @@ interface UseForgeByPrefixReturn {
443
444
  route: (suffix: string, params?: Record<string, unknown>) => string;
444
445
  }
445
446
 
446
- 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 ForgeRouteMap as g, type ForgeRouteName as h, type LoadingChangeCallback as i, type LoadingChangeEvent as j, LoadingTracker as k, type RequestConfig as l, type ResponseData as m, type UseForgeApiBoundReturn as n, type UseForgeApiCall as o, type UseForgeApiReturn as p, type UseForgeByPrefixReturn as q };
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 };
@@ -146,6 +146,15 @@ interface ResponseData {
146
146
  data: unknown;
147
147
  config: RequestConfig;
148
148
  }
149
+ /**
150
+ * forge.api() 返回的可取消请求对象。
151
+ * 继承 Promise,附加 abort() 方法用于取消请求。
152
+ * 内部自动创建 AbortController,用户无需手动管理。
153
+ */
154
+ interface ForgeRequest<T = unknown> extends Promise<T> {
155
+ /** 取消请求。调用后请求将被中止,Promise reject 为 RequestAbortedError */
156
+ abort(): void;
157
+ }
149
158
  /**
150
159
  * forge.api(level, name, params) 调用参数
151
160
  *
@@ -182,14 +191,6 @@ interface ApiCallParams {
182
191
  * 单次请求超时覆盖(毫秒);不传时使用 createRouteForge({ timeout }) 全局值
183
192
  */
184
193
  timeout?: number;
185
- /**
186
- * 请求取消信号(AbortSignal);调用 AbortController.abort() 即可取消请求
187
- * @example
188
- * const controller = new AbortController();
189
- * forge.api('admin', 'users.index', { signal: controller.signal });
190
- * controller.abort(); // 取消请求
191
- */
192
- signal?: AbortSignal;
193
194
  }
194
195
  /**
195
196
  * 缓存存储介质
@@ -238,7 +239,7 @@ interface InterceptorHandler<TIn, TOut = TIn> {
238
239
  */
239
240
  interface RouteForge {
240
241
  /** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
241
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
242
+ api(level: string, name: string, params?: ApiCallParams): ForgeRequest;
242
243
  /** 拉取一个或多个层级(自动并发去重) */
243
244
  load(level: string | string[]): Promise<void>;
244
245
  /** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
@@ -379,14 +380,14 @@ type ForgeApiResponse<L extends string, N extends string> = [
379
380
  */
380
381
  interface BoundForge<LL = Promise<void>> {
381
382
  /** 直接调用 = api 快捷方式,自动带绑定的 level */
382
- (name: string, params?: ApiCallParams): Promise<unknown>;
383
+ (name: string, params?: ApiCallParams): ForgeRequest;
383
384
  /** 当前绑定的 level */
384
385
  readonly level: string;
385
386
  /** 绑定的路由名前缀(仅传入 prefix 时存在) */
386
387
  readonly prefix?: string;
387
388
  /** level 加载状态(core: Promise<void>,Vue: Ref<boolean>) */
388
389
  levelLoaded: LL;
389
- api(name: string, params?: ApiCallParams): Promise<unknown>;
390
+ api(name: string, params?: ApiCallParams): ForgeRequest;
390
391
  route(name: string, params?: Record<string, unknown>): string;
391
392
  url(name: string, params?: Record<string, unknown>): string;
392
393
  hasRoute(name: string): boolean;
@@ -443,4 +444,4 @@ interface UseForgeByPrefixReturn {
443
444
  route: (suffix: string, params?: Record<string, unknown>) => string;
444
445
  }
445
446
 
446
- 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 ForgeRouteMap as g, type ForgeRouteName as h, type LoadingChangeCallback as i, type LoadingChangeEvent as j, LoadingTracker as k, type RequestConfig as l, type ResponseData as m, type UseForgeApiBoundReturn as n, type UseForgeApiCall as o, type UseForgeApiReturn as p, type UseForgeByPrefixReturn as q };
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@route-forge/core",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",