@route-forge/core 2.2.1 → 3.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.
- package/README.md +31 -23
- package/README_zh.md +30 -23
- package/dist/codegen.cjs +7 -8
- package/dist/codegen.cjs.map +1 -1
- package/dist/codegen.d.cts +2 -3
- package/dist/codegen.d.ts +2 -3
- package/dist/codegen.js +7 -8
- package/dist/codegen.js.map +1 -1
- package/dist/index.cjs +182 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -8
- package/dist/index.d.ts +27 -8
- package/dist/index.js +181 -83
- package/dist/index.js.map +1 -1
- package/dist/route-forge.global.js +182 -82
- package/dist/route-forge.global.js.map +1 -1
- package/dist/route-forge.global.min.js +2 -2
- package/dist/{types-CDKE8rw-.d.cts → types-B_vdcRqx.d.cts} +57 -18
- package/dist/{types-CDKE8rw-.d.ts → types-B_vdcRqx.d.ts} +57 -18
- package/package.json +4 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var RouteForge=(function(exports){'use strict';var Q="route-forge:";function Te(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(Q)&&this.memory.delete(e.key.slice(Q.length));};this.storage=e.storage,this.fallbackTtl=e.ttl,this.backend=Te(e.storage),this.backend&&typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("storage",this.onStorageEvent);}key(e){return `${Q}${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,t){let n,o;t===null?(n=0,o=false):t===void 0?(n=this.fallbackTtl,o=true):t===0?(n=0,o=true):(n=Math.min(t,this.fallbackTtl),o=true);let s={level:e.level,routes:e.routes,ttl:n,cachedAt:Date.now()};if(this.memory.set(e.level,s),!(!o||this.storage==="memory"||!this.backend))try{this.backend.setItem(this.key(e.level),JSON.stringify(s));}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(Q)&&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 P=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);}},k=class extends P{constructor(e,t){super(`Route "${e}" not found${t?` in level "${t}"`:""}`,{code:"RF_FE_001",route:e,level:t});}},A=class extends P{constructor(e){super(`Level "${e}" not declared in options.levels`,{code:"RF_FE_002",level:e});}},H=class extends P{constructor(e,t){super(`Missing path parameter(s) ${t.join(", ")} for route "${e}"`,{code:"RF_FE_003",route:e,context:{missingParams:t}});}},D=class extends P{constructor(e){super(`Adapter "${e}" not available; install axios or use 'builtin'`,{code:"RF_FE_005",context:{adapter:e}});}},N=class extends P{constructor(e){super("Request interceptor must return a RequestConfig object",{code:"RF_FE_006",route:e});}},T=class extends P{constructor(e,t,n,o){super(e,{code:"RF_FE_007",route:t,level:n,cause:o});}},q=class extends P{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});}},L=class extends P{constructor(e,t,n){super(`Request aborted${e?` for route "${e}"`:""}`,{code:"RF_FE_009",route:e,level:t,cause:n});}};var S=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 K(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 h=await s(u);if(h===null||typeof h!="object")throw new N;return h},u=>c?c(u):Promise.reject(u));}return n}async function Y(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 Z(){return new S}function se(r,e){if(e?.aborted)return true;let t=r;return t?t.name==="AbortError"||t.code==="ERR_CANCELED":false}function Le(...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 Se(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 Re(r){let e=Le(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"||Se(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 se(i)?i:new T(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 f={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 f;throw new q(`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 ie(r){let e=r?.request??Z(),t=r?.response??Z(),n=Re;async function o(i){let l=await K(e,i),p=Promise.resolve(l).then(n);return Y(t,p)}return {request:o,requestRaw:n,interceptors:{request:e,response:t},runsInterceptors:true,get:(i,l)=>o({...l,url:i,method:"GET"}),post:(i,l)=>o({...l,url:i,method:"POST"}),put:(i,l)=>o({...l,url:i,method:"PUT"}),patch:(i,l)=>o({...l,url:i,method:"PATCH"}),delete:(i,l)=>o({...l,url:i,method:"DELETE"})}}function ye(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 ae(){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:ye(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:ye(c.headers),data:c.data,config:n}}throw s}}return {request:t,interceptors:void 0}}async function ue(r){let{adapter:e}=r;if(e&&typeof e=="object")return {request:n=>e.request(n),interceptors:e.interceptors};if(e==="builtin")return ie(r.forgeInterceptors);if(e==="axios"){let n=await ae();if(!n)throw new D("axios");return n}let t=await ae().catch(()=>null);return t||ie(r.forgeInterceptors)}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(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 ve(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 f of r.parameters){let i=e[f];i==null&&f in n&&(i=n[f]),i==null?r.uri.includes(`{${f}?}`)||o.push(f):s[f]=i;}if(o.length>0)throw new H(r.name,o);let c=r.uri.replace(/\{([^{}]+)\}/g,(f,i)=>{let l=i.endsWith("?"),p=l?i.slice(0,-1):i;if(s[p]!==void 0){let w=s[p];if(typeof w=="object")throw new P(`Path parameter "${p}" must be a primitive value (string, number, boolean), got ${typeof w}`,{code:"RF_FE_003",route:r.name,context:{param:p,value:w}});return encodeURIComponent(String(w))}return l?"":f});if(c=c.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t.urlPrefix)){let f=t.urlPrefix.endsWith("/")?t.urlPrefix.slice(0,-1):t.urlPrefix;return c.startsWith("/")?`${f}${c}`:`${f}/${c}`}let u=t.baseURL.endsWith("/")?t.baseURL.slice(0,-1):t.baseURL,h=t.urlPrefix;return c.startsWith("/")?`${u}${h}${c}`:`${u}${h}/${c}`}function be(r){return (r.methods.find(t=>t.toUpperCase()!=="HEAD")??r.methods[0]??"GET").toUpperCase()}function we(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 Ce(r){let{params:e,query:t,body:n,headers:o,timeout:s,...c}=r,u=e?{...e}:{};for(let[l,p]of Object.entries(c))l in u||(u[l]=p);let h,f,i;return t!==void 0&&(typeof t=="object"&&t!==null?h=t:"query"in u||(u.query=t)),n!==void 0&&(typeof n!="string"&&typeof n!="number"?f=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:h,body:f,headers:i,timeout:s}}async function Pe(r,e,t){let{explicitLevels:n,explicitEndpoint:o}=r;if(!o)throw new A("(auto-discovery)");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 A("(auto-discovery)")}}function Ie(r){return typeof r=="number"&&r<0?null:r}function ce(r,e,t){let{explicitLevels:n,explicitEager:o,explicitEndpoint:s}=t,c=r.schemeVersion??1;c>1&&console.warn(`[route-forge] backend schemeVersion=${c} > client supported 1; some features may be unavailable`),r.config.endpoint_prefix&&r.config.endpoint_prefix!==s&&(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),e.cacheTtl=Ie(r.config.cache_ttl);let u=Object.keys(r.levels),h={};for(let i of u){let l=r.levels[i]?.route;l&&typeof l.uri=="string"&&(h[i]={uri:l.uri,methods:l.methods??["GET","HEAD"]});}if(e.levelRoutes=h,n&&n.length>0){let i=n.filter(p=>u.includes(p)),l=n.filter(p=>!u.includes(p));l.length>0&&console.warn(`[route-forge] levels not in backend summary and dropped: ${l.join(", ")}`),e.levels=i;}else e.levels=u.slice();let f=u.filter(i=>r.levels[i]?.load==="eager");if(!o)e.eager=f;else {let i=new Set([...f,...o]);e.eager=[...i];}}var Me="__ROUTE_FORGE__",W;function Ee(){if(W!==void 0)return W;if(typeof window>"u")return W=null,null;let r;try{r=window[Me];}catch{r=void 0;}return W=r!==null&&typeof r=="object"?r:null,W}var ee=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 A(e)}async fetchLevel(e){let t=this.state.levelRoutes[e]?.uri,n=t?this.joinBaseAndPath(this.baseURL,t):ve(e,{baseURL:this.baseURL,endpoint:this.state.endpoint});return await this.fetchMeta(`route-forge.${e}`,n,e)}joinBaseAndPath(e,t){let n=e.endsWith("/")?e.slice(0,-1):e,o=t.startsWith("/")?t:`/${t}`;return `${n}${o}`}async loadOne(e){let t=this.getAutoDiscoveryError();if(t)throw t;if(this.assertLevelDeclared(e),!(this.state.cacheTtl===null)&&this.cache.get(e))return;let o=this.inflight.get(e);if(o)return o;let s=this.invalidationGens.get(e)??0,c=(async()=>{try{let u=await this.fetchLevel(e);(this.invalidationGens.get(e)??0)===s&&this.cache.set(u,this.state.cacheTtl);}finally{this.inflight.delete(e);}})();return this.inflight.set(e,c),c}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 Fe(r){let{ensureAdapter:e,requestInterceptors:t,responseInterceptors:n,load:o,findRouteMeta:s,baseURL:c,state:u,timeout:h,loadingTracker:f,autoDiscoveryPromise:i}=r;async function l(p,w,d){let{pathParams:v,query:m,body:C,headers:E,timeout:b}=Ce(w);if(d?.aborted)throw new L(p.name,p.level,d.reason);let R=be(p),F=we(X(p,v,{baseURL:c,urlPrefix:u.urlPrefix}),m),J={route:p.name,level:p.level??"",method:R,url:F,headers:{Accept:"application/json",...E??{}},body:C,params:v,timeout:b??h,signal:d,meta:p},I=await e(),M=I.runsInterceptors?J:await K(t,J);if(M.signal?.aborted)throw new L(p.name,p.level,M.signal.reason);f.start();try{let O=I.request(M).then(g=>{if(g.status<200||g.status>=300)throw new q(`HTTP ${g.status} for route "${g.route}" (${g.method} ${g.url})`,{route:g.route,level:g.level,status:g.status,url:g.url,method:g.method});return g},g=>{throw g instanceof P?g:se(g,d)?new L(p.name,p.level,g):new T(g instanceof Error?g.message:String(g),p.name,p.level,g)});return I.runsInterceptors?await O:await Y(n,O)}finally{f.stop();}}return function(w,d,v={}){let m,C=false,E,R=(async()=>{m=new AbortController,C&&m.abort(E),await i,await o(w);let F=s(w,d);if(!F)throw new k(d,w);return l(F,v,m.signal)})();return R.abort=()=>{m?m.abort():C=true;},R}}async function le(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 k(s,e)}function te(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 k(s,e)}function xe(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 ke(r){let{load:e,api:t,route:n,hasRoute:o,getRoutes:s,invalidate:c,isLoaded:u,loadingTracker:h}=r,f={load:e,hasRoute:o};function i(d,v){let m=e(d);m.catch(()=>{});let C=v?(b,R)=>le(f,d,v,b).then(F=>t(d,F,R)):(b,R)=>t(d,b,R),E=C;return xe(E,{level:d,...v!==void 0?{prefix:v}:{},api:C,route:v?(b,R)=>n(d,te(f,d,v,b),R):(b,R)=>n(d,b,R),url:v?(b,R)=>n(d,te(f,d,v,b),R):(b,R)=>n(d,b,R),hasRoute:b=>o(d,b),getRoutes:()=>s(d),load:()=>e(d),invalidate:()=>c(d),isLoaded:()=>u(d),isLoading:()=>h.isLoading(),onLoadingChange:b=>h.subscribe(b)}),Object.defineProperty(E,"levelLoaded",{value:m,writable:false,enumerable:true,configurable:true}),E}function l(d,v,m,C){let E=v.then(()=>d);return m?E.then(m,C).then(()=>d):E}function p(d,v,m){Object.defineProperty(d,"onLevelLoaded",{value:(C,E)=>l(d,v,C,E),writable:false,enumerable:false,configurable:false}),Object.defineProperty(d,"useRoutePrefix",{value:C=>w(m,C),writable:false,enumerable:false,configurable:false});}function w(d,v){let m=i(d,v),C=m.levelLoaded;return p(m,C,d),m}return w}var _e=3e4,$e=3600;function je(r={}){let e=Ee()??r.summary??null;if(!e&&!r.endpoint)throw new TypeError("createRouteForge: \u9700\u8981 options.endpoint\uFF0C\u6216 options.summary\uFF0C\u6216\u9875\u9762\u5185\u5D4C window.__ROUTE_FORGE__");let{adapter:t="auto",timeout:n=_e,baseURL:o="",interceptors:s,cache:c={}}=r,u=new G,h=r.levels,f=r.eager,i=r.endpoint,l={levels:h??[],eager:f??[],endpoint:i??e?.config?.endpoint_prefix??"",urlPrefix:"",cacheTtl:void 0,levelRoutes:{}},p={explicitLevels:h,explicitEager:f,explicitEndpoint:i},w=false,d,v,m=new Promise((a,y)=>{d=a,v=y;});m.catch(()=>{});let C=c.ttl??$e,E=c.storage??"memory",b=new B({storage:E,ttl:C}),R=new S,F=new S;if(s?.request)for(let a of s.request)if(typeof a=="function")R.use(a);else {let[y,x]=a;R.use(y,x);}if(s?.response)for(let a of s.response)if(typeof a=="function")F.use(a);else {let[y,x]=a;F.use(y,x);}let J=ue({adapter:t,forgeInterceptors:{request:R,response:F}}),I=false,M=null;async function O(){return I||(M=await J.catch(a=>{if(a instanceof D)throw a;return ue({adapter:"builtin",forgeInterceptors:{request:R,response:F}})}),I=true),M}function re(){if(!w&&!h?.length)throw new P("Route data not available. Auto-discovery has not completed. Use forge.ready() or forge.use(level) first.",{code:"RF_FE_010"})}async function g(a,y,x=""){let U=await O(),De={route:a,level:x,method:"GET",url:y,headers:{Accept:"application/json"},params:{},timeout:n,meta:{name:a,uri:y,methods:["GET"],parameters:[],level:x}},j=await(U.requestRaw??U.request)(De);if(!j||j.status<200||j.status>=300)throw new q(`Failed to fetch "${a}": HTTP ${j?.status}`,{level:x,status:j?.status,url:y,method:"GET"});return j.data}let _;e?(ce(e,l,p),w=true,_=Promise.resolve()):_=Pe(p,o,g).then(a=>{a!==null&&ce(a,l,p);});let de=null;_.catch(a=>{de=a;});let $=new ee({cache:b,state:l,baseURL:o,fetchMeta:g,autoDiscoveryPromise:_,getAutoDiscoveryError:()=>de}),z=a=>$.load(a),ne=(a,y)=>$.findRouteMeta(a,y),pe=a=>$.invalidate(a),fe=a=>$.isLoaded(a);function ge(a){return a===void 0?$.getRoutes():$.getRoutes(a)}function oe(a,y,x){re();let U=ne(a,y);if(!U)throw new k(y,a);return X(U,x??{},{baseURL:o,urlPrefix:l.urlPrefix})}let he=Fe({ensureAdapter:O,requestInterceptors:R,responseInterceptors:F,load:z,findRouteMeta:ne,baseURL:o,state:l,timeout:n,loadingTracker:u,autoDiscoveryPromise:_});function me(a,y){return re(),ne(a,y)!==void 0}_.then(()=>{if(w=true,l.eager.length>0)return Promise.allSettled(l.eager.map(a=>z(a))).then(a=>{a.forEach((y,x)=>{y.status==="rejected"&&console.error(`[route-forge] eager load failed for level "${l.eager[x]}":`,y.reason);});})}).then(()=>{d(V);}).catch(a=>{v(a);});function qe(a,y){return a?m.then(a,y).then(()=>V):m}let Ae=ke({load:z,api:he,route:oe,hasRoute:me,getRoutes:ge,invalidate:pe,isLoaded:fe,loadingTracker:u}),V={api:he,load:z,route:oe,url:oe,invalidate:pe,isLoaded:fe,hasRoute:me,getRoutes:ge,isLoading:()=>u.isLoading(),onLoadingChange:a=>u.subscribe(a),interceptors:{request:R,response:F},ready:qe,use(a,y){return a===void 0?V:Ae(a,y)}};return V}
|
|
2
|
-
exports.AdapterNotFoundError=
|
|
1
|
+
var RouteForge=(function(exports){'use strict';var Y="route-forge:";function Be(r){return r==="memory"||typeof globalThis>"u"?null:r==="sessionStorage"?globalThis.sessionStorage??null:r==="localStorage"?globalThis.localStorage??null:null}var N=class{constructor(e){this.memory=new Map;this.onStorageEvent=e=>{e.key&&e.key.startsWith(Y)&&this.memory.delete(e.key.slice(Y.length));};this.storage=e.storage,this.fallbackTtl=e.ttl,this.backend=Be(e.storage),this.backend&&typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("storage",this.onStorageEvent);}key(e){return `${Y}${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,t){let n,o;t===null?(n=0,o=false):t===void 0?(n=this.fallbackTtl,o=true):t===0?(n=0,o=true):(n=Math.min(t,this.fallbackTtl),o=true);let s={level:e.level,routes:e.routes,ttl:n,cachedAt:Date.now()};if(this.memory.set(e.level,s),!(!o||this.storage==="memory"||!this.backend))try{this.backend.setItem(this.key(e.level),JSON.stringify(s));}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(Y)&&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);}};function xe(r){if(!r||r.length===0)return "";let e=5,t=r.slice(0,e).join(", "),n=r.length>e?` (+${r.length-e} more)`:"";return ` Available: ${t}${n}`}var E=class extends C{constructor(e,t,n){super(`Route "${e}" not found${t?` in level "${t}"`:""}.${xe(n)}`,{code:"RF_FE_001",route:e,level:t,context:n&&n.length>0?{candidates:n}:void 0});}},B=class extends C{constructor(e,t){super(`Level "${e}" not declared in options.levels.${xe(t)}`,{code:"RF_FE_002",level:e,context:t&&t.length>0?{candidates:t}:void 0});}},H=class extends C{constructor(e,t,n){super(`Missing path parameter(s) ${t.join(", ")} for route "${e}"${n?` (${n})`:""}`,{code:"RF_FE_003",route:e,context:{missingParams:t,...n!==void 0?{uri:n}:{}}});}},W=class extends C{constructor(e,t,n){super(`Path parameter "${t}" must be a primitive value (string, number, boolean), got ${typeof n}`,{code:"RF_FE_003",route:e,context:{param:t,value:n}});}},j=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});}},F=class extends C{constructor(e,t,n,o){super(e,{code:"RF_FE_007",route:t,level:n,cause:o});}},T=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}),t.response!==void 0&&(this.response=t.response);}},$=class extends C{constructor(e,t,n){super(`Request aborted${e?` for route "${e}"`:""}`,{code:"RF_FE_009",route:e,level:t,cause:n});}},z=class extends C{constructor(){super("Route data not available. Auto-discovery has not completed. Use forge.ready() or forge.use(level) first, or await ready() before calling route()/hasRoute().",{code:"RF_FE_010"});}};var _=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 Z(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,i=o.onRejected;n=n.then(async c=>{if(!s)return c;let f=await s(c);if(f===null||typeof f!="object")throw new G;return f},c=>i?i(c):Promise.reject(c));}return n}async function ee(r,e){let t=[];r.forEach(o=>t.push(o));let n=e;for(let o of t){let s=o.onFulfilled,i=o.onRejected;n=n.then(c=>s?s(c):c,c=>i?i(c):Promise.reject(c));}return n}function te(){return new _}function ue(r){if(r==null)return {};let e,t;if(typeof r=="function")e=r;else if(Array.isArray(r))e=r[0],t=r[1];else if(typeof r=="object"){let o=r;e=o.resolve,t=o.reject;}else throw new TypeError(`Interceptor declaration must be a function, a [resolve, reject] tuple, or a { resolve, reject } object; received ${typeof r}.`);let n={};if(e!=null){if(typeof e!="function")throw new TypeError(`Interceptor "resolve" (onFulfilled) must be a function; received ${typeof e}.`);n.onFulfilled=e;}if(t!=null){if(typeof t!="function")throw new TypeError(`Interceptor "reject" (onRejected) must be a function; received ${typeof t}.`);n.onRejected=t;}return n}function ce(r,e){if(e?.aborted)return true;let t=r;return t?t.name==="AbortError"||t.code==="ERR_CANCELED":false}function He(...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 We(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 Ee(r){let e=He(r.signal,r.timeout&&r.timeout>0?AbortSignal.timeout(r.timeout):void 0),t=r.url;if(r.paramsSerializer&&r.params){let a=r.paramsSerializer(r.params);a&&(t=t.includes("?")?`${t}&${a}`:`${t}?${a}`);}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"||We(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(a){throw ce(a)?a:new F(a instanceof Error?a.message:String(a),r.route,r.level,a)}let i=await s.text(),c=i;if((s.headers.get("content-type")??"").includes("application/json"))try{c=JSON.parse(i);}catch{}let d={route:r.route,level:r.level,method:r.method,url:t,status:s.status,headers:s.headers,data:c,config:r};if(s.status>=200&&s.status<300)return d;throw new T(`HTTP ${s.status} for route "${r.route}" (${r.method} ${t})`,{route:r.route,level:r.level,status:s.status,url:t,method:r.method,response:d})}function le(r){let e=r?.request??te(),t=r?.response??te(),n=Ee;async function o(a){let p=await Z(e,a),g=Promise.resolve(p).then(n);return ee(t,g)}return {request:o,requestRaw:n,interceptors:{request:e,response:t},runsInterceptors:true,get:(a,p)=>o({...p,url:a,method:"GET"}),post:(a,p)=>o({...p,url:a,method:"POST"}),put:(a,p)=>o({...p,url:a,method:"PUT"}),patch:(a,p)=>o({...p,url:a,method:"PATCH"}),delete:(a,p)=>o({...p,url:a,method:"DELETE"})}}function Fe(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 de(){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:Fe(s.headers),data:s.data,config:n}}catch(s){if(s&&s.response){let i=s.response;return {route:n.route,level:n.level,method:n.method,url:n.url,status:i.status,headers:Fe(i.headers),data:i.data,config:n}}throw s}}return {request:t,interceptors:void 0}}async function pe(r){let{adapter:e}=r;if(e&&typeof e=="object")return {request:n=>e.request(n),interceptors:e.interceptors};if(e==="builtin")return le(r.forgeInterceptors);if(e==="axios"){let n=await de();if(!n)throw new j("axios");return n}let t=await de().catch(()=>null);return t||le(r.forgeInterceptors)}var J=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 Te(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 re(r,e,t){let n=r.parameter_defaults??{},o=[],s={};for(let d of r.parameters){let a=e[d];a==null&&d in n&&(a=n[d]),a==null?r.uri.includes(`{${d}?}`)||o.push(d):s[d]=a;}if(o.length>0)throw new H(r.name,o,r.uri);let i=r.uri.replace(/\{([^{}]+)\}/g,(d,a)=>{let p=a.endsWith("?"),g=p?a.slice(0,-1):a;if(s[g]!==void 0){let h=s[g];if(typeof h=="object")throw new W(r.name,g,h);return encodeURIComponent(String(h))}return p?"":d});if(i=i.replace(/\/+/g,"/").replace(/\/$/,""),/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t.urlPrefix)){let d=t.urlPrefix.endsWith("/")?t.urlPrefix.slice(0,-1):t.urlPrefix;return i.startsWith("/")?`${d}${i}`:`${d}/${i}`}let c=t.baseURL.endsWith("/")?t.baseURL.slice(0,-1):t.baseURL,f=t.urlPrefix;return i.startsWith("/")?`${c}${f}${i}`:`${c}${f}/${i}`}function qe(r){return (r.methods.find(t=>t.toUpperCase()!=="HEAD")??r.methods[0]??"GET").toUpperCase()}function De(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 Ie(r){let{params:e,query:t,body:n,headers:o,timeout:s,...i}=r,c=e?{...e}:{};for(let[p,g]of Object.entries(i))p in c||(c[p]=g);let f,d,a;return t!==void 0&&(typeof t=="object"&&t!==null?f=t:"query"in c||(c.query=t)),n!==void 0&&(typeof n!="string"&&typeof n!="number"?d=n:"body"in c||(c.body=n)),o!==void 0&&(typeof o=="object"&&o!==null?a=o:"headers"in c||(c.headers=o)),{pathParams:c,query:f,body:d,headers:a,timeout:s}}var fe="/_forge/routes";async function Ae(r,e,t){let{explicitLevels:n,explicitEndpoint:o,warnings:s}=r,i=o??fe,c=e.endsWith("/")?e.slice(0,-1):e,f=i.startsWith("/")?i:`/${i}`,d=`${c}${f}`;try{return await t("__forge__.summary",d)}catch(a){if(n&&n.length>0)return s&&console.warn(`[route-forge] summary endpoint unreachable: ${a.message}; using explicit levels`),null;throw new F(`Failed to fetch route summary from "${d}": ${a?.message??String(a)}; check the backend manifest endpoint or options.endpoint`,void 0,void 0,a)}}function Ge(r){return typeof r=="number"&&r<0?null:r}function ge(r,e,t){let{explicitLevels:n,explicitEager:o,explicitEndpoint:s,warnings:i}=t,c=r.schemeVersion??1;c>1&&i&&console.warn(`[route-forge] backend schemeVersion=${c} > client supported 1; some features may be unavailable`),r.config.endpoint_prefix&&r.config.endpoint_prefix!==s&&(s&&i&&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),e.cacheTtl=Ge(r.config.cache_ttl);let f=Object.keys(r.levels),d={};for(let p of f){let g=r.levels[p]?.route;g&&typeof g.uri=="string"&&(d[p]={uri:g.uri,methods:g.methods??["GET","HEAD"]});}if(e.levelRoutes=d,n&&n.length>0){let p=n.filter(h=>f.includes(h)),g=n.filter(h=>!f.includes(h));g.length>0&&i&&console.warn(`[route-forge] levels not in backend summary and dropped: ${g.join(", ")}`),e.levels=p;}else e.levels=f.slice();let a=f.filter(p=>r.levels[p]?.load==="eager");if(!o)e.eager=a;else {let p=new Set([...a,...o]);e.eager=[...p];}}var ze="__ROUTE_FORGE__",V;function Se(){if(V!==void 0)return V;if(typeof window>"u")return V=null,null;let r;try{r=window[ze];}catch{r=void 0;}return V=r!==null&&typeof r=="object"?r:null,V}var ne=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 B(e,this.state.levels)}async fetchLevel(e){let t=this.state.levelRoutes[e]?.uri,n=t?this.joinBaseAndPath(this.baseURL,t):Te(e,{baseURL:this.baseURL,endpoint:this.state.endpoint});return await this.fetchMeta(`route-forge.${e}`,n,e)}joinBaseAndPath(e,t){let n=e.endsWith("/")?e.slice(0,-1):e,o=t.startsWith("/")?t:`/${t}`;return `${n}${o}`}async loadOne(e){let t=this.getAutoDiscoveryError();if(t)throw t;if(this.assertLevelDeclared(e),!(this.state.cacheTtl===null)&&this.cache.get(e))return;let o=this.inflight.get(e);if(o)return o;let s=this.invalidationGens.get(e)??0,i=(async()=>{try{let c=await this.fetchLevel(e);(this.invalidationGens.get(e)??0)===s&&this.cache.set(c,this.state.cacheTtl);}finally{this.inflight.delete(e);}})();return this.inflight.set(e,i),i}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){this.assertLevelDeclared(e);let o=this.cache.get(e)?.routes??{},s={};for(let[i,c]of Object.entries(o))s[i]=JSON.parse(JSON.stringify(c));return s}let t={};for(let n of this.state.levels){let o=this.cache.get(n);if(o){let s={};for(let[i,c]of Object.entries(o.routes))s[i]=JSON.parse(JSON.stringify(c));t[n]=s;}}return t}};function Le(r){let{ensureAdapter:e,requestInterceptors:t,responseInterceptors:n,load:o,findRouteMeta:s,getRouteNames:i,baseURL:c,state:f,timeout:d,loadingTracker:a,autoDiscoveryPromise:p}=r;async function g(h,l,m){let{pathParams:w,query:y,body:k,headers:v,timeout:P}=Ie(l);if(m?.aborted)throw new $(h.name,h.level,m.reason);let q=qe(h),x=De(re(h,w,{baseURL:c,urlPrefix:f.urlPrefix}),y),D={route:h.name,level:h.level??"",method:q,url:x,headers:{Accept:"application/json",...v??{}},body:k,params:w,timeout:P??d,signal:m,meta:h},I=await e(),A=I.runsInterceptors?D:await Z(t,D);if(A.signal?.aborted)throw new $(h.name,h.level,A.signal.reason);a.start();try{let Q=I.request(A).then(R=>{if(R.status<200||R.status>=300)throw new T(`HTTP ${R.status} for route "${R.route}" (${R.method} ${R.url})`,{route:R.route,level:R.level,status:R.status,url:R.url,method:R.method,response:R});return R},R=>{throw R instanceof C?R:ce(R,m)?new $(h.name,h.level,R):new F(R instanceof Error?R.message:String(R),h.name,h.level,R)});return I.runsInterceptors?await Q:await ee(n,Q)}finally{a.stop();}}return function(l,m,w={}){let y,k=false,v,q=(async()=>{y=new AbortController,k&&y.abort(v),await p,await o(l);let x=s(l,m);if(!x)throw new E(m,l,i(l));return g(x,w,y.signal)})();return q.abort=()=>{y?y.abort():k=true;},q}}function Me(r,e){let t=r;for(;t.endsWith(e);)t=t.slice(0,-e.length);return t}async function he(r,e,t,n,o="."){let s=Me(t,o);if(!n)return s;let i=`${s}${o}${n}`;if(!n.startsWith(`${s}${o}`)||(await r.load(e),r.hasRoute(e,i)))return i;if(r.hasRoute(e,n))return n;throw new E(i,e,r.getRouteNames?.(e))}function oe(r,e,t,n,o="."){let s=Me(t,o);if(!n)return s;let i=`${s}${o}${n}`;if(!n.startsWith(`${s}${o}`)||r.hasRoute(e,i))return i;if(r.hasRoute(e,n))return n;throw new E(i,e,r.getRouteNames?.(e))}function je(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 $e(r){let{load:e,api:t,route:n,hasRoute:o,getRoutes:s,invalidate:i,isLoaded:c,loadingTracker:f}=r,d={load:e,hasRoute:o,getRouteNames:l=>Object.keys(s(l))};function a(l,m){let w=e(l);w.catch(()=>{});let y=m?(v,P)=>he(d,l,m,v).then(q=>t(l,q,P)):(v,P)=>t(l,v,P),k=y;return je(k,{level:l,...m!==void 0?{prefix:m}:{},api:y,route:m?(v,P)=>n(l,oe(d,l,m,v),P):(v,P)=>n(l,v,P),url:m?(v,P)=>n(l,oe(d,l,m,v),P):(v,P)=>n(l,v,P),hasRoute:v=>o(l,v),getRoutes:()=>s(l),load:()=>e(l),invalidate:()=>i(l),isLoaded:()=>c(l),isLoading:()=>f.isLoading(),onLoadingChange:v=>f.subscribe(v)}),Object.defineProperty(k,"levelLoaded",{value:w,writable:false,enumerable:true,configurable:true}),k}function p(l,m,w,y){let k=m.then(()=>l);return w?k.then(w,y).then(()=>l):k}function g(l,m,w){Object.defineProperty(l,"onLevelLoaded",{value:(y,k)=>p(l,m,y,k),writable:false,enumerable:false,configurable:false}),Object.defineProperty(l,"useRoutePrefix",{value:y=>h(w,y),writable:false,enumerable:false,configurable:false});}function h(l,m){let w=a(l,m),y=w.levelLoaded;return g(w,y,l),w}return h}var Je=3e4,Ve=3600;function Qe(r={}){let e=Se()??r.summary??null,{adapter:t="auto",timeout:n=Je,baseURL:o="",interceptors:s,cache:i={}}=r,c=r.warnings??true,f=new J,d=r.levels,a=r.eager,p=r.endpoint,g={levels:d??[],eager:a??[],endpoint:p??e?.config?.endpoint_prefix??fe,urlPrefix:"",cacheTtl:void 0,levelRoutes:{}},h={explicitLevels:d,explicitEager:a,explicitEndpoint:p,warnings:c},l=false,m,w,y=new Promise((u,b)=>{m=u,w=b;});y.catch(()=>{});let k=false;y.then(()=>{k=true;},()=>{});let v=i.ttl??Ve,P=i.storage??"memory",q=new N({storage:P,ttl:v}),x=new _,D=new _,I=ue(s?.request);(I.onFulfilled||I.onRejected)&&x.use(I.onFulfilled,I.onRejected);let A=ue(s?.response);(A.onFulfilled||A.onRejected)&&D.use(A.onFulfilled,A.onRejected);let Q=pe({adapter:t,forgeInterceptors:{request:x,response:D}}),se=false,R=null;async function me(){return se||(R=await Q.catch(u=>{if(u instanceof j)throw u;return c&&console.warn(`[route-forge] adapter initialization failed (${u?.message??String(u)}); falling back to builtin`),pe({adapter:"builtin",forgeInterceptors:{request:x,response:D}})}),se=true),R}function Re(){if(!l&&!d?.length)throw new z}async function ye(u,b,L=""){let U=await me(),Ne={route:u,level:L,method:"GET",url:b,headers:{Accept:"application/json"},params:{},timeout:n,meta:{name:u,uri:b,methods:["GET"],parameters:[],level:L}},M=await(U.requestRaw??U.request)(Ne);if(!M||M.status<200||M.status>=300)throw new T(`Failed to fetch "${u}" (${b}): HTTP ${M?.status}`,{level:L,status:M?.status,url:b,method:"GET",response:M??void 0});return M.data}let O;e?(ge(e,g,h),l=true,O=Promise.resolve()):O=Ae(h,o,ye).then(u=>{u!==null&&ge(u,g,h);});let ve=null;O.catch(u=>{ve=u;});let S=new ne({cache:q,state:g,baseURL:o,fetchMeta:ye,autoDiscoveryPromise:O,getAutoDiscoveryError:()=>ve}),K=u=>S.load(u),ie=(u,b)=>S.findRouteMeta(u,b),be=u=>S.invalidate(u),we=u=>S.isLoaded(u);function ke(u){return u===void 0?S.getRoutes():S.getRoutes(u)}function _e(){return [...g.levels]}function ae(u,b,L){Re();let U=ie(u,b);if(!U)throw new E(b,u,Object.keys(S.getRoutes(u)));return re(U,L??{},{baseURL:o,urlPrefix:g.urlPrefix})}let Pe=Le({ensureAdapter:me,requestInterceptors:x,responseInterceptors:D,load:K,findRouteMeta:ie,getRouteNames:u=>Object.keys(S.getRoutes(u)),baseURL:o,state:g,timeout:n,loadingTracker:f,autoDiscoveryPromise:O});function Ce(u,b){return Re(),ie(u,b)!==void 0}O.then(()=>{if(l=true,g.eager.length>0)return Promise.allSettled(g.eager.map(u=>K(u))).then(u=>{u.forEach((b,L)=>{b.status==="rejected"&&console.error(`[route-forge] eager load failed for level "${g.eager[L]}":`,b.reason);});})}).then(()=>{m(X);}).catch(u=>{w(u);});function Oe(u,b){return u?y.then(u,b).then(()=>X):y}let Ue=$e({load:K,api:Pe,route:ae,hasRoute:Ce,getRoutes:ke,invalidate:be,isLoaded:we,loadingTracker:f}),X={api:Pe,load:K,route:ae,url:ae,invalidate:be,isLoaded:we,hasRoute:Ce,getRoutes:ke,getLevels:_e,warnings:c,isLoading:()=>f.isLoading(),isReady:()=>k,onLoadingChange:u=>f.subscribe(u),interceptors:{request:x,response:D},ready:Oe,use(u,b){return u===void 0?X:Ue(u,b)}};return X}
|
|
2
|
+
exports.AdapterNotFoundError=j;exports.DiscoveryNotReadyError=z;exports.ForgeError=C;exports.HTTPError=T;exports.InterceptorManagerImpl=_;exports.InvalidInterceptorReturnError=G;exports.InvalidPathParamError=W;exports.LoadingTracker=J;exports.MissingRouteParamError=H;exports.NetworkError=F;exports.RequestAbortedError=$;exports.RouteCache=N;exports.UnknownLevelError=B;exports.UnknownRouteError=E;exports.createInterceptorManager=te;exports.createRouteForge=Qe;exports.resolveRouteName=he;exports.resolveRouteNameSync=oe;return exports;})({});
|
|
@@ -249,14 +249,21 @@ interface InterceptorHandler<TIn, TOut = TIn> {
|
|
|
249
249
|
* forge 顶层 API 形状
|
|
250
250
|
*/
|
|
251
251
|
interface RouteForge {
|
|
252
|
-
/**
|
|
253
|
-
|
|
252
|
+
/**
|
|
253
|
+
* 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息。
|
|
254
|
+
* 声明 `ForgeRouteMap`(codegen 生成或 module augmentation)后,name / params / 响应类型
|
|
255
|
+
* 按映射收敛;未声明映射时完全等价于 `(level: string, name: string, params?: ApiCallParams) => ForgeRequest<unknown>`。
|
|
256
|
+
*/
|
|
257
|
+
api<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: ForgeApiParams<L, N>): ForgeRequest<ForgeApiResponse<L, N>>;
|
|
254
258
|
/** 拉取一个或多个层级(自动并发去重) */
|
|
255
259
|
load(level: string | string[]): Promise<void>;
|
|
256
|
-
/**
|
|
257
|
-
|
|
260
|
+
/**
|
|
261
|
+
* 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存。
|
|
262
|
+
* 声明 `ForgeRouteMap` 后 name 按映射收敛(params 保持宽松——路径参数与后端默认值均可)。
|
|
263
|
+
*/
|
|
264
|
+
route<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: Record<string, unknown>): string;
|
|
258
265
|
/** route() 的语义别名,适用于链接生成等场景 */
|
|
259
|
-
url(level:
|
|
266
|
+
url<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: Record<string, unknown>): string;
|
|
260
267
|
/**
|
|
261
268
|
* 失效缓存:
|
|
262
269
|
* - invalidate():失效全部层级
|
|
@@ -266,19 +273,34 @@ interface RouteForge {
|
|
|
266
273
|
invalidate(level?: string | string[]): void;
|
|
267
274
|
/** 检查指定层级路由是否已加载并缓存;不传参检查全部 */
|
|
268
275
|
isLoaded(level?: string): boolean;
|
|
269
|
-
/**
|
|
270
|
-
hasRoute(level:
|
|
276
|
+
/** 检查指定层级下某路由是否存在(需该层级缓存已加载);声明 `ForgeRouteMap` 后 name 按映射收敛 */
|
|
277
|
+
hasRoute<L extends string, N extends ForgeRouteName<L>>(level: L, name: N): boolean;
|
|
271
278
|
/** 查询加载中标识状态 */
|
|
272
279
|
isLoading(): boolean;
|
|
280
|
+
/**
|
|
281
|
+
* ready() 是否已成功 resolve(同步查询,不触发任何加载)。
|
|
282
|
+
* discovery + eager 完成为 true;reject 不算就绪(保持 false)。
|
|
283
|
+
* 供框架层 ready 门闩(react Provider `gate` / vue `ForgeReady`)避免多余的 fallback 首帧。
|
|
284
|
+
*/
|
|
285
|
+
isReady(): boolean;
|
|
286
|
+
/** 非致命警告是否启用(来自 createRouteForge({ warnings }),默认 true);vue/react 适配层共用此开关 */
|
|
287
|
+
readonly warnings: boolean;
|
|
273
288
|
/** 订阅加载状态变更,返回取消订阅函数 */
|
|
274
289
|
onLoadingChange(cb: LoadingChangeCallback): () => void;
|
|
275
290
|
/**
|
|
276
291
|
* 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
|
|
277
|
-
* - getRoutes(level)
|
|
292
|
+
* - getRoutes(level):返回指定层级下全部路由;层级未声明抛 `UnknownLevelError`,
|
|
293
|
+
* 已声明但未加载返回 `{}`
|
|
278
294
|
* - getRoutes():返回全部层级的路由(按 level 分组)
|
|
279
295
|
*/
|
|
280
296
|
getRoutes(level: string): Record<string, RouteMeta>;
|
|
281
297
|
getRoutes(): Record<string, Record<string, RouteMeta>>;
|
|
298
|
+
/**
|
|
299
|
+
* 当前已知的已声明层级列表(含后端恒注入的 `unassigned`)。
|
|
300
|
+
* 内嵌 / `summary` 引导:构造后即可用;网络引导:`ready()` 前可能为空数组、之后为全量。
|
|
301
|
+
* 只读发现 API,不触发加载、未就绪不抛错(返回 `[]`)。
|
|
302
|
+
*/
|
|
303
|
+
getLevels(): string[];
|
|
282
304
|
/** 拦截器入口(请求 / 响应) */
|
|
283
305
|
interceptors: {
|
|
284
306
|
request: InterceptorManager<RequestConfig, RequestConfig>;
|
|
@@ -313,7 +335,7 @@ interface RouteForgeOptions {
|
|
|
313
335
|
* 摘要端点 URL(网络拉取来源)。
|
|
314
336
|
* 摘要数据源级联(SPEC §4.1.1):Blade 注入的 `window.__ROUTE_FORGE__` > 本 `summary` 字段 > 网络拉取 `endpoint`。
|
|
315
337
|
* 命中前两者时可省略;层级明细端点取自摘要 `levels[].route.uri`,不依赖本字段。
|
|
316
|
-
* 三者皆无(既无注入/summary、又无 endpoint
|
|
338
|
+
* 三者皆无(既无注入/summary、又无 endpoint)时网络引导回退默认摘要端点 `/_forge/routes`(DEFAULT_ENDPOINT)。
|
|
317
339
|
*/
|
|
318
340
|
endpoint?: string;
|
|
319
341
|
/**
|
|
@@ -335,17 +357,27 @@ interface RouteForgeOptions {
|
|
|
335
357
|
};
|
|
336
358
|
interceptors?: {
|
|
337
359
|
/**
|
|
338
|
-
*
|
|
339
|
-
* -
|
|
340
|
-
* - [
|
|
360
|
+
* 声明式请求拦截器,只描述**一个**拦截器,支持三种写法(SPEC §4.1.1):
|
|
361
|
+
* - 函数 `resolve` → 视为 onFulfilled
|
|
362
|
+
* - 元组 `[resolve?, reject?]` → 成功 / 失败(允许缺位,如 `[resolve]`、`[undefined, reject]`)
|
|
363
|
+
* - 对象 `{ resolve?, reject? }` → 具名成功 / 失败
|
|
364
|
+
* 需要注册多个拦截器请改用运行时 `forge.interceptors.request.use()`(可多次调用)。
|
|
341
365
|
*/
|
|
342
|
-
request?:
|
|
366
|
+
request?: ((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | [
|
|
367
|
+
((c: RequestConfig) => RequestConfig | Promise<RequestConfig>)?,
|
|
368
|
+
((e: unknown) => unknown | Promise<unknown>)?
|
|
369
|
+
] | {
|
|
370
|
+
resolve?: (c: RequestConfig) => RequestConfig | Promise<RequestConfig>;
|
|
371
|
+
reject?: (e: unknown) => unknown | Promise<unknown>;
|
|
372
|
+
};
|
|
343
373
|
/**
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
* - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
|
|
374
|
+
* 声明式响应拦截器,形状同 `request`(首段 onFulfilled 接收 ResponseData)。
|
|
375
|
+
* 同样只描述一个拦截器,多拦截器改用运行时 `forge.interceptors.response.use()`。
|
|
347
376
|
*/
|
|
348
|
-
response?:
|
|
377
|
+
response?: ((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>)?, ((e: unknown) => unknown | Promise<unknown>)?] | {
|
|
378
|
+
resolve?: (r: ResponseData) => unknown | Promise<unknown>;
|
|
379
|
+
reject?: (e: unknown) => unknown | Promise<unknown>;
|
|
380
|
+
};
|
|
349
381
|
};
|
|
350
382
|
/**
|
|
351
383
|
* @deprecated 前端校验始终开启,此选项不再被消费。
|
|
@@ -357,6 +389,13 @@ interface RouteForgeOptions {
|
|
|
357
389
|
strict?: boolean;
|
|
358
390
|
timeout?: number;
|
|
359
391
|
baseURL?: string;
|
|
392
|
+
/**
|
|
393
|
+
* 非致命警告开关(默认 true):控制 core 内部的 `console.warn`(如显式 levels 降级、
|
|
394
|
+
* endpoint_prefix 覆盖、schemeVersion 兼容提示等)。`false` 时静音这些 warn——
|
|
395
|
+
* `console.error` 级输出(如 eager 层级加载失败)不受影响,错误永远响亮。
|
|
396
|
+
* 该值以只读字段 `RouteForge.warnings` 暴露,vue/react 适配层的渲染期降级警告同样遵循它。
|
|
397
|
+
*/
|
|
398
|
+
warnings?: boolean;
|
|
360
399
|
}
|
|
361
400
|
/**
|
|
362
401
|
* 二级路由类型映射(可由 codegen 生成或通过 module augmentation 增强)
|
|
@@ -459,4 +498,4 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
|
|
|
459
498
|
call: UseForgeApiBoundCall<L>;
|
|
460
499
|
}
|
|
461
500
|
|
|
462
|
-
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
|
|
501
|
+
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 ResponseData as d, type ApiCallParams as e, type ForgeApiParams as f, type ForgeApiResponse as g, type ForgeRequest as h, type ForgeRouteMap as i, type ForgeRouteName as j, type LoadingChangeCallback as k, type LoadingChangeEvent as l, LoadingTracker as m, type RequestConfig as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q };
|
|
@@ -249,14 +249,21 @@ interface InterceptorHandler<TIn, TOut = TIn> {
|
|
|
249
249
|
* forge 顶层 API 形状
|
|
250
250
|
*/
|
|
251
251
|
interface RouteForge {
|
|
252
|
-
/**
|
|
253
|
-
|
|
252
|
+
/**
|
|
253
|
+
* 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息。
|
|
254
|
+
* 声明 `ForgeRouteMap`(codegen 生成或 module augmentation)后,name / params / 响应类型
|
|
255
|
+
* 按映射收敛;未声明映射时完全等价于 `(level: string, name: string, params?: ApiCallParams) => ForgeRequest<unknown>`。
|
|
256
|
+
*/
|
|
257
|
+
api<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: ForgeApiParams<L, N>): ForgeRequest<ForgeApiResponse<L, N>>;
|
|
254
258
|
/** 拉取一个或多个层级(自动并发去重) */
|
|
255
259
|
load(level: string | string[]): Promise<void>;
|
|
256
|
-
/**
|
|
257
|
-
|
|
260
|
+
/**
|
|
261
|
+
* 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存。
|
|
262
|
+
* 声明 `ForgeRouteMap` 后 name 按映射收敛(params 保持宽松——路径参数与后端默认值均可)。
|
|
263
|
+
*/
|
|
264
|
+
route<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: Record<string, unknown>): string;
|
|
258
265
|
/** route() 的语义别名,适用于链接生成等场景 */
|
|
259
|
-
url(level:
|
|
266
|
+
url<L extends string, N extends ForgeRouteName<L>>(level: L, name: N, params?: Record<string, unknown>): string;
|
|
260
267
|
/**
|
|
261
268
|
* 失效缓存:
|
|
262
269
|
* - invalidate():失效全部层级
|
|
@@ -266,19 +273,34 @@ interface RouteForge {
|
|
|
266
273
|
invalidate(level?: string | string[]): void;
|
|
267
274
|
/** 检查指定层级路由是否已加载并缓存;不传参检查全部 */
|
|
268
275
|
isLoaded(level?: string): boolean;
|
|
269
|
-
/**
|
|
270
|
-
hasRoute(level:
|
|
276
|
+
/** 检查指定层级下某路由是否存在(需该层级缓存已加载);声明 `ForgeRouteMap` 后 name 按映射收敛 */
|
|
277
|
+
hasRoute<L extends string, N extends ForgeRouteName<L>>(level: L, name: N): boolean;
|
|
271
278
|
/** 查询加载中标识状态 */
|
|
272
279
|
isLoading(): boolean;
|
|
280
|
+
/**
|
|
281
|
+
* ready() 是否已成功 resolve(同步查询,不触发任何加载)。
|
|
282
|
+
* discovery + eager 完成为 true;reject 不算就绪(保持 false)。
|
|
283
|
+
* 供框架层 ready 门闩(react Provider `gate` / vue `ForgeReady`)避免多余的 fallback 首帧。
|
|
284
|
+
*/
|
|
285
|
+
isReady(): boolean;
|
|
286
|
+
/** 非致命警告是否启用(来自 createRouteForge({ warnings }),默认 true);vue/react 适配层共用此开关 */
|
|
287
|
+
readonly warnings: boolean;
|
|
273
288
|
/** 订阅加载状态变更,返回取消订阅函数 */
|
|
274
289
|
onLoadingChange(cb: LoadingChangeCallback): () => void;
|
|
275
290
|
/**
|
|
276
291
|
* 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
|
|
277
|
-
* - getRoutes(level)
|
|
292
|
+
* - getRoutes(level):返回指定层级下全部路由;层级未声明抛 `UnknownLevelError`,
|
|
293
|
+
* 已声明但未加载返回 `{}`
|
|
278
294
|
* - getRoutes():返回全部层级的路由(按 level 分组)
|
|
279
295
|
*/
|
|
280
296
|
getRoutes(level: string): Record<string, RouteMeta>;
|
|
281
297
|
getRoutes(): Record<string, Record<string, RouteMeta>>;
|
|
298
|
+
/**
|
|
299
|
+
* 当前已知的已声明层级列表(含后端恒注入的 `unassigned`)。
|
|
300
|
+
* 内嵌 / `summary` 引导:构造后即可用;网络引导:`ready()` 前可能为空数组、之后为全量。
|
|
301
|
+
* 只读发现 API,不触发加载、未就绪不抛错(返回 `[]`)。
|
|
302
|
+
*/
|
|
303
|
+
getLevels(): string[];
|
|
282
304
|
/** 拦截器入口(请求 / 响应) */
|
|
283
305
|
interceptors: {
|
|
284
306
|
request: InterceptorManager<RequestConfig, RequestConfig>;
|
|
@@ -313,7 +335,7 @@ interface RouteForgeOptions {
|
|
|
313
335
|
* 摘要端点 URL(网络拉取来源)。
|
|
314
336
|
* 摘要数据源级联(SPEC §4.1.1):Blade 注入的 `window.__ROUTE_FORGE__` > 本 `summary` 字段 > 网络拉取 `endpoint`。
|
|
315
337
|
* 命中前两者时可省略;层级明细端点取自摘要 `levels[].route.uri`,不依赖本字段。
|
|
316
|
-
* 三者皆无(既无注入/summary、又无 endpoint
|
|
338
|
+
* 三者皆无(既无注入/summary、又无 endpoint)时网络引导回退默认摘要端点 `/_forge/routes`(DEFAULT_ENDPOINT)。
|
|
317
339
|
*/
|
|
318
340
|
endpoint?: string;
|
|
319
341
|
/**
|
|
@@ -335,17 +357,27 @@ interface RouteForgeOptions {
|
|
|
335
357
|
};
|
|
336
358
|
interceptors?: {
|
|
337
359
|
/**
|
|
338
|
-
*
|
|
339
|
-
* -
|
|
340
|
-
* - [
|
|
360
|
+
* 声明式请求拦截器,只描述**一个**拦截器,支持三种写法(SPEC §4.1.1):
|
|
361
|
+
* - 函数 `resolve` → 视为 onFulfilled
|
|
362
|
+
* - 元组 `[resolve?, reject?]` → 成功 / 失败(允许缺位,如 `[resolve]`、`[undefined, reject]`)
|
|
363
|
+
* - 对象 `{ resolve?, reject? }` → 具名成功 / 失败
|
|
364
|
+
* 需要注册多个拦截器请改用运行时 `forge.interceptors.request.use()`(可多次调用)。
|
|
341
365
|
*/
|
|
342
|
-
request?:
|
|
366
|
+
request?: ((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | [
|
|
367
|
+
((c: RequestConfig) => RequestConfig | Promise<RequestConfig>)?,
|
|
368
|
+
((e: unknown) => unknown | Promise<unknown>)?
|
|
369
|
+
] | {
|
|
370
|
+
resolve?: (c: RequestConfig) => RequestConfig | Promise<RequestConfig>;
|
|
371
|
+
reject?: (e: unknown) => unknown | Promise<unknown>;
|
|
372
|
+
};
|
|
343
373
|
/**
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
* - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
|
|
374
|
+
* 声明式响应拦截器,形状同 `request`(首段 onFulfilled 接收 ResponseData)。
|
|
375
|
+
* 同样只描述一个拦截器,多拦截器改用运行时 `forge.interceptors.response.use()`。
|
|
347
376
|
*/
|
|
348
|
-
response?:
|
|
377
|
+
response?: ((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>)?, ((e: unknown) => unknown | Promise<unknown>)?] | {
|
|
378
|
+
resolve?: (r: ResponseData) => unknown | Promise<unknown>;
|
|
379
|
+
reject?: (e: unknown) => unknown | Promise<unknown>;
|
|
380
|
+
};
|
|
349
381
|
};
|
|
350
382
|
/**
|
|
351
383
|
* @deprecated 前端校验始终开启,此选项不再被消费。
|
|
@@ -357,6 +389,13 @@ interface RouteForgeOptions {
|
|
|
357
389
|
strict?: boolean;
|
|
358
390
|
timeout?: number;
|
|
359
391
|
baseURL?: string;
|
|
392
|
+
/**
|
|
393
|
+
* 非致命警告开关(默认 true):控制 core 内部的 `console.warn`(如显式 levels 降级、
|
|
394
|
+
* endpoint_prefix 覆盖、schemeVersion 兼容提示等)。`false` 时静音这些 warn——
|
|
395
|
+
* `console.error` 级输出(如 eager 层级加载失败)不受影响,错误永远响亮。
|
|
396
|
+
* 该值以只读字段 `RouteForge.warnings` 暴露,vue/react 适配层的渲染期降级警告同样遵循它。
|
|
397
|
+
*/
|
|
398
|
+
warnings?: boolean;
|
|
360
399
|
}
|
|
361
400
|
/**
|
|
362
401
|
* 二级路由类型映射(可由 codegen 生成或通过 module augmentation 增强)
|
|
@@ -459,4 +498,4 @@ interface UseForgeApiBoundReturn<L extends string, PendingType = unknown, ErrorT
|
|
|
459
498
|
call: UseForgeApiBoundCall<L>;
|
|
460
499
|
}
|
|
461
500
|
|
|
462
|
-
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
|
|
501
|
+
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 ResponseData as d, type ApiCallParams as e, type ForgeApiParams as f, type ForgeApiResponse as g, type ForgeRequest as h, type ForgeRouteMap as i, type ForgeRouteName as j, type LoadingChangeCallback as k, type LoadingChangeEvent as l, LoadingTracker as m, type RequestConfig 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": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器 / Framework-agnostic named-routes client core: tiered lazy loading, isolated cache, request deduplication, interceptors",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"laravel",
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
},
|
|
32
32
|
"type": "module",
|
|
33
33
|
"sideEffects": false,
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18"
|
|
36
|
+
},
|
|
34
37
|
"main": "./dist/index.cjs",
|
|
35
38
|
"module": "./dist/index.js",
|
|
36
39
|
"types": "./dist/index.d.ts",
|