@fulgurjs/federation 5.1.3 → 5.2.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.
Files changed (88) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.en.md +7 -5
  3. package/README.md +14 -12
  4. package/dist/context.cjs +2 -2
  5. package/dist/context.js +2 -2
  6. package/dist/index.cjs +141 -48
  7. package/dist/index.js +141 -48
  8. package/dist/react-adapter.cjs +32 -1
  9. package/dist/react-adapter.d.cts +1 -1
  10. package/dist/react-adapter.d.ts +1 -1
  11. package/dist/react-adapter.js +32 -1
  12. package/dist/react.d.ts +2 -2
  13. package/dist/runtime-entry.d.ts +2 -2
  14. package/dist/runtime.js +7 -7
  15. package/dist/vue-adapter.cjs +99 -15
  16. package/dist/vue-adapter.d.cts +1 -1
  17. package/dist/vue-adapter.d.ts +1 -1
  18. package/dist/vue-adapter.js +100 -16
  19. package/examples/README.en.md +47 -0
  20. package/examples/README.md +40 -18
  21. package/examples/react/README.md +83 -0
  22. package/examples/react/host/README.md +49 -0
  23. package/examples/react/host/fulgurjs.config.ts +31 -0
  24. package/examples/{react-remote → react/host}/index.html +2 -1
  25. package/examples/react/host/package-lock.json +2381 -0
  26. package/examples/react/host/package.json +24 -0
  27. package/examples/react/host/src/App.tsx +19 -0
  28. package/examples/react/host/src/main.tsx +33 -0
  29. package/examples/react/host/src/pages/UtilsDemo.tsx +32 -0
  30. package/examples/react/host/src/remotePages.tsx +16 -0
  31. package/examples/{react-remote → react/host}/tsconfig.json +2 -3
  32. package/examples/{react-remote → react/host}/vite.config.ts +2 -2
  33. package/examples/react/remote/README.md +47 -0
  34. package/examples/react/remote/fulgurjs.config.ts +20 -0
  35. package/examples/{react-host → react/remote}/index.html +2 -1
  36. package/examples/react/remote/package-lock.json +2323 -0
  37. package/examples/react/remote/package.json +23 -0
  38. package/examples/react/remote/src/App.tsx +16 -0
  39. package/examples/react/remote/src/exposes/ClickButton.tsx +15 -0
  40. package/examples/react/remote/src/exposes/pages/DetailPage.tsx +10 -0
  41. package/examples/react/remote/src/exposes/pages/HomePage.tsx +12 -0
  42. package/examples/react/remote/src/exposes/utils.ts +10 -0
  43. package/examples/react/remote/src/main.tsx +11 -0
  44. package/examples/{react-host → react/remote}/tsconfig.json +3 -4
  45. package/examples/{react-host → react/remote}/vite.config.ts +2 -2
  46. package/examples/vue/README.md +85 -0
  47. package/examples/vue/host/README.md +50 -0
  48. package/examples/vue/host/fulgurjs.config.ts +30 -0
  49. package/examples/vue/host/index.html +12 -0
  50. package/examples/vue/host/package-lock.json +1855 -0
  51. package/examples/vue/host/package.json +21 -0
  52. package/examples/vue/host/src/App.vue +12 -0
  53. package/examples/vue/host/src/main.ts +44 -0
  54. package/examples/vue/host/src/pages/HomePage.vue +16 -0
  55. package/examples/vue/host/src/pages/UtilsDemo.vue +45 -0
  56. package/examples/vue/host/tsconfig.json +13 -0
  57. package/examples/vue/host/vite.config.ts +8 -0
  58. package/examples/vue/remote/README.md +47 -0
  59. package/examples/vue/remote/fulgurjs.config.ts +20 -0
  60. package/examples/vue/remote/index.html +12 -0
  61. package/examples/vue/remote/package-lock.json +1833 -0
  62. package/examples/vue/remote/package.json +20 -0
  63. package/examples/vue/remote/src/App.vue +16 -0
  64. package/examples/vue/remote/src/exposes/ClickButton.vue +16 -0
  65. package/examples/vue/remote/src/exposes/pages/DetailPage.vue +14 -0
  66. package/examples/vue/remote/src/exposes/pages/HomePage.vue +11 -0
  67. package/examples/vue/remote/src/exposes/utils.ts +10 -0
  68. package/examples/vue/remote/src/main.ts +6 -0
  69. package/examples/vue/remote/tsconfig.json +13 -0
  70. package/examples/vue/remote/vite.config.ts +8 -0
  71. package/package.json +2 -2
  72. package/examples/host/fulgurjs.config.ts +0 -26
  73. package/examples/react-host/README.md +0 -28
  74. package/examples/react-host/fulgurjs.config.ts +0 -19
  75. package/examples/react-host/package.json +0 -23
  76. package/examples/react-host/src/App.tsx +0 -66
  77. package/examples/react-host/src/federation/pages.data.ts +0 -21
  78. package/examples/react-host/src/main.tsx +0 -8
  79. package/examples/react-remote/fulgurjs.config.ts +0 -17
  80. package/examples/react-remote/package.json +0 -22
  81. package/examples/react-remote/src/Button.tsx +0 -15
  82. package/examples/react-remote/src/main.tsx +0 -6
  83. package/examples/react-remote/src/pages/Detail.tsx +0 -10
  84. package/examples/react-remote/src/pages/Home.tsx +0 -14
  85. package/examples/react-remote/src/utils.ts +0 -3
  86. package/examples/remote-a/fulgurjs.config.ts +0 -24
  87. package/examples/remote-a/src/views/Detail.vue +0 -3
  88. package/examples/remote-a/src/views/Home.vue +0 -3
