@fulgurjs/federation 4.3.0 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/runtime.js CHANGED
@@ -1,10 +1,22 @@
1
- var pe=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(s){let c=pe.exec(String(s).trim());return c?{major:Number(c[1]),minor:Number(c[2]??0),patch:Number(c[3]??0),pre:c[4]?c[4].split("."):[]}:null}function de(s,c){if(s.length===0&&c.length===0)return 0;if(s.length===0)return 1;if(c.length===0)return-1;let l=Math.max(s.length,c.length);for(let n=0;n<l;n++){let g=s[n],y=c[n];if(g===void 0)return-1;if(y===void 0)return 1;let w=/^\d+$/.test(g),b=/^\d+$/.test(y);if(w&&b){let T=Number(g)-Number(y);if(T!==0)return T}else{if(w!==b)return w?-1:1;if(g!==y)return g<y?-1:1}}return 0}function x(s,c){let l=L(s),n=L(c);return!l||!n?s<c?-1:s>c?1:0:l.major!==n.major?l.major-n.major:l.minor!==n.minor?l.minor-n.minor:l.patch!==n.patch?l.patch-n.patch:de(l.pre,n.pre)}var ge=/^[a-z]+[+:-]/i;function k(s,c){if(c===!1||c==null||c==="")return!0;let l=String(c).trim();return!l||l==="*"||l==="latest"||ge.test(l)?!0:l.split("||").some(n=>he(s,n.trim()))}function he(s,c){if(!c||c==="*")return!L(s)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!k(s,`>=${y}`)||!k(s,`<=${w}`))}let n=L(s);if(!n)return!1;let g=ye(c);if(g===null)return!0;for(let y of g)if(!be(n,s,y))return!1;return!(n.pre.length>0&&!g.some(y=>y.ver.pre.length>0)&&!g.some(w=>w.ver.major===n.major&&w.ver.minor===n.minor&&w.ver.patch===n.patch))}function ye(s){let c=[],l=s.trim().split(/\s+/).filter(Boolean);if(l.length===0)return null;for(let n of l){let g=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(n);if(!g)return null;let y=g[1],w=g[2],b=Se(y,w);if(b===null)return null;c.push(...b)}return c}function Se(s,c){let l=Ee(c);if(!l)return null;let{ver:n,partial:g}=l;switch(s){case"^":{let y=Re(n);return y?[{op:">=",ver:n},{op:"<",ver:y}]:null}case"~":{let y=g>=2?{major:n.major,minor:n.minor+1,patch:0,pre:[]}:{major:n.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:n},{op:"<",ver:y}]}case">=":return[{op:">=",ver:n}];case">":return g===1?[{op:">=",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:">",ver:n}];case"<":return g===1?[{op:"<",ver:{major:n.major,minor:0,patch:0,pre:[]}}]:g===2?[{op:"<",ver:{major:n.major,minor:n.minor,patch:0,pre:[]}}]:[{op:"<",ver:n}];case"<=":return[{op:"<=",ver:n}];case"=":case void 0:return g===1?[{op:">=",ver:n},{op:"<",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:n},{op:"<",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:n}];default:return null}}function Re(s){return s.major>0?{major:s.major+1,minor:0,patch:0,pre:[]}:s.minor>0?{major:0,minor:s.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:s.patch+1,pre:[]}}function Ee(s){let c=s.replace(/^v/,"").trim();if(!c||c==="*"||c==="x"||c==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let l=c.split("."),n=[],g=0;for(let b of l.slice(0,3))if(/^\d+$/.test(b))n.push(Number(b)),g++;else{if(b==="x"||b==="X"||b==="*")break;break}let y=c.split("-"),w=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return g===0&&w.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:n[0]??0,minor:n[1]??0,patch:n[2]??0,pre:w},partial:g}}function we(s,c){switch(c){case">=":return s>=0;case">":return s>0;case"<":return s<0;case"<=":return s<=0;case"=":return s===0}}function be(s,c,l){let n=`${s.major}.${s.minor}.${s.patch}`+(s.pre.length?`-${s.pre.join(".")}`:"");if(l.upper)return!(!(x(n,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:""))>=0)||!(x(n,`${l.upper.major}.${l.upper.minor}.${l.upper.patch}`)<0));let g=x(n,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=we(g,l.op);return l.ver.pre.length>0&&s.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,n){super(`[fulgurjs:${c}] ${l}`),this.name="FgError",this.code=c,this.details=n}},R={REMOTE_LOAD_FAILED:"MFU-001",REMOTE_NAME_MISMATCH:"MFU-002",SHARE_STRICT_VERSION:"MFU-003",SHARE_NOT_AVAILABLE:"MFU-004",CONTAINER_REINIT_CONFLICT:"MFU-005",MODULE_NOT_EXPOSED:"MFU-006",PRELOAD_FAILED:"MFU-007",REMOTE_UNKNOWN:"MFU-008",EMPTY_EXPORTS:"MFU-009",SINGLETON_SKEW:"MFU-010",SETUP_INVALID_EXPORT:"MFU-011",SETUP_RUN_FAILED:"MFU-012",SETUP_SESSION_KEY_MISSING:"MFU-013",SETUP_RECURSION:"MFU-014"};var J="4.3.0";var Pe="__fulgurjsSetup",_e="__FULGURJS_APP_CONFIG__",D=15e3,B=2,ve=5,Me=3e4,$e=4e3,xe=.2;function Ie(){let s=Object.create(null),c=new Map,l=[],n=new Map,g=new Map,y=new WeakMap,w=new WeakMap,b={},T=()=>{for(let e of l)try{e.init?.(b)}catch(r){console.warn("[fulgurjs] runtimePlugin init failed:",e.name,r)}},U=new Map,j,Y=e=>{let r=U.get(e);return r||U.set(e,r={}),r},V=()=>globalThis[_e]??{};async function K(e,r,t,o){let a=u=>u instanceof S?u:new S(R.SETUP_RUN_FAILED,`${o} of "${e}" threw: ${String(u?.message??u)}
2
- \u4FEE\u6CD5: \u4FEE\u590D\u8BE5 ${o} \u7684\u521D\u59CB\u5316\u903B\u8F91\u540E\u91CD\u65B0\u52A0\u8F7D\uFF08\u5931\u8D25\u7684\u521D\u59CB\u5316\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u76F4\u63A5\u91CD\u8BD5\uFF09`,{remote:e,phase:o});j=e;let i;try{i=r(t)}catch(u){throw a(u)}finally{j=void 0}try{await i}catch(u){throw a(u)}}async function Z(e,r,t,o){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let a=await r.get(t),i=a?.default;if(typeof i!="function")throw new S(R.SETUP_INVALID_EXPORT,`setup module "${t}" of "${e.name}": default export is ${a==null?String(a):typeof i}, expected a function
3
- expected: export default async function setup(context: RemoteSetupContext) { ... }
4
- \u4FEE\u6CD5: \u5728 federation({ setup }) \u6307\u5411\u7684\u6587\u4EF6\u8865\u9ED8\u8BA4\u5BFC\u51FA\u51FD\u6570\uFF08\u5177\u540D onSession \u53EF\u9009\uFF1B\u5176\u4ED6\u5BFC\u51FA\u4E0D\u4F5C\u4E3A\u751F\u547D\u5468\u671F\u5165\u53E3\uFF09`,{remote:e.name,module:t});if(a.onSession!==void 0&&typeof a.onSession!="function")throw new S(R.SETUP_INVALID_EXPORT,`setup module "${t}" of "${e.name}": export "onSession" is ${typeof a.onSession}, expected a function
5
- \u4FEE\u6CD5: \u5C06 onSession \u4FEE\u6B63\u4E3A\u51FD\u6570\u5BFC\u51FA\uFF0C\u6216\u5220\u9664\u8BE5\u5177\u540D\u5BFC\u51FA\uFF08\u5176\u4ED6\u5BFC\u51FA\u540D\u4E0D\u4F5C\u4E3A\u751F\u547D\u5468\u671F\u5165\u53E3\uFF09`,{remote:e.name,module:t});o.setupExports=a,await K(e.name,i,{appContext:V(),signal:(o.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(a){throw e.debug.setup="failed",o.setupExports=void 0,a}}async function Q(e,r,t){let o=V(),a=o?.sessionKey;if(typeof a!="string"||a==="")throw new S(R.SETUP_SESSION_KEY_MISSING,`remote "${e.name}" declares onSession but AppContext.sessionKey is ${a===void 0?"missing":JSON.stringify(a)}
6
- expected: \u5BBF\u4E3B\u767B\u5F55\u540E provideAppContext({ ..., sessionKey: '<\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID>' })
7
- \u4FEE\u6CD5: \u5BBF\u4E3B\u767B\u5F55\u6D41\u7A0B\u6BCF\u6B21\u6210\u529F\u767B\u5F55/\u91CD\u767B\u751F\u6210\u65B0\u4EE3\u6B21 ID\uFF08\u7981\u6B62\u7528 token \u5145\u5F53\uFF09\uFF0C\u5E76\u5728 loadRemote \u524D\u63D0\u4F9B`,{remote:e.name});if(r.sessionPromise&&r.sessionKey===a)return r.sessionPromise;r.controller?.abort();let i=new AbortController;r.controller=i,r.sessionKey=a;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!i.signal.aborted&&await K(e.name,t,{appContext:o,sessionKey:a,signal:i.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===a&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),p}async function ee(e,r){let t=r?.[Pe];if(typeof t!="string"||t==="")return;let o=Y(e.name);o.setupPromise||(o.setupPromise=Z(e,r,t,o).catch(i=>{throw o.setupPromise=void 0,i})),await o.setupPromise;let a=o.setupExports?.onSession;typeof a=="function"&&await Q(e,o,a)}function re(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>s[e]??=Object.create(null);function _(e){try{b.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function te(e="default"){return A(e),s}function ne(e,r,t,o,a={}){let i=A(e||"default"),u=Object.hasOwn(i,r)?i[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),i[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:o,from:a.from??"unknown",eager:!!a.eager,loaded:!!a.loaded})}function oe(e){let r=(t,o,a)=>{if(t===void 0)return;if(!(typeof t=="number"&&(a?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] registerRemote("${e.name}"): ${o} must be a ${a?"integer 0..10":"finite positive number"}, got ${String(t)}`)};r(e.timeout,"timeout"),r(e.retries,"retries",!0),e.breaker&&(r(e.breaker.threshold,"breaker.threshold"),r(e.breaker.resetMs,"breaker.resetMs"))}function H(e){for(let r of e){oe(r);let t=c.get(r.name);c.set(r.name,{timeout:D,retries:B,...t,...r,breakerThreshold:r.breaker?.threshold??t?.breakerThreshold??ve,breakerResetMs:r.breaker?.resetMs??t?.breakerResetMs??Me,state:t?.state??"idle",breakerState:t?.breakerState??{fails:0,openUntil:0},entryInflight:t?.entryInflight??new Map,debug:t?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function ie(e){H([e])}function se(e){l.push(...e),T()}async function ae(e,r={}){let t=r.shareScope||"default",o=r.shareKey||e,i=A(t)[o]||{},u=Object.keys(i),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||k(f,p)),d;if(r.singleton&&u.length>0){let f=u.filter(m=>i[m].loaded);if(d=[...f.length?f:u].sort(x).pop(),u.length>1||!h.includes(d)){let m=i[d],$=`singleton skew "${o}": req "${p??"any"}" use ${d} from ${m.from}`;if(r.strictVersion){let v=new S(R.SHARE_STRICT_VERSION,$,{shareKey:o,requiredVersion:p});throw _({remote:m.from,error:v}),v}console.warn(`[fulgurjs:MFU-010] ${$}`)}}else if(d=[...h].sort(x).pop(),!d){if(r.strictVersion){let m=new S(R.SHARE_STRICT_VERSION,`no satisfying version for "${o}" (required "${p}") in share scope "${t}"`);throw _({remote:o,error:m}),m}if(r.fallback)return r.fallback();let f=new S(R.SHARE_NOT_AVAILABLE,`shared "${o}" (${p??"any"}) unavailable in scope "${t}" (no local fallback)`,{shareKey:o,requiredVersion:p});throw _({remote:o,error:f}),f}let E=i[d];if(b.resolveShare){let f=await b.resolveShare({shareKey:o,shareScope:t,requiredVersion:p,picked:E,available:Object.values(i)});f&&(E=f)}return E.loaded=!0,E.get()}function ce(e){try{let r=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return r.protocol+"//"+r.host+r.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function q(e,r,t){return new Promise((o,a)=>{let i=setTimeout(()=>a(new Error(`timeout after ${r}ms: ${t}`)),r);e.then(u=>{clearTimeout(i),o(u)},u=>{clearTimeout(i),a(u)})})}let le=e=>new Promise(r=>setTimeout(r,e));function N(e,r){if(!e||typeof e.get!="function")throw new Error(`remoteEntry of "${r.name}" does not export a container interface (get/init)`);if(e.name&&r.name&&e.name!==r.name){let t=`remoteEntry self-reported name "${e.name}" mismatches configured name "${r.name}"`;if(r.promise)console.warn(`[fulgurjs] ${t} (promise-based remote, continuing)`);else throw Object.assign(new Error(t),{code:R.REMOTE_NAME_MISMATCH})}}async function G(e,r){let t=r.entryInflight.get(e),o=t??import(e);return t||(r.entryInflight.set(e,o),o.catch(()=>r.entryInflight.delete(e))),q(o,r.timeout??D,`load remoteEntry ${e}`)}async function X(e,r){let t=e.shareScope||"default";if(e.container){let i=w.get(e.container);if(i&&i!==t)throw new S(R.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${i}", cannot re-init with "${t}"`);return e.container}if(e.containerPromise)return e.containerPromise;let o=e.breakerState;if(o.openUntil>Date.now()){let i=new S(R.REMOTE_LOAD_FAILED,`circuit breaker open for remote "${e.name}" until ${new Date(o.openUntil).toISOString()}`,{remote:e.name});throw _({remote:e.name,error:i}),i}e.state="loading",e.debug.status="loading";let a=(async()=>{let i=[];if(e.promise)i.push(async()=>{let f=await q(e.promise(),e.timeout??D,`resolve promise remote "${e.name}"`),m=typeof f=="string"?await G(f,e):f;return N(m,e),m});else for(let f of[e.entry,...e.fallback??[]])i.push(async()=>{let m=await G(f,e);return N(m,e),m});let u,p,h=!1,d=r?.retries??e.retries??B;for(let f of i){for(let m=0;m<=d;m++){let $=performance.now();try{u=await f(),e.lastLoadMs=Math.round(performance.now()-$),e.debug.lastLoadMs=e.lastLoadMs,h=!0;break}catch(v){if(p=v,v?.code)throw v;m<d&&await le(Math.min($e,200*2**m)*(1-xe*(1-2*Math.random())))}}if(h)break}if(!h||!u){let f=ce(e.entry),m=[];throw/^https?:\/\//.test(e.entry)&&typeof location<"u"?(m.push(`1. is the remote dev server running? open ${f} in a browser \u2014 it must return JS, not HTML`),m.push("2. is the URL correct in federation({ remotes })? dev/prod entries can differ"),m.push("3. CORS: the remote dev server must allow cross-origin requests (check its server.cors)")):(m.push(`1. is the remote deployed? open ${f} in a browser \u2014 it must return JS`),m.push("2. NGINX/CDN routing: the entry path must serve the remoteEntry JS (check try_files)")),new S(R.REMOTE_LOAD_FAILED,`failed to load remote "${e.name}" from ${f}: ${String(p?.message??p)}
8
- `+m.join(`
9
- `),{remote:e.name})}N(u,e);let E=w.get(u);if(E&&E!==t)throw new S(R.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${E}", cannot re-init with "${t}"`);return typeof u.init=="function"&&await u.init(s),w.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",o.fails=0,u})();e.containerPromise=a;try{return await a}catch(i){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(i?.message??i),o.fails+=1,o.fails>=e.breakerThreshold&&(o.openUntil=Date.now()+e.breakerResetMs,o.fails=0),i instanceof S)throw _({remote:e.name,error:i}),i;if(i?.code)throw _({remote:e.name,error:i}),i;let u=new S(R.REMOTE_LOAD_FAILED,String(i?.message??i),{remote:e.name});throw _({remote:e.name,error:u}),u}}function C(e){let r=e.indexOf("/");return r===-1?{remote:e,module:""}:{remote:e.slice(0,r),module:z(e.slice(r+1))}}function z(e){return e?e.startsWith(".")?e:`./${e}`:""}async function ue(e,r){let{remote:t,module:o}=C(e);if(o&&j===t)throw new S(R.SETUP_RECURSION,`loadRemote("${e}") re-entered from setup/onSession of "${t}" \u2014 the initialization promise would await itself (deadlock)
10
- \u4FEE\u6CD5: setup/onSession \u5185\u4E0D loadRemote \u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u9700\u8981\u7684\u4E1A\u52A1\u6A21\u5757\u6539\u4E3A\u5728\u9875\u9762\u7EC4\u4EF6\u5185\u52A0\u8F7D\uFF0C\u6216\u7ECF context \u901A\u9053\u89E3\u8026`,{remote:t});try{b.beforeLoadRemote?.({remote:t,module:o})}catch(h){console.warn("[fulgurjs] beforeLoadRemote hook error (ignored):",h)}let a=c.get(t);if(!a)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${t}". Register it via federation({ remotes }) or registerRemote().`,{remote:t});let i;try{let h=o&&a.manifestUrl?F(e):Promise.resolve();[i]=await Promise.all([X(a,{retries:r?.retries}),h])}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}if(!o)return i;await ee(a,i);let u=`${t}@${a.shareScope||"default"}#${o}`;n.has(u)||n.set(u,i.get(o).catch(h=>{throw n.delete(u),h instanceof S||h?.code?h:new S(R.REMOTE_LOAD_FAILED,`failed to load module "${o}" from remote "${t}": ${String(h?.message??h)}`,{remote:t,module:o})}));let p;try{p=await n.get(u)}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}try{b.afterLoadRemote?.({remote:t,module:o,module_ns:p})}catch(h){console.warn("[fulgurjs] afterLoadRemote hook error (ignored):",h)}if(p&&typeof p=="object"&&Object.keys(p).length===0){let h=new S(R.EMPTY_EXPORTS,`no exports: ${o} @ ${t}`,{remote:t,module:o});_({remote:t,error:h}),console.error(`[fulgurjs:MFU-009] ${h.message}`)}return p}function fe(e){let r=c.get(e);if(!r)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${e}"`,{remote:e});return X(r)}async function F(e,r={}){let{remote:t,module:o}=C(e),a=c.get(t);if(!a)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${t}"`,{remote:t});let i=r.mode??"preload",u=(d,E)=>{if(d.sheet)return Promise.resolve();let f=y.get(d);if(f)return f;let m=new Promise($=>{let v=()=>{d.removeEventListener("load",v),d.removeEventListener("error",I),$()},I=()=>{_({remote:t,error:new S(R.PRELOAD_FAILED,`failed to load remote stylesheet ${E}`,{remote:t})}),v()};d.addEventListener("load",v,{once:!0}),d.addEventListener("error",I,{once:!0}),d.sheet&&v()});return y.set(d,m),m},p=(d,E)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${d}"]`);if(f)return E==="style"&&i==="preload"?y.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=E==="style"?"stylesheet":"modulepreload",m.href=d,i==="prefetch"&&(m.fetchPriority="low");let $=E==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),E==="style"&&i==="preload"?$:Promise.resolve()},h=d=>{let E=typeof document<"u"?document.baseURI:void 0,f=new URL(a.entry,E||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(d,f).href};try{if(a.manifestUrl){let d=g.get(a.manifestUrl);d||(d=fetch(a.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),g.set(a.manifestUrl,d),d.then(f=>{f||g.delete(a.manifestUrl)},()=>g.delete(a.manifestUrl)));let E=await d;if(E){let f=E.schemaVersion;if(typeof f=="number"&&(!Number.isInteger(f)||f>1)){_({remote:t,error:new S(R.PRELOAD_FAILED,`unsupported manifest schemaVersion ${String(f)} (expected 1)`,{remote:t})}),await p(a.entry,"modulepreload");return}await p(a.entry,"modulepreload");let m=E.exposes,$=Array.isArray(m)?m.filter(M=>M&&typeof M=="object").map(M=>[String(M.name??""),M]):m&&typeof m=="object"?Object.entries(m):[],v=o?$.filter(([M,O])=>z(String(O?.name??M))===o):$,I=[];for(let[,M]of v)if(typeof M?.file=="string"&&await p(h(M.file),"modulepreload"),Array.isArray(M?.css))for(let O of M.css){if(typeof O!="string")continue;let me=p(h(O),"style");i==="preload"&&I.push(me)}await Promise.all(I);return}}await p(a.entry,"modulepreload")}catch(d){_({remote:t,error:new S(R.PRELOAD_FAILED,String(d?.message??d),{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=s,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:s,initSharing:te,registerShare:ne,registerRemotes:H,registerRemote:ie,registerPlugins:se,loadShare:ae,loadRemote:ue,getContainer:fe,preloadRemote:F,parseSpec:C,clearSessionState:re}}var W=globalThis,P=W.__FULGURJS_RUNTIME__??Ie();W.__FULGURJS_RUNTIME__=P;try{Object.freeze(P)}catch{}var Ne=J;function Ce(){return P}var Fe=P.initSharing,De=P.registerShare,Ve=P.registerRemotes,Ke=P.registerRemote,He=P.registerPlugins,qe=P.loadShare,Ge=P.loadRemote,Xe=P.getContainer,ze=P.preloadRemote,Je=P.parseSpec,Be=P.clearSessionState,We=P.shareScopeMap;function Ye(s){if(s&&typeof s=="object"&&"default"in s){let c=s.default;return c!==void 0?c:s}return s}var Ze=P;export{Be as clearSessionState,Ze as default,Xe as getContainer,Ce as getRuntime,Fe as initSharing,Ge as loadRemote,qe as loadShare,Je as parseSpec,ze as preloadRemote,He as registerPlugins,Ke as registerRemote,Ve as registerRemotes,De as registerShare,P as runtime,We as shareScopeMap,Ye as unwrapDefault,Ne as version};
1
+ var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(i){let c=de.exec(String(i).trim());return c?{major:Number(c[1]),minor:Number(c[2]??0),patch:Number(c[3]??0),pre:c[4]?c[4].split("."):[]}:null}function ge(i,c){if(i.length===0&&c.length===0)return 0;if(i.length===0)return 1;if(c.length===0)return-1;let l=Math.max(i.length,c.length);for(let o=0;o<l;o++){let g=i[o],y=c[o];if(g===void 0)return-1;if(y===void 0)return 1;let w=/^\d+$/.test(g),b=/^\d+$/.test(y);if(w&&b){let I=Number(g)-Number(y);if(I!==0)return I}else{if(w!==b)return w?-1:1;if(g!==y)return g<y?-1:1}}return 0}function O(i,c){let l=L(i),o=L(c);return!l||!o?i<c?-1:i>c?1:0:l.major!==o.major?l.major-o.major:l.minor!==o.minor?l.minor-o.minor:l.patch!==o.patch?l.patch-o.patch:ge(l.pre,o.pre)}var he=/^[a-z]+[+:-]/i;function j(i,c){if(c===!1||c==null||c==="")return!0;let l=String(c).trim();return!l||l==="*"||l==="latest"||he.test(l)?!0:l.split("||").some(o=>ye(i,o.trim()))}function ye(i,c){if(!c||c==="*")return!L(i)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!j(i,`>=${y}`)||!j(i,`<=${w}`))}let o=L(i);if(!o)return!1;let g=Se(c);if(g===null)return!0;for(let y of g)if(!Pe(o,i,y))return!1;return!(o.pre.length>0&&!g.some(y=>y.ver.pre.length>0)&&!g.some(w=>w.ver.major===o.major&&w.ver.minor===o.minor&&w.ver.patch===o.patch))}function Se(i){let c=[],l=i.trim().split(/\s+/).filter(Boolean);if(l.length===0)return null;for(let o of l){let g=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(o);if(!g)return null;let y=g[1],w=g[2],b=Ee(y,w);if(b===null)return null;c.push(...b)}return c}function Ee(i,c){let l=we(c);if(!l)return null;let{ver:o,partial:g}=l;switch(i){case"^":{let y=Re(o);return y?[{op:">=",ver:o},{op:"<",ver:y}]:null}case"~":{let y=g>=2?{major:o.major,minor:o.minor+1,patch:0,pre:[]}:{major:o.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:o},{op:"<",ver:y}]}case">=":return[{op:">=",ver:o}];case">":return g===1?[{op:">=",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:">",ver:o}];case"<":return g===1?[{op:"<",ver:{major:o.major,minor:0,patch:0,pre:[]}}]:g===2?[{op:"<",ver:{major:o.major,minor:o.minor,patch:0,pre:[]}}]:[{op:"<",ver:o}];case"<=":return[{op:"<=",ver:o}];case"=":case void 0:return g===1?[{op:">=",ver:o},{op:"<",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:o},{op:"<",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:o}];default:return null}}function Re(i){return i.major>0?{major:i.major+1,minor:0,patch:0,pre:[]}:i.minor>0?{major:0,minor:i.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:i.patch+1,pre:[]}}function we(i){let c=i.replace(/^v/,"").trim();if(!c||c==="*"||c==="x"||c==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let l=c.split("."),o=[],g=0;for(let b of l.slice(0,3))if(/^\d+$/.test(b))o.push(Number(b)),g++;else{if(b==="x"||b==="X"||b==="*")break;break}let y=c.split("-"),w=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return g===0&&w.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:o[0]??0,minor:o[1]??0,patch:o[2]??0,pre:w},partial:g}}function be(i,c){switch(c){case">=":return i>=0;case">":return i>0;case"<":return i<0;case"<=":return i<=0;case"=":return i===0}}function Pe(i,c,l){let o=`${i.major}.${i.minor}.${i.patch}`+(i.pre.length?`-${i.pre.join(".")}`:"");if(l.upper)return!(!(O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:""))>=0)||!(O(o,`${l.upper.major}.${l.upper.minor}.${l.upper.patch}`)<0));let g=O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=be(g,l.op);return l.ver.pre.length>0&&i.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,o){super(`[fulgurjs:${c}] ${l}`),this.name="FgError",this.code=c,this.details=o}},E={REMOTE_LOAD_FAILED:"MFU-001",REMOTE_NAME_MISMATCH:"MFU-002",SHARE_STRICT_VERSION:"MFU-003",SHARE_NOT_AVAILABLE:"MFU-004",CONTAINER_REINIT_CONFLICT:"MFU-005",MODULE_NOT_EXPOSED:"MFU-006",PRELOAD_FAILED:"MFU-007",REMOTE_UNKNOWN:"MFU-008",EMPTY_EXPORTS:"MFU-009",SINGLETON_SKEW:"MFU-010",SETUP_INVALID_EXPORT:"MFU-011",SETUP_RUN_FAILED:"MFU-012",SETUP_SESSION_KEY_MISSING:"MFU-013",SETUP_RECURSION:"MFU-014"};var W="4.3.1";var _e="__fulgurjsSetup",$e="__FULGURJS_APP_CONFIG__",D=15e3,z=2,Me=5,ve=3e4,Ie=4e3,Te=.2;function Oe(){let i=Object.create(null),c=new Map,l=[],o=new Set,g=new Map,y=new Map,w=new WeakMap,b=new WeakMap,I={},Z=()=>{for(let e of l)try{e.init?.(I)}catch(r){console.warn("[fulgurjs] \u8FD0\u884C\u65F6\u6269\u5C55\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BE5\u6269\u5C55\u5C06\u4E0D\u53EF\u7528\uFF1A",e.name,r)}},k=new Map,A,Q=e=>{let r=k.get(e);return r||k.set(e,r={}),r},V=()=>globalThis[$e]??{};async function K(e,r,t,n){let a=u=>u instanceof S?u:new S(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${n} \u521D\u59CB\u5316\u5931\u8D25\u3002
2
+ \u539F\u56E0\uFF1A${String(u?.message??u)}
3
+ \u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${n} \u51FD\u6570\u540E\u91CD\u65B0\u52A0\u8F7D\uFF1B\u5931\u8D25\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u4EE5\u76F4\u63A5\u91CD\u8BD5\u3002`,{remote:e,phase:n});A=e;let s;try{s=r(t)}catch(u){throw a(u)}finally{A=void 0}try{await s}catch(u){throw a(u)}}async function ee(e,r,t,n){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let a=await r.get(t),s=a?.default;if(typeof s!="function")throw new S(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${t}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
4
+ \u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${a==null?String(a):typeof s}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
5
+ \u4FEE\u6CD5\uFF1A\u5728 setup \u6307\u5411\u7684\u6587\u4EF6\u4E2D\u9ED8\u8BA4\u5BFC\u51FA\u51FD\u6570\uFF0C\u4F8B\u5982 export default async function setup(context) { ... }\uFF1B\u5177\u540D onSession \u53EF\u9009\u3002`,{remote:e.name,module:t});if(a.onSession!==void 0&&typeof a.onSession!="function")throw new S(E.SETUP_INVALID_EXPORT,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 setup \u6A21\u5757 "${t}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
6
+ \u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof a.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
7
+ \u4FEE\u6CD5\uFF1A\u5C06 onSession \u6539\u4E3A\u5177\u540D\u5BFC\u51FA\u7684\u51FD\u6570\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,{remote:e.name,module:t});n.setupExports=a,await K(e.name,s,{appContext:V(),signal:(n.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(a){throw e.debug.setup="failed",n.setupExports=void 0,a}}async function re(e,r,t){let n=V(),a=n?.sessionKey;if(typeof a!="string"||a==="")throw new S(E.SETUP_SESSION_KEY_MISSING,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u58F0\u660E\u4E86 onSession\uFF0C\u4F46\u5BBF\u4E3B\u5C1A\u672A\u63D0\u4F9B\u6709\u6548\u7684 AppContext.sessionKey\u3002
8
+ \u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${a===void 0?"\u7F3A\u5931":JSON.stringify(a)}\u3002
9
+ \u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u6BCF\u6B21\u767B\u5F55\u6216\u91CD\u767B\u65F6\u751F\u6210\u65B0\u7684\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID\uFF0C\u5E76\u5728\u52A0\u8F7D\u8FDC\u7A0B\u9875\u9762\u524D\u8C03\u7528 provideAppContext({ ..., sessionKey: '\u767B\u5F55\u4EE3\u6B21 ID' })\uFF1B\u4E0D\u8981\u4F7F\u7528 token \u539F\u6587\u3002`,{remote:e.name});if(r.sessionPromise&&r.sessionKey===a)return r.sessionPromise;r.controller?.abort();let s=new AbortController;r.controller=s,r.sessionKey=a;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!s.signal.aborted&&await K(e.name,t,{appContext:n,sessionKey:a,signal:s.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===a&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),p}async function te(e,r){let t=r?.[_e];if(typeof t!="string"||t==="")return;let n=Q(e.name);n.setupPromise||(n.setupPromise=ee(e,r,t,n).catch(s=>{throw n.setupPromise=void 0,s})),await n.setupPromise;let a=n.setupExports?.onSession;typeof a=="function"&&await re(e,n,a)}function ne(){for(let e of k.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let U=e=>i[e]??=Object.create(null);function _(e){try{I.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function oe(e="default"){return U(e),i}function se(e,r,t,n,a={}){let s=U(e||"default"),u=Object.hasOwn(s,r)?s[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),s[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:n,from:a.from??"unknown",eager:!!a.eager,loaded:!!a.loaded})}function ie(e){let r=(t,n,a)=>{if(t===void 0)return;if(!(typeof t=="number"&&(a?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${n} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${a?" 0 \u5230 10 \u7684\u6574\u6570":"\u5927\u4E8E 0 \u7684\u6709\u9650\u6570\u5B57"}\u3002\u8BF7\u4FEE\u6B63 registerRemote \u914D\u7F6E\u3002`)};r(e.timeout,"timeout"),r(e.retries,"retries",!0),e.breaker&&(r(e.breaker.threshold,"breaker.threshold"),r(e.breaker.resetMs,"breaker.resetMs"))}function H(e){for(let r of e){ie(r);let t=c.get(r.name);c.set(r.name,{timeout:D,retries:z,...t,...r,breakerThreshold:r.breaker?.threshold??t?.breakerThreshold??Me,breakerResetMs:r.breaker?.resetMs??t?.breakerResetMs??ve,state:t?.state??"idle",breakerState:t?.breakerState??{fails:0,openUntil:0},entryInflight:t?.entryInflight??new Map,debug:t?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function ae(e){H([e])}function ce(e){l.push(...e),Z()}async function le(e,r={}){let t=r.shareScope||"default",n=r.shareKey||e,s=U(t)[n]||{},u=Object.keys(s),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||j(f,p)),d;if(r.singleton&&u.length>0){let f=u.filter(m=>s[m].loaded);if(d=[...f.length?f:u].sort(O).pop(),!h.includes(d)){let m=s[d],v=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${n}" \u7684\u5B9E\u9645\u7248\u672C\u4E0D\u6EE1\u8DB3\u5F53\u524D\u5E94\u7528\u8981\u6C42\u3002
10
+ \u539F\u56E0\uFF1A\u5E94\u7528\u8981\u6C42 ${p??"\u4EFB\u610F\u7248\u672C"}\uFF0C\u4F5C\u7528\u57DF\u4E2D\u6709 ${u.join("\u3001")}\uFF1B\u4E3A\u4FDD\u8BC1\u5168\u9875\u53EA\u4F7F\u7528\u4E00\u4E2A\u5B9E\u4F8B\uFF0C\u6700\u7EC8\u590D\u7528 ${m.from} \u63D0\u4F9B\u7684 ${d}\u3002
11
+ \u5F71\u54CD\uFF1A\u53EF\u80FD\u51FA\u73B0\u72B6\u6001\u4E0D\u4E00\u81F4\u6216\u8FD0\u884C\u9519\u8BEF\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u4E24\u7AEF API \u662F\u5426\u517C\u5BB9\u3002
12
+ \u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u6838\u5BF9\u540E\u8C03\u6574 shared.requiredVersion\uFF1B\u82E5\u5FC5\u987B\u62D2\u7EDD\u4E0D\u517C\u5BB9\u7248\u672C\uFF0C\u8BF7\u542F\u7528 strictVersion\u3002`;if(r.strictVersion){let T=new S(E.SHARE_STRICT_VERSION,v,{shareKey:n,requiredVersion:p});throw _({remote:m.from,error:T}),T}let $=`${t}|${n}|${p??"*"}|${d}|${u.join(",")}`;o.has($)||(o.add($),console.warn(`[fulgurjs:MFU-010] ${v}`))}}else if(d=[...h].sort(O).pop(),!d){if(r.strictVersion){let m=new S(E.SHARE_STRICT_VERSION,`\u73B0\u8C61\uFF1A\u5171\u4EAB\u4F5C\u7528\u57DF "${t}" \u4E2D\u627E\u4E0D\u5230\u7B26\u5408\u8981\u6C42\u7684 "${n}"\u3002
13
+ \u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${p}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${u.join("\u3001")||"\u65E0"}\u3002
14
+ \u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`);throw _({remote:n,error:m}),m}if(r.fallback)return r.fallback();let f=new S(E.SHARE_NOT_AVAILABLE,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u52A0\u8F7D\u5171\u4EAB\u4F9D\u8D56 "${n}"\u3002
15
+ \u539F\u56E0\uFF1A\u4F5C\u7528\u57DF "${t}" \u4E2D\u6CA1\u6709\u7B26\u5408 ${p??"\u4EFB\u610F\u7248\u672C"} \u8981\u6C42\u7684\u7248\u672C\uFF0C\u4E14\u672A\u914D\u7F6E\u672C\u5730\u526F\u672C\u3002
16
+ \u4FEE\u6CD5\uFF1A\u5728\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u6CE8\u518C\u8BE5\u4F9D\u8D56\uFF0C\u6216\u4E3A shared \u914D\u7F6E\u53EF\u7528\u7684\u672C\u5730\u526F\u672C\u3002`,{shareKey:n,requiredVersion:p});throw _({remote:n,error:f}),f}let R=s[d];if(I.resolveShare){let f=await I.resolveShare({shareKey:n,shareScope:t,requiredVersion:p,picked:R,available:Object.values(s)});f&&(R=f)}return R.loaded=!0,R.get()}function q(e){try{let r=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return r.protocol+"//"+r.host+r.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function G(e,r,t){return new Promise((n,a)=>{let s=setTimeout(()=>a(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${t}`)),r);e.then(u=>{clearTimeout(s),n(u)},u=>{clearTimeout(s),a(u)})})}let ue=e=>new Promise(r=>setTimeout(r,e));function N(e,r){if(!e||typeof e.get!="function")throw new Error(`\u8FDC\u7A0B\u5E94\u7528 "${r.name}" \u7684 remoteEntry \u672A\u5BFC\u51FA\u5BB9\u5668\u63A5\u53E3\u3002\u8BF7\u786E\u8BA4\u5165\u53E3\u5BFC\u51FA\u4E86 get()\uFF0C\u5E76\u68C0\u67E5\u8BE5\u5730\u5740\u662F\u5426\u8FD4\u56DE\u6B63\u786E\u7684\u8054\u90A6\u5165\u53E3 JS\u3002`);if(e.name&&r.name&&e.name!==r.name){let t=`\u8FDC\u7A0B\u5165\u53E3\u81EA\u62A5\u540D\u79F0 "${e.name}" \u4E0E\u5BBF\u4E3B\u914D\u7F6E\u540D\u79F0 "${r.name}" \u4E0D\u4E00\u81F4\u3002\u8BF7\u7EDF\u4E00\u4E24\u4FA7 federation({ name }) \u4E0E remotes \u7684\u540D\u79F0\u3002`;if(r.promise)console.warn(`[fulgurjs] ${t} \u5F53\u524D\u662F\u52A8\u6001 Promise \u8FDC\u7A0B\uFF0C\u7EE7\u7EED\u52A0\u8F7D\u3002`);else throw Object.assign(new Error(t),{code:E.REMOTE_NAME_MISMATCH})}}async function J(e,r){let t=r.entryInflight.get(e),n=t??import(e);return t||(r.entryInflight.set(e,n),n.catch(()=>r.entryInflight.delete(e))),G(n,r.timeout??D,`\u52A0\u8F7D\u8FDC\u7A0B\u5165\u53E3 ${q(e)}`)}async function X(e,r){let t=e.shareScope||"default";if(e.container){let s=b.get(e.container);if(s&&s!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${s}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${t}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return e.container}if(e.containerPromise)return e.containerPromise;let n=e.breakerState;if(n.openUntil>Date.now()){let s=new S(E.REMOTE_LOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u8FDE\u7EED\u52A0\u8F7D\u5931\u8D25\uFF0C\u7194\u65AD\u5668\u5DF2\u5F00\u542F\uFF1B\u5C06\u5728 ${new Date(n.openUntil).toISOString()} \u540E\u5141\u8BB8\u91CD\u8BD5\u3002\u8BF7\u5148\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u670D\u52A1\u548C\u7F51\u7EDC\u3002`,{remote:e.name});throw _({remote:e.name,error:s}),s}e.state="loading",e.debug.status="loading";let a=(async()=>{let s=[];if(e.promise)s.push(async()=>{let f=await G(e.promise(),e.timeout??D,`\u89E3\u6790\u52A8\u6001\u8FDC\u7A0B\u5E94\u7528 "${e.name}"`),m=typeof f=="string"?await J(f,e):f;return N(m,e),m});else for(let f of[e.entry,...e.fallback??[]])s.push(async()=>{let m=await J(f,e);return N(m,e),m});let u,p,h=!1,d=r?.retries??e.retries??z;for(let f of s){for(let m=0;m<=d;m++){let v=performance.now();try{u=await f(),e.lastLoadMs=Math.round(performance.now()-v),e.debug.lastLoadMs=e.lastLoadMs,h=!0;break}catch($){if(p=$,$?.code)throw $;m<d&&await ue(Math.min(Ie,200*2**m)*(1-Te*(1-2*Math.random())))}}if(h)break}if(!h||!u){let f=q(e.entry),m=[];throw/^https?:\/\//.test(e.entry)&&typeof location<"u"?(m.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${f}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5E76\u8FD4\u56DE JS \u800C\u975E HTML\u3002`),m.push("2. \u6838\u5BF9 federation({ remotes }) \u4E2D\u7684\u5730\u5740\uFF1B\u5F00\u53D1\u548C\u751F\u4EA7\u5730\u5740\u53EF\u4EE5\u4E0D\u540C\u3002"),m.push("3. \u82E5\u8DE8\u57DF\uFF0C\u68C0\u67E5\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u7684 server.cors \u914D\u7F6E\u3002")):(m.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${f}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5E94\u7528\u5DF2\u90E8\u7F72\uFF0C\u4E14\u5165\u53E3\u8FD4\u56DE JS\u3002`),m.push("2. \u68C0\u67E5 Nginx/CDN \u7684\u5165\u53E3\u8DEF\u5F84\u6620\u5C04\uFF1B\u8BE5\u5730\u5740\u4E0D\u80FD\u56DE\u9000\u5230 index.html\u3002")),new S(E.REMOTE_LOAD_FAILED,`\u73B0\u8C61\uFF1A\u65E0\u6CD5\u4ECE ${f} \u52A0\u8F7D\u8FDC\u7A0B\u5E94\u7528 "${e.name}"\u3002
17
+ \u539F\u56E0\uFF1A${String(p?.message??p)}
18
+ \u4FEE\u6CD5\uFF1A
19
+ ${m.join(`
20
+ `)}`,{remote:e.name})}N(u,e);let R=b.get(u);if(R&&R!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${R}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${t}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`);return typeof u.init=="function"&&await u.init(i),b.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",n.fails=0,u})();e.containerPromise=a;try{return await a}catch(s){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(s?.message??s),n.fails+=1,n.fails>=e.breakerThreshold&&(n.openUntil=Date.now()+e.breakerResetMs,n.fails=0),s instanceof S)throw _({remote:e.name,error:s}),s;if(s?.code)throw _({remote:e.name,error:s}),s;let u=new S(E.REMOTE_LOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(s?.message??s)}\u3002\u8BF7\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u3001\u7F51\u7EDC\u53CA\u5171\u4EAB\u4F9D\u8D56\u3002`,{remote:e.name});throw _({remote:e.name,error:u}),u}}function C(e){let r=e.indexOf("/");return r===-1?{remote:e,module:""}:{remote:e.slice(0,r),module:B(e.slice(r+1))}}function B(e){return e?e.startsWith(".")?e:`./${e}`:""}async function fe(e,r){let{remote:t,module:n}=C(e);if(n&&A===t)throw new S(E.SETUP_RECURSION,`\u73B0\u8C61\uFF1A\u52A0\u8F7D "${e}" \u65F6\uFF0C\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684 setup/onSession \u53C8\u540C\u6B65\u52A0\u8F7D\u4E86\u81EA\u8EAB\u6A21\u5757\uFF0C\u5F62\u6210\u5FAA\u73AF\u7B49\u5F85\u3002
21
+ \u539F\u56E0\uFF1A\u521D\u59CB\u5316\u5C1A\u672A\u5B8C\u6210\uFF0C\u4E0D\u80FD\u7B49\u5F85\u81EA\u8EAB\u7684\u521D\u59CB\u5316\u7ED3\u679C\u3002
22
+ \u4FEE\u6CD5\uFF1A\u4E0D\u8981\u5728 setup/onSession \u4E2D\u52A0\u8F7D\u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u8BF7\u5728\u9875\u9762\u7EC4\u4EF6\u4E2D\u52A0\u8F7D\uFF0C\u6216\u901A\u8FC7 context \u89E3\u8026\u3002`,{remote:t});try{I.beforeLoadRemote?.({remote:t,module:n})}catch(h){console.warn("[fulgurjs] beforeLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u6A21\u5757\u52A0\u8F7D\u5C06\u7EE7\u7EED\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A",h)}let a=c.get(t);if(!a)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${t}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,{remote:t});let s;try{let h=n&&a.manifestUrl?F(e):Promise.resolve();[s]=await Promise.all([X(a,{retries:r?.retries}),h])}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${e}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}if(!n)return s;await te(a,s);let u=`${t}@${a.shareScope||"default"}#${n}`;g.has(u)||g.set(u,s.get(n).catch(h=>{throw g.delete(u),h instanceof S||h?.code?h:new S(E.REMOTE_LOAD_FAILED,`\u65E0\u6CD5\u4ECE\u8FDC\u7A0B\u5E94\u7528 "${t}" \u52A0\u8F7D\u6A21\u5757 "${n}"\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(h?.message??h)}\u3002\u8BF7\u6838\u5BF9 exposes \u952E\u548C\u8FDC\u7A0B\u6784\u5EFA\u4EA7\u7269\u3002`,{remote:t,module:n})}));let p;try{p=await g.get(u)}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${e}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}try{I.afterLoadRemote?.({remote:t,module:n,module_ns:p})}catch(h){console.warn("[fulgurjs] afterLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u5DF2\u52A0\u8F7D\u6A21\u5757\u4ECD\u53EF\u4F7F\u7528\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A",h)}if(p&&typeof p=="object"&&Object.keys(p).length===0){let h=new S(E.EMPTY_EXPORTS,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684\u6A21\u5757 "${n}" \u6CA1\u6709\u4EFB\u4F55\u5BFC\u51FA\u3002\u8BF7\u68C0\u67E5 exposes \u6307\u5411\u7684\u6587\u4EF6\u53CA\u5176 export \u58F0\u660E\u3002`,{remote:t,module:n});_({remote:t,error:h}),console.error(h.message)}return p}function me(e){let r=c.get(e);if(!r)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${e}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:e});return X(r)}async function F(e,r={}){let{remote:t,module:n}=C(e),a=c.get(t);if(!a)throw new S(E.REMOTE_UNKNOWN,`\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${t}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`,{remote:t});let s=r.mode??"preload",u=(d,R)=>{if(d.sheet)return Promise.resolve();let f=w.get(d);if(f)return f;let m=new Promise(v=>{let $=()=>{d.removeEventListener("load",$),d.removeEventListener("error",T),v()},T=()=>{_({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684\u6837\u5F0F\u8D44\u6E90\u52A0\u8F7D\u5931\u8D25\uFF1A${R}\u3002\u8BF7\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\u4EE5\u53CA\u8DE8\u57DF\u548C\u7F13\u5B58\u914D\u7F6E\u3002`,{remote:t})}),$()};d.addEventListener("load",$,{once:!0}),d.addEventListener("error",T,{once:!0}),d.sheet&&$()});return w.set(d,m),m},p=(d,R)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${d}"]`);if(f)return R==="style"&&s==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=d,s==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),R==="style"&&s==="preload"?v:Promise.resolve()},h=d=>{let R=typeof document<"u"?document.baseURI:void 0,f=new URL(a.entry,R||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(d,f).href};try{if(a.manifestUrl){let d=y.get(a.manifestUrl);d||(d=fetch(a.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(a.manifestUrl,d),d.then(f=>{f||y.delete(a.manifestUrl)},()=>y.delete(a.manifestUrl)));let R=await d;if(R){let f=R.schemaVersion;if(typeof f=="number"&&(!Number.isInteger(f)||f>1)){_({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u7684 manifest \u534F\u8BAE\u7248\u672C\u4E3A ${String(f)}\uFF0C\u5F53\u524D\u4EC5\u652F\u6301\u7248\u672C 1\u3002\u8BF7\u7EDF\u4E00\u5BBF\u4E3B\u548C\u8FDC\u7A0B\u7684\u63D2\u4EF6\u7248\u672C\u3002`,{remote:t})}),await p(a.entry,"modulepreload");return}await p(a.entry,"modulepreload");let m=R.exposes,v=Array.isArray(m)?m.filter(M=>M&&typeof M=="object").map(M=>[String(M.name??""),M]):m&&typeof m=="object"?Object.entries(m):[],$=n?v.filter(([M,x])=>B(String(x?.name??M))===n):v,T=[];for(let[,M]of $)if(typeof M?.file=="string"&&await p(h(M.file),"modulepreload"),Array.isArray(M?.css))for(let x of M.css){if(typeof x!="string")continue;let pe=p(h(x),"style");s==="preload"&&T.push(pe)}await Promise.all(T);return}}await p(a.entry,"modulepreload")}catch(d){_({remote:t,error:new S(E.PRELOAD_FAILED,`\u8FDC\u7A0B\u5E94\u7528 "${t}" \u9884\u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(d?.message??d)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`,{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=i,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:i,initSharing:oe,registerShare:se,registerRemotes:H,registerRemote:ae,registerPlugins:ce,loadShare:le,loadRemote:fe,getContainer:me,preloadRemote:F,parseSpec:C,clearSessionState:ne}}var Y=globalThis,P=Y.__FULGURJS_RUNTIME__??Oe();Y.__FULGURJS_RUNTIME__=P;try{Object.freeze(P)}catch{}var Ce=W;function Fe(){return P}var De=P.initSharing,Ve=P.registerShare,Ke=P.registerRemotes,He=P.registerRemote,qe=P.registerPlugins,Ge=P.loadShare,Je=P.loadRemote,Xe=P.getContainer,Be=P.preloadRemote,We=P.parseSpec,ze=P.clearSessionState,Ye=P.shareScopeMap;function Ze(i){if(i&&typeof i=="object"&&"default"in i){let c=i.default;return c!==void 0?c:i}return i}var Qe=P;export{ze as clearSessionState,Qe as default,Xe as getContainer,Fe as getRuntime,De as initSharing,Je as loadRemote,Ge as loadShare,We as parseSpec,Be as preloadRemote,qe as registerPlugins,He as registerRemote,Ke as registerRemotes,Ve as registerShare,P as runtime,Ye as shareScopeMap,Ze as unwrapDefault,Ce as version};
@@ -216,7 +216,7 @@ function createHostPages(options, load) {
216
216
  if (route.startsWith(prefix) || `${route}/` === prefix) return name;
217
217
  }
218
218
  throw new Error(
219
- `[fulgurjs] page route "${route}" matches none of remotePrefixes { ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
219
+ `[fulgurjs] \u9875\u9762\u8DEF\u7531 "${route}" \u672A\u5339\u914D\u4EFB\u4F55 remotePrefixes\uFF1A{ ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
220
220
  \u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
221
221
  \u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
222
222
  );
@@ -278,7 +278,7 @@ function createHostPages(options, load) {
278
278
  const inner = mod?.default ?? mod;
279
279
  if (!inner) {
280
280
  throw new Error(
281
- `[fulgurjs] remote module "${spec}" did not export a component (got ${inner === null ? "null" : typeof inner})\u3002
281
+ `[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u6CA1\u6709\u5BFC\u51FA\u53EF\u6E32\u67D3\u7EC4\u4EF6\uFF1B\u5F53\u524D\u503C\u7C7B\u578B\u4E3A ${inner === null ? "null" : typeof inner}\u3002
282
282
  \u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
283
283
  );
284
284
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createHostPages,
3
3
  createRemoteComponent
4
- } from "./chunk-AD2XIMBJ.js";
4
+ } from "./chunk-NOMYWDZN.js";
5
5
  import "./chunk-TSXZ7TWA.js";
6
6
  export {
7
7
  createHostPages,
package/dist/vue.cjs CHANGED
@@ -278,6 +278,7 @@ function createRuntime() {
278
278
  const shareScopeMap2 = /* @__PURE__ */ Object.create(null);
279
279
  const remotes = /* @__PURE__ */ new Map();
280
280
  const plugins = [];
281
+ const reportedSingletonSkews = /* @__PURE__ */ new Set();
281
282
  const loadedModules = /* @__PURE__ */ new Map();
282
283
  const remoteManifests = /* @__PURE__ */ new Map();
283
284
  const stylesheetLoads = /* @__PURE__ */ new WeakMap();
@@ -288,7 +289,7 @@ function createRuntime() {
288
289
  try {
289
290
  p.init?.(hooks);
290
291
  } catch (err) {
291
- console.warn("[fulgurjs] runtimePlugin init failed:", p.name, err);
292
+ console.warn("[fulgurjs] \u8FD0\u884C\u65F6\u6269\u5C55\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u8BE5\u6269\u5C55\u5C06\u4E0D\u53EF\u7528\uFF1A", p.name, err);
292
293
  }
293
294
  }
294
295
  };
@@ -305,8 +306,9 @@ function createRuntime() {
305
306
  if (err instanceof FgError) return err;
306
307
  return new FgError(
307
308
  ErrorCodes.SETUP_RUN_FAILED,
308
- `${phase} of "${remoteName}" threw: ${String(err?.message ?? err)}
309
- \u4FEE\u6CD5: \u4FEE\u590D\u8BE5 ${phase} \u7684\u521D\u59CB\u5316\u903B\u8F91\u540E\u91CD\u65B0\u52A0\u8F7D\uFF08\u5931\u8D25\u7684\u521D\u59CB\u5316\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u76F4\u63A5\u91CD\u8BD5\uFF09`,
309
+ `\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${remoteName}" \u7684 ${phase} \u521D\u59CB\u5316\u5931\u8D25\u3002
310
+ \u539F\u56E0\uFF1A${String(err?.message ?? err)}
311
+ \u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${phase} \u51FD\u6570\u540E\u91CD\u65B0\u52A0\u8F7D\uFF1B\u5931\u8D25\u7F13\u5B58\u5DF2\u6E05\u9664\uFF0C\u53EF\u4EE5\u76F4\u63A5\u91CD\u8BD5\u3002`,
310
312
  { remote: remoteName, phase }
311
313
  );
312
314
  };
@@ -339,17 +341,18 @@ function createRuntime() {
339
341
  if (typeof setupFn !== "function") {
340
342
  throw new FgError(
341
343
  ErrorCodes.SETUP_INVALID_EXPORT,
342
- `setup module "${setupKey}" of "${remote.name}": default export is ${mod == null ? String(mod) : typeof setupFn}, expected a function
343
- expected: export default async function setup(context: RemoteSetupContext) { ... }
344
- \u4FEE\u6CD5: \u5728 federation({ setup }) \u6307\u5411\u7684\u6587\u4EF6\u8865\u9ED8\u8BA4\u5BFC\u51FA\u51FD\u6570\uFF08\u5177\u540D onSession \u53EF\u9009\uFF1B\u5176\u4ED6\u5BFC\u51FA\u4E0D\u4F5C\u4E3A\u751F\u547D\u5468\u671F\u5165\u53E3\uFF09`,
344
+ `\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u7684 setup \u6A21\u5757 "${setupKey}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
345
+ \u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${mod == null ? String(mod) : typeof setupFn}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
346
+ \u4FEE\u6CD5\uFF1A\u5728 setup \u6307\u5411\u7684\u6587\u4EF6\u4E2D\u9ED8\u8BA4\u5BFC\u51FA\u51FD\u6570\uFF0C\u4F8B\u5982 export default async function setup(context) { ... }\uFF1B\u5177\u540D onSession \u53EF\u9009\u3002`,
345
347
  { remote: remote.name, module: setupKey }
346
348
  );
347
349
  }
348
350
  if (mod.onSession !== void 0 && typeof mod.onSession !== "function") {
349
351
  throw new FgError(
350
352
  ErrorCodes.SETUP_INVALID_EXPORT,
351
- `setup module "${setupKey}" of "${remote.name}": export "onSession" is ${typeof mod.onSession}, expected a function
352
- \u4FEE\u6CD5: \u5C06 onSession \u4FEE\u6B63\u4E3A\u51FD\u6570\u5BFC\u51FA\uFF0C\u6216\u5220\u9664\u8BE5\u5177\u540D\u5BFC\u51FA\uFF08\u5176\u4ED6\u5BFC\u51FA\u540D\u4E0D\u4F5C\u4E3A\u751F\u547D\u5468\u671F\u5165\u53E3\uFF09`,
353
+ `\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u7684 setup \u6A21\u5757 "${setupKey}" \u65E0\u6CD5\u521D\u59CB\u5316\u3002
354
+ \u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof mod.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
355
+ \u4FEE\u6CD5\uFF1A\u5C06 onSession \u6539\u4E3A\u5177\u540D\u5BFC\u51FA\u7684\u51FD\u6570\uFF0C\u6216\u5220\u9664\u8BE5\u5BFC\u51FA\u3002`,
353
356
  { remote: remote.name, module: setupKey }
354
357
  );
355
358
  }
@@ -373,9 +376,9 @@ function createRuntime() {
373
376
  if (typeof sessionKey !== "string" || sessionKey === "") {
374
377
  throw new FgError(
375
378
  ErrorCodes.SETUP_SESSION_KEY_MISSING,
376
- `remote "${remote.name}" declares onSession but AppContext.sessionKey is ${sessionKey === void 0 ? "missing" : JSON.stringify(sessionKey)}
377
- expected: \u5BBF\u4E3B\u767B\u5F55\u540E provideAppContext({ ..., sessionKey: '<\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID>' })
378
- \u4FEE\u6CD5: \u5BBF\u4E3B\u767B\u5F55\u6D41\u7A0B\u6BCF\u6B21\u6210\u529F\u767B\u5F55/\u91CD\u767B\u751F\u6210\u65B0\u4EE3\u6B21 ID\uFF08\u7981\u6B62\u7528 token \u5145\u5F53\uFF09\uFF0C\u5E76\u5728 loadRemote \u524D\u63D0\u4F9B`,
379
+ `\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u58F0\u660E\u4E86 onSession\uFF0C\u4F46\u5BBF\u4E3B\u5C1A\u672A\u63D0\u4F9B\u6709\u6548\u7684 AppContext.sessionKey\u3002
380
+ \u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${sessionKey === void 0 ? "\u7F3A\u5931" : JSON.stringify(sessionKey)}\u3002
381
+ \u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u6BCF\u6B21\u767B\u5F55\u6216\u91CD\u767B\u65F6\u751F\u6210\u65B0\u7684\u975E\u654F\u611F\u767B\u5F55\u4EE3\u6B21 ID\uFF0C\u5E76\u5728\u52A0\u8F7D\u8FDC\u7A0B\u9875\u9762\u524D\u8C03\u7528 provideAppContext({ ..., sessionKey: '\u767B\u5F55\u4EE3\u6B21 ID' })\uFF1B\u4E0D\u8981\u4F7F\u7528 token \u539F\u6587\u3002`,
379
382
  { remote: remote.name }
380
383
  );
381
384
  }
@@ -459,7 +462,7 @@ function createRuntime() {
459
462
  const ok = typeof v === "number" && (int10 ? Number.isInteger(v) && v >= 0 && v <= 10 : Number.isFinite(v) && v > 0);
460
463
  if (!ok) {
461
464
  throw new Error(
462
- `[fulgurjs] registerRemote("${r.name}"): ${name} must be a ${int10 ? "integer 0..10" : "finite positive number"}, got ${String(v)}`
465
+ `[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${r.name}" \u7684 ${name} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(v)}\uFF0C\u5E94\u4E3A${int10 ? " 0 \u5230 10 \u7684\u6574\u6570" : "\u5927\u4E8E 0 \u7684\u6709\u9650\u6570\u5B57"}\u3002\u8BF7\u4FEE\u6B63 registerRemote \u914D\u7F6E\u3002`
463
466
  );
464
467
  }
465
468
  };
@@ -510,9 +513,12 @@ function createRuntime() {
510
513
  if (opts.singleton && versions.length > 0) {
511
514
  const loadedVersions = versions.filter((v) => byName[v].loaded);
512
515
  pick = [...loadedVersions.length ? loadedVersions : versions].sort(compareVersions).pop();
513
- if (versions.length > 1 || !satisfying.includes(pick)) {
516
+ if (!satisfying.includes(pick)) {
514
517
  const entry0 = byName[pick];
515
- const msg = `singleton skew "${shareKey}": req "${req ?? "any"}" use ${pick} from ${entry0.from}`;
518
+ const msg = `\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${shareKey}" \u7684\u5B9E\u9645\u7248\u672C\u4E0D\u6EE1\u8DB3\u5F53\u524D\u5E94\u7528\u8981\u6C42\u3002
519
+ \u539F\u56E0\uFF1A\u5E94\u7528\u8981\u6C42 ${req ?? "\u4EFB\u610F\u7248\u672C"}\uFF0C\u4F5C\u7528\u57DF\u4E2D\u6709 ${versions.join("\u3001")}\uFF1B\u4E3A\u4FDD\u8BC1\u5168\u9875\u53EA\u4F7F\u7528\u4E00\u4E2A\u5B9E\u4F8B\uFF0C\u6700\u7EC8\u590D\u7528 ${entry0.from} \u63D0\u4F9B\u7684 ${pick}\u3002
520
+ \u5F71\u54CD\uFF1A\u53EF\u80FD\u51FA\u73B0\u72B6\u6001\u4E0D\u4E00\u81F4\u6216\u8FD0\u884C\u9519\u8BEF\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u4E24\u7AEF API \u662F\u5426\u517C\u5BB9\u3002
521
+ \u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u6838\u5BF9\u540E\u8C03\u6574 shared.requiredVersion\uFF1B\u82E5\u5FC5\u987B\u62D2\u7EDD\u4E0D\u517C\u5BB9\u7248\u672C\uFF0C\u8BF7\u542F\u7528 strictVersion\u3002`;
516
522
  if (opts.strictVersion) {
517
523
  const err = new FgError(ErrorCodes.SHARE_STRICT_VERSION, msg, {
518
524
  shareKey,
@@ -521,7 +527,11 @@ function createRuntime() {
521
527
  emitError({ remote: entry0.from, error: err });
522
528
  throw err;
523
529
  }
524
- console.warn(`[fulgurjs:MFU-010] ${msg}`);
530
+ const warningKey = `${scopeName}|${shareKey}|${req ?? "*"}|${pick}|${versions.join(",")}`;
531
+ if (!reportedSingletonSkews.has(warningKey)) {
532
+ reportedSingletonSkews.add(warningKey);
533
+ console.warn(`[fulgurjs:MFU-010] ${msg}`);
534
+ }
525
535
  }
526
536
  } else {
527
537
  pick = [...satisfying].sort(compareVersions).pop();
@@ -529,7 +539,9 @@ function createRuntime() {
529
539
  if (opts.strictVersion) {
530
540
  const err2 = new FgError(
531
541
  ErrorCodes.SHARE_STRICT_VERSION,
532
- `no satisfying version for "${shareKey}" (required "${req}") in share scope "${scopeName}"`
542
+ `\u73B0\u8C61\uFF1A\u5171\u4EAB\u4F5C\u7528\u57DF "${scopeName}" \u4E2D\u627E\u4E0D\u5230\u7B26\u5408\u8981\u6C42\u7684 "${shareKey}"\u3002
543
+ \u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${req}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${versions.join("\u3001") || "\u65E0"}\u3002
544
+ \u4FEE\u6CD5\uFF1A\u7EDF\u4E00\u5BBF\u4E3B\u4E0E\u8FDC\u7A0B\u7684\u4F9D\u8D56\u7248\u672C\uFF0C\u6216\u4FEE\u6B63 shared.requiredVersion\u3002`
533
545
  );
534
546
  emitError({ remote: shareKey, error: err2 });
535
547
  throw err2;
@@ -537,7 +549,9 @@ function createRuntime() {
537
549
  if (opts.fallback) return opts.fallback();
538
550
  const err = new FgError(
539
551
  ErrorCodes.SHARE_NOT_AVAILABLE,
540
- `shared "${shareKey}" (${req ?? "any"}) unavailable in scope "${scopeName}" (no local fallback)`,
552
+ `\u73B0\u8C61\uFF1A\u65E0\u6CD5\u52A0\u8F7D\u5171\u4EAB\u4F9D\u8D56 "${shareKey}"\u3002
553
+ \u539F\u56E0\uFF1A\u4F5C\u7528\u57DF "${scopeName}" \u4E2D\u6CA1\u6709\u7B26\u5408 ${req ?? "\u4EFB\u610F\u7248\u672C"} \u8981\u6C42\u7684\u7248\u672C\uFF0C\u4E14\u672A\u914D\u7F6E\u672C\u5730\u526F\u672C\u3002
554
+ \u4FEE\u6CD5\uFF1A\u5728\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u6CE8\u518C\u8BE5\u4F9D\u8D56\uFF0C\u6216\u4E3A shared \u914D\u7F6E\u53EF\u7528\u7684\u672C\u5730\u526F\u672C\u3002`,
541
555
  { shareKey, requiredVersion: req }
542
556
  );
543
557
  emitError({ remote: shareKey, error: err });
@@ -568,7 +582,7 @@ function createRuntime() {
568
582
  }
569
583
  function withTimeout(p, ms, label) {
570
584
  return new Promise((resolve, reject) => {
571
- const t = setTimeout(() => reject(new Error(`timeout after ${ms}ms: ${label}`)), ms);
585
+ const t = setTimeout(() => reject(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${ms} \u6BEB\u79D2\uFF1A${label}`)), ms);
572
586
  p.then(
573
587
  (v) => {
574
588
  clearTimeout(t);
@@ -585,13 +599,13 @@ function createRuntime() {
585
599
  function validateContainerInterface(container, remote) {
586
600
  if (!container || typeof container.get !== "function") {
587
601
  throw new Error(
588
- `remoteEntry of "${remote.name}" does not export a container interface (get/init)`
602
+ `\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u7684 remoteEntry \u672A\u5BFC\u51FA\u5BB9\u5668\u63A5\u53E3\u3002\u8BF7\u786E\u8BA4\u5165\u53E3\u5BFC\u51FA\u4E86 get()\uFF0C\u5E76\u68C0\u67E5\u8BE5\u5730\u5740\u662F\u5426\u8FD4\u56DE\u6B63\u786E\u7684\u8054\u90A6\u5165\u53E3 JS\u3002`
589
603
  );
590
604
  }
591
605
  if (container.name && remote.name && container.name !== remote.name) {
592
- const msg = `remoteEntry self-reported name "${container.name}" mismatches configured name "${remote.name}"`;
606
+ const msg = `\u8FDC\u7A0B\u5165\u53E3\u81EA\u62A5\u540D\u79F0 "${container.name}" \u4E0E\u5BBF\u4E3B\u914D\u7F6E\u540D\u79F0 "${remote.name}" \u4E0D\u4E00\u81F4\u3002\u8BF7\u7EDF\u4E00\u4E24\u4FA7 federation({ name }) \u4E0E remotes \u7684\u540D\u79F0\u3002`;
593
607
  if (remote.promise) {
594
- console.warn(`[fulgurjs] ${msg} (promise-based remote, continuing)`);
608
+ console.warn(`[fulgurjs] ${msg} \u5F53\u524D\u662F\u52A8\u6001 Promise \u8FDC\u7A0B\uFF0C\u7EE7\u7EED\u52A0\u8F7D\u3002`);
595
609
  } else {
596
610
  throw Object.assign(new Error(msg), { code: ErrorCodes.REMOTE_NAME_MISMATCH });
597
611
  }
@@ -607,7 +621,7 @@ function createRuntime() {
607
621
  remote.entryInflight.set(url, inflight);
608
622
  inflight.catch(() => remote.entryInflight.delete(url));
609
623
  }
610
- return withTimeout(inflight, remote.timeout ?? DEFAULT_TIMEOUT, `load remoteEntry ${url}`);
624
+ return withTimeout(inflight, remote.timeout ?? DEFAULT_TIMEOUT, `\u52A0\u8F7D\u8FDC\u7A0B\u5165\u53E3 ${sanitizeUrl(url)}`);
611
625
  }
612
626
  async function acquireContainer(remote, overrides) {
613
627
  const scopeKey = remote.shareScope || "default";
@@ -616,7 +630,7 @@ function createRuntime() {
616
630
  if (prevScope && prevScope !== scopeKey) {
617
631
  throw new FgError(
618
632
  ErrorCodes.CONTAINER_REINIT_CONFLICT,
619
- `container "${remote.name}" already initialized with share scope "${prevScope}", cannot re-init with "${scopeKey}"`
633
+ `\u8FDC\u7A0B\u5BB9\u5668 "${remote.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${prevScope}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${scopeKey}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`
620
634
  );
621
635
  }
622
636
  return remote.container;
@@ -626,7 +640,7 @@ function createRuntime() {
626
640
  if (b.openUntil > Date.now()) {
627
641
  const err = new FgError(
628
642
  ErrorCodes.REMOTE_LOAD_FAILED,
629
- `circuit breaker open for remote "${remote.name}" until ${new Date(b.openUntil).toISOString()}`,
643
+ `\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u8FDE\u7EED\u52A0\u8F7D\u5931\u8D25\uFF0C\u7194\u65AD\u5668\u5DF2\u5F00\u542F\uFF1B\u5C06\u5728 ${new Date(b.openUntil).toISOString()} \u540E\u5141\u8BB8\u91CD\u8BD5\u3002\u8BF7\u5148\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u670D\u52A1\u548C\u7F51\u7EDC\u3002`,
630
644
  { remote: remote.name }
631
645
  );
632
646
  emitError({ remote: remote.name, error: err });
@@ -641,7 +655,7 @@ function createRuntime() {
641
655
  const resolved = await withTimeout(
642
656
  remote.promise(),
643
657
  remote.timeout ?? DEFAULT_TIMEOUT,
644
- `resolve promise remote "${remote.name}"`
658
+ `\u89E3\u6790\u52A8\u6001\u8FDC\u7A0B\u5E94\u7528 "${remote.name}"`
645
659
  );
646
660
  const container2 = typeof resolved === "string" ? await importEntry(resolved, remote) : resolved;
647
661
  validateContainerInterface(container2, remote);
@@ -683,17 +697,19 @@ function createRuntime() {
683
697
  const shown = sanitizeUrl(remote.entry);
684
698
  const hints = [];
685
699
  if (/^https?:\/\//.test(remote.entry) && typeof location !== "undefined") {
686
- hints.push(`1. is the remote dev server running? open ${shown} in a browser \u2014 it must return JS, not HTML`);
687
- hints.push(`2. is the URL correct in federation({ remotes })? dev/prod entries can differ`);
688
- hints.push(`3. CORS: the remote dev server must allow cross-origin requests (check its server.cors)`);
700
+ hints.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${shown}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5E76\u8FD4\u56DE JS \u800C\u975E HTML\u3002`);
701
+ hints.push(`2. \u6838\u5BF9 federation({ remotes }) \u4E2D\u7684\u5730\u5740\uFF1B\u5F00\u53D1\u548C\u751F\u4EA7\u5730\u5740\u53EF\u4EE5\u4E0D\u540C\u3002`);
702
+ hints.push(`3. \u82E5\u8DE8\u57DF\uFF0C\u68C0\u67E5\u8FDC\u7A0B\u5F00\u53D1\u670D\u52A1\u7684 server.cors \u914D\u7F6E\u3002`);
689
703
  } else {
690
- hints.push(`1. is the remote deployed? open ${shown} in a browser \u2014 it must return JS`);
691
- hints.push(`2. NGINX/CDN routing: the entry path must serve the remoteEntry JS (check try_files)`);
704
+ hints.push(`1. \u5728\u6D4F\u89C8\u5668\u6253\u5F00 ${shown}\uFF0C\u786E\u8BA4\u8FDC\u7A0B\u5E94\u7528\u5DF2\u90E8\u7F72\uFF0C\u4E14\u5165\u53E3\u8FD4\u56DE JS\u3002`);
705
+ hints.push(`2. \u68C0\u67E5 Nginx/CDN \u7684\u5165\u53E3\u8DEF\u5F84\u6620\u5C04\uFF1B\u8BE5\u5730\u5740\u4E0D\u80FD\u56DE\u9000\u5230 index.html\u3002`);
692
706
  }
693
707
  throw new FgError(
694
708
  ErrorCodes.REMOTE_LOAD_FAILED,
695
- `failed to load remote "${remote.name}" from ${shown}: ${String(lastErr?.message ?? lastErr)}
696
- ` + hints.join("\n"),
709
+ `\u73B0\u8C61\uFF1A\u65E0\u6CD5\u4ECE ${shown} \u52A0\u8F7D\u8FDC\u7A0B\u5E94\u7528 "${remote.name}"\u3002
710
+ \u539F\u56E0\uFF1A${String(lastErr?.message ?? lastErr)}
711
+ \u4FEE\u6CD5\uFF1A
712
+ ${hints.join("\n")}`,
697
713
  { remote: remote.name }
698
714
  );
699
715
  }
@@ -702,7 +718,7 @@ function createRuntime() {
702
718
  if (prevScope && prevScope !== scopeKey) {
703
719
  throw new FgError(
704
720
  ErrorCodes.CONTAINER_REINIT_CONFLICT,
705
- `container "${remote.name}" already initialized with share scope "${prevScope}", cannot re-init with "${scopeKey}"`
721
+ `\u8FDC\u7A0B\u5BB9\u5668 "${remote.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${prevScope}" \u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u518D\u4EE5 "${scopeKey}" \u521D\u59CB\u5316\u3002\u8BF7\u7EDF\u4E00 shareScope \u914D\u7F6E\u3002`
706
722
  );
707
723
  }
708
724
  if (typeof container.init === "function") {
@@ -736,7 +752,7 @@ function createRuntime() {
736
752
  emitError({ remote: remote.name, error: err });
737
753
  throw err;
738
754
  }
739
- const wrapped = new FgError(ErrorCodes.REMOTE_LOAD_FAILED, String(err?.message ?? err), {
755
+ const wrapped = new FgError(ErrorCodes.REMOTE_LOAD_FAILED, `\u8FDC\u7A0B\u5E94\u7528 "${remote.name}" \u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(err?.message ?? err)}\u3002\u8BF7\u68C0\u67E5\u8FDC\u7A0B\u5165\u53E3\u3001\u7F51\u7EDC\u53CA\u5171\u4EAB\u4F9D\u8D56\u3002`, {
740
756
  remote: remote.name
741
757
  });
742
758
  emitError({ remote: remote.name, error: wrapped });
@@ -757,21 +773,22 @@ function createRuntime() {
757
773
  if (module2 && lifecycleSyncRemote === name) {
758
774
  throw new FgError(
759
775
  ErrorCodes.SETUP_RECURSION,
760
- `loadRemote("${spec}") re-entered from setup/onSession of "${name}" \u2014 the initialization promise would await itself (deadlock)
761
- \u4FEE\u6CD5: setup/onSession \u5185\u4E0D loadRemote \u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u9700\u8981\u7684\u4E1A\u52A1\u6A21\u5757\u6539\u4E3A\u5728\u9875\u9762\u7EC4\u4EF6\u5185\u52A0\u8F7D\uFF0C\u6216\u7ECF context \u901A\u9053\u89E3\u8026`,
776
+ `\u73B0\u8C61\uFF1A\u52A0\u8F7D "${spec}" \u65F6\uFF0C\u8FDC\u7A0B\u5E94\u7528 "${name}" \u7684 setup/onSession \u53C8\u540C\u6B65\u52A0\u8F7D\u4E86\u81EA\u8EAB\u6A21\u5757\uFF0C\u5F62\u6210\u5FAA\u73AF\u7B49\u5F85\u3002
777
+ \u539F\u56E0\uFF1A\u521D\u59CB\u5316\u5C1A\u672A\u5B8C\u6210\uFF0C\u4E0D\u80FD\u7B49\u5F85\u81EA\u8EAB\u7684\u521D\u59CB\u5316\u7ED3\u679C\u3002
778
+ \u4FEE\u6CD5\uFF1A\u4E0D\u8981\u5728 setup/onSession \u4E2D\u52A0\u8F7D\u540C\u4E00\u8FDC\u7A0B\u7684\u6A21\u5757\uFF1B\u8BF7\u5728\u9875\u9762\u7EC4\u4EF6\u4E2D\u52A0\u8F7D\uFF0C\u6216\u901A\u8FC7 context \u89E3\u8026\u3002`,
762
779
  { remote: name }
763
780
  );
764
781
  }
765
782
  try {
766
783
  hooks.beforeLoadRemote?.({ remote: name, module: module2 });
767
784
  } catch (hookErr) {
768
- console.warn("[fulgurjs] beforeLoadRemote hook error (ignored):", hookErr);
785
+ console.warn("[fulgurjs] beforeLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u6A21\u5757\u52A0\u8F7D\u5C06\u7EE7\u7EED\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A", hookErr);
769
786
  }
770
787
  const remote = remotes.get(name);
771
788
  if (!remote) {
772
789
  throw new FgError(
773
790
  ErrorCodes.REMOTE_UNKNOWN,
774
- `unknown remote "${name}". Register it via federation({ remotes }) or registerRemote().`,
791
+ `\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${name}"\u3002\u8BF7\u5728 federation({ remotes }) \u4E2D\u914D\u7F6E\uFF0C\u6216\u5728\u52A0\u8F7D\u524D\u8C03\u7528 registerRemote()\u3002`,
775
792
  { remote: name }
776
793
  );
777
794
  }
@@ -781,7 +798,7 @@ function createRuntime() {
781
798
  [container] = await Promise.all([acquireContainer(remote, { retries: opts?.retries }), stylesReady]);
782
799
  } catch (err) {
783
800
  if (opts?.fallbackModule) {
784
- console.error(`[fulgurjs] loadRemote("${spec}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`, err);
801
+ console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`, err);
785
802
  emitError({ remote: name, error: err });
786
803
  return await opts.fallbackModule();
787
804
  }
@@ -798,7 +815,7 @@ function createRuntime() {
798
815
  if (err instanceof FgError || err?.code) throw err;
799
816
  throw new FgError(
800
817
  ErrorCodes.REMOTE_LOAD_FAILED,
801
- `failed to load module "${module2}" from remote "${name}": ${String(err?.message ?? err)}`,
818
+ `\u65E0\u6CD5\u4ECE\u8FDC\u7A0B\u5E94\u7528 "${name}" \u52A0\u8F7D\u6A21\u5757 "${module2}"\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(err?.message ?? err)}\u3002\u8BF7\u6838\u5BF9 exposes \u952E\u548C\u8FDC\u7A0B\u6784\u5EFA\u4EA7\u7269\u3002`,
802
819
  { remote: name, module: module2 }
803
820
  );
804
821
  })
@@ -809,7 +826,7 @@ function createRuntime() {
809
826
  ns = await loadedModules.get(cacheKey);
810
827
  } catch (err) {
811
828
  if (opts?.fallbackModule) {
812
- console.error(`[fulgurjs] loadRemote("${spec}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`, err);
829
+ console.error(`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u52A0\u8F7D\u5931\u8D25\uFF0C\u6B63\u5728\u4F7F\u7528\u663E\u5F0F\u914D\u7F6E\u7684 fallbackModule\uFF1B\u539F\u59CB\u9519\u8BEF\uFF1A`, err);
813
830
  emitError({ remote: name, error: err });
814
831
  return await opts.fallbackModule();
815
832
  }
@@ -818,23 +835,23 @@ function createRuntime() {
818
835
  try {
819
836
  hooks.afterLoadRemote?.({ remote: name, module: module2, module_ns: ns });
820
837
  } catch (hookErr) {
821
- console.warn("[fulgurjs] afterLoadRemote hook error (ignored):", hookErr);
838
+ console.warn("[fulgurjs] afterLoadRemote \u89C2\u6D4B\u94A9\u5B50\u6267\u884C\u5931\u8D25\uFF1B\u5DF2\u52A0\u8F7D\u6A21\u5757\u4ECD\u53EF\u4F7F\u7528\u3002\u8BF7\u68C0\u67E5\u8BE5\u94A9\u5B50\uFF1A", hookErr);
822
839
  }
823
840
  if (ns && typeof ns === "object" && Object.keys(ns).length === 0) {
824
841
  const err = new FgError(
825
842
  ErrorCodes.EMPTY_EXPORTS,
826
- `no exports: ${module2} @ ${name}`,
843
+ `\u8FDC\u7A0B\u5E94\u7528 "${name}" \u7684\u6A21\u5757 "${module2}" \u6CA1\u6709\u4EFB\u4F55\u5BFC\u51FA\u3002\u8BF7\u68C0\u67E5 exposes \u6307\u5411\u7684\u6587\u4EF6\u53CA\u5176 export \u58F0\u660E\u3002`,
827
844
  { remote: name, module: module2 }
828
845
  );
829
846
  emitError({ remote: name, error: err });
830
- console.error(`[fulgurjs:MFU-009] ${err.message}`);
847
+ console.error(err.message);
831
848
  }
832
849
  return ns;
833
850
  }
834
851
  function getContainer2(name) {
835
852
  const remote = remotes.get(name);
836
853
  if (!remote) {
837
- throw new FgError(ErrorCodes.REMOTE_UNKNOWN, `unknown remote "${name}"`, { remote: name });
854
+ throw new FgError(ErrorCodes.REMOTE_UNKNOWN, `\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${name}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`, { remote: name });
838
855
  }
839
856
  return acquireContainer(remote);
840
857
  }
@@ -842,7 +859,7 @@ function createRuntime() {
842
859
  const { remote: name, module: module2 } = parseSpec2(spec);
843
860
  const remote = remotes.get(name);
844
861
  if (!remote) {
845
- throw new FgError(ErrorCodes.REMOTE_UNKNOWN, `unknown remote "${name}"`, { remote: name });
862
+ throw new FgError(ErrorCodes.REMOTE_UNKNOWN, `\u672A\u77E5\u8FDC\u7A0B\u5E94\u7528 "${name}"\u3002\u8BF7\u5148\u6CE8\u518C\u8BE5\u8FDC\u7A0B\u5E94\u7528\u3002`, { remote: name });
846
863
  }
847
864
  const mode = opts.mode ?? "preload";
848
865
  const waitForStylesheet = (link, href) => {
@@ -858,7 +875,7 @@ function createRuntime() {
858
875
  const failed = () => {
859
876
  emitError({
860
877
  remote: name,
861
- error: new FgError(ErrorCodes.PRELOAD_FAILED, `failed to load remote stylesheet ${href}`, {
878
+ error: new FgError(ErrorCodes.PRELOAD_FAILED, `\u8FDC\u7A0B\u5E94\u7528 "${name}" \u7684\u6837\u5F0F\u8D44\u6E90\u52A0\u8F7D\u5931\u8D25\uFF1A${href}\u3002\u8BF7\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\u4EE5\u53CA\u8DE8\u57DF\u548C\u7F13\u5B58\u914D\u7F6E\u3002`, {
862
879
  remote: name
863
880
  })
864
881
  });
@@ -918,7 +935,7 @@ function createRuntime() {
918
935
  if (typeof sv === "number" && (!Number.isInteger(sv) || sv > 1)) {
919
936
  emitError({
920
937
  remote: name,
921
- error: new FgError(ErrorCodes.PRELOAD_FAILED, `unsupported manifest schemaVersion ${String(sv)} (expected 1)`, {
938
+ error: new FgError(ErrorCodes.PRELOAD_FAILED, `\u8FDC\u7A0B\u5E94\u7528 "${name}" \u7684 manifest \u534F\u8BAE\u7248\u672C\u4E3A ${String(sv)}\uFF0C\u5F53\u524D\u4EC5\u652F\u6301\u7248\u672C 1\u3002\u8BF7\u7EDF\u4E00\u5BBF\u4E3B\u548C\u8FDC\u7A0B\u7684\u63D2\u4EF6\u7248\u672C\u3002`, {
922
939
  remote: name
923
940
  })
924
941
  });
@@ -950,7 +967,7 @@ function createRuntime() {
950
967
  } catch (err) {
951
968
  emitError({
952
969
  remote: name,
953
- error: new FgError(ErrorCodes.PRELOAD_FAILED, String(err?.message ?? err), {
970
+ error: new FgError(ErrorCodes.PRELOAD_FAILED, `\u8FDC\u7A0B\u5E94\u7528 "${name}" \u9884\u52A0\u8F7D\u5931\u8D25\u3002\u5E95\u5C42\u539F\u56E0\uFF1A${String(err?.message ?? err)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`, {
954
971
  remote: name
955
972
  })
956
973
  });
@@ -1199,7 +1216,7 @@ function createHostPages(options, load) {
1199
1216
  if (route.startsWith(prefix) || `${route}/` === prefix) return name;
1200
1217
  }
1201
1218
  throw new Error(
1202
- `[fulgurjs] page route "${route}" matches none of remotePrefixes { ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
1219
+ `[fulgurjs] \u9875\u9762\u8DEF\u7531 "${route}" \u672A\u5339\u914D\u4EFB\u4F55 remotePrefixes\uFF1A{ ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
1203
1220
  \u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
1204
1221
  \u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
1205
1222
  );
@@ -1261,7 +1278,7 @@ function createHostPages(options, load) {
1261
1278
  const inner = mod?.default ?? mod;
1262
1279
  if (!inner) {
1263
1280
  throw new Error(
1264
- `[fulgurjs] remote module "${spec}" did not export a component (got ${inner === null ? "null" : typeof inner})\u3002
1281
+ `[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u6CA1\u6709\u5BFC\u51FA\u53EF\u6E32\u67D3\u7EC4\u4EF6\uFF1B\u5F53\u524D\u503C\u7C7B\u578B\u4E3A ${inner === null ? "null" : typeof inner}\u3002
1265
1282
  \u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
1266
1283
  );
1267
1284
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fulgurjs/federation",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "type": "module",
5
5
  "description": "Vite Module Federation with full Webpack MF parity. Dev & production, no compromise.",
6
6
  "license": "MIT",