@arun-shop/shell-stub 0.1.2 → 0.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.
package/README.md CHANGED
@@ -31,10 +31,20 @@ http://localhost:3102/catalog.
31
31
  | ------------ | -------------------------------------------------------------- | --------- |
32
32
  | `--name` | The MFE's name: files at `/mfe/<name>/`, API at `/api/<name>/` | required |
33
33
  | `--mfe-url` | The MFE's FES | required |
34
- | `--port` | The stub's port | `3100` |
34
+ | `--port` | The stub's port; `0` picks any free port | `3100` |
35
35
  | `--route` | The MFE's route | `/<name>` |
36
36
  | `--env-file` | A `.env` with New Relic browser keys, to report errors | none |
37
37
 
38
+ ### Ports
39
+
40
+ The stub needs one port, in development mode too (Vite runs inside it). If the port is taken, it says
41
+ so and exits: pass another `--port`, or `--port 0` for any free port (it prints the URL it got).
42
+
43
+ To use other ports on one machine without editing `package.json`, set `SHELL_STUB_PORT` and
44
+ `SHELL_STUB_MFE_URL`, in the shell or in the `--env-file`. They override the flags, because an MFE's
45
+ script always passes them. The FES port itself is the MFE's own setting (`PORT` in its `fes/.env`);
46
+ point `SHELL_STUB_MFE_URL` at it when you change it.
47
+
38
48
  New Relic is off unless the env file sets all of `NEW_RELIC_ACCOUNT_ID`, `NEW_RELIC_TRUST_KEY`,
39
49
  `NEW_RELIC_AGENT_ID`, `NEW_RELIC_BROWSER_LICENSE_KEY` and `NEW_RELIC_BROWSER_APPLICATION_ID`. These are
40
50
  the Shell's public browser keys.
@@ -42,6 +52,31 @@ the Shell's public browser keys.
42
52
  The stub uses the same `@arun-dev/ui` and `@arun-dev/tokens` versions as the Shell, so an MFE looks the
43
53
  same standalone as in the Shell. Requires Node 24.22.1 or newer.
44
54
 
55
+ ## Development mode (HMR)
56
+
57
+ With `--dev`, the stub runs the MFE's own Vite (from the MFE's `node_modules`, with its
58
+ `vite.config.ts`) inside its own process and serves the MFE's source through it. Edits show at once
59
+ through hot module replacement, and React Fast Refresh keeps component state. One process and one
60
+ port: HMR runs on the stub's origin, and the API still goes to `--mfe-url`.
61
+
62
+ ```json
63
+ {
64
+ "scripts": {
65
+ "standalone:dev": "shell-stub --name catalog --mfe-url http://localhost:3002 --port 3102 --dev"
66
+ }
67
+ }
68
+ ```
69
+
70
+ | Option | Meaning | Default |
71
+ | ------------- | ---------------------------------- | --------------- |
72
+ | `--dev` | Development mode with HMR | off |
73
+ | `--dev-root` | The MFE's Vite project | `client` |
74
+ | `--dev-entry` | The entry in that project's source | `src/entry.tsx` |
75
+
76
+ The MFE needs no extra Vite configuration: its usual `base` (`/mfe/<name>/`) is kept. Browser
77
+ debugging works on the original TypeScript through Vite's source maps, and Vite's compile errors show
78
+ in the stub's terminal and in its browser overlay. Production builds are unaffected.
79
+
45
80
  ## Release
46
81
 