package/dist/runtime.js CHANGED
@@ -1,22 +1,22 @@
1
- var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(a){let c=de.exec(String(a).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(a,c){if(a.length===0&&c.length===0)return 0;if(a.length===0)return 1;if(c.length===0)return-1;let l=Math.max(a.length,c.length);for(let o=0;o<l;o++){let g=a[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(a,c){let l=L(a),o=L(c);return!l||!o?a<c?-1:a>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(a,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(a,o.trim()))}function ye(a,c){if(!c||c==="*")return!L(a)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!j(a,`>=${y}`)||!j(a,`<=${w}`))}let o=L(a);if(!o)return!1;let g=Se(c);if(g===null)return!0;for(let y of g)if(!Pe(o,a,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(a){let c=[],l=a.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(a,c){let l=we(c);if(!l)return null;let{ver:o,partial:g}=l;switch(a){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(a){return a.major>0?{major:a.major+1,minor:0,patch:0,pre:[]}:a.minor>0?{major:0,minor:a.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:a.patch+1,pre:[]}}function we(a){let c=a.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(a,c){switch(c){case">=":return a>=0;case">":return a>0;case"<":return a<0;case"<=":return a<=0;case"=":return a===0}}function Pe(a,c,l){let o=`${a.major}.${a.minor}.${a.patch}`+(a.pre.length?`-${a.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&&a.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="5.1.3";var $e="__fulgurjsSetup",_e="__FULGURJS_APP_CONFIG__",D=15e3,z=2,Me=5,ve=3e4,Ie=4e3,Te=.2;function Oe(){let a=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)}},U=new Map,k,Q=e=>{let r=U.get(e);return r||U.set(e,r={}),r},V=()=>globalThis[_e]??{};async function K(e,r,t,s){let i=u=>u instanceof S?u:new S(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${s} \u521D\u59CB\u5316\u5931\u8D25\u3002
1
+ var de=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function L(a){let c=de.exec(String(a).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(a,c){if(a.length===0&&c.length===0)return 0;if(a.length===0)return 1;if(c.length===0)return-1;let l=Math.max(a.length,c.length);for(let o=0;o<l;o++){let d=a[o],y=c[o];if(d===void 0)return-1;if(y===void 0)return 1;let w=/^\d+$/.test(d),b=/^\d+$/.test(y);if(w&&b){let I=Number(d)-Number(y);if(I!==0)return I}else{if(w!==b)return w?-1:1;if(d!==y)return d<y?-1:1}}return 0}function O(a,c){let l=L(a),o=L(c);return!l||!o?a<c?-1:a>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(a,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(a,o.trim()))}function ye(a,c){if(!c||c==="*")return!L(a)?.pre.length;let l=c.split(/\s+-\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!j(a,`>=${y}`)||!j(a,`<=${w}`))}let o=L(a);if(!o)return!1;let d=Se(c);if(d===null)return!0;for(let y of d)if(!Pe(o,a,y))return!1;return!(o.pre.length>0&&!d.some(y=>y.ver.pre.length>0)&&!d.some(w=>w.ver.major===o.major&&w.ver.minor===o.minor&&w.ver.patch===o.patch))}function Se(a){let c=[],l=a.trim().split(/\s+/).filter(Boolean);if(l.length===0)return null;for(let o of l){let d=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(o);if(!d)return null;let y=d[1],w=d[2],b=Ee(y,w);if(b===null)return null;c.push(...b)}return c}function Ee(a,c){let l=we(c);if(!l)return null;let{ver:o,partial:d}=l;switch(a){case"^":{let y=Re(o);return y?[{op:">=",ver:o},{op:"<",ver:y}]:null}case"~":{let y=d>=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 d===1?[{op:">=",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:d===2?[{op:">=",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:">",ver:o}];case"<":return d===1?[{op:"<",ver:{major:o.major,minor:0,patch:0,pre:[]}}]:d===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 d===1?[{op:">=",ver:o},{op:"<",ver:{major:o.major+1,minor:0,patch:0,pre:[]}}]:d===2?[{op:">=",ver:o},{op:"<",ver:{major:o.major,minor:o.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:o}];default:return null}}function Re(a){return a.major>0?{major:a.major+1,minor:0,patch:0,pre:[]}:a.minor>0?{major:0,minor:a.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:a.patch+1,pre:[]}}function we(a){let c=a.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=[],d=0;for(let b of l.slice(0,3))if(/^\d+$/.test(b))o.push(Number(b)),d++;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 d===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:d}}function be(a,c){switch(c){case">=":return a>=0;case">":return a>0;case"<":return a<0;case"<=":return a<=0;case"=":return a===0}}function Pe(a,c,l){let o=`${a.major}.${a.minor}.${a.patch}`+(a.pre.length?`-${a.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 d=O(o,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=be(d,l.op);return l.ver.pre.length>0&&a.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,o,d){super(`[fulgurjs:${c}] ${l}`,d),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="5.2.0";var $e="__fulgurjsSetup",_e="__FULGURJS_APP_CONFIG__",D=15e3,z=2,Me=5,ve=3e4,Ie=4e3,Te=.2;function Oe(){let a=Object.create(null),c=new Map,l=[],o=new Set,d=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)}},U=new Map,k,Q=e=>{let r=U.get(e);return r||U.set(e,r={}),r},V=()=>globalThis[_e]??{};async function K(e,r,t,s){let i=u=>u instanceof S?u:new S(E.SETUP_RUN_FAILED,`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u5E94\u7528 "${e}" \u7684 ${s} \u521D\u59CB\u5316\u5931\u8D25\u3002
2
2
  \u539F\u56E0\uFF1A${String(u?.message??u)}
3
- \u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${s} \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:s});k=e;let n;try{n=r(t)}catch(u){throw i(u)}finally{k=void 0}try{await n}catch(u){throw i(u)}}async function ee(e,r,t,s){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let i=await r.get(t),n=i?.default;if(typeof n!="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
3
+ \u4FEE\u6CD5\uFF1A\u68C0\u67E5\u5E76\u4FEE\u590D\u8BE5 ${s} \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:s},{cause:u});k=e;let n;try{n=r(t)}catch(u){throw i(u)}finally{k=void 0}try{await n}catch(u){throw i(u)}}async function ee(e,r,t,s){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let i=await r.get(t),n=i?.default;if(typeof n!="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
4
  \u539F\u56E0\uFF1A\u9ED8\u8BA4\u5BFC\u51FA\u7C7B\u578B\u4E3A ${i==null?String(i):typeof n}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
5
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(i.onSession!==void 0&&typeof i.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
6
  \u539F\u56E0\uFF1AonSession \u5BFC\u51FA\u7C7B\u578B\u4E3A ${typeof i.onSession}\uFF0C\u5E94\u4E3A\u51FD\u6570\u3002
7
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});s.setupExports=i,await K(e.name,n,{appContext:V(),signal:(s.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(i){throw e.debug.setup="failed",s.setupExports=void 0,i}}async function re(e,r,t){let s=V(),i=s?.sessionKey;if(typeof i!="string"||i==="")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
8
  \u539F\u56E0\uFF1A\u5F53\u524D\u503C\u4E3A ${i===void 0?"\u7F3A\u5931":JSON.stringify(i)}\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===i)return r.sessionPromise;r.controller?.abort();let n=new AbortController;r.controller=n,r.sessionKey=i;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!n.signal.aborted&&await K(e.name,t,{appContext:s,sessionKey:i,signal:n.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===i&&(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 s=Q(e.name);s.setupPromise||(s.setupPromise=ee(e,r,t,s).catch(n=>{throw s.setupPromise=void 0,n})),await s.setupPromise;let i=s.setupExports?.onSession;typeof i=="function"&&await re(e,s,i)}function ne(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>a[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 A(e),a}function se(e,r,t,s,i={}){let n=A(e||"default"),u=Object.hasOwn(n,r)?n[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),n[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:s,from:i.from??"unknown",eager:!!i.eager,loaded:!!i.loaded})}function ie(e){let r=(t,s,i)=>{if(t===void 0)return;if(!(typeof t=="number"&&(i?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${s} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${i?" 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,entryFailCounts:t?.entryFailCounts??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",s=r.shareKey||e,n=A(t)[s]||{},u=Object.keys(n),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=>n[m].loaded);if(d=[...f.length?f:u].sort(O).pop(),!h.includes(d)){let m=n[d],v=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${s}" \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
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===i)return r.sessionPromise;r.controller?.abort();let n=new AbortController;r.controller=n,r.sessionKey=i;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!n.signal.aborted&&await K(e.name,t,{appContext:s,sessionKey:i,signal:n.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===i&&(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 s=Q(e.name);s.setupPromise||(s.setupPromise=ee(e,r,t,s).catch(n=>{throw s.setupPromise=void 0,n})),await s.setupPromise;let i=s.setupExports?.onSession;typeof i=="function"&&await re(e,s,i)}function ne(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>a[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 A(e),a}function se(e,r,t,s,i={}){let n=A(e||"default"),u=Object.hasOwn(n,r)?n[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),n[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:s,from:i.from??"unknown",eager:!!i.eager,loaded:!!i.loaded})}function ie(e){let r=(t,s,i)=>{if(t===void 0)return;if(!(typeof t=="number"&&(i?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] \u8FDC\u7A0B\u5E94\u7528 "${e.name}" \u7684 ${s} \u914D\u7F6E\u65E0\u6548\uFF1A\u5F53\u524D\u4E3A ${String(t)}\uFF0C\u5E94\u4E3A${i?" 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,entryFailCounts:t?.entryFailCounts??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",s=r.shareKey||e,n=A(t)[s]||{},u=Object.keys(n),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||j(f,p)),g;if(r.singleton&&u.length>0){let f=u.filter(m=>n[m].loaded);if(g=[...f.length?f:u].sort(O).pop(),!h.includes(g)){let m=n[g],v=`\u73B0\u8C61\uFF1A\u5171\u4EAB\u5355\u4F8B "${s}" \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 ${g}\u3002
11
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:s,requiredVersion:p});throw $({remote:m.from,error:T}),T}let _=`${t}|${s}|${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 "${s}"\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:s,requiredVersion:p});throw $({remote:m.from,error:T}),T}let _=`${t}|${s}|${p??"*"}|${g}|${u.join(",")}`;o.has(_)||(o.add(_),console.warn(`[fulgurjs:MFU-010] ${v}`))}}else if(g=[...h].sort(O).pop(),!g){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 "${s}"\u3002
13
13
  \u539F\u56E0\uFF1A\u8981\u6C42\u7248\u672C ${p}\uFF0C\u5F53\u524D\u53EF\u7528\u7248\u672C\u4E3A ${u.join("\u3001")||"\u65E0"}\u3002
14
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:s,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 "${s}"\u3002
15
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:s,requiredVersion:p});throw $({remote:s,error:f}),f}let R=n[d];if(I.resolveShare){let f=await I.resolveShare({shareKey:s,shareScope:t,requiredVersion:p,picked:R,available:Object.values(n)});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((s,i)=>{let n=setTimeout(()=>i(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${t}`)),r);e.then(u=>{clearTimeout(n),s(u)},u=>{clearTimeout(n),i(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.entryFailCounts.get(e)??0,s=t>0?`${e}${e.includes("?")?"&":"?"}fulgurjs_retry=${t}`:e,i=r.entryInflight.get(e),n=i??import(s);return i||(r.entryInflight.set(e,n),n.catch(()=>{r.entryInflight.delete(e),r.entryFailCounts.set(e,(r.entryFailCounts.get(e)??0)+1)})),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 n=b.get(e.container);if(n&&n!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${n}" \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 s=e.breakerState;if(s.openUntil>Date.now()){let n=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(s.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:n}),n}e.state="loading",e.debug.status="loading";let i=(async()=>{let n=[];if(e.promise)n.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??[]])n.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 n){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
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:s,requiredVersion:p});throw $({remote:s,error:f}),f}let R=n[g];if(I.resolveShare){let f=await I.resolveShare({shareKey:s,shareScope:t,requiredVersion:p,picked:R,available:Object.values(n)});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((s,i)=>{let n=setTimeout(()=>i(new Error(`\u7B49\u5F85\u8D85\u8FC7 ${r} \u6BEB\u79D2\uFF1A${t}`)),r);e.then(u=>{clearTimeout(n),s(u)},u=>{clearTimeout(n),i(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.entryFailCounts.get(e)??0,s=t>0?`${e}${e.includes("?")?"&":"?"}fulgurjs_retry=${t}`:e,i=r.entryInflight.get(e),n=i??import(s);return i||(r.entryInflight.set(e,n),n.catch(()=>{r.entryInflight.delete(e),r.entryFailCounts.set(e,(r.entryFailCounts.get(e)??0)+1)})),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 n=b.get(e.container);if(n&&n!==t)throw new S(E.CONTAINER_REINIT_CONFLICT,`\u8FDC\u7A0B\u5BB9\u5668 "${e.name}" \u5DF2\u4F7F\u7528\u5171\u4EAB\u4F5C\u7528\u57DF "${n}" \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 s=e.breakerState;if(s.openUntil>Date.now()){let n=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(s.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:n}),n}e.state="loading",e.debug.status="loading";let i=(async()=>{let n=[];if(e.promise)n.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??[]])n.push(async()=>{let m=await J(f,e);return N(m,e),m});let u,p,h=!1,g=r?.retries??e.retries??z;for(let f of n){for(let m=0;m<=g;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<g&&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
17
  \u539F\u56E0\uFF1A${String(p?.message??p)}
18
18
  \u4FEE\u6CD5\uFF1A
19
19
  ${m.join(`
20
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(a),b.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",s.fails=0,u})();e.containerPromise=i;try{return await i}catch(n){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(n?.message??n),s.fails+=1,s.fails>=e.breakerThreshold&&(s.openUntil=Date.now()+e.breakerResetMs,s.fails=0),n instanceof S)throw $({remote:e.name,error:n}),n;if(n?.code)throw $({remote:e.name,error:n}),n;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(n?.message??n)}\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:s}=C(e);if(s&&k===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
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:s})}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 i=c.get(t);if(!i)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 n;try{let h=s&&i.manifestUrl?F(e):Promise.resolve();[n]=await Promise.all([X(i,{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(!s)return n;await te(i,n);let u=`${t}@${i.shareScope||"default"}#${s}`;g.has(u)||g.set(u,n.get(s).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 "${s}"\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:s})}));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:s,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 "${s}" \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:s});$({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:s}=C(e),i=c.get(t);if(!i)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 n=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"&&n==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=d,n==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),R==="style"&&n==="preload"?v:Promise.resolve()},h=d=>{let R=typeof document<"u"?document.baseURI:void 0,f=new URL(i.entry,R||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(d,f).href};try{if(i.manifestUrl){let d=y.get(i.manifestUrl);d||(d=fetch(i.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(i.manifestUrl,d),d.then(f=>{f||y.delete(i.manifestUrl)},()=>y.delete(i.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(i.entry,"modulepreload");return}await p(i.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):[],_=s?v.filter(([M,x])=>B(String(x?.name??M))===s):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");n==="preload"&&T.push(pe)}await Promise.all(T);return}}await p(i.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__=a,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:a,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(a){if(a&&typeof a=="object"&&"default"in a){let c=a.default;return c!==void 0?c:a}return a}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};
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:s})}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 i=c.get(t);if(!i)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 n;try{let h=s&&i.manifestUrl?F(e):Promise.resolve();[n]=await Promise.all([X(i,{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(!s)return n;await te(i,n);let u=`${t}@${i.shareScope||"default"}#${s}`;d.has(u)||d.set(u,n.get(s).catch(h=>{throw d.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 "${s}"\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:s})}));let p;try{p=await d.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:s,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 "${s}" \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:s});$({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:s}=C(e),i=c.get(t);if(!i)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 n=r.mode??"preload",u=(g,R)=>{if(g.sheet)return Promise.resolve();let f=w.get(g);if(f)return f;let m=new Promise(v=>{let _=()=>{g.removeEventListener("load",_),g.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})}),_()};g.addEventListener("load",_,{once:!0}),g.addEventListener("error",T,{once:!0}),g.sheet&&_()});return w.set(g,m),m},p=(g,R)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${g}"]`);if(f)return R==="style"&&n==="preload"?w.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=R==="style"?"stylesheet":"modulepreload",m.href=g,n==="prefetch"&&(m.fetchPriority="low");let v=R==="style"?u(m,g):Promise.resolve();return document.head.appendChild(m),R==="style"&&n==="preload"?v:Promise.resolve()},h=g=>{let R=typeof document<"u"?document.baseURI:void 0,f=new URL(i.entry,R||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(g,f).href};try{if(i.manifestUrl){let g=y.get(i.manifestUrl);g||(g=fetch(i.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),y.set(i.manifestUrl,g),g.then(f=>{f||y.delete(i.manifestUrl)},()=>y.delete(i.manifestUrl)));let R=await g;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(i.entry,"modulepreload");return}await p(i.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):[],_=s?v.filter(([M,x])=>B(String(x?.name??M))===s):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");n==="preload"&&T.push(pe)}await Promise.all(T);return}}await p(i.entry,"modulepreload")}catch(g){$({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(g?.message??g)}\u3002\u8BF7\u68C0\u67E5 manifest \u548C\u8D44\u6E90\u5730\u5740\u3002`,{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=a,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:a,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(a){if(a&&typeof a=="object"&&"default"in a){let c=a.default;return c!==void 0?c:a}return a}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};
@@ -249,28 +249,111 @@ var ERROR_STYLE = {
249
249
  fontSize: "13px",
250
250
  lineHeight: "1.6"
251
251
  };
252
+ var BUTTON_STYLE = {
253
+ padding: "4px 14px",
254
+ marginRight: "8px",
255
+ border: "1px solid #c45656",
256
+ borderRadius: "4px",
257
+ background: "#c45656",
258
+ color: "#fff",
259
+ fontSize: "13px",
260
+ cursor: "pointer"
261
+ };
262
+ var SECONDARY_BUTTON_STYLE = {
263
+ padding: "4px 14px",
264
+ border: "1px solid #c45656",
265
+ borderRadius: "4px",
266
+ background: "#fff",
267
+ color: "#c45656",
268
+ fontSize: "13px",
269
+ cursor: "pointer"
270
+ };
252
271
  var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
253
272
  name: "FulgurjsRemoteError",
254
- props: { error: { type: Object, default: void 0 } },
273
+ props: {
274
+ error: { type: Object, default: void 0 },
275
+ retry: { type: Function, required: false, default: void 0 },
276
+ retrying: { type: Boolean, default: false }
277
+ },
255
278
  setup(props) {
279
+ const reloadPage = () => {
280
+ window.location.reload();
281
+ };
256
282
  return () => {
257
283
  const err = props.error;
258
284
  const code = err?.code ?? "UNKNOWN";
259
285
  const message = err?.message ?? String(props.error ?? "unknown error");
260
- return (0, import_vue.h)("div", { style: ERROR_STYLE }, [
286
+ const buttons = [
287
+ props.retry ? (0, import_vue.h)("button", {
288
+ key: "retry",
289
+ style: BUTTON_STYLE,
290
+ type: "button",
291
+ "data-fulgurjs-retry": "",
292
+ disabled: props.retrying,
293
+ onClick: () => props.retry?.()
294
+ }, props.retrying ? "\u52A0\u8F7D\u4E2D\u2026" : "\u91CD\u8BD5\u52A0\u8F7D") : null,
295
+ (0, import_vue.h)("button", {
296
+ key: "reload",
297
+ style: SECONDARY_BUTTON_STYLE,
298
+ type: "button",
299
+ "data-fulgurjs-reload": "",
300
+ disabled: props.retrying,
301
+ onClick: reloadPage
302
+ }, "\u5237\u65B0\u9875\u9762\u91CD\u8BD5")
303
+ ].filter(Boolean);
304
+ return (0, import_vue.h)("div", { style: ERROR_STYLE, "data-fulgurjs-error": code }, [
261
305
  (0, import_vue.h)("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
262
306
  (0, import_vue.h)("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
263
- (0, import_vue.h)("p", { style: "margin:0" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002")
307
+ (0, import_vue.h)("p", { style: "margin:0 0 8px" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002"),
308
+ (0, import_vue.h)("p", { style: "margin:0 0 10px" }, "\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u5F53\u524D\u9875\u9762\u91CD\u5EFA\u52A0\u8F7D\uFF1B\u82E5\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58\u5931\u8D25\u7684\u6A21\u5757\uFF08\u5982\u8FDC\u7A0B\u9759\u6001\u5B50\u4F9D\u8D56\u66FE\u52A0\u8F7D\u5931\u8D25\uFF09\uFF0C\u8BF7\u7528\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\u2014\u2014\u5B83\u4F1A\u6574\u9875\u5237\u65B0\uFF08\u4FDD\u7559\u5F53\u524D\u5730\u5740\uFF09\uFF0C\u672A\u4FDD\u5B58\u7684\u9875\u9762\u72B6\u6001\u4F1A\u4E22\u5931\u3002"),
309
+ (0, import_vue.h)("div", { style: "margin:0" }, buttons)
264
310
  ]);
265
311
  };
266
312
  }
267
313
  });
314
+ function createRecoverableErrorPlaceholder(loader, spec, userErrorComponent) {
315
+ if (userErrorComponent) return userErrorComponent;
316
+ return (0, import_vue.defineComponent)({
317
+ name: "FulgurjsRemoteErrorWithRetry",
318
+ props: { error: { type: Object, default: void 0 } },
319
+ setup(props, { attrs }) {
320
+ const recovered = (0, import_vue.ref)(null);
321
+ const retrying = (0, import_vue.ref)(false);
322
+ const retryError = (0, import_vue.ref)(void 0);
323
+ const retry = async () => {
324
+ if (retrying.value) return;
325
+ retrying.value = true;
326
+ retryError.value = void 0;
327
+ try {
328
+ const mod = await loader();
329
+ const inner = mod?.default ?? mod;
330
+ if (!inner) throw noRenderableExportError(spec, inner);
331
+ recovered.value = inner;
332
+ } catch (e) {
333
+ retryError.value = e;
334
+ } finally {
335
+ retrying.value = false;
336
+ }
337
+ };
338
+ return () => {
339
+ const inner = recovered.value;
340
+ if (inner) return (0, import_vue.h)(inner, attrs);
341
+ return (0, import_vue.h)(RemoteErrorPlaceholder, {
342
+ error: retryError.value ?? props.error,
343
+ retry,
344
+ retrying: retrying.value
345
+ });
346
+ };
347
+ }
348
+ });
349
+ }
268
350
  function createRemoteComponent(loadRemote) {
269
351
  return function remoteComponent(spec, opts = {}) {
352
+ const loader = () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m);
270
353
  return (0, import_vue.defineAsyncComponent)({
271
- loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
354
+ loader,
272
355
  loadingComponent: opts.loadingComponent,
273
- errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
356
+ errorComponent: createRecoverableErrorPlaceholder(loader, spec, opts.errorComponent),
274
357
  delay: opts.delay,
275
358
  timeout: opts.timeout
276
359
  });
@@ -290,18 +373,19 @@ function createHostPages(options, load) {
290
373
  let comp = compCache.get(spec);
291
374
  if (!comp) {
292
375
  const name = cleanCompName(spec);
376
+ const pageLoader = async () => {
377
+ await beforeLoad?.();
378
+ const mod = await load(spec);
379
+ const inner = mod?.default ?? mod;
380
+ if (!inner) {
381
+ throw noRenderableExportError(spec, inner);
382
+ }
383
+ return inner;
384
+ };
293
385
  const asyncComp = (0, import_vue.defineAsyncComponent)({
294
- loader: async () => {
295
- await beforeLoad?.();
296
- const mod = await load(spec);
297
- const inner = mod?.default ?? mod;
298
- if (!inner) {
299
- throw noRenderableExportError(spec, inner);
300
- }
301
- return inner;
302
- },
386
+ loader: pageLoader,
303
387
  loadingComponent,
304
- errorComponent: errorComponent ?? RemoteErrorPlaceholder,
388
+ errorComponent: createRecoverableErrorPlaceholder(pageLoader, spec, errorComponent),
305
389
  delay
306
390
  });
307
391
  asyncComp.name = name;
@@ -19,7 +19,7 @@ interface HostPagesOptions extends HostPagesCoreOptions {
19
19
  beforeLoad?: () => void | Promise<void>;
20
20
  /** 加载期占位组件(骨架屏) */
21
21
  loadingComponent?: Component;
22
- /** 错误占位组件(缺省 = 内置三段式错误占位:错误码+根因+修法) */
22
+ /** 错误占位组件(缺省 = 内置错误占位:错误码+根因+修法+重试加载/刷新页面重试;自定义时完全接管) */
23
23
  errorComponent?: Component;
24
24
  /** 骨架屏延迟 ms(默认 200,防闪) */
25
25
  delay?: number;
@@ -19,7 +19,7 @@ interface HostPagesOptions extends HostPagesCoreOptions {
19
19
  beforeLoad?: () => void | Promise<void>;
20
20
  /** 加载期占位组件(骨架屏) */
21
21
  loadingComponent?: Component;
22
- /** 错误占位组件(缺省 = 内置三段式错误占位:错误码+根因+修法) */
22
+ /** 错误占位组件(缺省 = 内置错误占位:错误码+根因+修法+重试加载/刷新页面重试;自定义时完全接管) */
23
23
  errorComponent?: Component;
24
24
  /** 骨架屏延迟 ms(默认 200,防闪) */
25
25
  delay?: number;
@@ -8,7 +8,7 @@ import {
8
8
  import "./chunk-TSXZ7TWA.js";
9
9
 
10
10
  // src/vue-adapter.ts
11
- import { defineAsyncComponent, defineComponent, h } from "vue";
11
+ import { defineAsyncComponent, defineComponent, h, ref } from "vue";
12
12
  var ERROR_STYLE = {
13
13
  padding: "16px",
14
14
  border: "1px solid #fde2e2",
@@ -18,28 +18,111 @@ var ERROR_STYLE = {
18
18
  fontSize: "13px",
19
19
  lineHeight: "1.6"
20
20
  };
21
+ var BUTTON_STYLE = {
22
+ padding: "4px 14px",
23
+ marginRight: "8px",
24
+ border: "1px solid #c45656",
25
+ borderRadius: "4px",
26
+ background: "#c45656",
27
+ color: "#fff",
28
+ fontSize: "13px",
29
+ cursor: "pointer"
30
+ };
31
+ var SECONDARY_BUTTON_STYLE = {
32
+ padding: "4px 14px",
33
+ border: "1px solid #c45656",
34
+ borderRadius: "4px",
35
+ background: "#fff",
36
+ color: "#c45656",
37
+ fontSize: "13px",
38
+ cursor: "pointer"
39
+ };
21
40
  var RemoteErrorPlaceholder = defineComponent({
22
41
  name: "FulgurjsRemoteError",
23
- props: { error: { type: Object, default: void 0 } },
42
+ props: {
43
+ error: { type: Object, default: void 0 },
44
+ retry: { type: Function, required: false, default: void 0 },
45
+ retrying: { type: Boolean, default: false }
46
+ },
24
47
  setup(props) {
48
+ const reloadPage = () => {
49
+ window.location.reload();
50
+ };
25
51
  return () => {
26
52
  const err = props.error;
27
53
  const code = err?.code ?? "UNKNOWN";
28
54
  const message = err?.message ?? String(props.error ?? "unknown error");
29
- return h("div", { style: ERROR_STYLE }, [
55
+ const buttons = [
56
+ props.retry ? h("button", {
57
+ key: "retry",
58
+ style: BUTTON_STYLE,
59
+ type: "button",
60
+ "data-fulgurjs-retry": "",
61
+ disabled: props.retrying,
62
+ onClick: () => props.retry?.()
63
+ }, props.retrying ? "\u52A0\u8F7D\u4E2D\u2026" : "\u91CD\u8BD5\u52A0\u8F7D") : null,
64
+ h("button", {
65
+ key: "reload",
66
+ style: SECONDARY_BUTTON_STYLE,
67
+ type: "button",
68
+ "data-fulgurjs-reload": "",
69
+ disabled: props.retrying,
70
+ onClick: reloadPage
71
+ }, "\u5237\u65B0\u9875\u9762\u91CD\u8BD5")
72
+ ].filter(Boolean);
73
+ return h("div", { style: ERROR_STYLE, "data-fulgurjs-error": code }, [
30
74
  h("p", { style: "margin:0 0 4px;font-weight:600" }, `\u8FDC\u7A0B\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF08\u9519\u8BEF\u7801 ${code}\uFF09`),
31
75
  h("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
32
- h("p", { style: "margin:0" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002")
76
+ h("p", { style: "margin:0 0 8px" }, "\u4FEE\u6CD5\uFF1A\u2460 \u6838\u5BF9 spec \u7684\u300C\u8FDC\u7A0B\u540D/expose \u540D\u300D\u4E0E\u8FDC\u7A0B\u5E94\u7528 exposes \u662F\u5426\u4E00\u81F4\uFF08MFU-006/008\uFF09\uFF1B\u2461 \u6838\u5BF9 remotes \u5730\u5740\u7AEF\u53E3\u4E0E\u8FDC\u7A0B\u670D\u52A1\u53EF\u8FBE\u6027\u3001remoteEntry \u662F\u5426\u53EF\u8BBF\u95EE\uFF08MFU-001\uFF09\uFF1B\u2462 \u67E5\u770B window \u7684 fulgurjs:error \u4E8B\u4EF6\u4E0E console \u540C\u6E90\u9519\u8BEF\u5B9A\u4F4D\u6839\u56E0\u3002"),
77
+ h("p", { style: "margin:0 0 10px" }, "\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u5F53\u524D\u9875\u9762\u91CD\u5EFA\u52A0\u8F7D\uFF1B\u82E5\u6D4F\u89C8\u5668\u5DF2\u7F13\u5B58\u5931\u8D25\u7684\u6A21\u5757\uFF08\u5982\u8FDC\u7A0B\u9759\u6001\u5B50\u4F9D\u8D56\u66FE\u52A0\u8F7D\u5931\u8D25\uFF09\uFF0C\u8BF7\u7528\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\u2014\u2014\u5B83\u4F1A\u6574\u9875\u5237\u65B0\uFF08\u4FDD\u7559\u5F53\u524D\u5730\u5740\uFF09\uFF0C\u672A\u4FDD\u5B58\u7684\u9875\u9762\u72B6\u6001\u4F1A\u4E22\u5931\u3002"),
78
+ h("div", { style: "margin:0" }, buttons)
33
79
  ]);
34
80
  };
35
81
  }
36
82
  });
83
+ function createRecoverableErrorPlaceholder(loader, spec, userErrorComponent) {
84
+ if (userErrorComponent) return userErrorComponent;
85
+ return defineComponent({
86
+ name: "FulgurjsRemoteErrorWithRetry",
87
+ props: { error: { type: Object, default: void 0 } },
88
+ setup(props, { attrs }) {
89
+ const recovered = ref(null);
90
+ const retrying = ref(false);
91
+ const retryError = ref(void 0);
92
+ const retry = async () => {
93
+ if (retrying.value) return;
94
+ retrying.value = true;
95
+ retryError.value = void 0;
96
+ try {
97
+ const mod = await loader();
98
+ const inner = mod?.default ?? mod;
99
+ if (!inner) throw noRenderableExportError(spec, inner);
100
+ recovered.value = inner;
101
+ } catch (e) {
102
+ retryError.value = e;
103
+ } finally {
104
+ retrying.value = false;
105
+ }
106
+ };
107
+ return () => {
108
+ const inner = recovered.value;
109
+ if (inner) return h(inner, attrs);
110
+ return h(RemoteErrorPlaceholder, {
111
+ error: retryError.value ?? props.error,
112
+ retry,
113
+ retrying: retrying.value
114
+ });
115
+ };
116
+ }
117
+ });
118
+ }
37
119
  function createRemoteComponent(loadRemote) {
38
120
  return function remoteComponent(spec, opts = {}) {
121
+ const loader = () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m);
39
122
  return defineAsyncComponent({
40
- loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
123
+ loader,
41
124
  loadingComponent: opts.loadingComponent,
42
- errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
125
+ errorComponent: createRecoverableErrorPlaceholder(loader, spec, opts.errorComponent),
43
126
  delay: opts.delay,
44
127
  timeout: opts.timeout
45
128
  });
@@ -59,18 +142,19 @@ function createHostPages(options, load) {
59
142
  let comp = compCache.get(spec);
60
143
  if (!comp) {
61
144
  const name = cleanCompName(spec);
145
+ const pageLoader = async () => {
146
+ await beforeLoad?.();
147
+ const mod = await load(spec);
148
+ const inner = mod?.default ?? mod;
149
+ if (!inner) {
150
+ throw noRenderableExportError(spec, inner);
151
+ }
152
+ return inner;
153
+ };
62
154
  const asyncComp = defineAsyncComponent({
63
- loader: async () => {
64
- await beforeLoad?.();
65
- const mod = await load(spec);
66
- const inner = mod?.default ?? mod;
67
- if (!inner) {
68
- throw noRenderableExportError(spec, inner);
69
- }
70
- return inner;
71
- },
155
+ loader: pageLoader,
72
156
  loadingComponent,
73
- errorComponent: errorComponent ?? RemoteErrorPlaceholder,
157
+ errorComponent: createRecoverableErrorPlaceholder(pageLoader, spec, errorComponent),
74
158
  delay
75
159
  });
76
160
  asyncComp.name = name;
@@ -0,0 +1,47 @@
1
+ # fulgurjs-federation Examples
2
+
3
+ Pick your framework, copy the host and remote directories, run `npm install`, and you get a full module federation demo. All four projects are standalone: no dependency on this repo's source, the monorepo workspace, or any parent `node_modules` — the plugin dependency is an exact published version from the npm registry.
4
+
5
+ ## Vue (host 5214 / remote 5213)
6
+
7
+ Full walkthrough: **[vue/README.md](./vue/README.md)** (Chinese).
8
+
9
+ ```bash
10
+ cd examples/vue/remote && npm install && npm run dev # terminal 1: vue-remote, http://localhost:5213
11
+ cd examples/vue/host && npm install && npm run dev # terminal 2: vue-host, http://localhost:5214
12
+ ```
13
+
14
+ ## React (host 5204 / remote 5203)
15
+
16
+ Full walkthrough: **[react/README.md](./react/README.md)** (Chinese).
17
+
18
+ ```bash
19
+ cd examples/react/remote && npm install && npm run dev # terminal 1: react-remote, http://localhost:5203
20
+ cd examples/react/host && npm install && npm run dev # terminal 2: react-host, http://localhost:5204
21
+ ```
22
+
23
+ ## What each pair demonstrates
24
+
25
+ - A clickable remote counter component (local state lives inside the remote component; operated on the host page)
26
+ - Cross-application plain TS module calls (the host renders real return values)
27
+ - A remote home page plus a parameterized detail page (deep links survive refresh)
28
+ - Host navigation with route-level lazy loading (the home page never bulk-prefetches unvisited remote pages)
29
+ - The plugin's built-in loading/error placeholders and recovery actions (**Retry load** recovers in-page; **Refresh page to retry** recovers via a user-initiated full reload)
30
+ - Production build with a minimal Nginx deployment (including SPA fallback)
31
+
32
+ ## Layout
33
+
34
+ ```text
35
+ examples/
36
+ ├── README.md / README.en.md # this entry (CN/EN)
37
+ ├── vue/
38
+ │ ├── README.md # guide for the Vue pair
39
+ │ ├── host/ # Vue host (vue-host, 5214)
40
+ │ └── remote/ # Vue remote (vue-remote, 5213)
41
+ └── react/
42
+ ├── README.md # guide for the React pair
43
+ ├── host/ # React host (react-host, 5204)
44
+ └── remote/ # React remote (react-remote, 5203)
45
+ ```
46
+
47
+ > `examples/` is for users to copy and run. The repository-root `fixtures/` are internal regression harnesses (source-linked to the plugin workspace) — do not treat them as usage templates.
@@ -1,27 +1,49 @@
1
- # examples — 可复制的单项目配置样例
1
+ # fulgurjs-federation 示例总入口
2
2
 
3
- 每个目录是一个**独立项目**的 `fulgurjs.config.ts`(4.2.0 单项目契约:默认导出直接可传给 `federation()`):
3
+ 选择你的框架,复制对应宿主与远程两个目录,`npm install` 后即可看到完整的模块联邦演示。四个工程互相独立:不依赖本仓库源码、monorepo workspace 或父目录 node_modules,插件依赖为 npm registry 精确正式包。
4
4
 
5
- - [`remote-a/fulgurjs.config.ts`](./remote-a/fulgurjs.config.ts) — 远程应用:exposes / setup / shared
6
- - [`host/fulgurjs.config.ts`](./host/fulgurjs.config.ts) — 宿主应用:remotes 消费地址 + 可选 `hostPages` 页面核对数据(仅供 CLI)
5
+ ## Vue(宿主 5214 / 远程 5213)
7
6
 
8
- React 完整可运行工程(5.1.0 起,npm registry 安装即跑,区别于上面两个「配置样例」目录):
7
+ 完整操作步骤见 **[vue/README.md](./vue/README.md)**。
9
8
 
10
- - [`react-remote/`](./react-remote) — React 远程(5203):Button/utils/pages expose + shared react/react-dom singleton
11
- - [`react-host/`](./react-host) — React 宿主(5204):`@fulgurjs/federation/react` 导入 + 页面表 + React Router;运行说明见其 README
9
+ ```bash
10
+ cd examples/vue/remote && npm install && npm run dev # 终端 1:vue-remote,http://localhost:5213
11
+ cd examples/vue/host && npm install && npm run dev # 终端 2:vue-host,http://localhost:5214
12
+ ```
13
+
14
+ ## React(宿主 5204 / 远程 5203)
12
15
 
13
- 复制方式:把对应文件整份复制到**你自己的项目根目录**(两个项目不共享配置文件、不共享父目录配置),再在各自 `vite.config.ts` 的 plugins 里加一次 `federation(fulgurjsConfig)`:
16
+ 完整操作步骤见 **[react/README.md](./react/README.md)**。
14
17
 
15
- ```ts
16
- import federation from '@fulgurjs/federation'
17
- import fulgurjsConfig from './fulgurjs.config'
18
+ ```bash
19
+ cd examples/react/remote && npm install && npm run dev # 终端 1:react-remote,http://localhost:5203
20
+ cd examples/react/host && npm install && npm run dev # 终端 2:react-host,http://localhost:5204
21
+ ```
18
22
 
19
- export default defineConfig({
20
- plugins: [
21
- // ...原有插件,
22
- federation(fulgurjsConfig),
23
- ],
24
- })
23
+ ## 每对示例演示什么
24
+
25
+ - 远程可点击计数组件(本地状态在远程组件内,宿主页面直接操作)
26
+ - 普通 TS 模块跨应用调用(宿主展示真实返回值)
27
+ - 远程首页 + 带真实路由参数的详情页(深链刷新可恢复)
28
+ - 宿主导航、路由级懒加载(首页不批量预取未访问的远程页面)
29
+ - 插件默认加载/错误占位与恢复操作(**重试加载** 同页恢复;**刷新页面重试** 整页恢复)
30
+ - 生产构建 + 最小 Nginx 部署(含 SPA fallback)
31
+
32
+ ## 目录
33
+
34
+ ```text
35
+ examples/
36
+ ├── README.md / README.en.md # 本入口(中/英)
37
+ ├── vue/
38
+ │ ├── README.md # Vue 一对示例的组合说明
39
+ │ ├── host/ # Vue 宿主(vue-host,5214)
40
+ │ └── remote/ # Vue 远程(vue-remote,5213)
41
+ └── react/
42
+ ├── README.md # React 一对示例的组合说明
43
+ ├── host/ # React 宿主(react-host,5204)
44
+ └── remote/ # React 远程(react-remote,5203)
25
45
  ```
26
46
 
27
- 验证:在复制后的项目根目录运行 `npx fulgurjs explain`(纯本地、无网络),应输出本应用的形态摘要与 `federation(fulgurjsConfig)` 接入块。
47
+ > `examples/` 面向使用者拷贝运行;仓库根的 `fixtures/` 是插件内部回归夹具(源码 link 到插件工作区),请勿当作使用模板。
48
+
49
+ > 提示:复制后可在项目根目录运行 `npx fulgurjs explain`(纯本地、无网络)核对联邦配置摘要。