@fulgurjs/federation 3.0.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +27 -25
- package/dist/chunk-AYS56IRF.js +42 -0
- package/dist/{chunk-TMSMEZPM.js → chunk-X4LZDAZQ.js} +1 -1
- package/dist/cli.js +2 -2
- package/dist/index.cjs +80 -41
- package/dist/index.js +80 -41
- package/dist/runtime-entry.d.ts +279 -0
- package/dist/runtime-entry.js +5 -0
- package/dist/runtime.js +2 -2
- package/dist/vue-adapter.cjs +66 -0
- package/dist/vue-adapter.d.cts +16 -0
- package/dist/vue-adapter.d.ts +16 -0
- package/dist/vue-adapter.js +6 -0
- package/dist/vue.cjs +17 -18
- package/dist/vue.d.cts +4 -33
- package/dist/vue.d.ts +4 -33
- package/dist/vue.js +3 -845
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +12 -10
- package/package.json +13 -5
- package/client.d.ts +0 -180
package/dist/runtime.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var oe=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function I(o){let i=oe.exec(String(o).trim());return i?{major:Number(i[1]),minor:Number(i[2]??0),patch:Number(i[3]??0),pre:i[4]?i[4].split("."):[]}:null}function ie(o,i){if(o.length===0&&i.length===0)return 0;if(o.length===0)return 1;if(i.length===0)return-1;let s=Math.max(o.length,i.length);for(let n=0;n<s;n++){let f=o[n],y=i[n];if(f===void 0)return-1;if(y===void 0)return 1;let
|
|
1
|
+
var oe=/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;function I(o){let i=oe.exec(String(o).trim());return i?{major:Number(i[1]),minor:Number(i[2]??0),patch:Number(i[3]??0),pre:i[4]?i[4].split("."):[]}:null}function ie(o,i){if(o.length===0&&i.length===0)return 0;if(o.length===0)return 1;if(i.length===0)return-1;let s=Math.max(o.length,i.length);for(let n=0;n<s;n++){let f=o[n],y=i[n];if(f===void 0)return-1;if(y===void 0)return 1;let b=/^\d+$/.test(f),w=/^\d+$/.test(y);if(b&&w){let T=Number(f)-Number(y);if(T!==0)return T}else{if(b!==w)return b?-1:1;if(f!==y)return f<y?-1:1}}return 0}function O(o,i){let s=I(o),n=I(i);return!s||!n?o<i?-1:o>i?1:0:s.major!==n.major?s.major-n.major:s.minor!==n.minor?s.minor-n.minor:s.patch!==n.patch?s.patch-n.patch:ie(s.pre,n.pre)}var se=/^[a-z]+[+:-]/i;function P(o,i){if(i===!1||i==null||i==="")return!0;let s=String(i).trim();return!s||s==="*"||s==="latest"||se.test(s)?!0:s.split("||").some(n=>ae(o,n.trim()))}function ae(o,i){if(!i||i==="*")return!I(o)?.pre.length;let s=i.split(/\s+-\s+/);if(s.length===2){let y=s[0].trim(),b=s[1].trim();return!(!P(o,`>=${y}`)||!P(o,`<=${b}`))}let n=I(o);if(!n)return!1;let f=ce(i);if(f===null)return!0;for(let y of f)if(!pe(n,o,y))return!1;return!(n.pre.length>0&&!f.some(y=>y.ver.pre.length>0)&&!f.some(b=>b.ver.major===n.major&&b.ver.minor===n.minor&&b.ver.patch===n.patch))}function ce(o){let i=[],s=o.trim().split(/\s+/).filter(Boolean);if(s.length===0)return null;for(let n of s){let f=/^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(n);if(!f)return null;let y=f[1],b=f[2],w=le(y,b);if(w===null)return null;i.push(...w)}return i}function le(o,i){let s=me(i);if(!s)return null;let{ver:n,partial:f}=s;switch(o){case"^":{let y=ue(n);return y?[{op:">=",ver:n},{op:"<",ver:y}]:null}case"~":{let y=f>=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 f===1?[{op:">=",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:f===2?[{op:">=",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:">",ver:n}];case"<":return f===1?[{op:"<",ver:{major:n.major,minor:0,patch:0,pre:[]}}]:f===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 f===1?[{op:">=",ver:n},{op:"<",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:f===2?[{op:">=",ver:n},{op:"<",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:n}];default:return null}}function ue(o){return o.major>0?{major:o.major+1,minor:0,patch:0,pre:[]}:o.minor>0?{major:0,minor:o.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:o.patch+1,pre:[]}}function me(o){let i=o.replace(/^v/,"").trim();if(!i||i==="*"||i==="x"||i==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let s=i.split("."),n=[],f=0;for(let w of s.slice(0,3))if(/^\d+$/.test(w))n.push(Number(w)),f++;else{if(w==="x"||w==="X"||w==="*")break;break}let y=i.split("-"),b=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return f===0&&b.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:b},partial:f}}function fe(o,i){switch(i){case">=":return o>=0;case">":return o>0;case"<":return o<0;case"<=":return o<=0;case"=":return o===0}}function pe(o,i,s){let n=`${o.major}.${o.minor}.${o.patch}`+(o.pre.length?`-${o.pre.join(".")}`:"");if(s.upper)return!(!(O(n,`${s.ver.major}.${s.ver.minor}.${s.ver.patch}`+(s.ver.pre.length?`-${s.ver.pre.join(".")}`:""))>=0)||!(O(n,`${s.upper.major}.${s.upper.minor}.${s.upper.patch}`)<0));let f=O(n,`${s.ver.major}.${s.ver.minor}.${s.ver.patch}`+(s.ver.pre.length?`-${s.ver.pre.join(".")}`:"")),y=fe(f,s.op);return s.ver.pre.length>0&&o.pre.length===0&&(s.op===">"||s.op==="<")?!1:y}var E=class extends Error{code;details;constructor(i,s,n){super(`[fulgurjs:${i}] ${s}`),this.name="FgError",this.code=i,this.details=n}},S={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"};var q="4.0.0";var U=15e3,z=2,de=5,ge=3e4,he=4e3,ye=.2;function Re(){let o=Object.create(null),i=new Map,s=[],n=new Map,f=new Map,y=new WeakMap,b=new WeakMap,w={},T=()=>{for(let e of s)try{e.init?.(w)}catch(t){console.warn("[fulgurjs] runtimePlugin init failed:",e.name,t)}},N=e=>o[e]??=Object.create(null);function k(e){try{w.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function B(e="default"){return N(e),o}function J(e,t,r,l,h={}){let a=N(e||"default"),p=Object.hasOwn(a,t)?a[t]:void 0,d=p&&typeof p=="object"?p:void 0;d||(d=Object.create(null),a[t]=d),!(Object.hasOwn(d,r)&&d[r])&&(d[r]={version:r,get:l,from:h.from??"unknown",eager:!!h.eager,loaded:!!h.loaded})}function G(e){let t=(r,l,h)=>{if(r===void 0)return;if(!(typeof r=="number"&&(h?Number.isInteger(r)&&r>=0&&r<=10:Number.isFinite(r)&&r>0)))throw new Error(`[fulgurjs] registerRemote("${e.name}"): ${l} must be a ${h?"integer 0..10":"finite positive number"}, got ${String(r)}`)};t(e.timeout,"timeout"),t(e.retries,"retries",!0),e.breaker&&(t(e.breaker.threshold,"breaker.threshold"),t(e.breaker.resetMs,"breaker.resetMs"))}function F(e){for(let t of e){G(t);let r=i.get(t.name);i.set(t.name,{timeout:U,retries:z,...r,...t,breakerThreshold:t.breaker?.threshold??r?.breakerThreshold??de,breakerResetMs:t.breaker?.resetMs??r?.breakerResetMs??ge,state:r?.state??"idle",breakerState:r?.breakerState??{fails:0,openUntil:0},entryInflight:r?.entryInflight??new Map,debug:r?.debug??{entry:t.entry,status:"idle"}})}}function X(e){F([e])}function Y(e){s.push(...e),T()}async function Z(e,t={}){let r=t.shareScope||"default",l=t.shareKey||e,a=N(r)[l]||{},p=Object.keys(a),d=t.requiredVersion,g=p.filter(c=>d===void 0||d===!1||P(c,d)),m;if(t.singleton&&p.length>0){let c=p.filter(u=>a[u].loaded);if(m=[...c.length?c:p].sort(O).pop(),p.length>1||!g.includes(m)){let u=a[m],_=`singleton skew "${l}": req "${d??"any"}" use ${m} from ${u.from}`;if(t.strictVersion){let $=new E(S.SHARE_STRICT_VERSION,_,{shareKey:l,requiredVersion:d});throw k({remote:u.from,error:$}),$}console.warn(`[fulgurjs:MFU-010] ${_}`)}}else if(m=[...g].sort(O).pop(),!m){if(t.strictVersion){let u=new E(S.SHARE_STRICT_VERSION,`no satisfying version for "${l}" (required "${d}") in share scope "${r}"`);throw k({remote:l,error:u}),u}if(t.fallback)return t.fallback();let c=new E(S.SHARE_NOT_AVAILABLE,`shared "${l}" (${d??"any"}) unavailable in scope "${r}" (no local fallback)`,{shareKey:l,requiredVersion:d});throw k({remote:l,error:c}),c}let R=a[m];if(w.resolveShare){let c=await w.resolveShare({shareKey:l,shareScope:r,requiredVersion:d,picked:R,available:Object.values(a)});c&&(R=c)}return R.loaded=!0,R.get()}function Q(e){try{let t=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return t.protocol+"//"+t.host+t.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function C(e,t,r){return new Promise((l,h)=>{let a=setTimeout(()=>h(new Error(`timeout after ${t}ms: ${r}`)),t);e.then(p=>{clearTimeout(a),l(p)},p=>{clearTimeout(a),h(p)})})}let ee=e=>new Promise(t=>setTimeout(t,e));function A(e,t){if(!e||typeof e.get!="function")throw new Error(`remoteEntry of "${t.name}" does not export a container interface (get/init)`);if(e.name&&t.name&&e.name!==t.name){let r=`remoteEntry self-reported name "${e.name}" mismatches configured name "${t.name}"`;if(t.promise)console.warn(`[fulgurjs] ${r} (promise-based remote, continuing)`);else throw Object.assign(new Error(r),{code:S.REMOTE_NAME_MISMATCH})}}async function D(e,t){let r=t.entryInflight.get(e),l=r??import(e);return r||(t.entryInflight.set(e,l),l.catch(()=>t.entryInflight.delete(e))),C(l,t.timeout??U,`load remoteEntry ${e}`)}async function V(e,t){let r=e.shareScope||"default";if(e.container){let a=b.get(e.container);if(a&&a!==r)throw new E(S.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${a}", cannot re-init with "${r}"`);return e.container}if(e.containerPromise)return e.containerPromise;let l=e.breakerState;if(l.openUntil>Date.now()){let a=new E(S.REMOTE_LOAD_FAILED,`circuit breaker open for remote "${e.name}" until ${new Date(l.openUntil).toISOString()}`,{remote:e.name});throw k({remote:e.name,error:a}),a}e.state="loading",e.debug.status="loading";let h=(async()=>{let a=[];if(e.promise)a.push(async()=>{let c=await C(e.promise(),e.timeout??U,`resolve promise remote "${e.name}"`),u=typeof c=="string"?await D(c,e):c;return A(u,e),u});else for(let c of[e.entry,...e.fallback??[]])a.push(async()=>{let u=await D(c,e);return A(u,e),u});let p,d,g=!1,m=t?.retries??e.retries??z;for(let c of a){for(let u=0;u<=m;u++){let _=performance.now();try{p=await c(),e.lastLoadMs=Math.round(performance.now()-_),e.debug.lastLoadMs=e.lastLoadMs,g=!0;break}catch($){if(d=$,$?.code)throw $;u<m&&await ee(Math.min(he,200*2**u)*(1-ye*(1-2*Math.random())))}}if(g)break}if(!g||!p){let c=Q(e.entry),u=[];throw/^https?:\/\//.test(e.entry)&&typeof location<"u"?(u.push(`1. is the remote dev server running? open ${c} in a browser \u2014 it must return JS, not HTML`),u.push("2. is the URL correct in federation({ remotes })? dev/prod entries can differ"),u.push("3. CORS: the remote dev server must allow cross-origin requests (check its server.cors)")):(u.push(`1. is the remote deployed? open ${c} in a browser \u2014 it must return JS`),u.push("2. NGINX/CDN routing: the entry path must serve the remoteEntry JS (check try_files)")),new E(S.REMOTE_LOAD_FAILED,`failed to load remote "${e.name}" from ${c}: ${String(d?.message??d)}
|
|
2
2
|
`+u.join(`
|
|
3
|
-
`),{remote:e.name})}A(p,e);let
|
|
3
|
+
`),{remote:e.name})}A(p,e);let R=b.get(p);if(R&&R!==r)throw new E(S.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${R}", cannot re-init with "${r}"`);return typeof p.init=="function"&&await p.init(o),b.set(p,r),e.container=p,e.state="loaded",e.debug.status="loaded",l.fails=0,p})();e.containerPromise=h;try{return await h}catch(a){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(a?.message??a),l.fails+=1,l.fails>=e.breakerThreshold&&(l.openUntil=Date.now()+e.breakerResetMs,l.fails=0),a instanceof E)throw k({remote:e.name,error:a}),a;if(a?.code)throw k({remote:e.name,error:a}),a;let p=new E(S.REMOTE_LOAD_FAILED,String(a?.message??a),{remote:e.name});throw k({remote:e.name,error:p}),p}}function x(e){let t=e.indexOf("/");return t===-1?{remote:e,module:""}:{remote:e.slice(0,t),module:H(e.slice(t+1))}}function H(e){return e?e.startsWith(".")?e:`./${e}`:""}async function re(e,t){let{remote:r,module:l}=x(e);try{w.beforeLoadRemote?.({remote:r,module:l})}catch(g){console.warn("[fulgurjs] beforeLoadRemote hook error (ignored):",g)}let h=i.get(r);if(!h)throw new E(S.REMOTE_UNKNOWN,`unknown remote "${r}". Register it via federation({ remotes }) or registerRemote().`,{remote:r});let a;try{let g=l&&h.manifestUrl?K(e):Promise.resolve();[a]=await Promise.all([V(h,{retries:t?.retries}),g])}catch(g){if(t?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`,g),k({remote:r,error:g}),await t.fallbackModule();throw g}if(!l)return a;let p=`${r}@${h.shareScope||"default"}#${l}`;n.has(p)||n.set(p,a.get(l).catch(g=>{throw n.delete(p),g instanceof E||g?.code?g:new E(S.REMOTE_LOAD_FAILED,`failed to load module "${l}" from remote "${r}": ${String(g?.message??g)}`,{remote:r,module:l})}));let d;try{d=await n.get(p)}catch(g){if(t?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\u663E\u5F0F\u964D\u7EA7\uFF0C\u9519\u8BEF\u5DF2\u900F\u51FA)`,g),k({remote:r,error:g}),await t.fallbackModule();throw g}try{w.afterLoadRemote?.({remote:r,module:l,module_ns:d})}catch(g){console.warn("[fulgurjs] afterLoadRemote hook error (ignored):",g)}if(d&&typeof d=="object"&&Object.keys(d).length===0){let g=new E(S.EMPTY_EXPORTS,`no exports: ${l} @ ${r}`,{remote:r,module:l});k({remote:r,error:g}),console.error(`[fulgurjs:MFU-009] ${g.message}`)}return d}function te(e){let t=i.get(e);if(!t)throw new E(S.REMOTE_UNKNOWN,`unknown remote "${e}"`,{remote:e});return V(t)}async function K(e,t={}){let{remote:r,module:l}=x(e),h=i.get(r);if(!h)throw new E(S.REMOTE_UNKNOWN,`unknown remote "${r}"`,{remote:r});let a=t.mode??"preload",p=(m,R)=>{if(m.sheet)return Promise.resolve();let c=y.get(m);if(c)return c;let u=new Promise(_=>{let $=()=>{m.removeEventListener("load",$),m.removeEventListener("error",j),_()},j=()=>{k({remote:r,error:new E(S.PRELOAD_FAILED,`failed to load remote stylesheet ${R}`,{remote:r})}),$()};m.addEventListener("load",$,{once:!0}),m.addEventListener("error",j,{once:!0}),m.sheet&&$()});return y.set(m,u),u},d=(m,R)=>{if(typeof document>"u")return Promise.resolve();let c=document.querySelector(`link[href="${m}"]`);if(c)return R==="style"&&a==="preload"?y.get(c)??Promise.resolve():Promise.resolve();let u=document.createElement("link");u.rel=R==="style"?"stylesheet":"modulepreload",u.href=m,a==="prefetch"&&(u.fetchPriority="low");let _=R==="style"?p(u,m):Promise.resolve();return document.head.appendChild(u),R==="style"&&a==="preload"?_:Promise.resolve()},g=m=>{let R=typeof document<"u"?document.baseURI:void 0,c=new URL(h.entry,R||"http://fulgurjs.invalid/");return!c.pathname.endsWith("/")&&!c.pathname.split("/").pop().includes(".")&&(c.pathname+="/"),new URL(m,c).href};try{if(h.manifestUrl){let m=f.get(h.manifestUrl);m||(m=fetch(h.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(c=>c.ok?c.json():void 0),f.set(h.manifestUrl,m),m.then(c=>{c||f.delete(h.manifestUrl)},()=>f.delete(h.manifestUrl)));let R=await m;if(R){let c=R.schemaVersion;if(typeof c=="number"&&(!Number.isInteger(c)||c>1)){k({remote:r,error:new E(S.PRELOAD_FAILED,`unsupported manifest schemaVersion ${String(c)} (expected 1)`,{remote:r})}),await d(h.entry,"modulepreload");return}await d(h.entry,"modulepreload");let u=R.exposes,_=Array.isArray(u)?u.filter(v=>v&&typeof v=="object").map(v=>[String(v.name??""),v]):u&&typeof u=="object"?Object.entries(u):[],$=l?_.filter(([v,L])=>H(String(L?.name??v))===l):_,j=[];for(let[,v]of $)if(typeof v?.file=="string"&&await d(g(v.file),"modulepreload"),Array.isArray(v?.css))for(let L of v.css){if(typeof L!="string")continue;let ne=d(g(L),"style");a==="preload"&&j.push(ne)}await Promise.all(j);return}}await d(h.entry,"modulepreload")}catch(m){k({remote:r,error:new E(S.PRELOAD_FAILED,String(m?.message??m),{remote:r})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=o,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[t,r]of i)e[t]={...r.debug,entry:r.entry};return e},errors:[]}),{shareScopeMap:o,initSharing:B,registerShare:J,registerRemotes:F,registerRemote:X,registerPlugins:Y,loadShare:Z,loadRemote:re,getContainer:te,preloadRemote:K,parseSpec:x}}var W=globalThis,M=W.__FULGURJS_RUNTIME__??Re();W.__FULGURJS_RUNTIME__=M;try{Object.freeze(M)}catch{}var ve=q;function _e(){return M}var Oe=M.initSharing,je=M.registerShare,Te=M.registerRemotes,Le=M.registerRemote,Ie=M.registerPlugins,Pe=M.loadShare,Ne=M.loadRemote,Ae=M.getContainer,xe=M.preloadRemote,Ue=M.parseSpec,Fe=M.shareScopeMap;function Ce(o){if(o&&typeof o=="object"&&"default"in o){let i=o.default;return i!==void 0?i:o}return o}var De=M;export{De as default,Ae as getContainer,_e as getRuntime,Oe as initSharing,Ne as loadRemote,Pe as loadShare,Ue as parseSpec,xe as preloadRemote,Ie as registerPlugins,Le as registerRemote,Te as registerRemotes,je as registerShare,M as runtime,Fe as shareScopeMap,Ce as unwrapDefault,ve as version};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/vue-adapter.ts
|
|
21
|
+
var vue_adapter_exports = {};
|
|
22
|
+
__export(vue_adapter_exports, {
|
|
23
|
+
createRemoteComponent: () => createRemoteComponent
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(vue_adapter_exports);
|
|
26
|
+
var import_vue = require("vue");
|
|
27
|
+
var ERROR_STYLE = {
|
|
28
|
+
padding: "16px",
|
|
29
|
+
border: "1px solid #fde2e2",
|
|
30
|
+
borderRadius: "4px",
|
|
31
|
+
background: "#fef0f0",
|
|
32
|
+
color: "#c45656",
|
|
33
|
+
fontSize: "13px",
|
|
34
|
+
lineHeight: "1.6"
|
|
35
|
+
};
|
|
36
|
+
var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
37
|
+
name: "FulgurjsRemoteError",
|
|
38
|
+
props: { error: { type: Object, default: void 0 } },
|
|
39
|
+
setup(props) {
|
|
40
|
+
return () => {
|
|
41
|
+
const err = props.error;
|
|
42
|
+
const code = err?.code ?? "UNKNOWN";
|
|
43
|
+
const message = err?.message ?? String(props.error ?? "unknown error");
|
|
44
|
+
return (0, import_vue.h)("div", { style: ERROR_STYLE }, [
|
|
45
|
+
(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`),
|
|
46
|
+
(0, import_vue.h)("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
47
|
+
(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")
|
|
48
|
+
]);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
function createRemoteComponent(loadRemote) {
|
|
53
|
+
return function remoteComponent(spec, opts = {}) {
|
|
54
|
+
return (0, import_vue.defineAsyncComponent)({
|
|
55
|
+
loader: () => loadRemote(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
56
|
+
loadingComponent: opts.loadingComponent,
|
|
57
|
+
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
58
|
+
delay: opts.delay,
|
|
59
|
+
timeout: opts.timeout
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
64
|
+
0 && (module.exports = {
|
|
65
|
+
createRemoteComponent
|
|
66
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
|
|
3
|
+
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
|
4
|
+
|
|
5
|
+
interface RemoteComponentOptions {
|
|
6
|
+
loadingComponent?: Component;
|
|
7
|
+
errorComponent?: Component;
|
|
8
|
+
retries?: number;
|
|
9
|
+
delay?: number;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}
|
|
12
|
+
declare function createRemoteComponent(loadRemote: (spec: string, opts?: {
|
|
13
|
+
retries?: number;
|
|
14
|
+
}) => Promise<any>): (spec: string, opts?: RemoteComponentOptions) => Component;
|
|
15
|
+
|
|
16
|
+
export { type RemoteComponentOptions, createRemoteComponent };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
|
|
3
|
+
/** Vue 适配层只接收加载函数,不静态引用运行时内核。 */
|
|
4
|
+
|
|
5
|
+
interface RemoteComponentOptions {
|
|
6
|
+
loadingComponent?: Component;
|
|
7
|
+
errorComponent?: Component;
|
|
8
|
+
retries?: number;
|
|
9
|
+
delay?: number;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}
|
|
12
|
+
declare function createRemoteComponent(loadRemote: (spec: string, opts?: {
|
|
13
|
+
retries?: number;
|
|
14
|
+
}) => Promise<any>): (spec: string, opts?: RemoteComponentOptions) => Component;
|
|
15
|
+
|
|
16
|
+
export { type RemoteComponentOptions, createRemoteComponent };
|
package/dist/vue.cjs
CHANGED
|
@@ -23,7 +23,6 @@ __export(vue_exports, {
|
|
|
23
23
|
remoteComponent: () => remoteComponent
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(vue_exports);
|
|
26
|
-
var import_vue = require("vue");
|
|
27
26
|
|
|
28
27
|
// src/semver.ts
|
|
29
28
|
var VERSION_RE = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
@@ -851,7 +850,8 @@ var preloadRemote = runtime.preloadRemote;
|
|
|
851
850
|
var parseSpec = runtime.parseSpec;
|
|
852
851
|
var shareScopeMap = runtime.shareScopeMap;
|
|
853
852
|
|
|
854
|
-
// src/vue.ts
|
|
853
|
+
// src/vue-adapter.ts
|
|
854
|
+
var import_vue = require("vue");
|
|
855
855
|
var ERROR_STYLE = {
|
|
856
856
|
padding: "16px",
|
|
857
857
|
border: "1px solid #fde2e2",
|
|
@@ -863,9 +863,7 @@ var ERROR_STYLE = {
|
|
|
863
863
|
};
|
|
864
864
|
var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
865
865
|
name: "FulgurjsRemoteError",
|
|
866
|
-
props: {
|
|
867
|
-
error: { type: Object, default: void 0 }
|
|
868
|
-
},
|
|
866
|
+
props: { error: { type: Object, default: void 0 } },
|
|
869
867
|
setup(props) {
|
|
870
868
|
return () => {
|
|
871
869
|
const err = props.error;
|
|
@@ -874,24 +872,25 @@ var RemoteErrorPlaceholder = (0, import_vue.defineComponent)({
|
|
|
874
872
|
return (0, import_vue.h)("div", { style: ERROR_STYLE }, [
|
|
875
873
|
(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`),
|
|
876
874
|
(0, import_vue.h)("p", { style: "margin:0 0 8px;word-break:break-all" }, message),
|
|
877
|
-
(0, import_vue.h)(
|
|
878
|
-
"p",
|
|
879
|
-
{ style: "margin:0" },
|
|
880
|
-
"\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"
|
|
881
|
-
)
|
|
875
|
+
(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")
|
|
882
876
|
]);
|
|
883
877
|
};
|
|
884
878
|
}
|
|
885
879
|
});
|
|
886
|
-
function
|
|
887
|
-
return (
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
880
|
+
function createRemoteComponent(loadRemote2) {
|
|
881
|
+
return function remoteComponent2(spec, opts = {}) {
|
|
882
|
+
return (0, import_vue.defineAsyncComponent)({
|
|
883
|
+
loader: () => loadRemote2(spec, { retries: opts.retries }).then((m) => m.default ?? m),
|
|
884
|
+
loadingComponent: opts.loadingComponent,
|
|
885
|
+
errorComponent: opts.errorComponent ?? RemoteErrorPlaceholder,
|
|
886
|
+
delay: opts.delay,
|
|
887
|
+
timeout: opts.timeout
|
|
888
|
+
});
|
|
889
|
+
};
|
|
894
890
|
}
|
|
891
|
+
|
|
892
|
+
// src/vue.ts
|
|
893
|
+
var remoteComponent = createRemoteComponent(loadRemote);
|
|
895
894
|
// Annotate the CommonJS export names for ESM import in node:
|
|
896
895
|
0 && (module.exports = {
|
|
897
896
|
remoteComponent
|
package/dist/vue.d.cts
CHANGED
|
@@ -1,35 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { RemoteComponentOptions } from './vue-adapter.cjs';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
* Vue 生态层:remoteComponent() 远程组件直渲染。
|
|
5
|
-
*
|
|
6
|
-
* 定位:runtime.js 保持框架无关(不 import vue,gzip 红线守卫),
|
|
7
|
-
* Vue 封装按需引入——独立文件、零 runtime 体积增量。
|
|
8
|
-
*
|
|
9
|
-
* 语义(用法与选项见 README §8):
|
|
10
|
-
* - 内部 = defineAsyncComponent({ loader: () => loadRemote(spec, opts).then(m => m.default ?? m) });
|
|
11
|
-
* - H3 零兜底:加载失败显式进错误态(fulgurjs:error 事件由 runtime 层照常发出),
|
|
12
|
-
* 不传 errorComponent 时渲染内置默认错误占位(文案含错误码+根因+修法,显式非静默);
|
|
13
|
-
* - 模块去重沿用 loadRemote 内部 Promise 缓存(同 spec 不重复加载);
|
|
14
|
-
* - 返回标准 Vue 异步组件,props(如 form-params)在使用处透传,不改分发机制。
|
|
15
|
-
*/
|
|
4
|
+
declare const remoteComponent: (spec: string, opts?: RemoteComponentOptions) => vue.Component;
|
|
16
5
|
|
|
17
|
-
|
|
18
|
-
/** 加载期间展示的组件 */
|
|
19
|
-
loadingComponent?: Component;
|
|
20
|
-
/** 加载失败展示的组件(收到 error prop);不传时用内置默认错误占位 */
|
|
21
|
-
errorComponent?: Component;
|
|
22
|
-
/** 单次调用级重试覆盖,透传 loadRemote(缺省用远程注册值,默认 2) */
|
|
23
|
-
retries?: number;
|
|
24
|
-
/** defineAsyncComponent delay(ms):切换到 loadingComponent 前的等待,默认 200 */
|
|
25
|
-
delay?: number;
|
|
26
|
-
/** defineAsyncComponent timeout(ms):超时进错误态;不设则由 runtime 容器超时兜底 */
|
|
27
|
-
timeout?: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 创建远程组件:`remoteComponent('demo-host/FormRouterPage')`。
|
|
31
|
-
* 返回标准 Vue 异步组件,使用处直接透传 props(如 form-params)。
|
|
32
|
-
*/
|
|
33
|
-
declare function remoteComponent(spec: string, opts?: RemoteComponentOptions): Component;
|
|
34
|
-
|
|
35
|
-
export { type RemoteComponentOptions, remoteComponent };
|
|
6
|
+
export { RemoteComponentOptions, remoteComponent };
|
package/dist/vue.d.ts
CHANGED
|
@@ -1,35 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { RemoteComponentOptions } from './vue-adapter.js';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
* Vue 生态层:remoteComponent() 远程组件直渲染。
|
|
5
|
-
*
|
|
6
|
-
* 定位:runtime.js 保持框架无关(不 import vue,gzip 红线守卫),
|
|
7
|
-
* Vue 封装按需引入——独立文件、零 runtime 体积增量。
|
|
8
|
-
*
|
|
9
|
-
* 语义(用法与选项见 README §8):
|
|
10
|
-
* - 内部 = defineAsyncComponent({ loader: () => loadRemote(spec, opts).then(m => m.default ?? m) });
|
|
11
|
-
* - H3 零兜底:加载失败显式进错误态(fulgurjs:error 事件由 runtime 层照常发出),
|
|
12
|
-
* 不传 errorComponent 时渲染内置默认错误占位(文案含错误码+根因+修法,显式非静默);
|
|
13
|
-
* - 模块去重沿用 loadRemote 内部 Promise 缓存(同 spec 不重复加载);
|
|
14
|
-
* - 返回标准 Vue 异步组件,props(如 form-params)在使用处透传,不改分发机制。
|
|
15
|
-
*/
|
|
4
|
+
declare const remoteComponent: (spec: string, opts?: RemoteComponentOptions) => vue.Component;
|
|
16
5
|
|
|
17
|
-
|
|
18
|
-
/** 加载期间展示的组件 */
|
|
19
|
-
loadingComponent?: Component;
|
|
20
|
-
/** 加载失败展示的组件(收到 error prop);不传时用内置默认错误占位 */
|
|
21
|
-
errorComponent?: Component;
|
|
22
|
-
/** 单次调用级重试覆盖,透传 loadRemote(缺省用远程注册值,默认 2) */
|
|
23
|
-
retries?: number;
|
|
24
|
-
/** defineAsyncComponent delay(ms):切换到 loadingComponent 前的等待,默认 200 */
|
|
25
|
-
delay?: number;
|
|
26
|
-
/** defineAsyncComponent timeout(ms):超时进错误态;不设则由 runtime 容器超时兜底 */
|
|
27
|
-
timeout?: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 创建远程组件:`remoteComponent('demo-host/FormRouterPage')`。
|
|
31
|
-
* 返回标准 Vue 异步组件,使用处直接透传 props(如 form-params)。
|
|
32
|
-
*/
|
|
33
|
-
declare function remoteComponent(spec: string, opts?: RemoteComponentOptions): Component;
|
|
34
|
-
|
|
35
|
-
export { type RemoteComponentOptions, remoteComponent };
|
|
6
|
+
export { RemoteComponentOptions, remoteComponent };
|