47
82
  Releases are made with [changesets](https://github.com/changesets/changesets), as in
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/monitoring-BrrZzYzN.js","assets/parse-url-BjQzQUGD.js","assets/stringify-Dzp3UIiC.js","assets/preload-helper-DqzGtu2i.js","assets/env.npm-BosvNi0g.js","assets/event-listener-opts-S1G6uDJo.js","assets/clean-url-PIxP5rIW.js","assets/constants-B39wMiCG.js","assets/page-visibility-CPUGlMvF.js","assets/deny-list-DB7HzON3.js","assets/constants-CZf-nsH0.js","assets/drain-Ci6kjtHo.js","assets/register-handler-Do-e4XFS.js","assets/feature-base-DCxEqhTo.js","assets/agent-constants-BslZEhou.js","assets/utils-HjH2zvlh.js","assets/invoke-yXE5uxEq.js","assets/events-BqJgC3Et.js","assets/constants-CvitFm-l.js","assets/constants-BCcBZ5XF.js","assets/constants-CdX3b0L1.js","assets/utils-BCGlS8lK.js","assets/constants-CDnI58H4.js","assets/feature-gates-D617h-o3.js","assets/load-1XXgLaBh.js","assets/constants-CMEXhPvr.js","assets/constants-BWRO9jlX.js","assets/constants-BR-VOpyY.js","assets/utils-ByvlpCaG.js","assets/constants-Dx9_fT4n.js","assets/sharedHandlers-WNAr8J3U.js","assets/iframe-constants-C6xKQhrH.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-DqzGtu2i.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=Object.freeze({__proto__:null,get start(){return He},get ensureJQuerySupport(){return Ce},get setBootstrapMaxTime(){return le},get setMountMaxTime(){return ue},get setUnmountMaxTime(){return de},get setUnloadMaxTime(){return fe},get registerApplication(){return Me},get unregisterApplication(){return Pe},get getMountedApps(){return Oe},get getAppStatus(){return Ae},get unloadApplication(){return Fe},get checkActivityFunctions(){return Ne},get getAppNames(){return ke},get pathToActiveWhen(){return Re},get navigateToUrl(){return V},get patchHistoryApi(){return be},get triggerAppChange(){return ze},get addErrorHandler(){return o},get removeErrorHandler(){return s},get mountRootParcel(){return oe},get NOT_LOADED(){return u},get LOADING_SOURCE_CODE(){return d},get NOT_BOOTSTRAPPED(){return f},get BOOTSTRAPPING(){return p},get NOT_MOUNTED(){return m},get MOUNTING(){return h},get UPDATING(){return _},get LOAD_ERROR(){return b},get MOUNTED(){return g},get UNLOADING(){return y},get UNMOUNTING(){return v},get SKIP_BECAUSE_BROKEN(){return x}}),n=(typeof globalThis<`u`?globalThis:typeof window<`u`?window:typeof global<`u`?global:typeof self<`u`?self:{}).CustomEvent,r=function(){try{var e=new n(`cat`,{detail:{foo:`bar`}});return e.type===`cat`&&e.detail.foo===`bar`}catch{}return!1}()?n:typeof document<`u`&&typeof document.createEvent==`function`?function(e,t){var n=document.createEvent(`CustomEvent`);return t?n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail):n.initCustomEvent(e,!1,!1,void 0),n}:function(e,t){var n=document.createEventObject();return n.type=e,t?(n.bubbles=!!t.bubbles,n.cancelable=!!t.cancelable,n.detail=t.detail):(n.bubbles=!1,n.cancelable=!1,n.detail=void 0),n},i=[];function a(e,t,n){let r=l(e,t,n);i.length?i.forEach((e=>e(r))):setTimeout((()=>{throw r}))}function o(e){if(typeof e!=`function`)throw Error(c(28,!1));i.push(e)}function s(e){if(typeof e!=`function`)throw Error(c(29,!1));let t=!1;return i=i.filter((n=>{let r=n===e;return t||=r,!r})),t}function c(e,t,...n){return`single-spa minified message #${e}: ${t?t+` `:``}See https://single-spa.js.org/error/?code=${e}${n.length?`&arg=${n.join(`&arg=`)}`:``}`}function l(e,t,n){let r=`${E(t)} '${w(t)}' died in status ${t.status}: `,i;if(e instanceof Error){try{e.message=r+e.message}catch{}i=e}else{console.warn(c(30,!1,t.status,w(t)));try{i=Error(r+JSON.stringify(e))}catch{i=e}}return i.appOrParcelName=w(t),t.status=n,i}var u=`NOT_LOADED`,d=`LOADING_SOURCE_CODE`,f=`NOT_BOOTSTRAPPED`,p=`BOOTSTRAPPING`,m=`NOT_MOUNTED`,h=`MOUNTING`,g=`MOUNTED`,_=`UPDATING`,v=`UNMOUNTING`,y=`UNLOADING`,b=`LOAD_ERROR`,x=`SKIP_BECAUSE_BROKEN`;function S(e){return e.status===g}function C(e){try{return e.activeWhen(window.location)}catch(t){return a(t,e,x),!1}}function w(e){return e.name}function T(e){return!!e.unmountThisParcel}function E(e){return T(e)?`parcel`:`application`}function D(){for(let e=arguments.length-1;e>0;e--)for(let t in arguments[e])t!==`__proto__`&&(arguments[e-1][t]=arguments[e][t]);return arguments[0]}function O(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}function k(e){return e&&(typeof e==`function`||(t=e,Array.isArray(t)&&!O(t,(e=>typeof e!=`function`))));var t}function A(e,t){let n=e[t]||[];n=Array.isArray(n)?n:[n],n.length===0&&(n=[()=>Promise.resolve()]);let r=E(e),i=w(e);return function(e){return n.reduce(((n,a,o)=>n.then((()=>{let n=a(e);return ee(n)?n:Promise.reject(c(15,!1,r,i,t,o))}))),Promise.resolve())}}function ee(e){return e&&typeof e.then==`function`&&typeof e.catch==`function`}var te=[];function j(e,t){return Promise.resolve().then((()=>e.status===`NOT_BOOTSTRAPPED`?(e.status=p,e.bootstrap?I(e,`bootstrap`).then(n).catch((n=>{if(t)throw l(n,e,x);return a(n,e,x),e})):Promise.resolve().then(n)):e));function n(){return e.status=m,e}}function M(e,t){return Promise.resolve().then((()=>{if(e.status!==`MOUNTED`)return e;e.status=v;let n=Object.keys(e.parcels).map((t=>e.parcels[t].unmountThisParcel()));return Promise.all(n).then(r,(n=>r().then((()=>{let r=Error(n.message);if(t)throw l(r,e,x);a(r,e,x)})))).then((()=>e));function r(){return I(e,`unmount`).then((()=>{e.status=m}),(n=>{if(t)throw l(n,e,x);a(n,e,x)}))}}))}var ne=!1,re=!1;function N(e,t){return Promise.resolve().then((()=>e.status===`NOT_MOUNTED`?(ne||=(window.dispatchEvent(new r(`single-spa:before-first-mount`)),!0),e.status=h,I(e,`mount`).then((()=>(e.status=g,re||=(window.dispatchEvent(new r(`single-spa:first-mount`)),!0),e))).catch((n=>{return e.status=g,M(e,!0).then(r,r);function r(){if(t)throw l(n,e,x);return a(n,e,x),e}}))):e))}var ie=0,ae={parcels:{}};function oe(){return se.apply(ae,arguments)}function se(e,t){let n=this;if(!e||typeof e!=`object`&&typeof e!=`function`)throw Error(c(2,!1));if(e.name&&typeof e.name!=`string`)throw Error(c(3,!1,typeof e.name));let r=ie++,i=e.name||`parcel-${r}`;if(typeof t!=`object`)throw Error(c(4,!1,i,typeof t));if(!t.domElement)throw Error(c(5,!1,i));let a=typeof e==`function`,o=a?e:()=>Promise.resolve(e),s={id:r,parcels:{},status:a?d:f,customProps:t,parentName:w(n),unmountThisParcel:()=>h.then((()=>{if(s.status!==`MOUNTED`)throw Error(c(6,!1,i,s.status));return M(s,!0)})).then((e=>(s.parentName&&delete n.parcels[s.id],e))).then((e=>(g(e),e))).catch((e=>{throw s.status=x,_(e),e}))},u;n.parcels[r]=s;let p=o();if(!p||typeof p.then!=`function`)throw Error(c(7,!1));p=p.then((e=>{if(!e)throw Error(c(8,!1));if(i=e.name||`parcel-${r}`,Object.prototype.hasOwnProperty.call(e,`bootstrap`)&&!k(e.bootstrap))throw Error(c(9,!1,i));if(!k(e.mount))throw Error(c(10,!1,i));if(!k(e.unmount))throw Error(c(11,!1,i));if(e.update&&!k(e.update))throw Error(c(12,!1,i));let t=A(e,`bootstrap`),n=A(e,`mount`),a=A(e,`unmount`);s.status=f,s.name=i,s.bootstrap=t,s.mount=n,s.unmount=a,s.timeouts=pe(e.timeouts),e.update&&(s.update=A(e,`update`),u.update=function(e){return s.customProps=e,P((t=s,Promise.resolve().then((()=>{if(t.status!==`MOUNTED`)throw Error(c(32,!1,w(t)));return t.status=`UPDATING`,I(t,`update`).then((()=>(t.status=`MOUNTED`,t))).catch((e=>{throw l(e,t,`SKIP_BECAUSE_BROKEN`)}))}))));var t})}));let m=p.then((()=>j(s,!0))),h=m.then((()=>N(s,!0))),g,_,v=new Promise(((e,t)=>{g=e,_=t}));return u={mount:()=>P(Promise.resolve().then((()=>{if(s.status!==`NOT_MOUNTED`)throw Error(c(13,!1,i,s.status));return n.parcels[r]=s,N(s)}))),unmount:()=>P(s.unmountThisParcel()),getStatus:()=>s.status,loadPromise:P(p),bootstrapPromise:P(m),mountPromise:P(h),unmountPromise:P(v)},u}function P(e){return e.then((()=>null))}function ce(e){let n=w(e),r=typeof e.customProps==`function`?e.customProps(n,window.location):e.customProps;(typeof r!=`object`||!r||Array.isArray(r))&&(r={},console.warn(c(40,!1),n,r));let i=D({},r,{name:n,mountParcel:se.bind(e),singleSpa:t});return T(e)&&(i.unmountSelf=e.unmountThisParcel),i}var F={bootstrap:{millis:4e3,dieOnTimeout:!1,warningMillis:1e3},mount:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},unmount:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},unload:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},update:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3}};function le(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(16,!1));F.bootstrap={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function ue(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(17,!1));F.mount={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function de(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(18,!1));F.unmount={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function fe(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(19,!1));F.unload={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function I(e,t){let n=e.timeouts[t],r=n.warningMillis,i=E(e);return new Promise(((a,o)=>{let s=!1,l=!1;e[t](ce(e)).then((e=>{s=!0,a(e)})).catch((e=>{s=!0,o(e)})),setTimeout((()=>d(1)),r),setTimeout((()=>d(!0)),n.millis);let u=c(31,!1,t,i,w(e),n.millis);function d(e){if(!s){if(!0===e)l=!0,n.dieOnTimeout?o(Error(u)):console.error(u);else if(!l){let t=e,i=t*r;console.warn(u),i+r<n.millis&&setTimeout((()=>d(t+1)),r)}}}}))}function pe(e){let t={};for(let n in F)t[n]=D({},F[n],e&&e[n]||{});return t}function L(e){return Promise.resolve().then((()=>{if(e.loadPromise)return e.loadPromise;if(e.status!==`NOT_LOADED`&&e.status!==`LOAD_ERROR`)return e;let t,n;return e.status=d,e.loadPromise=Promise.resolve().then((()=>{let r=e.loadApp(ce(e));if(!ee(r))throw n=!0,Error(c(33,!1,w(e)));return r.then((n=>{let r;e.loadErrorTime=null,t=n,typeof t!=`object`&&(r=34),Object.prototype.hasOwnProperty.call(t,`bootstrap`)&&!k(t.bootstrap)&&(r=35),k(t.mount)||(r=36),k(t.unmount)||(r=37);let i=E(t);if(r){let n;try{n=JSON.stringify(t)}catch{}return console.error(c(r,!1,i,w(e),n),t),a(void 0,e,x),e}return t.devtools&&t.devtools.overlays&&(e.devtools.overlays=D({},e.devtools.overlays,t.devtools.overlays)),e.status=f,e.bootstrap=A(t,`bootstrap`),e.mount=A(t,`mount`),e.unmount=A(t,`unmount`),e.unload=A(t,`unload`),e.timeouts=pe(t.timeouts),delete e.loadPromise,e}))})).catch((t=>{let r;return delete e.loadPromise,n?r=x:(r=b,e.loadErrorTime=new Date().getTime()),a(t,e,r),e}))}))}var R=typeof window<`u`,z={hashchange:[],popstate:[]},B=[`hashchange`,`popstate`];function V(e){let t;if(typeof e==`string`)t=e;else if(this&&this.href)t=this.href;else{if(!(e&&e.currentTarget&&e.currentTarget.href&&e.preventDefault))throw Error(c(14,!1));t=e.currentTarget.href,e.preventDefault()}let n=xe(window.location.href),r=xe(t);t.indexOf(`#`)===0?window.location.hash=r.hash:n.host!==r.host&&r.host?window.location.href=t:r.pathname===n.pathname&&r.search===n.search?window.location.hash=r.hash:window.history.pushState(null,null,t)}function me(e){if(e){let t=e[0].type;B.indexOf(t)>=0&&z[t].forEach((t=>{try{t.apply(this,e)}catch(e){setTimeout((()=>{throw e}))}}))}}var he;function ge(){Y([],arguments)}function _e(e,t){return function(){let n=window.location.href,r=e.apply(this,arguments),i=window.location.href;return he&&n===i||window.dispatchEvent(ve(window.history.state,t)),r}}function ve(e,t){let n;try{n=new PopStateEvent(`popstate`,{state:e})}catch{n=document.createEvent(`PopStateEvent`),n.initPopStateEvent(`popstate`,!1,!1,e)}return n.singleSpa=!0,n.singleSpaTrigger=t,n}var H=null,ye=!1;function be(e){if(ye)throw Error(c(43,!1));he=!e||!e.hasOwnProperty(`urlRerouteOnly`)||e.urlRerouteOnly,ye=!0,H=window.history.replaceState,window.addEventListener(`hashchange`,ge),window.addEventListener(`popstate`,ge);let t=window.addEventListener,n=window.removeEventListener;window.addEventListener=function(e,n){if(!(typeof n==`function`&&B.indexOf(e)>=0)||O(z[e],(e=>e===n)))return t.apply(this,arguments);z[e].push(n)},window.removeEventListener=function(e,t){return typeof t==`function`&&B.indexOf(e)>=0&&(z[e]=z[e].filter((e=>e!==t))),n.apply(this,arguments)},window.history.pushState=_e(window.history.pushState,`pushState`),window.history.replaceState=_e(H,`replaceState`)}function xe(e){let t=document.createElement(`a`);return t.href=e,t}R&&(window.singleSpaNavigate?console.warn(c(41,!1)):window.singleSpaNavigate=V);var Se=!1;function Ce(e=window.jQuery){if(e||window.$&&window.$.fn&&window.$.fn.jquery&&(e=window.$),e&&!Se){let t=e.fn.on,n=e.fn.off;e.fn.on=function(e,n){return we.call(this,t,window.addEventListener,e,n,arguments)},e.fn.off=function(e,t){return we.call(this,n,window.removeEventListener,e,t,arguments)},Se=!0}}function we(e,t,n,r,i){return typeof n==`string`?(n.split(/\s+/).forEach((e=>{B.indexOf(e)>=0&&(t(e,r),n=n.replace(e,``))})),n.trim()===``?this:e.apply(this,i)):e.apply(this,i)}var U={};function W(e){return Promise.resolve().then((()=>{let t=U[w(e)];if(!t)return e;if(e.status===`NOT_LOADED`)return Te(e,t),e;if(e.status===`UNLOADING`)return t.promise.then((()=>e));if(e.status!==`NOT_MOUNTED`&&e.status!==`LOAD_ERROR`)return e;let n=e.status===`LOAD_ERROR`?Promise.resolve():I(e,`unload`);return e.status=y,n.then((()=>(Te(e,t),e))).catch((n=>(function(e,t,n){delete U[w(e)],delete e.bootstrap,delete e.mount,delete e.unmount,delete e.unload,a(n,e,x),t.reject(n)}(e,t,n),e)))}))}function Te(e,t){delete U[w(e)],delete e.bootstrap,delete e.mount,delete e.unmount,delete e.unload,e.status=u,t.resolve()}function Ee(e,t,n,r){U[w(e)]={app:e,resolve:n,reject:r},Object.defineProperty(U[w(e)],"promise",{get:t})}function De(e){return U[e]}var G=[];function Oe(){return G.filter(S).map(w)}function ke(){return G.map(w)}function Ae(e){let t=O(G,(t=>w(t)===e));return t?t.status:null}var je=!1;function Me(e,t,n,r){let i=function(e,t,n,r){let i={name:null,loadApp:null,activeWhen:null,customProps:null};return typeof e==`object`?(function(e){if(Array.isArray(e)||e===null)throw Error(c(39,!1));let t=[`name`,`app`,`activeWhen`,`customProps`],n=Object.keys(e).reduce(((e,n)=>t.indexOf(n)>=0?e:e.concat(n)),[]);if(n.length!==0)throw Error(c(38,!1,t.join(`, `),n.join(`, `)));if(typeof e.name!=`string`||e.name.length===0||typeof e.app!=`object`&&typeof e.app!=`function`)throw Error(c(20,!1));let r=e=>typeof e==`string`||typeof e==`function`;if(!(r(e.activeWhen)||Array.isArray(e.activeWhen)&&e.activeWhen.every(r)))throw Error(c(24,!1));if(!Le(e.customProps))throw Error(c(22,!1))}(e),i.name=e.name,i.loadApp=e.app,i.activeWhen=e.activeWhen,i.customProps=e.customProps):(function(e,t,n,r){if(typeof e!=`string`||e.length===0)throw Error(c(20,!1));if(!t)throw Error(c(23,!1));if(typeof n!=`function`)throw Error(c(24,!1));if(!Le(r))throw Error(c(22,!1))}(e,t,n,r),i.name=e,i.loadApp=t,i.activeWhen=n,i.customProps=r),i.loadApp=typeof(a=i.loadApp)==`function`?a:()=>Promise.resolve(a),i.customProps=function(e){return e||{}}(i.customProps),i.activeWhen=function(e){let t=Array.isArray(e)?e:[e];return t=t.map((e=>typeof e==`function`?e:Re(e))),e=>t.some((t=>t(e)))}(i.activeWhen),i;var a}(e,t,n,r);if(X()||je||(je=!0,setTimeout((()=>{X()||console.warn(c(1,!1))}),5e3)),ke().indexOf(i.name)!==-1)throw Error(c(21,!1,i.name));G.push(D({loadErrorTime:null,status:u,parcels:{},devtools:{overlays:{options:{},selectors:[]}}},i)),R&&(Ce(),Y())}function Ne(e=window.location){return G.filter((t=>t.activeWhen(e))).map(w)}function Pe(e){if(G.filter((t=>w(t)===e)).length===0)throw Error(c(25,!1,e));return(R?Fe(e,{waitForUnmount:!1}):Promise.resolve()).then((()=>{let t=G.map(w).indexOf(e);G.splice(t,1)}))}function Fe(e,t={waitForUnmount:!1}){if(typeof e!=`string`)throw Error(c(26,!1));let n=O(G,(t=>w(t)===e));if(!n)throw Error(c(27,!1,e));let r=De(w(n));if(t&&t.waitForUnmount){if(r)return r.promise;{let e=new Promise(((t,r)=>{Ee(n,(()=>e),t,r)}));return e}}{let e;return r?(e=r.promise,Ie(n,r.resolve,r.reject)):e=new Promise(((t,r)=>{Ee(n,(()=>e),t,r),Ie(n,t,r)})),e}}function Ie(e,t,n){Promise.resolve().then((()=>{if(O(Ne(),(t=>t===w(e))))return ze()})).then((()=>M(e).then(W).then((()=>{t(),setTimeout((()=>{Y()}))})))).catch(n)}function Le(e){return!e||typeof e==`function`||typeof e==`object`&&!!e&&!Array.isArray(e)}function Re(e,t){let n=function(e,t){let n=0,r=!1,i=`^`;e[0]!==`/`&&(e=`/`+e);for(let t=0;t<e.length;t++){let n=e[t];(!r&&n===`:`||r&&n===`/`)&&a(t)}return a(e.length),new RegExp(i,`i`);function a(a){let o=e.slice(n,a).replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`);if(i+=r?`[^/]+/?`:o,a===e.length){if(r)t&&(i+=`$`);else{let e=t?``:`.*`;i=i.charAt(i.length-1)===`/`?`${i}${e}$`:`${i}(/${e})?(#.*)?$`}}r=!r,n=a}}(e,t);return e=>{let t=e.origin;t||=`${e.protocol}//${e.host}`;let r=e.href.replace(t,``).replace(e.search,``).split(`?`)[0];return n.test(r)}}var K=!1,q=[],J=R&&window.location.href;function ze(){return Y()}function Y(e=[],t,n=!1){if(K)return new Promise(((e,n)=>{q.push({resolve:e,reject:n,eventArguments:t})}));let{appsToUnload:i,appsToUnmount:a,appsToLoad:o,appsToMount:s}=function(){let e=[],t=[],n=[],r=[],i=new Date().getTime();return G.forEach((a=>{let o=a.status!==`SKIP_BECAUSE_BROKEN`&&C(a);switch(a.status){case b:o&&i-a.loadErrorTime>=200&&n.push(a);break;case u:case d:o&&n.push(a);break;case f:case m:!o&&De(w(a))?e.push(a):o&&r.push(a);break;case g:o||t.push(a)}})),{appsToUnload:e,appsToUnmount:t,appsToLoad:n,appsToMount:r}}(),l,p=[],h=J,_=J=window.location.href;return X()?(K=!0,l=i.concat(o,a,s),Promise.resolve().then((()=>(E(l.length===0?`before-no-app-change`:`before-app-change`,T(!0)),E(`before-routing-event`,T(!0,{cancelNavigation:v})),Promise.all(p).then((n=>{if(n.some((e=>e)))return H.call(window.history,history.state,``,h.substring(location.origin.length)),J=location.href,K=!1,Y(e,t,!0);let r=i.map(W),c=a.map(M).map((e=>e.then(W))).concat(r),l=Promise.all(c);l.then((()=>{E(`before-mount-routing-event`,T(!0))}),(e=>{throw e}));let u=o.map((e=>L(e).then((e=>Be(e,l))))),d=s.filter((e=>o.indexOf(e)<0)).map((e=>Be(e,l)));return l.catch((e=>{throw S(),e})).then((()=>(S(),Promise.all(u.concat(d)).catch((t=>{throw e.forEach((e=>e.reject(t))),t})).then(y).then((()=>{}),(e=>{throw e})))))})))))):(l=o,Promise.resolve().then((()=>{let e=o.map(L);return Promise.all(e).then(S).then((()=>[])).catch((e=>{throw S(),e})).finally((()=>{}))})));function v(e=!0){let t=typeof e?.then==`function`?e:Promise.resolve(e);p.push(t.catch((e=>(console.warn(Error(c(42,!1))),console.warn(e),!1))))}function y(){let t=Oe();e.forEach((e=>e.resolve(t)));try{E(l.length===0?`no-app-change`:`app-change`,T()),E(`routing-event`,T())}catch(e){setTimeout((()=>{throw e}))}if(K=!1,q.length>0){let e=q;q=[],Y(e)}return t}function S(){n||(e.forEach((e=>{me(e.eventArguments)})),me(t))}function T(e=!1,n){let r={},c={[g]:[],[m]:[],[u]:[],[x]:[]};e?(o.concat(s).forEach(((e,t)=>{f(e,g)})),i.forEach((e=>{f(e,u)})),a.forEach((e=>{f(e,m)}))):l.forEach((e=>{f(e)}));let d={detail:{newAppStatuses:r,appsByNewStatus:c,totalAppChanges:l.length,originalEvent:t?.[0],oldUrl:h,newUrl:_}};return n&&D(d.detail,n),d;function f(e,t){let n=w(e);t||=Ae(n),r[n]=t,(c[t]=c[t]||[]).push(n)}}function E(e,t){n||window.dispatchEvent(new r(`single-spa:${e}`,t))}}function Be(e,t){return C(e)?j(e).then((e=>t.then((()=>C(e)?N(e):e)))):t.then((()=>e))}var Ve=!1;function He(e){Ve=!0,R&&(be(e),Y())}function X(){return Ve}var Ue={getRawAppData:function(){return[...G]},reroute:Y,NOT_LOADED:u,toLoadPromise:L,toBootstrapPromise:j,unregisterApplication:Pe,getProfilerData:function(){return te}};R&&window.__SINGLE_SPA_DEVTOOLS__&&(window.__SINGLE_SPA_DEVTOOLS__.exposedMethods=Ue);function We(){let e=document.getElementById(`shell-stub-config`);if(!e?.textContent)throw Error(`shell-stub: the server did not provide a config`);return JSON.parse(e.textContent)}var Z=We(),{name:Q,routePrefix:Ge}=Z;if(Z.newRelic){let{startMonitoring:t}=await e(async()=>{let{startMonitoring:e}=await import(`./monitoring-BrrZzYzN.js`);return{startMonitoring:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]));t(Z.newRelic)}var Ke=document.getElementById(`stub-title`),$=document.getElementById(`stub-message`),qe=document.getElementById(`mfe-root`);Ke&&(Ke.textContent=`${Q[0]?.toUpperCase()??``}${Q.slice(1)} (standalone)`),document.title=`${Q} standalone`;function Je(e){return e===Ge||e.startsWith(`${Ge}/`)}function Ye(e){$&&($.textContent=e,$.hidden=e===null)}Me({name:Q,app:()=>e(()=>import(`/mfe/${Q}/entry.js`),[]),activeWhen:e=>Je(e.pathname),customProps:()=>({domElement:qe})}),o(e=>{reportError(e),Ye(`The ${Q} section is unavailable`)}),window.addEventListener(`single-spa:routing-event`,()=>{Je(window.location.pathname)?$?.textContent.startsWith(`This page`)&&Ye(null):Ye(`This page is not part of ${Q}.`)}),window.location.pathname===`/`&&V(Ge),He({urlRerouteOnly:!0});
2
+ import{t as e}from"./preload-helper-DqzGtu2i.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=Object.freeze({__proto__:null,get start(){return He},get ensureJQuerySupport(){return Ce},get setBootstrapMaxTime(){return le},get setMountMaxTime(){return ue},get setUnmountMaxTime(){return de},get setUnloadMaxTime(){return fe},get registerApplication(){return Me},get unregisterApplication(){return Pe},get getMountedApps(){return Oe},get getAppStatus(){return Ae},get unloadApplication(){return Fe},get checkActivityFunctions(){return Ne},get getAppNames(){return ke},get pathToActiveWhen(){return Re},get navigateToUrl(){return V},get patchHistoryApi(){return be},get triggerAppChange(){return ze},get addErrorHandler(){return o},get removeErrorHandler(){return s},get mountRootParcel(){return oe},get NOT_LOADED(){return u},get LOADING_SOURCE_CODE(){return d},get NOT_BOOTSTRAPPED(){return f},get BOOTSTRAPPING(){return p},get NOT_MOUNTED(){return m},get MOUNTING(){return h},get UPDATING(){return _},get LOAD_ERROR(){return b},get MOUNTED(){return g},get UNLOADING(){return y},get UNMOUNTING(){return v},get SKIP_BECAUSE_BROKEN(){return x}}),n=(typeof globalThis<`u`?globalThis:typeof window<`u`?window:typeof global<`u`?global:typeof self<`u`?self:{}).CustomEvent,r=function(){try{var e=new n(`cat`,{detail:{foo:`bar`}});return e.type===`cat`&&e.detail.foo===`bar`}catch{}return!1}()?n:typeof document<`u`&&typeof document.createEvent==`function`?function(e,t){var n=document.createEvent(`CustomEvent`);return t?n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail):n.initCustomEvent(e,!1,!1,void 0),n}:function(e,t){var n=document.createEventObject();return n.type=e,t?(n.bubbles=!!t.bubbles,n.cancelable=!!t.cancelable,n.detail=t.detail):(n.bubbles=!1,n.cancelable=!1,n.detail=void 0),n},i=[];function a(e,t,n){let r=l(e,t,n);i.length?i.forEach((e=>e(r))):setTimeout((()=>{throw r}))}function o(e){if(typeof e!=`function`)throw Error(c(28,!1));i.push(e)}function s(e){if(typeof e!=`function`)throw Error(c(29,!1));let t=!1;return i=i.filter((n=>{let r=n===e;return t||=r,!r})),t}function c(e,t,...n){return`single-spa minified message #${e}: ${t?t+` `:``}See https://single-spa.js.org/error/?code=${e}${n.length?`&arg=${n.join(`&arg=`)}`:``}`}function l(e,t,n){let r=`${E(t)} '${w(t)}' died in status ${t.status}: `,i;if(e instanceof Error){try{e.message=r+e.message}catch{}i=e}else{console.warn(c(30,!1,t.status,w(t)));try{i=Error(r+JSON.stringify(e))}catch{i=e}}return i.appOrParcelName=w(t),t.status=n,i}var u=`NOT_LOADED`,d=`LOADING_SOURCE_CODE`,f=`NOT_BOOTSTRAPPED`,p=`BOOTSTRAPPING`,m=`NOT_MOUNTED`,h=`MOUNTING`,g=`MOUNTED`,_=`UPDATING`,v=`UNMOUNTING`,y=`UNLOADING`,b=`LOAD_ERROR`,x=`SKIP_BECAUSE_BROKEN`;function S(e){return e.status===g}function C(e){try{return e.activeWhen(window.location)}catch(t){return a(t,e,x),!1}}function w(e){return e.name}function T(e){return!!e.unmountThisParcel}function E(e){return T(e)?`parcel`:`application`}function D(){for(let e=arguments.length-1;e>0;e--)for(let t in arguments[e])t!==`__proto__`&&(arguments[e-1][t]=arguments[e][t]);return arguments[0]}function O(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}function k(e){return e&&(typeof e==`function`||(t=e,Array.isArray(t)&&!O(t,(e=>typeof e!=`function`))));var t}function A(e,t){let n=e[t]||[];n=Array.isArray(n)?n:[n],n.length===0&&(n=[()=>Promise.resolve()]);let r=E(e),i=w(e);return function(e){return n.reduce(((n,a,o)=>n.then((()=>{let n=a(e);return ee(n)?n:Promise.reject(c(15,!1,r,i,t,o))}))),Promise.resolve())}}function ee(e){return e&&typeof e.then==`function`&&typeof e.catch==`function`}var te=[];function j(e,t){return Promise.resolve().then((()=>e.status===`NOT_BOOTSTRAPPED`?(e.status=p,e.bootstrap?I(e,`bootstrap`).then(n).catch((n=>{if(t)throw l(n,e,x);return a(n,e,x),e})):Promise.resolve().then(n)):e));function n(){return e.status=m,e}}function M(e,t){return Promise.resolve().then((()=>{if(e.status!==`MOUNTED`)return e;e.status=v;let n=Object.keys(e.parcels).map((t=>e.parcels[t].unmountThisParcel()));return Promise.all(n).then(r,(n=>r().then((()=>{let r=Error(n.message);if(t)throw l(r,e,x);a(r,e,x)})))).then((()=>e));function r(){return I(e,`unmount`).then((()=>{e.status=m}),(n=>{if(t)throw l(n,e,x);a(n,e,x)}))}}))}var ne=!1,re=!1;function N(e,t){return Promise.resolve().then((()=>e.status===`NOT_MOUNTED`?(ne||=(window.dispatchEvent(new r(`single-spa:before-first-mount`)),!0),e.status=h,I(e,`mount`).then((()=>(e.status=g,re||=(window.dispatchEvent(new r(`single-spa:first-mount`)),!0),e))).catch((n=>{return e.status=g,M(e,!0).then(r,r);function r(){if(t)throw l(n,e,x);return a(n,e,x),e}}))):e))}var ie=0,ae={parcels:{}};function oe(){return se.apply(ae,arguments)}function se(e,t){let n=this;if(!e||typeof e!=`object`&&typeof e!=`function`)throw Error(c(2,!1));if(e.name&&typeof e.name!=`string`)throw Error(c(3,!1,typeof e.name));let r=ie++,i=e.name||`parcel-${r}`;if(typeof t!=`object`)throw Error(c(4,!1,i,typeof t));if(!t.domElement)throw Error(c(5,!1,i));let a=typeof e==`function`,o=a?e:()=>Promise.resolve(e),s={id:r,parcels:{},status:a?d:f,customProps:t,parentName:w(n),unmountThisParcel:()=>h.then((()=>{if(s.status!==`MOUNTED`)throw Error(c(6,!1,i,s.status));return M(s,!0)})).then((e=>(s.parentName&&delete n.parcels[s.id],e))).then((e=>(g(e),e))).catch((e=>{throw s.status=x,_(e),e}))},u;n.parcels[r]=s;let p=o();if(!p||typeof p.then!=`function`)throw Error(c(7,!1));p=p.then((e=>{if(!e)throw Error(c(8,!1));if(i=e.name||`parcel-${r}`,Object.prototype.hasOwnProperty.call(e,`bootstrap`)&&!k(e.bootstrap))throw Error(c(9,!1,i));if(!k(e.mount))throw Error(c(10,!1,i));if(!k(e.unmount))throw Error(c(11,!1,i));if(e.update&&!k(e.update))throw Error(c(12,!1,i));let t=A(e,`bootstrap`),n=A(e,`mount`),a=A(e,`unmount`);s.status=f,s.name=i,s.bootstrap=t,s.mount=n,s.unmount=a,s.timeouts=pe(e.timeouts),e.update&&(s.update=A(e,`update`),u.update=function(e){return s.customProps=e,P((t=s,Promise.resolve().then((()=>{if(t.status!==`MOUNTED`)throw Error(c(32,!1,w(t)));return t.status=`UPDATING`,I(t,`update`).then((()=>(t.status=`MOUNTED`,t))).catch((e=>{throw l(e,t,`SKIP_BECAUSE_BROKEN`)}))}))));var t})}));let m=p.then((()=>j(s,!0))),h=m.then((()=>N(s,!0))),g,_,v=new Promise(((e,t)=>{g=e,_=t}));return u={mount:()=>P(Promise.resolve().then((()=>{if(s.status!==`NOT_MOUNTED`)throw Error(c(13,!1,i,s.status));return n.parcels[r]=s,N(s)}))),unmount:()=>P(s.unmountThisParcel()),getStatus:()=>s.status,loadPromise:P(p),bootstrapPromise:P(m),mountPromise:P(h),unmountPromise:P(v)},u}function P(e){return e.then((()=>null))}function ce(e){let n=w(e),r=typeof e.customProps==`function`?e.customProps(n,window.location):e.customProps;(typeof r!=`object`||!r||Array.isArray(r))&&(r={},console.warn(c(40,!1),n,r));let i=D({},r,{name:n,mountParcel:se.bind(e),singleSpa:t});return T(e)&&(i.unmountSelf=e.unmountThisParcel),i}var F={bootstrap:{millis:4e3,dieOnTimeout:!1,warningMillis:1e3},mount:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},unmount:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},unload:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3},update:{millis:3e3,dieOnTimeout:!1,warningMillis:1e3}};function le(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(16,!1));F.bootstrap={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function ue(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(17,!1));F.mount={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function de(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(18,!1));F.unmount={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function fe(e,t,n){if(typeof e!=`number`||e<=0)throw Error(c(19,!1));F.unload={millis:e,dieOnTimeout:t,warningMillis:n||1e3}}function I(e,t){let n=e.timeouts[t],r=n.warningMillis,i=E(e);return new Promise(((a,o)=>{let s=!1,l=!1;e[t](ce(e)).then((e=>{s=!0,a(e)})).catch((e=>{s=!0,o(e)})),setTimeout((()=>d(1)),r),setTimeout((()=>d(!0)),n.millis);let u=c(31,!1,t,i,w(e),n.millis);function d(e){if(!s){if(!0===e)l=!0,n.dieOnTimeout?o(Error(u)):console.error(u);else if(!l){let t=e,i=t*r;console.warn(u),i+r<n.millis&&setTimeout((()=>d(t+1)),r)}}}}))}function pe(e){let t={};for(let n in F)t[n]=D({},F[n],e&&e[n]||{});return t}function L(e){return Promise.resolve().then((()=>{if(e.loadPromise)return e.loadPromise;if(e.status!==`NOT_LOADED`&&e.status!==`LOAD_ERROR`)return e;let t,n;return e.status=d,e.loadPromise=Promise.resolve().then((()=>{let r=e.loadApp(ce(e));if(!ee(r))throw n=!0,Error(c(33,!1,w(e)));return r.then((n=>{let r;e.loadErrorTime=null,t=n,typeof t!=`object`&&(r=34),Object.prototype.hasOwnProperty.call(t,`bootstrap`)&&!k(t.bootstrap)&&(r=35),k(t.mount)||(r=36),k(t.unmount)||(r=37);let i=E(t);if(r){let n;try{n=JSON.stringify(t)}catch{}return console.error(c(r,!1,i,w(e),n),t),a(void 0,e,x),e}return t.devtools&&t.devtools.overlays&&(e.devtools.overlays=D({},e.devtools.overlays,t.devtools.overlays)),e.status=f,e.bootstrap=A(t,`bootstrap`),e.mount=A(t,`mount`),e.unmount=A(t,`unmount`),e.unload=A(t,`unload`),e.timeouts=pe(t.timeouts),delete e.loadPromise,e}))})).catch((t=>{let r;return delete e.loadPromise,n?r=x:(r=b,e.loadErrorTime=new Date().getTime()),a(t,e,r),e}))}))}var R=typeof window<`u`,z={hashchange:[],popstate:[]},B=[`hashchange`,`popstate`];function V(e){let t;if(typeof e==`string`)t=e;else if(this&&this.href)t=this.href;else{if(!(e&&e.currentTarget&&e.currentTarget.href&&e.preventDefault))throw Error(c(14,!1));t=e.currentTarget.href,e.preventDefault()}let n=xe(window.location.href),r=xe(t);t.indexOf(`#`)===0?window.location.hash=r.hash:n.host!==r.host&&r.host?window.location.href=t:r.pathname===n.pathname&&r.search===n.search?window.location.hash=r.hash:window.history.pushState(null,null,t)}function me(e){if(e){let t=e[0].type;B.indexOf(t)>=0&&z[t].forEach((t=>{try{t.apply(this,e)}catch(e){setTimeout((()=>{throw e}))}}))}}var he;function ge(){Y([],arguments)}function _e(e,t){return function(){let n=window.location.href,r=e.apply(this,arguments),i=window.location.href;return he&&n===i||window.dispatchEvent(ve(window.history.state,t)),r}}function ve(e,t){let n;try{n=new PopStateEvent(`popstate`,{state:e})}catch{n=document.createEvent(`PopStateEvent`),n.initPopStateEvent(`popstate`,!1,!1,e)}return n.singleSpa=!0,n.singleSpaTrigger=t,n}var H=null,ye=!1;function be(e){if(ye)throw Error(c(43,!1));he=!e||!e.hasOwnProperty(`urlRerouteOnly`)||e.urlRerouteOnly,ye=!0,H=window.history.replaceState,window.addEventListener(`hashchange`,ge),window.addEventListener(`popstate`,ge);let t=window.addEventListener,n=window.removeEventListener;window.addEventListener=function(e,n){if(!(typeof n==`function`&&B.indexOf(e)>=0)||O(z[e],(e=>e===n)))return t.apply(this,arguments);z[e].push(n)},window.removeEventListener=function(e,t){return typeof t==`function`&&B.indexOf(e)>=0&&(z[e]=z[e].filter((e=>e!==t))),n.apply(this,arguments)},window.history.pushState=_e(window.history.pushState,`pushState`),window.history.replaceState=_e(H,`replaceState`)}function xe(e){let t=document.createElement(`a`);return t.href=e,t}R&&(window.singleSpaNavigate?console.warn(c(41,!1)):window.singleSpaNavigate=V);var Se=!1;function Ce(e=window.jQuery){if(e||window.$&&window.$.fn&&window.$.fn.jquery&&(e=window.$),e&&!Se){let t=e.fn.on,n=e.fn.off;e.fn.on=function(e,n){return we.call(this,t,window.addEventListener,e,n,arguments)},e.fn.off=function(e,t){return we.call(this,n,window.removeEventListener,e,t,arguments)},Se=!0}}function we(e,t,n,r,i){return typeof n==`string`?(n.split(/\s+/).forEach((e=>{B.indexOf(e)>=0&&(t(e,r),n=n.replace(e,``))})),n.trim()===``?this:e.apply(this,i)):e.apply(this,i)}var U={};function W(e){return Promise.resolve().then((()=>{let t=U[w(e)];if(!t)return e;if(e.status===`NOT_LOADED`)return Te(e,t),e;if(e.status===`UNLOADING`)return t.promise.then((()=>e));if(e.status!==`NOT_MOUNTED`&&e.status!==`LOAD_ERROR`)return e;let n=e.status===`LOAD_ERROR`?Promise.resolve():I(e,`unload`);return e.status=y,n.then((()=>(Te(e,t),e))).catch((n=>(function(e,t,n){delete U[w(e)],delete e.bootstrap,delete e.mount,delete e.unmount,delete e.unload,a(n,e,x),t.reject(n)}(e,t,n),e)))}))}function Te(e,t){delete U[w(e)],delete e.bootstrap,delete e.mount,delete e.unmount,delete e.unload,e.status=u,t.resolve()}function Ee(e,t,n,r){U[w(e)]={app:e,resolve:n,reject:r},Object.defineProperty(U[w(e)],"promise",{get:t})}function De(e){return U[e]}var G=[];function Oe(){return G.filter(S).map(w)}function ke(){return G.map(w)}function Ae(e){let t=O(G,(t=>w(t)===e));return t?t.status:null}var je=!1;function Me(e,t,n,r){let i=function(e,t,n,r){let i={name:null,loadApp:null,activeWhen:null,customProps:null};return typeof e==`object`?(function(e){if(Array.isArray(e)||e===null)throw Error(c(39,!1));let t=[`name`,`app`,`activeWhen`,`customProps`],n=Object.keys(e).reduce(((e,n)=>t.indexOf(n)>=0?e:e.concat(n)),[]);if(n.length!==0)throw Error(c(38,!1,t.join(`, `),n.join(`, `)));if(typeof e.name!=`string`||e.name.length===0||typeof e.app!=`object`&&typeof e.app!=`function`)throw Error(c(20,!1));let r=e=>typeof e==`string`||typeof e==`function`;if(!(r(e.activeWhen)||Array.isArray(e.activeWhen)&&e.activeWhen.every(r)))throw Error(c(24,!1));if(!Le(e.customProps))throw Error(c(22,!1))}(e),i.name=e.name,i.loadApp=e.app,i.activeWhen=e.activeWhen,i.customProps=e.customProps):(function(e,t,n,r){if(typeof e!=`string`||e.length===0)throw Error(c(20,!1));if(!t)throw Error(c(23,!1));if(typeof n!=`function`)throw Error(c(24,!1));if(!Le(r))throw Error(c(22,!1))}(e,t,n,r),i.name=e,i.loadApp=t,i.activeWhen=n,i.customProps=r),i.loadApp=typeof(a=i.loadApp)==`function`?a:()=>Promise.resolve(a),i.customProps=function(e){return e||{}}(i.customProps),i.activeWhen=function(e){let t=Array.isArray(e)?e:[e];return t=t.map((e=>typeof e==`function`?e:Re(e))),e=>t.some((t=>t(e)))}(i.activeWhen),i;var a}(e,t,n,r);if(X()||je||(je=!0,setTimeout((()=>{X()||console.warn(c(1,!1))}),5e3)),ke().indexOf(i.name)!==-1)throw Error(c(21,!1,i.name));G.push(D({loadErrorTime:null,status:u,parcels:{},devtools:{overlays:{options:{},selectors:[]}}},i)),R&&(Ce(),Y())}function Ne(e=window.location){return G.filter((t=>t.activeWhen(e))).map(w)}function Pe(e){if(G.filter((t=>w(t)===e)).length===0)throw Error(c(25,!1,e));return(R?Fe(e,{waitForUnmount:!1}):Promise.resolve()).then((()=>{let t=G.map(w).indexOf(e);G.splice(t,1)}))}function Fe(e,t={waitForUnmount:!1}){if(typeof e!=`string`)throw Error(c(26,!1));let n=O(G,(t=>w(t)===e));if(!n)throw Error(c(27,!1,e));let r=De(w(n));if(t&&t.waitForUnmount){if(r)return r.promise;{let e=new Promise(((t,r)=>{Ee(n,(()=>e),t,r)}));return e}}{let e;return r?(e=r.promise,Ie(n,r.resolve,r.reject)):e=new Promise(((t,r)=>{Ee(n,(()=>e),t,r),Ie(n,t,r)})),e}}function Ie(e,t,n){Promise.resolve().then((()=>{if(O(Ne(),(t=>t===w(e))))return ze()})).then((()=>M(e).then(W).then((()=>{t(),setTimeout((()=>{Y()}))})))).catch(n)}function Le(e){return!e||typeof e==`function`||typeof e==`object`&&!!e&&!Array.isArray(e)}function Re(e,t){let n=function(e,t){let n=0,r=!1,i=`^`;e[0]!==`/`&&(e=`/`+e);for(let t=0;t<e.length;t++){let n=e[t];(!r&&n===`:`||r&&n===`/`)&&a(t)}return a(e.length),new RegExp(i,`i`);function a(a){let o=e.slice(n,a).replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`);if(i+=r?`[^/]+/?`:o,a===e.length){if(r)t&&(i+=`$`);else{let e=t?``:`.*`;i=i.charAt(i.length-1)===`/`?`${i}${e}$`:`${i}(/${e})?(#.*)?$`}}r=!r,n=a}}(e,t);return e=>{let t=e.origin;t||=`${e.protocol}//${e.host}`;let r=e.href.replace(t,``).replace(e.search,``).split(`?`)[0];return n.test(r)}}var K=!1,q=[],J=R&&window.location.href;function ze(){return Y()}function Y(e=[],t,n=!1){if(K)return new Promise(((e,n)=>{q.push({resolve:e,reject:n,eventArguments:t})}));let{appsToUnload:i,appsToUnmount:a,appsToLoad:o,appsToMount:s}=function(){let e=[],t=[],n=[],r=[],i=new Date().getTime();return G.forEach((a=>{let o=a.status!==`SKIP_BECAUSE_BROKEN`&&C(a);switch(a.status){case b:o&&i-a.loadErrorTime>=200&&n.push(a);break;case u:case d:o&&n.push(a);break;case f:case m:!o&&De(w(a))?e.push(a):o&&r.push(a);break;case g:o||t.push(a)}})),{appsToUnload:e,appsToUnmount:t,appsToLoad:n,appsToMount:r}}(),l,p=[],h=J,_=J=window.location.href;return X()?(K=!0,l=i.concat(o,a,s),Promise.resolve().then((()=>(E(l.length===0?`before-no-app-change`:`before-app-change`,T(!0)),E(`before-routing-event`,T(!0,{cancelNavigation:v})),Promise.all(p).then((n=>{if(n.some((e=>e)))return H.call(window.history,history.state,``,h.substring(location.origin.length)),J=location.href,K=!1,Y(e,t,!0);let r=i.map(W),c=a.map(M).map((e=>e.then(W))).concat(r),l=Promise.all(c);l.then((()=>{E(`before-mount-routing-event`,T(!0))}),(e=>{throw e}));let u=o.map((e=>L(e).then((e=>Be(e,l))))),d=s.filter((e=>o.indexOf(e)<0)).map((e=>Be(e,l)));return l.catch((e=>{throw S(),e})).then((()=>(S(),Promise.all(u.concat(d)).catch((t=>{throw e.forEach((e=>e.reject(t))),t})).then(y).then((()=>{}),(e=>{throw e})))))})))))):(l=o,Promise.resolve().then((()=>{let e=o.map(L);return Promise.all(e).then(S).then((()=>[])).catch((e=>{throw S(),e})).finally((()=>{}))})));function v(e=!0){let t=typeof e?.then==`function`?e:Promise.resolve(e);p.push(t.catch((e=>(console.warn(Error(c(42,!1))),console.warn(e),!1))))}function y(){let t=Oe();e.forEach((e=>e.resolve(t)));try{E(l.length===0?`no-app-change`:`app-change`,T()),E(`routing-event`,T())}catch(e){setTimeout((()=>{throw e}))}if(K=!1,q.length>0){let e=q;q=[],Y(e)}return t}function S(){n||(e.forEach((e=>{me(e.eventArguments)})),me(t))}function T(e=!1,n){let r={},c={[g]:[],[m]:[],[u]:[],[x]:[]};e?(o.concat(s).forEach(((e,t)=>{f(e,g)})),i.forEach((e=>{f(e,u)})),a.forEach((e=>{f(e,m)}))):l.forEach((e=>{f(e)}));let d={detail:{newAppStatuses:r,appsByNewStatus:c,totalAppChanges:l.length,originalEvent:t?.[0],oldUrl:h,newUrl:_}};return n&&D(d.detail,n),d;function f(e,t){let n=w(e);t||=Ae(n),r[n]=t,(c[t]=c[t]||[]).push(n)}}function E(e,t){n||window.dispatchEvent(new r(`single-spa:${e}`,t))}}function Be(e,t){return C(e)?j(e).then((e=>t.then((()=>C(e)?N(e):e)))):t.then((()=>e))}var Ve=!1;function He(e){Ve=!0,R&&(be(e),Y())}function X(){return Ve}var Ue={getRawAppData:function(){return[...G]},reroute:Y,NOT_LOADED:u,toLoadPromise:L,toBootstrapPromise:j,unregisterApplication:Pe,getProfilerData:function(){return te}};R&&window.__SINGLE_SPA_DEVTOOLS__&&(window.__SINGLE_SPA_DEVTOOLS__.exposedMethods=Ue);function We(){let e=document.getElementById(`shell-stub-config`);if(!e?.textContent)throw Error(`shell-stub: the server did not provide a config`);return JSON.parse(e.textContent)}var Z=We(),{name:Q,routePrefix:Ge}=Z;if(Z.newRelic){let{startMonitoring:t}=await e(async()=>{let{startMonitoring:e}=await import(`./monitoring-BrrZzYzN.js`);return{startMonitoring:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]));t(Z.newRelic)}var Ke=document.getElementById(`stub-title`),$=document.getElementById(`stub-message`),qe=document.getElementById(`mfe-root`);Ke&&(Ke.textContent=`${Q[0]?.toUpperCase()??``}${Q.slice(1)} (standalone)`),document.title=`${Q} standalone`;function Je(e){return e===Ge||e.startsWith(`${Ge}/`)}function Ye(e){$&&($.textContent=e,$.hidden=e===null)}if(Z.devEntry){let t=`/mfe/${Q}`;(await e(()=>import(`${t}/@react-refresh`),[])).default.injectIntoGlobalHook(window),Object.assign(window,{$RefreshReg$:()=>void 0,$RefreshSig$:()=>e=>e,__vite_plugin_react_preamble_installed__:!0}),await e(()=>import(`${t}/@vite/client`),[])}var Xe=Z.devEntry?`/mfe/${Q}/${Z.devEntry}`:`/mfe/${Q}/entry.js`;Me({name:Q,app:()=>import(Xe),activeWhen:e=>Je(e.pathname),customProps:()=>({domElement:qe})}),o(e=>{reportError(e),Ye(`The ${Q} section is unavailable`)}),window.addEventListener(`single-spa:routing-event`,()=>{Je(window.location.pathname)?$?.textContent.startsWith(`This page`)&&Ye(null):Ye(`This page is not part of ${Q}.`)}),window.location.pathname===`/`&&V(Ge),He({urlRerouteOnly:!0});
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Shop MFE standalone</title>
7
7
  <!--shell-stub-config-->
8
- <script type="module" crossorigin src="/__stub/assets/index-BGzTufKJ.js"></script>
8
+ <script type="module" crossorigin src="/__stub/assets/index-Ci9AYxw3.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/__stub/assets/preload-helper-DqzGtu2i.js">
10
10
  <link rel="stylesheet" crossorigin href="/__stub/assets/index-CVD68-I6.css">
11
11
  </head>
@@ -10,17 +10,26 @@ function configScript(config) {
10
10
  }
11
11
  /**
12
12
  * One origin for one MFE, as the router is for the whole shop: `/mfe/<name>` and `/api/<name>` go
13
- * to the MFE's FES, `/__stub/` serves the stub page's files, and every other page is the stub page.
13
+ * to the MFE's FES (its files come from its Vite dev server in development mode), `/__stub/` serves
14
+ * the stub page's files, and every other page is the stub page.
14
15
  */
15
- export function createApp({ mfeUrl, clientDir, ...config }) {
16
+ export function createApp({ mfeUrl, devMiddleware, clientDir, ...config }) {
16
17
  const app = express();
17
18
  app.disable('x-powered-by');
18
- const prefixes = [`/mfe/${config.name}`, `/api/${config.name}`];
19
- app.use(createProxyMiddleware({
20
- target: mfeUrl,
21
- xfwd: true,
22
- pathFilter: (path) => prefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`) || path.startsWith(`${prefix}?`)),
23
- }));
19
+ const under = (prefix) => (path) => path === prefix || path.startsWith(`${prefix}/`) || path.startsWith(`${prefix}?`);
20
+ const isMfeFile = under(`/mfe/${config.name}`);
21
+ if (devMiddleware) {
22
+ app.use((req, res, next) => {
23
+ if (isMfeFile(req.path))
24
+ devMiddleware(req, res, next);
25
+ else
26
+ next();
27
+ });
28
+ }
29
+ else {
30
+ app.use(createProxyMiddleware({ target: mfeUrl, xfwd: true, pathFilter: isMfeFile }));
31
+ }
32
+ app.use(createProxyMiddleware({ target: mfeUrl, xfwd: true, pathFilter: under(`/api/${config.name}`) }));
24
33
  app.use('/__stub', express.static(clientDir, {
25
34
  index: false,
26
35
  setHeaders: (res, path) => {
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,EAAE,EAAgB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAU9D,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAEtD,0EAA0E;AAC1E,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,OAAO,0DAA0D,IAAI,WAAW,CAAC;AACnF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAe;IACrE,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,GAAG,CACL,qBAAqB,CAAC;QACpB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,QAAQ,CAAC,IAAI,CACX,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CACpF;KACJ,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,SAAS,EACT,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE;QACxB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACxB,GAAG,CAAC,GAAG,CACL,eAAe,EACf,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,UAAU,CAC/E,CAAC;QACJ,CAAC;KACF,CAAC,CACH,CAAC;IAEF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CACtE,kBAAkB,EAClB,YAAY,CAAC,MAAM,CAAC,CACrB,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,EAAE,EAAqC,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAe9D,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAEtD,0EAA0E;AAC1E,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,OAAO,0DAA0D,IAAI,WAAW,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,EAAe;IACpF,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5B,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CACjD,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;gBAClD,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,GAAG,CAAC,GAAG,CACL,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAChG,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,SAAS,EACT,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE;QACxB,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACxB,GAAG,CAAC,GAAG,CACL,eAAe,EACf,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,UAAU,CAC/E,CAAC;QACJ,CAAC;KACF,CAAC,CACH,CAAC;IAEF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CACtE,kBAAkB,EAClB,YAAY,CAAC,MAAM,CAAC,CACrB,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,29 +1,44 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
2
+ import { createServer } from 'node:http';
3
+ import { join, resolve } from 'node:path';
3
4
  import { parseArgs } from 'node:util';
4
5
  import { createApp } from './app.js';
5
- const usage = `Usage: shell-stub --name <mfe> --mfe-url <url> [--port <port>] [--route <path>] [--env-file <file>]
6
+ import { listen } from './listen.js';
7
+ import { resolveSettings } from './settings.js';
8
+ import { startVite, viteMiddleware } from './vite.js';
9
+ const usage = `Usage: shell-stub --name <mfe> --mfe-url <url> [--port <port>] [--route <path>]
10
+ [--env-file <file>] [--dev [--dev-root <dir>] [--dev-entry <path>]]
6
11
 
7
12
  Runs one shop MFE standalone at http://localhost:<port>/<mfe>.
8
13
 
9
14
  --name the MFE's name, as in the Shell's MFE list (e.g. catalog)
10
15
  --mfe-url the MFE's FES (e.g. http://localhost:3002)
11
- --port the stub's port (default 3100)
16
+ --port the stub's port (default 3100); 0 picks any free port
12
17
  --route the MFE's route (default /<name>)
13
18
  --env-file a .env file with the New Relic browser keys (optional):
14
19
  NEW_RELIC_ACCOUNT_ID, NEW_RELIC_TRUST_KEY, NEW_RELIC_AGENT_ID,
15
- NEW_RELIC_BROWSER_LICENSE_KEY, NEW_RELIC_BROWSER_APPLICATION_ID`;
20
+ NEW_RELIC_BROWSER_LICENSE_KEY, NEW_RELIC_BROWSER_APPLICATION_ID
21
+ --dev development mode with HMR: runs the MFE's own Vite in this process and serves
22
+ /mfe/<name> from its source; the API still goes to --mfe-url
23
+ --dev-root the MFE's Vite project, for --dev (default client)
24
+ --dev-entry the entry in that project's source, for --dev (default src/entry.tsx)
25
+
26
+ Environment (overrides the flags, e.g. for other ports on one machine; can be in --env-file):
27
+ SHELL_STUB_PORT, SHELL_STUB_MFE_URL`;
16
28
  const { values } = parseArgs({
17
29
  options: {
18
30
  name: { type: 'string' },
19
31
  'mfe-url': { type: 'string' },
20
- port: { type: 'string', default: '3100' },
32
+ port: { type: 'string' },
21
33
  route: { type: 'string' },
22
34
  'env-file': { type: 'string' },
35
+ dev: { type: 'boolean', default: false },
36
+ 'dev-root': { type: 'string', default: 'client' },
37
+ 'dev-entry': { type: 'string', default: 'src/entry.tsx' },
23
38
  help: { type: 'boolean', default: false },
24
39
  },
25
40
  });
26
- if (values.help || !values.name || !values['mfe-url']) {
41
+ if (values.help || !values.name) {
27
42
  console.log(usage);
28
43
  process.exit(values.help ? 0 : 1);
29
44
  }
@@ -40,18 +55,40 @@ function newRelic() {
40
55
  };
41
56
  return Object.values(config).every(Boolean) ? config : undefined;
42
57
  }
58
+ function fail(error) {
59
+ console.error(error instanceof Error ? error.message : String(error));
60
+ process.exit(1);
61
+ }
43
62
  const name = values.name;
44
- const port = Number(values.port);
63
+ const settings = (() => {
64
+ try {
65
+ return resolveSettings({ port: values.port, mfeUrl: values['mfe-url'] }, process.env);
66
+ }
67
+ catch (error) {
68
+ return fail(error);
69
+ }
70
+ })();
71
+ const { mfeUrl } = settings;
45
72
  const monitoring = newRelic();
46
- createApp({
73
+ const server = createServer();
74
+ const devRoot = resolve(values['dev-root']);
75
+ const vite = values.dev ? await startVite(devRoot, server) : undefined;
76
+ server.on('request', createApp({
47
77
  name,
48
78
  routePrefix: values.route ?? `/${name}`,
49
- mfeUrl: values['mfe-url'],
79
+ mfeUrl,
50
80
  clientDir: join(import.meta.dirname, '..', 'client'),
51
81
  ...(monitoring ? { newRelic: monitoring } : {}),
52
- }).listen(port, () => {
53
- console.log(`${name} standalone on http://localhost:${port}/${name}`);
54
- console.log(` /mfe/${name}, /api/${name} -> ${values['mfe-url'] ?? ''}`);
55
- console.log(` New Relic browser agent: ${monitoring ? 'on' : 'off'}`);
56
- });
82
+ ...(vite ? { devMiddleware: viteMiddleware(vite), devEntry: values['dev-entry'] } : {}),
83
+ }));
84
+ const port = await listen(server, settings.port).catch(fail);
85
+ console.log(`${name} standalone on http://localhost:${port}/${name}`);
86
+ if (vite) {
87
+ console.log(` /mfe/${name} -> Vite in ${devRoot} (development mode, HMR)`);
88
+ console.log(` /api/${name} -> ${mfeUrl}`);
89
+ }
90
+ else {
91
+ console.log(` /mfe/${name}, /api/${name} -> ${mfeUrl}`);
92
+ }
93
+ console.log(` New Relic browser agent: ${monitoring ? 'on' : 'off'}`);
57
94
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/server/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/server/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Starts `server` on `port` and resolves with the port it got, which is the system's choice for
3
+ * port 0. A port in use is an error that says what to do, not Node's EADDRINUSE stack trace.
4
+ */
5
+ export function listen(server, port) {
6
+ return new Promise((resolve, reject) => {
7
+ const onError = (error) => {
8
+ server.off('listening', onListening);
9
+ reject(error.code === 'EADDRINUSE'
10
+ ? new Error(`shell-stub: port ${port} is in use. Pass --port <n>, set SHELL_STUB_PORT, or use ` +
11
+ '--port 0 for any free port.')
12
+ : error);
13
+ };
14
+ const onListening = () => {
15
+ server.off('error', onError);
16
+ resolve(server.address().port);
17
+ };
18
+ server.once('error', onError);
19
+ server.once('listening', onListening);
20
+ server.listen(port);
21
+ });
22
+ }
23
+ //# sourceMappingURL=listen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/server/listen.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,IAAY;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,CAAC,KAA4B,EAAE,EAAE;YAC/C,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CACJ,KAAK,CAAC,IAAI,KAAK,YAAY;gBACzB,CAAC,CAAC,IAAI,KAAK,CACP,oBAAoB,IAAI,2DAA2D;oBACjF,6BAA6B,CAChC;gBACH,CAAC,CAAC,KAAK,CACV,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAE,MAAM,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const DEFAULT_PORT = 3100;
2
+ /**
3
+ * The port and FES URL, from SHELL_STUB_PORT and SHELL_STUB_MFE_URL if set, else from the flags.
4
+ * The environment wins because an MFE's script always passes the flags: it is how a machine with
5
+ * other ports changes them without editing package.json.
6
+ */
7
+ export function resolveSettings(flags, env) {
8
+ const rawPort = env.SHELL_STUB_PORT ?? flags.port ?? String(DEFAULT_PORT);
9
+ const port = Number(rawPort);
10
+ if (!/^\d+$/.test(rawPort) || port > 65535) {
11
+ throw new Error(`shell-stub: the port must be a number from 0 to 65535, not "${rawPort}"`);
12
+ }
13
+ const mfeUrl = env.SHELL_STUB_MFE_URL ?? flags.mfeUrl;
14
+ if (!mfeUrl)
15
+ throw new Error('shell-stub: --mfe-url (or SHELL_STUB_MFE_URL) is required');
16
+ const protocol = URL.canParse(mfeUrl) ? new URL(mfeUrl).protocol : '';
17
+ if (protocol !== 'http:' && protocol !== 'https:') {
18
+ throw new Error(`shell-stub: the MFE URL must start with http:// or https://, not "${mfeUrl}"`);
19
+ }
20
+ return { port, mfeUrl };
21
+ }
22
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/server/settings.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiE,EACjE,GAAsB;IAEtB,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,+DAA+D,OAAO,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC;IACtD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,qEAAqE,MAAM,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ /** The ES module file an export map entry points at: a path, or its `import`/`default` condition. */
6
+ function esmEntry(target) {
7
+ if (typeof target === 'string' || target === undefined)
8
+ return target;
9
+ return esmEntry(target.import ?? target.default);
10
+ }
11
+ /**
12
+ * Starts the MFE's own Vite (from its `node_modules`, with its `vite.config.ts`) inside this
13
+ * process, in middleware mode, with HMR on `server`: one process, one port, one origin.
14
+ */
15
+ export async function startVite(root, server) {
16
+ // Vite belongs to the MFE, so it is resolved from the MFE's Vite project, not from this package.
17
+ const require = createRequire(join(root, 'package.json'));
18
+ const packageJson = require.resolve('vite/package.json');
19
+ const { exports } = JSON.parse(readFileSync(packageJson, 'utf8'));
20
+ const entry = esmEntry(exports['.']);
21
+ if (!entry)
22
+ throw new Error(`shell-stub: no ES module entry in ${packageJson}`);
23
+ const file = join(dirname(packageJson), entry);
24
+ const { createServer } = (await import(pathToFileURL(file).href));
25
+ return createServer({
26
+ root,
27
+ appType: 'custom',
28
+ server: { middlewareMode: true, hmr: { server } },
29
+ });
30
+ }
31
+ export function viteMiddleware(vite) {
32
+ return (req, res, next) => {
33
+ vite.middlewares(req, res, next);
34
+ };
35
+ }
36
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../../src/server/vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,qGAAqG;AACrG,SAAS,QAAQ,CAAC,MAAoB;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtE,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,MAAc;IAC1D,iGAAiG;IACjG,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAE/D,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAE/D,CAAC;IACF,OAAO,YAAY,CAAC;QAClB,IAAI;QACJ,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE;KAClD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arun-shop/shell-stub",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Runs one shop micro frontend standalone: the Shell's page setup, without the Shell app.",
5
5
  "keywords": [
6
6
  "micro-frontends",