@route-forge/core 2.0.0 → 2.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.
@@ -1,2 +1,2 @@
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;})({});
1
+ var RouteForge=(function(exports){'use strict';var V="route-forge:";function Le(r){return r==="memory"||typeof globalThis>"u"?null:r==="sessionStorage"?globalThis.sessionStorage??null:r==="localStorage"?globalThis.localStorage??null:null}var B=class{constructor(e){this.memory=new Map;this.onStorageEvent=e=>{e.key&&e.key.startsWith(V)&&this.memory.delete(e.key.slice(V.length));};this.storage=e.storage,this.fallbackTtl=e.ttl,this.backend=Le(e.storage),this.backend&&typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("storage",this.onStorageEvent);}key(e){return `${V}${e}`}get(e){if(this.storage==="memory"||!this.backend)return this.getFromMemory(e);let t=this.getFromMemory(e);if(t)return t;let n=this.backend.getItem(this.key(e));if(n)try{let o=JSON.parse(n);if(this.isExpired(o)){this.del(e);return}return this.memory.set(e,o),o}catch{return}}getFromMemory(e){let t=this.memory.get(e);if(t){if(this.isExpired(t)){this.memory.delete(e);return}return t}}set(e){let t;e.cache!==void 0&&e.cache!==null?t=e.cache>0?Math.min(e.cache,this.fallbackTtl):e.cache:t=this.fallbackTtl;let n={level:e.level,routes:e.routes,ttl:t,cachedAt:Date.now()};if(this.memory.set(e.level,n),!(this.storage==="memory"||!this.backend))try{this.backend.setItem(this.key(e.level),JSON.stringify(n));}catch{}}del(e){if(this.memory.delete(e),this.backend)try{this.backend.removeItem(this.key(e));}catch{}}clear(){if(this.memory.clear(),this.backend)try{let e=[];for(let t=0;t<this.backend.length;t++){let n=this.backend.key(t);n&&n.startsWith(V)&&e.push(n);}for(let t of e)this.backend.removeItem(t);}catch{}}isExpired(e){return e.ttl===null||e.ttl===0?false:Date.now()-e.cachedAt>e.ttl*1e3}};var C=class extends Error{constructor(e,t){super(e),this.name=this.constructor.name,this.code=t.code,t.route!==void 0&&(this.route=t.route),t.level!==void 0&&(this.level=t.level),t.context!==void 0&&(this.context=t.context),t.cause!==void 0&&(this.cause=t.cause);}},x=class extends C{constructor(e,t){super(`Route "${e}" not found${t?` in level "${t}"`:""}`,{code:"RF_FE_001",route:e,level:t});}},L=class extends C{constructor(e){super(`Level "${e}" not declared in options.levels`,{code:"RF_FE_002",level:e});}},N=class extends C{constructor(e,t){super(`Missing path parameter(s) ${t.join(", ")} for route "${e}"`,{code:"RF_FE_003",route:e,context:{missingParams:t}});}},A=class extends C{constructor(e){super(`Adapter "${e}" not available; install axios or use 'builtin'`,{code:"RF_FE_005",context:{adapter:e}});}},G=class extends C{constructor(e){super("Request interceptor must return a RequestConfig object",{code:"RF_FE_006",route:e});}},I=class extends C{constructor(e,t,n,o){super(e,{code:"RF_FE_007",route:t,level:n,cause:o});}},E=class extends C{constructor(e,t){super(e,{code:"RF_FE_008",route:t.route,level:t.level,context:{status:t.status,url:t.url,method:t.method},cause:t.cause});}},M=class extends C{constructor(e,t,n){super(`Request aborted${e?` for route "${e}"`:""}`,{code:"RF_FE_009",route:e,level:t,cause:n});}};var D=class{constructor(){this.handlers=[];this.nextId=0;}use(e,t){let n=this.nextId++;return this.handlers.push({id:n,onFulfilled:e,onRejected:t}),n}eject(e){let t=this.handlers.findIndex(n=>n.id===e);t>=0&&this.handlers.splice(t,1);}clear(){this.handlers=[];}forEach(e){for(let t of this.handlers)e(t);}get size(){return this.handlers.length}};async function Q(r,e){let t=[];r.forEach(o=>t.push(o)),t.reverse();let n=Promise.resolve(e);for(let o of t){let s=o.onFulfilled,c=o.onRejected;n=n.then(async u=>{if(!s)return u;let g=await s(u);if(g===null||typeof g!="object")throw new G;return g},u=>c?c(u):Promise.reject(u));}return n}async function Z(r,e){let t=[];r.forEach(o=>t.push(o));let n=e;for(let o of t){let s=o.onFulfilled,c=o.onRejected;n=n.then(u=>s?s(u):u,u=>c?c(u):Promise.reject(u));}return n}function K(){return new D}function oe(r,e){if(e?.aborted)return true;let t=r;return t?t.name==="AbortError"||t.code==="ERR_CANCELED":false}function Ae(...r){let e=r.filter(n=>!!n);if(e.length===0)return;if(e.length===1)return e[0];if(typeof AbortSignal<"u"&&typeof AbortSignal.any=="function")return AbortSignal.any(e);let t=new AbortController;for(let n of e){if(n.aborted)return t.abort(n.reason),t.signal;n.addEventListener("abort",()=>t.abort(n.reason),{once:true});}return t.signal}function Ie(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 he(r){let e=Ae(r.signal,r.timeout&&r.timeout>0?AbortSignal.timeout(r.timeout):void 0),t=r.url;if(r.paramsSerializer&&r.params){let i=r.paramsSerializer(r.params);i&&(t=t.includes("?")?`${t}&${i}`:`${t}?${i}`);}let n=new Headers(r.headers),o={method:r.method,headers:n};e&&(o.signal=e),r.body!==void 0&&!["GET","HEAD"].includes(r.method.toUpperCase())&&(typeof r.body=="string"||Ie(r.body)?o.body=r.body:(o.body=JSON.stringify(r.body),n.has("Content-Type")||n.set("Content-Type","application/json")));let s;try{s=await fetch(t,o);}catch(i){throw oe(i)?i:new I(i instanceof Error?i.message:String(i),r.route,r.level,i)}let c=await s.text(),u=c;if((s.headers.get("content-type")??"").includes("application/json"))try{u=JSON.parse(c);}catch{}let p={route:r.route,level:r.level,method:r.method,url:t,status:s.status,headers:s.headers,data:u,config:r};if(s.status>=200&&s.status<300)return p;throw new E(`HTTP ${s.status} for route "${r.route}" (${r.method} ${t})`,{route:r.route,level:r.level,status:s.status,url:t,method:r.method})}function se(r){let e=r?.request??K(),t=r?.response??K(),n=he;async function o(i){let f=await Q(e,i),l=Promise.resolve(f).then(n);return Z(t,l)}return {request:o,requestRaw:n,interceptors:{request:e,response:t},runsInterceptors:true,get:(i,f)=>o({...f,url:i,method:"GET"}),post:(i,f)=>o({...f,url:i,method:"POST"}),put:(i,f)=>o({...f,url:i,method:"PUT"}),patch:(i,f)=>o({...f,url:i,method:"PATCH"}),delete:(i,f)=>o({...f,url:i,method:"DELETE"})}}function me(r){if(!r)return new Headers;let e=typeof r.toJSON=="function"?r.toJSON():r;try{return new Headers(e)}catch{return new Headers}}async function ie(){let r,e="axios";try{let n=await import(e);r=n.default??n;}catch{typeof globalThis<"u"&&globalThis.axios&&(r=globalThis.axios);}if(!r||typeof r.request!="function")return null;async function t(n){let o={...n.headers};try{let s=await r.request({url:n.url,method:n.method,headers:o,data:n.body,timeout:n.timeout,signal:n.signal});return {route:n.route,level:n.level,method:n.method,url:n.url,status:s.status,headers:me(s.headers),data:s.data,config:n}}catch(s){if(s&&s.response){let c=s.response;return {route:n.route,level:n.level,method:n.method,url:n.url,status:c.status,headers:me(c.headers),data:c.data,config:n}}throw s}}return {request:t,interceptors:void 0}}async function ae(r){let{adapter:e}=r;if(e&&typeof e=="object")return {request:n=>e.request(n),interceptors:e.interceptors};if(e==="builtin")return se(r.forgeInterceptors);if(e==="axios"){let n=await ie();if(!n)throw new A("axios");return n}let t=await ie().catch(()=>null);return t||se(r.forgeInterceptors)}var W=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(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e);}}notify(){let e={loading:this.count>0,count:this.count};for(let t of this.subscribers)try{t(e);}catch{}}};function Re(r,e){let t=e.baseURL.endsWith("/")?e.baseURL.slice(0,-1):e.baseURL,n=e.endpoint.startsWith("/")?e.endpoint:`/${e.endpoint}`;return `${t}${n}/${encodeURIComponent(r)}`}function X(r,e,t){let n=r.parameter_defaults??{},o=[],s={};for(let p of r.parameters){let i=e[p];i==null&&p in n&&(i=n[p]),i==null?r.uri.includes(`{${p}?}`)||o.push(p):s[p]=i;}if(o.length>0)throw new N(r.name,o);let c=r.uri.replace(/\{([^{}]+)\}/g,(p,i)=>{let f=i.endsWith("?"),l=f?i.slice(0,-1):i;if(s[l]!==void 0){let k=s[l];if(typeof k=="object")throw new C(`Path parameter "${l}" must be a primitive value (string, number, boolean), got ${typeof k}`,{code:"RF_FE_003",route:r.name,context:{param:l,value:k}});return encodeURIComponent(String(k))}return f?"":p});if(c=c.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t.urlPrefix)){let p=t.urlPrefix.endsWith("/")?t.urlPrefix.slice(0,-1):t.urlPrefix;return c.startsWith("/")?`${p}${c}`:`${p}/${c}`}let u=t.baseURL.endsWith("/")?t.baseURL.slice(0,-1):t.baseURL,g=t.urlPrefix;return c.startsWith("/")?`${u}${g}${c}`:`${u}${g}/${c}`}function ye(r){return (r.methods.find(t=>t.toUpperCase()!=="HEAD")??r.methods[0]??"GET").toUpperCase()}function ve(r,e){if(!e)return r;let t=new URLSearchParams;for(let[o,s]of Object.entries(e))s!=null&&t.append(o,String(s));let n=t.toString();return n?r.includes("?")?`${r}&${n}`:`${r}?${n}`:r}function be(r){let{params:e,query:t,body:n,headers:o,timeout:s,...c}=r,u=e?{...e}:{};for(let[f,l]of Object.entries(c))f in u||(u[f]=l);let g,p,i;return t!==void 0&&(typeof t=="object"&&t!==null?g=t:"query"in u||(u.query=t)),n!==void 0&&(typeof n!="string"&&typeof n!="number"?p=n:"body"in u||(u.body=n)),o!==void 0&&(typeof o=="object"&&o!==null?i=o:"headers"in u||(u.headers=o)),{pathParams:u,query:g,body:p,headers:i,timeout:s}}var j="unassigned";async function we(r,e,t){let{explicitLevels:n,explicitEndpoint:o}=r;try{let s=e.endsWith("/")?e.slice(0,-1):e,c=o.startsWith("/")?o:`/${o}`;return await t("__forge__.summary",`${s}${c}`)}catch(s){if(n&&n.length>0)return console.warn(`[route-forge] summary endpoint unreachable: ${s.message}; using explicit levels`),null;throw new L("(auto-discovery)")}}function Ce(r,e,t){let{explicitLevels:n,explicitEager:o,explicitEndpoint:s}=t,c=r.schemaVersion??1;c>1&&console.warn(`[route-forge] backend schemaVersion=${c} > client supported 1; some features may be unavailable`),r.config.endpoint_prefix&&r.config.endpoint_prefix!==s&&(console.warn(`[route-forge] backend endpoint_prefix "${r.config.endpoint_prefix}" overrides frontend endpoint "${s}"`),e.endpoint=r.config.endpoint_prefix),r.config.url_prefix&&(e.urlPrefix=r.config.url_prefix.endsWith("/")?r.config.url_prefix.slice(0,-1):r.config.url_prefix);let u=Object.keys(r.levels);e.backendHasUnassignedLevel=u.includes(j),Array.isArray(r.unassigned)&&r.unassigned.length>0&&!e.backendHasUnassignedLevel&&(e.summaryUnassigned=r.unassigned);let g=u.slice();if(e.summaryUnassigned&&!e.backendHasUnassignedLevel&&g.push(j),n&&n.length>0){let i=n.filter(l=>g.includes(l)),f=n.filter(l=>!g.includes(l));f.length>0&&console.warn(`[route-forge] levels not in backend summary and dropped: ${f.join(", ")}`),e.levels=i;}else e.levels=g;let p=u.filter(i=>r.levels[i]?.load==="eager");if(!o)e.eager=p;else {let i=new Set([...p,...o]);e.eager=[...i];}}var Y=class{constructor(e){this.inflight=new Map;this.invalidationGens=new Map;this.cache=e.cache,this.state=e.state,this.baseURL=e.baseURL,this.fetchMeta=e.fetchMeta,this.autoDiscoveryPromise=e.autoDiscoveryPromise,this.getAutoDiscoveryError=e.getAutoDiscoveryError;}assertLevelDeclared(e){if(!this.state.levels.includes(e))throw new L(e)}async fetchLevel(e){return await this.fetchMeta(`__forge__.load.${e}`,Re(e,{baseURL:this.baseURL,endpoint:this.state.endpoint}),e)}async loadOne(e){let t=this.getAutoDiscoveryError();if(t)throw t;if(this.assertLevelDeclared(e),this.cache.get(e))return;let n=this.inflight.get(e);if(n)return n;let o=this.invalidationGens.get(e)??0,s=(async()=>{try{if(e===j&&!this.state.backendHasUnassignedLevel&&this.state.summaryUnassigned){let u={};for(let g of this.state.summaryUnassigned)u[g.name]={...g,level:j};this.cache.set({level:j,routes:u,cache:null});return}let c=await this.fetchLevel(e);(this.invalidationGens.get(e)??0)===o&&this.cache.set(c);}finally{this.inflight.delete(e);}})();return this.inflight.set(e,s),s}async load(e){await this.autoDiscoveryPromise;let t=Array.isArray(e)?e:[e];await Promise.all(t.map(n=>this.loadOne(n)));}invalidate(e){if(e===void 0){this.cache.clear(),this.inflight.clear();for(let t of this.state.levels)this.invalidationGens.set(t,(this.invalidationGens.get(t)??0)+1);}else if(Array.isArray(e))for(let t of e)this.cache.del(t),this.inflight.delete(t),this.invalidationGens.set(t,(this.invalidationGens.get(t)??0)+1);else this.cache.del(e),this.inflight.delete(e),this.invalidationGens.set(e,(this.invalidationGens.get(e)??0)+1);}isLoaded(e){return e?this.cache.get(e)!==void 0:this.state.levels.length>0&&this.state.levels.every(t=>this.cache.get(t)!==void 0)}findRouteMeta(e,t){let o=this.cache.get(e)?.routes[t];if(o)return {...o,level:e}}getRoutes(e){if(e!==void 0){let o=this.cache.get(e)?.routes??{},s={};for(let[c,u]of Object.entries(o))s[c]=JSON.parse(JSON.stringify(u));return s}let t={};for(let n of this.state.levels){let o=this.cache.get(n);if(o){let s={};for(let[c,u]of Object.entries(o.routes))s[c]=JSON.parse(JSON.stringify(u));t[n]=s;}}return t}};function ke(r){let{ensureAdapter:e,requestInterceptors:t,responseInterceptors:n,load:o,findRouteMeta:s,baseURL:c,state:u,timeout:g,loadingTracker:p,autoDiscoveryPromise:i}=r;async function f(l,k,d){let{pathParams:R,query:b,body:w,headers:P,timeout:m}=be(k);if(d?.aborted)throw new M(l.name,l.level,d.reason);let y=ye(l),q=ve(X(l,R,{baseURL:c,urlPrefix:u.urlPrefix}),b),U={route:l.name,level:l.level??"",method:y,url:q,headers:{Accept:"application/json",...P??{}},body:w,params:R,timeout:m??g,signal:d,meta:l},S=await e(),T=S.runsInterceptors?U:await Q(t,U);if(T.signal?.aborted)throw new M(l.name,l.level,T.signal.reason);p.start();try{let O=S.request(T).then(h=>{if(h.status<200||h.status>=300)throw new E(`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 C?h:oe(h,d)?new M(l.name,l.level,h):new I(h instanceof Error?h.message:String(h),l.name,l.level,h)});return S.runsInterceptors?await O:await Z(n,O)}finally{p.stop();}}return function(k,d,R={}){let b,w=false,P,y=(async()=>{b=new AbortController,w&&b.abort(P),await i,await o(k);let q=s(k,d);if(!q)throw new x(d,k);return f(q,R,b.signal)})();return y.abort=()=>{b?b.abort():w=true;},y}}async function ue(r,e,t,n,o="."){if(!n)return t;let s=`${t}${o}${n}`;if(!n.startsWith(`${t}${o}`)||(await r.load(e),r.hasRoute(e,s)))return s;if(r.hasRoute(e,n))return n;throw new x(s,e)}function ee(r,e,t,n,o="."){if(!n)return t;let s=`${t}${o}${n}`;if(!n.startsWith(`${t}${o}`)||r.hasRoute(e,s))return s;if(r.hasRoute(e,n))return n;throw new x(s,e)}function Pe(r,e){for(let t of Object.keys(e)){let n=e[t];Object.defineProperty(r,t,{value:n!==null&&typeof n=="object"?Object.freeze(n):n,writable:false,enumerable:false,configurable:false});}return r}function Fe(r){let{load:e,api:t,route:n,hasRoute:o,getRoutes:s,invalidate:c,isLoaded:u,loadingTracker:g}=r,p={load:e,hasRoute:o};function i(d,R){let b=e(d);b.catch(()=>{});let w=R?(m,y)=>ue(p,d,R,m).then(q=>t(d,q,y)):(m,y)=>t(d,m,y),P=w;return Pe(P,{level:d,...R!==void 0?{prefix:R}:{},api:w,route:R?(m,y)=>n(d,ee(p,d,R,m),y):(m,y)=>n(d,m,y),url:R?(m,y)=>n(d,ee(p,d,R,m),y):(m,y)=>n(d,m,y),hasRoute:m=>o(d,m),getRoutes:()=>s(d),load:()=>e(d),invalidate:()=>c(d),isLoaded:()=>u(d),isLoading:()=>g.isLoading(),onLoadingChange:m=>g.subscribe(m)}),Object.defineProperty(P,"levelLoaded",{value:b,writable:false,enumerable:true,configurable:true}),P}function f(d,R,b,w){let P=R.then(()=>d);return b?P.then(b,w).then(()=>d):P}function l(d,R,b){Object.defineProperty(d,"onLevelLoaded",{value:(w,P)=>f(d,R,w,P),writable:false,enumerable:false,configurable:false}),Object.defineProperty(d,"useRoutePrefix",{value:w=>k(b,w),writable:false,enumerable:false,configurable:false});}function k(d,R){let b=i(d,R),w=b.levelLoaded;return l(b,w,d),b}return k}var Me=3e4,De=3600;function Se(r){if(!r.endpoint)throw new TypeError("options.endpoint is required");let{adapter:e="auto",timeout:t=Me,baseURL:n="",interceptors:o,cache:s={}}=r,c=new W,u=r.levels,g=r.eager,p=r.endpoint,i={levels:u??[],eager:g??[],endpoint:p,urlPrefix:"",summaryUnassigned:void 0,backendHasUnassignedLevel:false},f={explicitLevels:u,explicitEager:g,explicitEndpoint:p},l=false,k,d,R=new Promise((a,v)=>{k=a,d=v;});R.catch(()=>{});let b=s.ttl??De,w=s.storage??"memory",P=new B({storage:w,ttl:b}),m=new D,y=new D;if(o?.request)for(let a of o.request)if(typeof a=="function")m.use(a);else {let[v,F]=a;m.use(v,F);}if(o?.response)for(let a of o.response)if(typeof a=="function")y.use(a);else {let[v,F]=a;y.use(v,F);}let q=ae({adapter:e,forgeInterceptors:{request:m,response:y}}),U=false,S=null;async function T(){return U||(S=await q.catch(a=>{if(a instanceof A)throw a;return ae({adapter:"builtin",forgeInterceptors:{request:m,response:y}})}),U=true),S}function O(){if(!l&&!u?.length)throw new C("Route data not available. Auto-discovery has not completed. Use forge.ready() or forge.use(level) first.",{code:"RF_FE_010"})}async function te(a,v,F=""){let H=await T(),qe={route:a,level:F,method:"GET",url:v,headers:{Accept:"application/json"},params:{},timeout:t,meta:{name:a,uri:v,methods:["GET"],parameters:[],level:F}},_=await(H.requestRaw??H.request)(qe);if(!_||_.status<200||_.status>=300)throw new E(`Failed to fetch "${a}": HTTP ${_?.status}`,{level:F,status:_?.status,url:v,method:"GET"});return _.data}let h=we(f,n,te).then(a=>{a!==null&&Ce(a,i,f);}),ce=null;h.catch(a=>{ce=a;});let $=new Y({cache:P,state:i,baseURL:n,fetchMeta:te,autoDiscoveryPromise:h,getAutoDiscoveryError:()=>ce}),J=a=>$.load(a),re=(a,v)=>$.findRouteMeta(a,v),de=a=>$.invalidate(a),le=a=>$.isLoaded(a);function pe(a){return a===void 0?$.getRoutes():$.getRoutes(a)}function ne(a,v,F){O();let H=re(a,v);if(!H)throw new x(v,a);return X(H,F??{},{baseURL:n,urlPrefix:i.urlPrefix})}let ge=ke({ensureAdapter:T,requestInterceptors:m,responseInterceptors:y,load:J,findRouteMeta:re,baseURL:n,state:i,timeout:t,loadingTracker:c,autoDiscoveryPromise:h});function fe(a,v){return O(),re(a,v)!==void 0}h.then(()=>{if(l=true,i.eager.length>0)return Promise.allSettled(i.eager.map(a=>J(a))).then(a=>{a.forEach((v,F)=>{v.status==="rejected"&&console.error(`[route-forge] eager load failed for level "${i.eager[F]}":`,v.reason);});})}).then(()=>{k(z);}).catch(a=>{d(a);});function xe(a,v){return a?R.then(a,v).then(()=>z):R}let Ee=Fe({load:J,api:ge,route:ne,hasRoute:fe,getRoutes:pe,invalidate:de,isLoaded:le,loadingTracker:c}),z={api:ge,load:J,route:ne,url:ne,invalidate:de,isLoaded:le,hasRoute:fe,getRoutes:pe,isLoading:()=>c.isLoading(),onLoadingChange:a=>c.subscribe(a),interceptors:{request:m,response:y},ready:xe,use(a,v){return a===void 0?z:Ee(a,v)}};return z}
2
+ exports.AdapterNotFoundError=A;exports.ForgeError=C;exports.HTTPError=E;exports.InterceptorManagerImpl=D;exports.InvalidInterceptorReturnError=G;exports.LoadingTracker=W;exports.MissingRouteParamError=N;exports.NetworkError=I;exports.RequestAbortedError=M;exports.RouteCache=B;exports.UnknownLevelError=L;exports.UnknownRouteError=x;exports.createInterceptorManager=K;exports.createRouteForge=Se;exports.resolveRouteName=ue;exports.resolveRouteNameSync=ee;return exports;})({});
@@ -440,4 +440,4 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
440
440
  call: UseForgeApiBoundCall<L>;
441
441
  }
442
442
 
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 };
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 RouteForgeOptions as a, type RouteForge as b, type InterceptorHandler 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 };
@@ -440,4 +440,4 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
440
440
  call: UseForgeApiBoundCall<L>;
441
441
  }
442
442
 
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 };
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 RouteForgeOptions as a, type RouteForge as b, type InterceptorHandler 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": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",