@granite-js/micro-frontend 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +35 -0
  3. package/dist/module/createMicroFrontendRuntime.js +1 -0
  4. package/dist/module/createMicroFrontendRuntime.js.map +1 -1
  5. package/dist/module/index.js +1 -0
  6. package/dist/module/index.js.map +1 -1
  7. package/dist/module/plugin/prelude.js +4 -1
  8. package/dist/module/plugin/prelude.js.map +1 -1
  9. package/dist/module/runtime/containerRegistry.js +8 -2
  10. package/dist/module/runtime/containerRegistry.js.map +1 -1
  11. package/dist/module/runtime/createMicroFrontendRuntime.js +4 -1
  12. package/dist/module/runtime/createMicroFrontendRuntime.js.map +1 -1
  13. package/dist/module/runtime/getAppName.js +37 -0
  14. package/dist/module/runtime/getAppName.js.map +1 -0
  15. package/dist/module/runtime/lifecycle.js +22 -0
  16. package/dist/module/runtime/lifecycle.js.map +1 -0
  17. package/dist/module/runtime/registry.js.map +1 -1
  18. package/dist/module/runtime/runtimeSourceURL.js +46 -0
  19. package/dist/module/runtime/runtimeSourceURL.js.map +1 -0
  20. package/dist/module/session/useMicroFrontendSessions.js +35 -6
  21. package/dist/module/session/useMicroFrontendSessions.js.map +1 -1
  22. package/dist/typescript/createMicroFrontendRuntime.d.ts +2 -1
  23. package/dist/typescript/index.d.ts +3 -2
  24. package/dist/typescript/runtime/createMicroFrontendRuntime.d.ts +2 -1
  25. package/dist/typescript/runtime/getAppName.d.ts +6 -0
  26. package/dist/typescript/runtime/lifecycle.d.ts +3 -0
  27. package/dist/typescript/runtime/registry.d.ts +4 -0
  28. package/dist/typescript/runtime/runtimeSourceURL.d.ts +5 -0
  29. package/dist/typescript/types.d.ts +11 -0
  30. package/package.json +4 -4
  31. package/src/createMicroFrontendRuntime.ts +3 -1
  32. package/src/index.ts +10 -1
  33. package/src/plugin/prelude.ts +6 -1
  34. package/src/runtime/containerRegistry.ts +11 -2
  35. package/src/runtime/createMicroFrontendRuntime.ts +8 -1
  36. package/src/runtime/getAppName.ts +46 -0
  37. package/src/runtime/lifecycle.ts +28 -0
  38. package/src/runtime/registry.ts +5 -0
  39. package/src/runtime/runtimeSourceURL.ts +48 -0
  40. package/src/session/useMicroFrontendSessions.ts +61 -9
  41. package/src/types.ts +14 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @granite-js/micro-frontend
2
2
 
3
+ ## 2.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6a8eae2: Expose each evaluated app container's source URL through `AppContainer.runtime.sourceURL`, resolve the current container with `getAppName()`, and exact-match externally captured source URLs with `findAppNameBySourceURL()`.
8
+
9
+ ### Patch Changes
10
+
11
+ - @granite-js/utils@2.3.0
12
+
13
+ ## 2.2.0
14
+
15
+ ### Minor Changes
16
+
17
+ - 2513bd8: Allow hosts to observe committed micro-frontend session mount and unmount transitions through an `onLifecycleEvent` runtime option with session metadata and an active-session snapshot.
18
+
19
+ ### Patch Changes
20
+
21
+ - @granite-js/utils@2.2.0
22
+
3
23
  ## 2.1.1
4
24
 
5
25
  ### Patch Changes
package/README.md CHANGED
@@ -131,6 +131,15 @@ The durable owner is `global.__MICRO_FRONTEND__` with exactly this shape:
131
131
  - A current container registration creates paired legacy/current views for the
132
132
  same app name. The pair is transparent across separately evaluated bundles:
133
133
  it is one remote-owned registration, not two independently owned copies.
134
+ - A current container exposes the evaluated bundle source through
135
+ `runtime.sourceURL`. The generated prelude captures it from the bundle's
136
+ evaluation stack once when registering the container. Legacy container
137
+ adapters omit `runtime` until a compatible bundle is evaluated.
138
+ - `getAppName()` resolves the current bundle's structured source URL against
139
+ the container registry. A host call returns the host container name, while a
140
+ remote call returns that remote's name without reading a last-evaluated
141
+ global value. `findAppNameBySourceURL(sourceURL)` exposes the same exact
142
+ registry lookup for runtimes that already provide a structured source URL.
134
143
  - The dispose callback registry and registrar live on the same canonical
135
144
  context as non-enumerable properties. They are reused across separately
136
145
  evaluated bundles without changing the three-key enumerable registry shape.
@@ -172,6 +181,9 @@ const runtime = createMicroFrontendRuntime({
172
181
  return { filePath };
173
182
  },
174
183
  },
184
+ onLifecycleEvent(event) {
185
+ reportMicroFrontendLifecycle(event);
186
+ },
175
187
  });
176
188
 
177
189
  await runtime.preloadApp('cart');
@@ -211,6 +223,29 @@ The public runtime API is:
211
223
  | `evaluateScript(filePath)` | Evaluate an already-local bundle in the retained runtime. |
212
224
  | `onEvent(listener)` | Subscribe to native open, close, and visibility events. |
213
225
 
226
+ The host can provide `onLifecycleEvent` when creating the runtime for logging
227
+ and other observability integrations. Each event contains `session.id`,
228
+ `session.appName`, and the `activeSessions` snapshot when the callback is
229
+ emitted. The callback has the same lifetime as the runtime.
230
+
231
+ ```ts
232
+ const runtime = createMicroFrontendRuntime({
233
+ adapter,
234
+ onLifecycleEvent(event) {
235
+ reportMicroFrontendLifecycle({
236
+ ...event,
237
+ activeSessionCount: event.activeSessions.length,
238
+ });
239
+ },
240
+ });
241
+ ```
242
+
243
+ `mounted` is emitted after the session is committed to React state. `unmounted`
244
+ is emitted after the session is removed. When the session was the app's last
245
+ active session, Granite waits for the app's registered dispose callbacks before
246
+ emitting `unmounted`. Callback failures are reported without interrupting the
247
+ session lifecycle.
248
+
214
249
  Remote code can register an idempotent callback for explicit app-level resource
215
250
  cleanup:
216
251
 
@@ -9,6 +9,7 @@ export function createMicroFrontendRuntime(options) {
9
9
  return createMicroFrontendRuntimeWithDependencies({
10
10
  adapter: options.adapter,
11
11
  nativeRuntime: NativeGraniteMicroFrontendRuntime,
12
+ onLifecycleEvent: options.onLifecycleEvent,
12
13
  onPreloadError: options.onPreloadError ?? (() => undefined),
13
14
  parseEvent: parseNativeRuntimeEvent,
14
15
  registry: microFrontendModuleRegistry,
@@ -1 +1 @@
1
- {"version":3,"names":["removePendingHostComponentRoutes","createMicroFrontendRuntimeWithDependencies","parseNativeRuntimeEvent","microFrontendModuleRegistry","NativeGraniteMicroFrontendRuntime","createMicroFrontendRuntime","options","adapter","nativeRuntime","onPreloadError","undefined","parseEvent","registry"],"sourceRoot":"../../src","sources":["createMicroFrontendRuntime.ts"],"mappings":";;AAAA,SAASA,gCAAgC,QAAQ,qCAAkC;AACnF,SAASC,0CAA0C,QAAQ,yCAAsC;AACjG,SAASC,uBAAuB,QAAQ,sCAAmC;AAC3E,SAASC,2BAA2B,QAAQ,uBAAoB;AAChE,OAAOC,iCAAiC,MAAM,8CAA2C;AAQzF,OAAO,SAASC,0BAA0BA,CAACC,OAA0C,EAA2B;EAC9G,OAAOL,0CAA0C,CAAC;IAChDM,OAAO,EAAED,OAAO,CAACC,OAAO;IACxBC,aAAa,EAAEJ,iCAAiC;IAChDK,cAAc,EAAEH,OAAO,CAACG,cAAc,KAAK,MAAMC,SAAS,CAAC;IAC3DC,UAAU,EAAET,uBAAuB;IACnCU,QAAQ,EAAET,2BAA2B;IACrCH;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["removePendingHostComponentRoutes","createMicroFrontendRuntimeWithDependencies","parseNativeRuntimeEvent","microFrontendModuleRegistry","NativeGraniteMicroFrontendRuntime","createMicroFrontendRuntime","options","adapter","nativeRuntime","onLifecycleEvent","onPreloadError","undefined","parseEvent","registry"],"sourceRoot":"../../src","sources":["createMicroFrontendRuntime.ts"],"mappings":";;AAAA,SAASA,gCAAgC,QAAQ,qCAAkC;AACnF,SAASC,0CAA0C,QAAQ,yCAAsC;AACjG,SAASC,uBAAuB,QAAQ,sCAAmC;AAC3E,SAASC,2BAA2B,QAAQ,uBAAoB;AAChE,OAAOC,iCAAiC,MAAM,8CAA2C;AASzF,OAAO,SAASC,0BAA0BA,CAACC,OAA0C,EAA2B;EAC9G,OAAOL,0CAA0C,CAAC;IAChDM,OAAO,EAAED,OAAO,CAACC,OAAO;IACxBC,aAAa,EAAEJ,iCAAiC;IAChDK,gBAAgB,EAAEH,OAAO,CAACG,gBAAgB;IAC1CC,cAAc,EAAEJ,OAAO,CAACI,cAAc,KAAK,MAAMC,SAAS,CAAC;IAC3DC,UAAU,EAAEV,uBAAuB;IACnCW,QAAQ,EAAEV,2BAA2B;IACrCH;EACF,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  export { createMicroFrontendRuntime } from "./createMicroFrontendRuntime.js";
4
4
  export { createRoute } from "./createRoute.js";
5
+ export { findAppNameBySourceURL, getAppName } from "./runtime/getAppName.js";
5
6
  export { PendingHostComponent, usePendingHostComponentController, useIsPendingHostComponentHidden, useResolvedPendingHostComponent } from "./host/PendingHostComponent.js";
6
7
  export { createPendingHostComponentRoutePrefix, normalizeRoutePath } from "./host/routeMatcher.js";
7
8
  export { hidePendingHostComponent, installPendingHostComponentBridge, registerPendingHostComponentRoute, resetPendingHostComponent, resolvePendingHostComponent } from "./host/pendingHostComponentStore.js";
@@ -1 +1 @@
1
- {"version":3,"names":["createMicroFrontendRuntime","createRoute","PendingHostComponent","usePendingHostComponentController","useIsPendingHostComponentHidden","useResolvedPendingHostComponent","createPendingHostComponentRoutePrefix","normalizeRoutePath","hidePendingHostComponent","installPendingHostComponentBridge","registerPendingHostComponentRoute","resetPendingHostComponent","resolvePendingHostComponent","MicroFrontendSessionProvider","MissingMicroFrontendSessionError","useMicroFrontendSession","useMicroFrontendSessions","default","Portal","AppContainerNotFoundError","ExposedModuleNotFoundError","InvalidAppNameError","InvalidAppRequestError","InvalidNativeRuntimeEventError"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,0BAA0B,QAAQ,iCAA8B;AAEzE,SAASC,WAAW,QAAQ,kBAAe;AAG3C,SACEC,oBAAoB,EACpBC,iCAAiC,EACjCC,+BAA+B,EAC/BC,+BAA+B,QAC1B,gCAA6B;AASpC,SACEC,qCAAqC,EACrCC,kBAAkB,QACb,wBAAqB;AAC5B,SACEC,wBAAwB,EACxBC,iCAAiC,EACjCC,iCAAiC,EACjCC,yBAAyB,EACzBC,2BAA2B,QACtB,qCAAkC;AACzC,SACEC,4BAA4B,EAC5BC,gCAAgC,EAChCC,uBAAuB,QAClB,0CAAuC;AAE9C,SAASC,wBAAwB,QAAQ,uCAAoC;AAG7E,SAASC,OAAO,IAAIC,MAAM,QAAQ,mCAAmC;AAYrE,SACEC,yBAAyB,EACzBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,sBAAsB,EACtBC,8BAA8B,QACzB,qBAAkB","ignoreList":[]}
1
+ {"version":3,"names":["createMicroFrontendRuntime","createRoute","findAppNameBySourceURL","getAppName","PendingHostComponent","usePendingHostComponentController","useIsPendingHostComponentHidden","useResolvedPendingHostComponent","createPendingHostComponentRoutePrefix","normalizeRoutePath","hidePendingHostComponent","installPendingHostComponentBridge","registerPendingHostComponentRoute","resetPendingHostComponent","resolvePendingHostComponent","MicroFrontendSessionProvider","MissingMicroFrontendSessionError","useMicroFrontendSession","useMicroFrontendSessions","default","Portal","AppContainerNotFoundError","ExposedModuleNotFoundError","InvalidAppNameError","InvalidAppRequestError","InvalidNativeRuntimeEventError"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,0BAA0B,QAAQ,iCAA8B;AAEzE,SAASC,WAAW,QAAQ,kBAAe;AAE3C,SAASC,sBAAsB,EAAEC,UAAU,QAAQ,yBAAsB;AAEzE,SACEC,oBAAoB,EACpBC,iCAAiC,EACjCC,+BAA+B,EAC/BC,+BAA+B,QAC1B,gCAA6B;AASpC,SACEC,qCAAqC,EACrCC,kBAAkB,QACb,wBAAqB;AAC5B,SACEC,wBAAwB,EACxBC,iCAAiC,EACjCC,iCAAiC,EACjCC,yBAAyB,EACzBC,2BAA2B,QACtB,qCAAkC;AACzC,SACEC,4BAA4B,EAC5BC,gCAAgC,EAChCC,uBAAuB,QAClB,0CAAuC;AAE9C,SAASC,wBAAwB,QAAQ,uCAAoC;AAQ7E,SAASC,OAAO,IAAIC,MAAM,QAAQ,mCAAmC;AAerE,SACEC,yBAAyB,EACzBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,sBAAsB,EACtBC,8BAA8B,QACzB,qBAAkB","ignoreList":[]}
@@ -3,6 +3,7 @@
3
3
  import path from 'path';
4
4
  import { globalContextScript } from "./globalContextScript.js";
5
5
  import { CONTAINER_PAIRING_KEY } from "../runtime/containerPairing.js";
6
+ import { captureStackFrames, resolveCurrentSourceURL } from "../runtime/runtimeSourceURL.js";
6
7
  export function getPreludeConfig(options, appName) {
7
8
  const eagerSharedModules = Object.entries(options.shared ?? {}).filter(([, config]) => !Array.isArray(options.shared) && config.eager === true);
8
9
  const registerStatements = eagerSharedModules.map(([moduleName], index) => {
@@ -17,9 +18,11 @@ export function getPreludeConfig(options, appName) {
17
18
  shared: options.shared
18
19
  });
19
20
  const containerName = appName == null ? 'global.__granite.app.name' : JSON.stringify(appName);
21
+ const captureFrames = captureStackFrames.toString();
22
+ const resolveSourceURL = resolveCurrentSourceURL.toString();
20
23
  return {
21
24
  banner: [globalContextScript, '(function installMicroFrontendLifecycle(context) {', ' const callbacksDescriptor = Object.getOwnPropertyDescriptor(context, "disposeCallbacksByApp");', ' const disposeDescriptor = Object.getOwnPropertyDescriptor(context, "dispose");', ' const disposeCallbacksByApp = callbacksDescriptor == null ? {} : callbacksDescriptor.value;', ' if (typeof disposeCallbacksByApp !== "object" || disposeCallbacksByApp == null || Array.isArray(disposeCallbacksByApp)) {', ' throw new Error("Cannot install micro-frontend lifecycle: invalid-dispose-callback-registry");', ' }', ' const dispose = disposeDescriptor == null ? function dispose(appName, callback) {', ' if (typeof appName !== "string" || typeof callback !== "function") {', ' throw new Error("dispose() must be compiled with the microFrontend plugin");', ' }', ' const callbacks = disposeCallbacksByApp[appName] ||= new Set();', ' callbacks.add(callback);', ' let isRegistered = true;', ' return function unregisterDispose() {', ' if (!isRegistered) { return; }', ' isRegistered = false;', ' callbacks.delete(callback);', ' };', ' } : disposeDescriptor.value;', ' if (typeof dispose !== "function") {', ' throw new Error("Cannot install micro-frontend lifecycle: invalid-dispose-registrar");', ' }', ' try {', ' if (!Reflect.defineProperty(context, "disposeCallbacksByApp", {', ' configurable: true, enumerable: false, value: disposeCallbacksByApp, writable: true,', ' }) || !Reflect.defineProperty(context, "dispose", {', ' configurable: true, enumerable: false, value: dispose, writable: true,', ' })) {', ' throw new Error("Cannot install micro-frontend lifecycle: canonical-context-is-locked");', ' }', ' } catch (error) {', ' if (callbacksDescriptor == null) {', ' Reflect.deleteProperty(context, "disposeCallbacksByApp");', ' } else {', ' Reflect.defineProperty(context, "disposeCallbacksByApp", callbacksDescriptor);', ' }', ' if (disposeDescriptor == null) {', ' Reflect.deleteProperty(context, "dispose");', ' } else {', ' Reflect.defineProperty(context, "dispose", disposeDescriptor);', ' }', ' throw error;', ' }', '})(global.__MICRO_FRONTEND__);'].join('\n'),
22
- preludeScript: [`const __containerPairSymbol = Symbol.for(${JSON.stringify(CONTAINER_PAIRING_KEY)});`, 'const __legacyContainers = new WeakMap();', 'function createContainer(appName, config) {', ' const context = global.__MICRO_FRONTEND__;', ' const containers = context.__CONTAINERS__;', ' const instances = context.__INSTANCES__;', ' if (containers[appName] != null || typeof instances[appName] === "number") {', " throw new Error(`App container '${appName}' is already registered`);", ' }', ' if (!Object.isExtensible(containers) || !Object.isExtensible(instances)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' const modernContainer = { appName, config, exposedModules: {} };', ' const legacyContainer = { name: appName, config, exposeMap: {} };', ' try {', ' if (!Reflect.defineProperty(instances, appName, {', ' configurable: true, enumerable: false, value: instances.length, writable: false,', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' instances.push(legacyContainer);', ' if (!Reflect.set(containers, appName, modernContainer)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' if (!Reflect.defineProperty(modernContainer, __containerPairSymbol, {', ' configurable: true, enumerable: false, value: legacyContainer, writable: false,', ' }) || !Reflect.defineProperty(legacyContainer, __containerPairSymbol, {', ' configurable: true, enumerable: false, value: modernContainer, writable: false,', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' } catch (error) {', ' if (Object.is(instances[instances.length - 1], legacyContainer)) {', ' instances.pop();', ' }', ' Reflect.deleteProperty(instances, appName);', ' Reflect.deleteProperty(containers, appName);', ' Reflect.deleteProperty(modernContainer, __containerPairSymbol);', ' Reflect.deleteProperty(legacyContainer, __containerPairSymbol);', ' throw error;', ' }', ' __legacyContainers.set(modernContainer, legacyContainer);', ' return modernContainer;', '}', 'function exposeModule(container, exposedModule, moduleValue) {', " const normalizedModule = exposedModule.startsWith('./') ? exposedModule : `./${exposedModule}`;", " const legacyModule = exposedModule.startsWith('./') ? exposedModule.slice(2) : exposedModule;", ' const legacyContainer = __legacyContainers.get(container);', ' if (Reflect.has(container.exposedModules, normalizedModule) ||', ' (legacyContainer != null && Reflect.has(legacyContainer.exposeMap, legacyModule))) {', " throw new Error(`Exposed module '${normalizedModule}' is already registered in app container '${container.appName}'`);", ' }', ' const ownsModernContainer = Object.is(', ' global.__MICRO_FRONTEND__.__CONTAINERS__[container.appName],', ' container', ' );', ' let legacyModuleValue = moduleValue;', ' if (legacyContainer != null &&', ' ((typeof moduleValue === "object" && moduleValue != null) || typeof moduleValue === "function") &&', ' moduleValue.__esModule !== true) {', ' legacyModuleValue = typeof moduleValue === "function"', ' ? function (...args) { return Reflect.apply(moduleValue, this, args); }', ' : {};', ' for (const exportName of Reflect.ownKeys(moduleValue)) {', ' if (exportName === "__esModule" || exportName === "default") {', ' continue;', ' }', ' const sourceDescriptor = Reflect.getOwnPropertyDescriptor(moduleValue, exportName);', ' const facadeDescriptor = Reflect.getOwnPropertyDescriptor(legacyModuleValue, exportName);', ' if (sourceDescriptor == null || (facadeDescriptor != null && facadeDescriptor.configurable === false)) {', ' // Callable facades keep intrinsic non-configurable slots such as prototype.', ' continue;', ' }', ' if (!Reflect.defineProperty(legacyModuleValue, exportName, {', ' enumerable: sourceDescriptor.enumerable,', ' get: function () { return Reflect.get(moduleValue, exportName); },', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' }', ' const hasDefaultExport = Reflect.getOwnPropertyDescriptor(moduleValue, "default") != null;', ' Object.defineProperties(legacyModuleValue, {', ' __esModule: { value: true },', ' default: {', ' enumerable: true,', ' get: hasDefaultExport', ' ? function () { return Reflect.get(moduleValue, "default"); }', ' : function () { return moduleValue; },', ' },', ' });', ' }', ' try {', ' if (ownsModernContainer && !Reflect.set(container.exposedModules, normalizedModule, moduleValue)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' if (legacyContainer != null) {', ' Object.defineProperty(legacyContainer.exposeMap, legacyModule, {', ' configurable: true,', ' enumerable: true,', ' get: function () { return legacyModuleValue; },', ' });', ' }', ' } catch (error) {', ' if (ownsModernContainer) {', ' Reflect.deleteProperty(container.exposedModules, normalizedModule);', ' }', ' if (legacyContainer != null) {', ' Reflect.deleteProperty(legacyContainer.exposeMap, legacyModule);', ' }', ' throw error;', ' }', '}', 'function registerShared(moduleName, moduleValue) {', ' const sharedModules = global.__MICRO_FRONTEND__.__SHARED__;', ' const existingModule = sharedModules[moduleName];', ' if (existingModule != null) {', ' if (typeof existingModule === "object" &&', ' typeof existingModule.get === "function" &&', ' typeof existingModule.loaded === "boolean" &&', ' Object.is(existingModule.get(), moduleValue)) {', ' return;', ' }', " throw new Error(`Shared module '${moduleName}' is already registered`);", ' }', ' sharedModules[moduleName] = { get: () => moduleValue, loaded: true };', '}', `const __container = createContainer(${containerName}, ${containerConfig});`, ...registerStatements, ...exposeStatements].join('\n')
25
+ preludeScript: [`const __containerPairSymbol = Symbol.for(${JSON.stringify(CONTAINER_PAIRING_KEY)});`, 'const __legacyContainers = new WeakMap();', 'function createContainer(appName, config) {', ' const context = global.__MICRO_FRONTEND__;', ' const containers = context.__CONTAINERS__;', ' const instances = context.__INSTANCES__;', ' if (containers[appName] != null || typeof instances[appName] === "number") {', " throw new Error(`App container '${appName}' is already registered`);", ' }', ' if (!Object.isExtensible(containers) || !Object.isExtensible(instances)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ` const stackFrames = (${captureFrames})();`, ` const sourceURL = (${resolveSourceURL})(stackFrames);`, ' const modernContainer = { appName, config, exposedModules: {}, runtime: { sourceURL } };', ' const legacyContainer = { name: appName, config, exposeMap: {} };', ' try {', ' if (!Reflect.defineProperty(instances, appName, {', ' configurable: true, enumerable: false, value: instances.length, writable: false,', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' instances.push(legacyContainer);', ' if (!Reflect.set(containers, appName, modernContainer)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' if (!Reflect.defineProperty(modernContainer, __containerPairSymbol, {', ' configurable: true, enumerable: false, value: legacyContainer, writable: false,', ' }) || !Reflect.defineProperty(legacyContainer, __containerPairSymbol, {', ' configurable: true, enumerable: false, value: modernContainer, writable: false,', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' } catch (error) {', ' if (Object.is(instances[instances.length - 1], legacyContainer)) {', ' instances.pop();', ' }', ' Reflect.deleteProperty(instances, appName);', ' Reflect.deleteProperty(containers, appName);', ' Reflect.deleteProperty(modernContainer, __containerPairSymbol);', ' Reflect.deleteProperty(legacyContainer, __containerPairSymbol);', ' throw error;', ' }', ' __legacyContainers.set(modernContainer, legacyContainer);', ' return modernContainer;', '}', 'function exposeModule(container, exposedModule, moduleValue) {', " const normalizedModule = exposedModule.startsWith('./') ? exposedModule : `./${exposedModule}`;", " const legacyModule = exposedModule.startsWith('./') ? exposedModule.slice(2) : exposedModule;", ' const legacyContainer = __legacyContainers.get(container);', ' if (Reflect.has(container.exposedModules, normalizedModule) ||', ' (legacyContainer != null && Reflect.has(legacyContainer.exposeMap, legacyModule))) {', " throw new Error(`Exposed module '${normalizedModule}' is already registered in app container '${container.appName}'`);", ' }', ' const ownsModernContainer = Object.is(', ' global.__MICRO_FRONTEND__.__CONTAINERS__[container.appName],', ' container', ' );', ' let legacyModuleValue = moduleValue;', ' if (legacyContainer != null &&', ' ((typeof moduleValue === "object" && moduleValue != null) || typeof moduleValue === "function") &&', ' moduleValue.__esModule !== true) {', ' legacyModuleValue = typeof moduleValue === "function"', ' ? function (...args) { return Reflect.apply(moduleValue, this, args); }', ' : {};', ' for (const exportName of Reflect.ownKeys(moduleValue)) {', ' if (exportName === "__esModule" || exportName === "default") {', ' continue;', ' }', ' const sourceDescriptor = Reflect.getOwnPropertyDescriptor(moduleValue, exportName);', ' const facadeDescriptor = Reflect.getOwnPropertyDescriptor(legacyModuleValue, exportName);', ' if (sourceDescriptor == null || (facadeDescriptor != null && facadeDescriptor.configurable === false)) {', ' // Callable facades keep intrinsic non-configurable slots such as prototype.', ' continue;', ' }', ' if (!Reflect.defineProperty(legacyModuleValue, exportName, {', ' enumerable: sourceDescriptor.enumerable,', ' get: function () { return Reflect.get(moduleValue, exportName); },', ' })) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' }', ' const hasDefaultExport = Reflect.getOwnPropertyDescriptor(moduleValue, "default") != null;', ' Object.defineProperties(legacyModuleValue, {', ' __esModule: { value: true },', ' default: {', ' enumerable: true,', ' get: hasDefaultExport', ' ? function () { return Reflect.get(moduleValue, "default"); }', ' : function () { return moduleValue; },', ' },', ' });', ' }', ' try {', ' if (ownsModernContainer && !Reflect.set(container.exposedModules, normalizedModule, moduleValue)) {', ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");', ' }', ' if (legacyContainer != null) {', ' Object.defineProperty(legacyContainer.exposeMap, legacyModule, {', ' configurable: true,', ' enumerable: true,', ' get: function () { return legacyModuleValue; },', ' });', ' }', ' } catch (error) {', ' if (ownsModernContainer) {', ' Reflect.deleteProperty(container.exposedModules, normalizedModule);', ' }', ' if (legacyContainer != null) {', ' Reflect.deleteProperty(legacyContainer.exposeMap, legacyModule);', ' }', ' throw error;', ' }', '}', 'function registerShared(moduleName, moduleValue) {', ' const sharedModules = global.__MICRO_FRONTEND__.__SHARED__;', ' const existingModule = sharedModules[moduleName];', ' if (existingModule != null) {', ' if (typeof existingModule === "object" &&', ' typeof existingModule.get === "function" &&', ' typeof existingModule.loaded === "boolean" &&', ' Object.is(existingModule.get(), moduleValue)) {', ' return;', ' }', " throw new Error(`Shared module '${moduleName}' is already registered`);", ' }', ' sharedModules[moduleName] = { get: () => moduleValue, loaded: true };', '}', `const __container = createContainer(${containerName}, ${containerConfig});`, ...registerStatements, ...exposeStatements].join('\n')
23
26
  };
24
27
  }
25
28
  //# sourceMappingURL=prelude.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["path","globalContextScript","CONTAINER_PAIRING_KEY","getPreludeConfig","options","appName","eagerSharedModules","Object","entries","shared","filter","config","Array","isArray","eager","registerStatements","map","moduleName","index","identifier","JSON","stringify","join","exposeStatements","exposes","exposedModule","modulePath","resolve","containerConfig","containerName","banner","preludeScript"],"sourceRoot":"../../../src","sources":["plugin/prelude.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["path","globalContextScript","CONTAINER_PAIRING_KEY","captureStackFrames","resolveCurrentSourceURL","getPreludeConfig","options","appName","eagerSharedModules","Object","entries","shared","filter","config","Array","isArray","eager","registerStatements","map","moduleName","index","identifier","JSON","stringify","join","exposeStatements","exposes","exposedModule","modulePath","resolve","containerConfig","containerName","captureFrames","toString","resolveSourceURL","banner","preludeScript"],"sourceRoot":"../../../src","sources":["plugin/prelude.ts"],"mappings":"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","ignoreList":[]}
@@ -3,8 +3,10 @@
3
3
  import { clearContainerPair, defineContainerPair, forgetContainerPair, getLegacyContainerPair, getModernContainerPair, isLegacyAppContainer, isContainerPair, isObjectRecord, rememberContainerPair, rememberLegacyAdapterPair } from "./containerPairing.js";
4
4
  import { AppContainerAlreadyRegisteredError } from "./errors.js";
5
5
  import { getMicroFrontendGlobalContext, MicroFrontendGlobalContextCompatibilityError } from "./globalContext.js";
6
+ import { captureStackFrames, resolveCurrentSourceURL } from "./runtimeSourceURL.js";
6
7
  export { exposeContainerModule as exposeModule } from "./containerModuleExposure.js";
7
8
  export function createContainer(appName, config = {}) {
9
+ const sourceURL = resolveCurrentSourceURL(captureStackFrames());
8
10
  const context = getMicroFrontendGlobalContext();
9
11
  const canonicalValue = Reflect.get(context.__CONTAINERS__, appName);
10
12
  const legacyIndex = Reflect.get(context.__INSTANCES__, appName);
@@ -17,7 +19,10 @@ export function createContainer(appName, config = {}) {
17
19
  const modernContainer = {
18
20
  appName,
19
21
  config,
20
- exposedModules: {}
22
+ exposedModules: {},
23
+ runtime: {
24
+ sourceURL
25
+ }
21
26
  };
22
27
  const legacyContainer = {
23
28
  name: appName,
@@ -178,7 +183,8 @@ function normalizeLegacyModule(exposedModule) {
178
183
  return exposedModule.startsWith('./') ? exposedModule.slice(2) : exposedModule;
179
184
  }
180
185
  function isAppContainer(value) {
181
- return isObjectRecord(value) && typeof Reflect.get(value, 'appName') === 'string' && isAppContainerConfig(Reflect.get(value, 'config')) && isObjectRecord(Reflect.get(value, 'exposedModules'));
186
+ const runtime = isObjectRecord(value) ? Reflect.get(value, 'runtime') : null;
187
+ return isObjectRecord(value) && typeof Reflect.get(value, 'appName') === 'string' && isAppContainerConfig(Reflect.get(value, 'config')) && isObjectRecord(Reflect.get(value, 'exposedModules')) && (runtime == null || isObjectRecord(runtime) && typeof Reflect.get(runtime, 'sourceURL') === 'string');
182
188
  }
183
189
  function isAppContainerConfig(value) {
184
190
  if (!isObjectRecord(value)) {
@@ -1 +1 @@
1
- {"version":3,"names":["clearContainerPair","defineContainerPair","forgetContainerPair","getLegacyContainerPair","getModernContainerPair","isLegacyAppContainer","isContainerPair","isObjectRecord","rememberContainerPair","rememberLegacyAdapterPair","AppContainerAlreadyRegisteredError","getMicroFrontendGlobalContext","MicroFrontendGlobalContextCompatibilityError","exposeContainerModule","exposeModule","createContainer","appName","config","context","canonicalValue","Reflect","get","__CONTAINERS__","legacyIndex","__INSTANCES__","isExtensible","modernContainer","exposedModules","legacyContainer","name","exposeMap","containerIndex","length","defineProperty","configurable","enumerable","value","writable","push","set","error","Object","is","pop","deleteProperty","getContainer","isAppContainer","getLegacyContainer","getLegacyAdapter","getExposedModule","container","exposedModule","module","normalizeExposedModule","undefined","normalizeLegacyModule","removeContainer","nextInstances","createLegacyInstancesWithout","clearRegistry","clearLegacyModules","existingAdapter","adapter","isAppContainerConfig","createNormalizedExposedModules","Proxy","_target","property","receiver","ownKeys","map","key","getOwnPropertyDescriptor","moduleName","has","instances","index","Number","isInteger","removed","Array","from","filter","entry","registeredNames","Set","entries","add","registry","keys","startsWith","slice","shared"],"sourceRoot":"../../../src","sources":["runtime/containerRegistry.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["clearContainerPair","defineContainerPair","forgetContainerPair","getLegacyContainerPair","getModernContainerPair","isLegacyAppContainer","isContainerPair","isObjectRecord","rememberContainerPair","rememberLegacyAdapterPair","AppContainerAlreadyRegisteredError","getMicroFrontendGlobalContext","MicroFrontendGlobalContextCompatibilityError","captureStackFrames","resolveCurrentSourceURL","exposeContainerModule","exposeModule","createContainer","appName","config","sourceURL","context","canonicalValue","Reflect","get","__CONTAINERS__","legacyIndex","__INSTANCES__","isExtensible","modernContainer","exposedModules","runtime","legacyContainer","name","exposeMap","containerIndex","length","defineProperty","configurable","enumerable","value","writable","push","set","error","Object","is","pop","deleteProperty","getContainer","isAppContainer","getLegacyContainer","getLegacyAdapter","getExposedModule","container","exposedModule","module","normalizeExposedModule","undefined","normalizeLegacyModule","removeContainer","nextInstances","createLegacyInstancesWithout","clearRegistry","clearLegacyModules","existingAdapter","adapter","isAppContainerConfig","createNormalizedExposedModules","Proxy","_target","property","receiver","ownKeys","map","key","getOwnPropertyDescriptor","moduleName","has","instances","index","Number","isInteger","removed","Array","from","filter","entry","registeredNames","Set","entries","add","registry","keys","startsWith","slice","shared"],"sourceRoot":"../../../src","sources":["runtime/containerRegistry.ts"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { AppContainerNotFoundError, InvalidAppNameError } from "./errors.js";
4
4
  import { getMicroFrontendGlobalContext } from "./globalContext.js";
5
+ import { setMicroFrontendLifecycleCallback } from "./lifecycle.js";
5
6
  import { installNativeComponentRegistryCompatibility } from "./nativeComponentRegistryCompatibility.js";
6
7
  import { parseAppRequest } from "./parseAppRequest.js";
7
8
  export function createMicroFrontendRuntimeWithDependencies(dependencies) {
@@ -47,7 +48,7 @@ export function createMicroFrontendRuntimeWithDependencies(dependencies) {
47
48
  throw error;
48
49
  }
49
50
  }
50
- return {
51
+ const runtime = {
51
52
  evaluateScript,
52
53
  preloadApp,
53
54
  async importApp(request) {
@@ -80,5 +81,7 @@ export function createMicroFrontendRuntimeWithDependencies(dependencies) {
80
81
  return subscription;
81
82
  }
82
83
  };
84
+ setMicroFrontendLifecycleCallback(runtime, dependencies.onLifecycleEvent);
85
+ return runtime;
83
86
  }
84
87
  //# sourceMappingURL=createMicroFrontendRuntime.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["AppContainerNotFoundError","InvalidAppNameError","getMicroFrontendGlobalContext","installNativeComponentRegistryCompatibility","parseAppRequest","createMicroFrontendRuntimeWithDependencies","dependencies","appEvaluations","Map","resetFailedEvaluation","appName","delete","registry","removeContainer","removePendingHostComponentRoutes","preloadApp","length","Promise","reject","existingEvaluation","get","evaluation","evaluateApp","set","evaluateScript","filePath","nativeRuntime","adapter","loadBundle","hasContainer","error","importApp","request","importModule","onEvent","listener","subscription","event","parsedEvent","parseEvent","name","params","catch","onPreloadError","exhaustiveEvent","startEventDelivery"],"sourceRoot":"../../../src","sources":["runtime/createMicroFrontendRuntime.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["AppContainerNotFoundError","InvalidAppNameError","getMicroFrontendGlobalContext","setMicroFrontendLifecycleCallback","installNativeComponentRegistryCompatibility","parseAppRequest","createMicroFrontendRuntimeWithDependencies","dependencies","appEvaluations","Map","resetFailedEvaluation","appName","delete","registry","removeContainer","removePendingHostComponentRoutes","preloadApp","length","Promise","reject","existingEvaluation","get","evaluation","evaluateApp","set","evaluateScript","filePath","nativeRuntime","adapter","loadBundle","hasContainer","error","runtime","importApp","request","importModule","onEvent","listener","subscription","event","parsedEvent","parseEvent","name","params","catch","onPreloadError","exhaustiveEvent","startEventDelivery","onLifecycleEvent"],"sourceRoot":"../../../src","sources":["runtime/createMicroFrontendRuntime.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ import { getMicroFrontendRuntimeContext } from "./registry.js";
4
+ import { captureStackFrames, resolveCurrentSourceURL } from "./runtimeSourceURL.js";
5
+ export function resolveAppNameBySourceURL(sourceURL, containers) {
6
+ let resolvedAppName = null;
7
+ for (const container of Object.values(containers)) {
8
+ if (container.runtime?.sourceURL !== sourceURL) {
9
+ continue;
10
+ }
11
+ if (resolvedAppName != null && resolvedAppName !== container.appName) {
12
+ return null;
13
+ }
14
+ resolvedAppName = container.appName;
15
+ }
16
+ return resolvedAppName;
17
+ }
18
+ export function findAppNameBySourceURL(sourceURL) {
19
+ return resolveAppNameBySourceURL(sourceURL, getMicroFrontendRuntimeContext().containers);
20
+ }
21
+ export function resolveAppNameFromStackFrames(frames, containers) {
22
+ const sourceURL = resolveCurrentSourceURL(frames);
23
+ const appName = resolveAppNameBySourceURL(sourceURL, containers);
24
+ if (appName != null) {
25
+ return appName;
26
+ }
27
+ throw new Error('Cannot resolve the current micro-frontend app name');
28
+ }
29
+ export function getAppName() {
30
+ const sourceURL = resolveCurrentSourceURL(captureStackFrames());
31
+ const appName = findAppNameBySourceURL(sourceURL);
32
+ if (appName != null) {
33
+ return appName;
34
+ }
35
+ throw new Error('Cannot resolve the current micro-frontend app name');
36
+ }
37
+ //# sourceMappingURL=getAppName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getMicroFrontendRuntimeContext","captureStackFrames","resolveCurrentSourceURL","resolveAppNameBySourceURL","sourceURL","containers","resolvedAppName","container","Object","values","runtime","appName","findAppNameBySourceURL","resolveAppNameFromStackFrames","frames","Error","getAppName"],"sourceRoot":"../../../src","sources":["runtime/getAppName.ts"],"mappings":";;AAAA,SAASA,8BAA8B,QAA2B,eAAY;AAC9E,SAASC,kBAAkB,EAAEC,uBAAuB,QAAgC,uBAAoB;AAExG,OAAO,SAASC,yBAAyBA,CACvCC,SAAiB,EACjBC,UAAkD,EACnC;EACf,IAAIC,eAA8B,GAAG,IAAI;EACzC,KAAK,MAAMC,SAAS,IAAIC,MAAM,CAACC,MAAM,CAACJ,UAAU,CAAC,EAAE;IACjD,IAAIE,SAAS,CAACG,OAAO,EAAEN,SAAS,KAAKA,SAAS,EAAE;MAC9C;IACF;IACA,IAAIE,eAAe,IAAI,IAAI,IAAIA,eAAe,KAAKC,SAAS,CAACI,OAAO,EAAE;MACpE,OAAO,IAAI;IACb;IACAL,eAAe,GAAGC,SAAS,CAACI,OAAO;EACrC;EACA,OAAOL,eAAe;AACxB;AAEA,OAAO,SAASM,sBAAsBA,CAACR,SAAiB,EAAiB;EACvE,OAAOD,yBAAyB,CAACC,SAAS,EAAEJ,8BAA8B,CAAC,CAAC,CAACK,UAAU,CAAC;AAC1F;AAEA,OAAO,SAASQ,6BAA6BA,CAC3CC,MAAoC,EACpCT,UAAkD,EAC1C;EACR,MAAMD,SAAS,GAAGF,uBAAuB,CAACY,MAAM,CAAC;EACjD,MAAMH,OAAO,GAAGR,yBAAyB,CAACC,SAAS,EAAEC,UAAU,CAAC;EAChE,IAAIM,OAAO,IAAI,IAAI,EAAE;IACnB,OAAOA,OAAO;EAChB;EAEA,MAAM,IAAII,KAAK,CAAC,oDAAoD,CAAC;AACvE;AAEA,OAAO,SAASC,UAAUA,CAAA,EAAW;EACnC,MAAMZ,SAAS,GAAGF,uBAAuB,CAACD,kBAAkB,CAAC,CAAC,CAAC;EAC/D,MAAMU,OAAO,GAAGC,sBAAsB,CAACR,SAAS,CAAC;EACjD,IAAIO,OAAO,IAAI,IAAI,EAAE;IACnB,OAAOA,OAAO;EAChB;EAEA,MAAM,IAAII,KAAK,CAAC,oDAAoD,CAAC;AACvE","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ const lifecycleCallbackByRuntime = new WeakMap();
4
+ export function setMicroFrontendLifecycleCallback(runtime, callback) {
5
+ if (callback == null) {
6
+ lifecycleCallbackByRuntime.delete(runtime);
7
+ return;
8
+ }
9
+ lifecycleCallbackByRuntime.set(runtime, callback);
10
+ }
11
+ export function emitMicroFrontendLifecycleEvent(runtime, event) {
12
+ const callback = lifecycleCallbackByRuntime.get(runtime);
13
+ if (callback == null) {
14
+ return;
15
+ }
16
+ try {
17
+ callback(event);
18
+ } catch (error) {
19
+ console.error('Failed to run a micro-frontend lifecycle callback', error);
20
+ }
21
+ }
22
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["lifecycleCallbackByRuntime","WeakMap","setMicroFrontendLifecycleCallback","runtime","callback","delete","set","emitMicroFrontendLifecycleEvent","event","get","error","console"],"sourceRoot":"../../../src","sources":["runtime/lifecycle.ts"],"mappings":";;AAEA,MAAMA,0BAA0B,GAAG,IAAIC,OAAO,CAAuD,CAAC;AAEtG,OAAO,SAASC,iCAAiCA,CAC/CC,OAAe,EACfC,QAAoE,EAC9D;EACN,IAAIA,QAAQ,IAAI,IAAI,EAAE;IACpBJ,0BAA0B,CAACK,MAAM,CAACF,OAAO,CAAC;IAC1C;EACF;EAEAH,0BAA0B,CAACM,GAAG,CAACH,OAAO,EAAEC,QAAQ,CAAC;AACnD;AAEA,OAAO,SAASG,+BAA+BA,CAACJ,OAAe,EAAEK,KAAkC,EAAQ;EACzG,MAAMJ,QAAQ,GAAGJ,0BAA0B,CAACS,GAAG,CAACN,OAAO,CAAC;EACxD,IAAIC,QAAQ,IAAI,IAAI,EAAE;IACpB;EACF;EAEA,IAAI;IACFA,QAAQ,CAACI,KAAK,CAAC;EACjB,CAAC,CAAC,OAAOE,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;EAC3E;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createContainer","exposeModule","getContainer","getExposedModule","removeContainer","ExposedModuleNotFoundError","SharedModuleAlreadyRegisteredError","getMicroFrontendGlobalContext","parseAppRequest","getMicroFrontendRuntimeContext","context","ensureRuntimeContext","registerShared","moduleName","module","sharedModules","__SHARED__","existingModule","isSharedModule","Object","is","get","loaded","value","Reflect","disposeAppResources","appName","disposeCallbacks","disposeCallbacksByApp","runAppDisposeCallbacks","hasContainer","importModule","request","exposedModule","container","containers","__CONTAINERS__","propertyDescriptors","Map","runtimeProperties","dispose","isRegisterAppDispose","createRegisterAppDispose","isDisposeCallbackRegistry","property","ownKeys","set","getOwnPropertyDescriptor","defineProperty","configurable","enumerable","writable","Error","String","error","descriptor","Array","from","reverse","deleteProperty","isObjectRecord","isArray","values","every","isDisposeCallbackSet","Symbol","iterator","appNameOrCallback","callback","registerAppDisposeCallback","Set","add","isRegistered","delete","callbacks","firstDisposeError","didDisposeFail","microFrontendModuleRegistry"],"sourceRoot":"../../../src","sources":["runtime/registry.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createContainer","exposeModule","getContainer","getExposedModule","removeContainer","ExposedModuleNotFoundError","SharedModuleAlreadyRegisteredError","getMicroFrontendGlobalContext","parseAppRequest","getMicroFrontendRuntimeContext","context","ensureRuntimeContext","registerShared","moduleName","module","sharedModules","__SHARED__","existingModule","isSharedModule","Object","is","get","loaded","value","Reflect","disposeAppResources","appName","disposeCallbacks","disposeCallbacksByApp","runAppDisposeCallbacks","hasContainer","importModule","request","exposedModule","container","containers","__CONTAINERS__","propertyDescriptors","Map","runtimeProperties","dispose","isRegisterAppDispose","createRegisterAppDispose","isDisposeCallbackRegistry","property","ownKeys","set","getOwnPropertyDescriptor","defineProperty","configurable","enumerable","writable","Error","String","error","descriptor","Array","from","reverse","deleteProperty","isObjectRecord","isArray","values","every","isDisposeCallbackSet","Symbol","iterator","appNameOrCallback","callback","registerAppDisposeCallback","Set","add","isRegistered","delete","callbacks","firstDisposeError","didDisposeFail","microFrontendModuleRegistry"],"sourceRoot":"../../../src","sources":["runtime/registry.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ export function captureStackFrames() {
4
+ const prepareStackTraceDescriptor = Object.getOwnPropertyDescriptor(Error, 'prepareStackTrace');
5
+ Object.defineProperty(Error, 'prepareStackTrace', {
6
+ configurable: true,
7
+ value: (_error, callSites) => callSites,
8
+ writable: true
9
+ });
10
+ const frames = [];
11
+ try {
12
+ const callSites = new Error().stack;
13
+ if (!Array.isArray(callSites)) {
14
+ throw new Error('Cannot capture structured micro-frontend stack frames');
15
+ }
16
+ for (const callSite of callSites) {
17
+ if (typeof callSite !== 'object' || callSite == null) {
18
+ continue;
19
+ }
20
+ if (!('getFileName' in callSite)) {
21
+ continue;
22
+ }
23
+ const getFileName = 'getFileName' in callSite ? callSite.getFileName : undefined;
24
+ const sourceURL = typeof getFileName === 'function' ? getFileName.call(callSite) : null;
25
+ frames.push({
26
+ sourceURL: typeof sourceURL === 'string' ? sourceURL : null
27
+ });
28
+ }
29
+ } finally {
30
+ if (prepareStackTraceDescriptor == null) {
31
+ Reflect.deleteProperty(Error, 'prepareStackTrace');
32
+ } else {
33
+ Object.defineProperty(Error, 'prepareStackTrace', prepareStackTraceDescriptor);
34
+ }
35
+ }
36
+ return frames;
37
+ }
38
+ export function resolveCurrentSourceURL(frames) {
39
+ for (const frame of frames) {
40
+ if (frame.sourceURL != null && frame.sourceURL.length > 0) {
41
+ return frame.sourceURL;
42
+ }
43
+ }
44
+ throw new Error('Cannot determine the caller micro-frontend sourceURL');
45
+ }
46
+ //# sourceMappingURL=runtimeSourceURL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["captureStackFrames","prepareStackTraceDescriptor","Object","getOwnPropertyDescriptor","Error","defineProperty","configurable","value","_error","callSites","writable","frames","stack","Array","isArray","callSite","getFileName","undefined","sourceURL","call","push","Reflect","deleteProperty","resolveCurrentSourceURL","frame","length"],"sourceRoot":"../../../src","sources":["runtime/runtimeSourceURL.ts"],"mappings":";;AAIA,OAAO,SAASA,kBAAkBA,CAAA,EAAiC;EACjE,MAAMC,2BAA2B,GAAGC,MAAM,CAACC,wBAAwB,CAACC,KAAK,EAAE,mBAAmB,CAAC;EAC/FF,MAAM,CAACG,cAAc,CAACD,KAAK,EAAE,mBAAmB,EAAE;IAChDE,YAAY,EAAE,IAAI;IAClBC,KAAK,EAAEA,CAACC,MAAe,EAAEC,SAA6B,KAAKA,SAAS;IACpEC,QAAQ,EAAE;EACZ,CAAC,CAAC;EAEF,MAAMC,MAA2B,GAAG,EAAE;EACtC,IAAI;IACF,MAAMF,SAAkB,GAAG,IAAIL,KAAK,CAAC,CAAC,CAACQ,KAAK;IAC5C,IAAI,CAACC,KAAK,CAACC,OAAO,CAACL,SAAS,CAAC,EAAE;MAC7B,MAAM,IAAIL,KAAK,CAAC,uDAAuD,CAAC;IAC1E;IACA,KAAK,MAAMW,QAAQ,IAAIN,SAAS,EAAE;MAChC,IAAI,OAAOM,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,IAAI,IAAI,EAAE;QACpD;MACF;MACA,IAAI,EAAE,aAAa,IAAIA,QAAQ,CAAC,EAAE;QAChC;MACF;MACA,MAAMC,WAAoB,GAAG,aAAa,IAAID,QAAQ,GAAGA,QAAQ,CAACC,WAAW,GAAGC,SAAS;MACzF,MAAMC,SAAkB,GAAG,OAAOF,WAAW,KAAK,UAAU,GAAGA,WAAW,CAACG,IAAI,CAACJ,QAAQ,CAAC,GAAG,IAAI;MAChGJ,MAAM,CAACS,IAAI,CAAC;QAAEF,SAAS,EAAE,OAAOA,SAAS,KAAK,QAAQ,GAAGA,SAAS,GAAG;MAAK,CAAC,CAAC;IAC9E;EACF,CAAC,SAAS;IACR,IAAIjB,2BAA2B,IAAI,IAAI,EAAE;MACvCoB,OAAO,CAACC,cAAc,CAAClB,KAAK,EAAE,mBAAmB,CAAC;IACpD,CAAC,MAAM;MACLF,MAAM,CAACG,cAAc,CAACD,KAAK,EAAE,mBAAmB,EAAEH,2BAA2B,CAAC;IAChF;EACF;EAEA,OAAOU,MAAM;AACf;AAEA,OAAO,SAASY,uBAAuBA,CAACZ,MAAoC,EAAU;EACpF,KAAK,MAAMa,KAAK,IAAIb,MAAM,EAAE;IAC1B,IAAIa,KAAK,CAACN,SAAS,IAAI,IAAI,IAAIM,KAAK,CAACN,SAAS,CAACO,MAAM,GAAG,CAAC,EAAE;MACzD,OAAOD,KAAK,CAACN,SAAS;IACxB;EACF;EACA,MAAM,IAAId,KAAK,CAAC,sDAAsD,CAAC;AACzE","ignoreList":[]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useLayoutEffect, useReducer, useRef } from 'react';
4
4
  import { installPendingHostComponentBridge, resetPendingHostComponent } from "../host/pendingHostComponentStore.js";
5
+ import { emitMicroFrontendLifecycleEvent } from "../runtime/lifecycle.js";
5
6
  import { disposeAppResources } from "../runtime/registry.js";
6
7
  const INITIAL_SESSIONS = [];
7
8
  function reduceMicroFrontendSessions(sessions, event) {
@@ -43,17 +44,32 @@ export function useMicroFrontendSessions(runtime) {
43
44
  const activeAppNames = new Set(sessions.map(({
44
45
  appName
45
46
  }) => appName));
46
- const inactiveAppNames = new Set(previousSessions.filter(({
47
+ const mountedSessions = sessions.filter(({
47
48
  sessionId
48
- }) => !activeSessionIds.has(sessionId)).map(({
49
+ }) => !previousSessions.some(previousSession => previousSession.sessionId === sessionId));
50
+ const inactiveSessions = previousSessions.filter(({
51
+ sessionId
52
+ }) => !activeSessionIds.has(sessionId));
53
+ const inactiveAppNames = new Set(inactiveSessions.map(({
49
54
  appName
50
55
  }) => appName).filter(appName => !activeAppNames.has(appName)));
51
- inactiveAppNames.forEach(appName => {
52
- void disposeAppResources(appName).catch(error => {
53
- console.error(`Failed to dispose micro-frontend app resources for '${appName}'`, error);
56
+ mountedSessions.forEach(session => {
57
+ emitMicroFrontendLifecycleEvent(runtime, createLifecycleEvent('mounted', session, sessions));
58
+ });
59
+ const appDisposals = new Map(Array.from(inactiveAppNames, appName => [appName, disposeAppResources(appName).catch(error => {
60
+ console.error(`Failed to dispose micro-frontend app resources for '${appName}'`, error);
61
+ })]));
62
+ inactiveSessions.forEach(session => {
63
+ const appDisposal = appDisposals.get(session.appName);
64
+ if (appDisposal == null) {
65
+ emitMicroFrontendLifecycleEvent(runtime, createLifecycleEvent('unmounted', session, sessions));
66
+ return;
67
+ }
68
+ void appDisposal.then(() => {
69
+ emitMicroFrontendLifecycleEvent(runtime, createLifecycleEvent('unmounted', session, previousSessionsRef.current));
54
70
  });
55
71
  });
56
- }, [sessions]);
72
+ }, [runtime, sessions]);
57
73
  useLayoutEffect(() => {
58
74
  installPendingHostComponentBridge();
59
75
  const subscription = runtime.onEvent(event => {
@@ -66,4 +82,17 @@ export function useMicroFrontendSessions(runtime) {
66
82
  }, [runtime]);
67
83
  return sessions;
68
84
  }
85
+ function createLifecycleEvent(phase, session, activeSessions) {
86
+ return {
87
+ phase,
88
+ session: toLifecycleSession(session),
89
+ activeSessions: activeSessions.map(toLifecycleSession)
90
+ };
91
+ }
92
+ function toLifecycleSession(session) {
93
+ return {
94
+ appName: session.appName,
95
+ id: session.sessionId
96
+ };
97
+ }
69
98
  //# sourceMappingURL=useMicroFrontendSessions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useLayoutEffect","useReducer","useRef","installPendingHostComponentBridge","resetPendingHostComponent","disposeAppResources","INITIAL_SESSIONS","reduceMicroFrontendSessions","sessions","event","name","some","sessionId","params","appName","scheme","isVisible","filter","map","session","exhaustiveEvent","useMicroFrontendSessions","runtime","dispatch","previousSessionsRef","previousSessions","current","activeSessionIds","Set","activeAppNames","inactiveAppNames","has","forEach","catch","error","console","subscription","onEvent","remove"],"sourceRoot":"../../../src","sources":["session/useMicroFrontendSessions.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useLayoutEffect","useReducer","useRef","installPendingHostComponentBridge","resetPendingHostComponent","emitMicroFrontendLifecycleEvent","disposeAppResources","INITIAL_SESSIONS","reduceMicroFrontendSessions","sessions","event","name","some","sessionId","params","appName","scheme","isVisible","filter","map","session","exhaustiveEvent","useMicroFrontendSessions","runtime","dispatch","previousSessionsRef","previousSessions","current","activeSessionIds","Set","activeAppNames","mountedSessions","previousSession","inactiveSessions","has","inactiveAppNames","forEach","createLifecycleEvent","appDisposals","Map","Array","from","catch","error","console","appDisposal","get","then","subscription","onEvent","remove","phase","activeSessions","toLifecycleSession","id"],"sourceRoot":"../../../src","sources":["session/useMicroFrontendSessions.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,7 @@
1
- import type { MicroFrontendAdapter, MicroFrontendRuntimeApi } from './types';
1
+ import type { MicroFrontendAdapter, MicroFrontendLifecycleCallback, MicroFrontendRuntimeApi } from './types';
2
2
  export interface CreateMicroFrontendRuntimeOptions {
3
3
  readonly adapter: MicroFrontendAdapter;
4
+ readonly onLifecycleEvent?: MicroFrontendLifecycleCallback;
4
5
  readonly onPreloadError?: (error: unknown) => void;
5
6
  }
6
7
  export declare function createMicroFrontendRuntime(options: CreateMicroFrontendRuntimeOptions): MicroFrontendRuntimeApi;
@@ -2,6 +2,7 @@ export { createMicroFrontendRuntime } from './createMicroFrontendRuntime';
2
2
  export type { CreateMicroFrontendRuntimeOptions } from './createMicroFrontendRuntime';
3
3
  export { createRoute } from './createRoute';
4
4
  export type { MicroFrontendRouteOptions } from './createRoute';
5
+ export { findAppNameBySourceURL, getAppName } from './runtime/getAppName';
5
6
  export type { PendingHostComponentController, PendingHostComponentProps } from './host/PendingHostComponent';
6
7
  export { PendingHostComponent, usePendingHostComponentController, useIsPendingHostComponentHidden, useResolvedPendingHostComponent, } from './host/PendingHostComponent';
7
8
  export type { PendingHostComponentAppConfig, PendingHostComponentRenderer, PendingHostComponentParams, PendingHostComponentRouteRequest, RegisterPendingHostComponentRouteOptions, ResolvedPendingHostComponent, } from './host/types';
@@ -11,7 +12,7 @@ export { MicroFrontendSessionProvider, MissingMicroFrontendSessionError, useMicr
11
12
  export type { MicroFrontendSession, MicroFrontendSessionProviderProps } from './session/MicroFrontendSessionContext';
12
13
  export { useMicroFrontendSessions } from './session/useMicroFrontendSessions';
13
14
  export type { MicroFrontendSessionState } from './session/useMicroFrontendSessions';
14
- export type { AppDisposeCallback, MicroFrontendRuntimeContext } from './runtime/registry';
15
+ export type { AppContainer, AppContainerRuntime, AppDisposeCallback, MicroFrontendRuntimeContext, } from './runtime/registry';
15
16
  export { default as Portal } from './specs/PortalViewNativeComponent';
16
- export type { AppRequest, MicroFrontendAppProps, MicroFrontendAdapter, MicroFrontendBundle, MicroFrontendBundleRequest, MicroFrontendRuntimeApi, MicroFrontendRuntimeEvent, MicroFrontendRuntimeEventSubscription, MicroFrontendSessionEvent, } from './types';
17
+ export type { AppRequest, MicroFrontendAppProps, MicroFrontendAdapter, MicroFrontendBundle, MicroFrontendBundleRequest, MicroFrontendLifecycleCallback, MicroFrontendLifecycleEvent, MicroFrontendLifecycleSession, MicroFrontendRuntimeApi, MicroFrontendRuntimeEvent, MicroFrontendRuntimeEventSubscription, MicroFrontendSessionEvent, } from './types';
17
18
  export { AppContainerNotFoundError, ExposedModuleNotFoundError, InvalidAppNameError, InvalidAppRequestError, InvalidNativeRuntimeEventError, } from './runtime/errors';
@@ -1,4 +1,4 @@
1
- import type { AppRequest, MicroFrontendAdapter, MicroFrontendRuntimeApi, MicroFrontendRuntimeEvent, MicroFrontendRuntimeEventSubscription } from '../types';
1
+ import type { AppRequest, MicroFrontendAdapter, MicroFrontendLifecycleEvent, MicroFrontendRuntimeApi, MicroFrontendRuntimeEvent, MicroFrontendRuntimeEventSubscription } from '../types';
2
2
  export interface NativeMicroFrontendRuntimeEvent {
3
3
  readonly name: string;
4
4
  readonly params: {
@@ -24,6 +24,7 @@ export interface CreateMicroFrontendRuntimeDependencies {
24
24
  readonly adapter: MicroFrontendAdapter;
25
25
  readonly nativeRuntime: NativeMicroFrontendRuntime;
26
26
  readonly onPreloadError: (error: unknown) => void;
27
+ readonly onLifecycleEvent?: (event: MicroFrontendLifecycleEvent) => void;
27
28
  readonly registry: MicroFrontendModuleRegistry;
28
29
  readonly removePendingHostComponentRoutes: (appName: string) => void;
29
30
  readonly parseEvent: (event: NativeMicroFrontendRuntimeEvent) => MicroFrontendRuntimeEvent;
@@ -0,0 +1,6 @@
1
+ import { type AppContainer } from './registry';
2
+ import { type RuntimeStackFrame } from './runtimeSourceURL';
3
+ export declare function resolveAppNameBySourceURL(sourceURL: string, containers: Readonly<Record<string, AppContainer>>): string | null;
4
+ export declare function findAppNameBySourceURL(sourceURL: string): string | null;
5
+ export declare function resolveAppNameFromStackFrames(frames: readonly RuntimeStackFrame[], containers: Readonly<Record<string, AppContainer>>): string;
6
+ export declare function getAppName(): string;
@@ -0,0 +1,3 @@
1
+ import type { MicroFrontendLifecycleEvent } from '../types';
2
+ export declare function setMicroFrontendLifecycleCallback(runtime: object, callback: ((event: MicroFrontendLifecycleEvent) => void) | undefined): void;
3
+ export declare function emitMicroFrontendLifecycleEvent(runtime: object, event: MicroFrontendLifecycleEvent): void;
@@ -9,10 +9,14 @@ export type SharedConfig = Readonly<Record<string, SharedModuleConfig>>;
9
9
  export interface AppContainerConfig {
10
10
  readonly shared?: SharedConfig;
11
11
  }
12
+ export interface AppContainerRuntime {
13
+ readonly sourceURL: string;
14
+ }
12
15
  export interface AppContainer {
13
16
  readonly appName: string;
14
17
  readonly config: AppContainerConfig;
15
18
  readonly exposedModules: Record<string, unknown>;
19
+ readonly runtime?: AppContainerRuntime;
16
20
  }
17
21
  export type AppDisposeCallback = () => void | Promise<void>;
18
22
  export interface RegisterAppDispose {
@@ -0,0 +1,5 @@
1
+ export interface RuntimeStackFrame {
2
+ readonly sourceURL: string | null;
3
+ }
4
+ export declare function captureStackFrames(): readonly RuntimeStackFrame[];
5
+ export declare function resolveCurrentSourceURL(frames: readonly RuntimeStackFrame[]): string;
@@ -41,6 +41,17 @@ export type MicroFrontendSessionEvent = Exclude<MicroFrontendRuntimeEvent, {
41
41
  export interface MicroFrontendRuntimeEventSubscription {
42
42
  readonly remove: () => void;
43
43
  }
44
+ export interface MicroFrontendLifecycleSession {
45
+ readonly appName: string;
46
+ readonly id: string;
47
+ }
48
+ export interface MicroFrontendLifecycleEvent {
49
+ readonly phase: 'mounted' | 'unmounted';
50
+ readonly session: MicroFrontendLifecycleSession;
51
+ /** Active sessions across every app when the callback is emitted. */
52
+ readonly activeSessions: readonly MicroFrontendLifecycleSession[];
53
+ }
54
+ export type MicroFrontendLifecycleCallback = (event: MicroFrontendLifecycleEvent) => void;
44
55
  export interface MicroFrontendRuntimeApi {
45
56
  readonly evaluateScript: (filePath: string) => Promise<void>;
46
57
  readonly preloadApp: (appName: string) => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@granite-js/micro-frontend",
3
- "version": "2.1.1",
3
+ "version": "2.3.0",
4
4
  "description": "Micro-frontend build, runtime, session, and Portal contracts for Granite brownfield applications",
5
5
  "main": "./dist/module/index.js",
6
6
  "types": "./dist/typescript/index.d.ts",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "dependencies": {
58
58
  "@babel/core": "7.28.5",
59
- "@granite-js/utils": "2.1.1",
59
+ "@granite-js/utils": "2.3.0",
60
60
  "@standard-schema/spec": "^1.0.0"
61
61
  },
62
62
  "peerDependencies": {
@@ -72,8 +72,8 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@babel/types": "7.28.5",
75
- "@granite-js/plugin-core": "2.1.1",
76
- "@granite-js/react-native": "2.1.1",
75
+ "@granite-js/plugin-core": "2.3.0",
76
+ "@granite-js/react-native": "2.3.0",
77
77
  "@types/babel__core": "^7.20.5",
78
78
  "@types/node": "24.10.12",
79
79
  "@types/react": "19.2.0",
@@ -3,10 +3,11 @@ import { createMicroFrontendRuntimeWithDependencies } from './runtime/createMicr
3
3
  import { parseNativeRuntimeEvent } from './runtime/parseNativeRuntimeEvent';
4
4
  import { microFrontendModuleRegistry } from './runtime/registry';
5
5
  import NativeGraniteMicroFrontendRuntime from './specs/NativeGraniteMicroFrontendRuntime';
6
- import type { MicroFrontendAdapter, MicroFrontendRuntimeApi } from './types';
6
+ import type { MicroFrontendAdapter, MicroFrontendLifecycleCallback, MicroFrontendRuntimeApi } from './types';
7
7
 
8
8
  export interface CreateMicroFrontendRuntimeOptions {
9
9
  readonly adapter: MicroFrontendAdapter;
10
+ readonly onLifecycleEvent?: MicroFrontendLifecycleCallback;
10
11
  readonly onPreloadError?: (error: unknown) => void;
11
12
  }
12
13
 
@@ -14,6 +15,7 @@ export function createMicroFrontendRuntime(options: CreateMicroFrontendRuntimeOp
14
15
  return createMicroFrontendRuntimeWithDependencies({
15
16
  adapter: options.adapter,
16
17
  nativeRuntime: NativeGraniteMicroFrontendRuntime,
18
+ onLifecycleEvent: options.onLifecycleEvent,
17
19
  onPreloadError: options.onPreloadError ?? (() => undefined),
18
20
  parseEvent: parseNativeRuntimeEvent,
19
21
  registry: microFrontendModuleRegistry,
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export { createMicroFrontendRuntime } from './createMicroFrontendRuntime';
2
2
  export type { CreateMicroFrontendRuntimeOptions } from './createMicroFrontendRuntime';
3
3
  export { createRoute } from './createRoute';
4
4
  export type { MicroFrontendRouteOptions } from './createRoute';
5
+ export { findAppNameBySourceURL, getAppName } from './runtime/getAppName';
5
6
  export type { PendingHostComponentController, PendingHostComponentProps } from './host/PendingHostComponent';
6
7
  export {
7
8
  PendingHostComponent,
@@ -36,7 +37,12 @@ export {
36
37
  export type { MicroFrontendSession, MicroFrontendSessionProviderProps } from './session/MicroFrontendSessionContext';
37
38
  export { useMicroFrontendSessions } from './session/useMicroFrontendSessions';
38
39
  export type { MicroFrontendSessionState } from './session/useMicroFrontendSessions';
39
- export type { AppDisposeCallback, MicroFrontendRuntimeContext } from './runtime/registry';
40
+ export type {
41
+ AppContainer,
42
+ AppContainerRuntime,
43
+ AppDisposeCallback,
44
+ MicroFrontendRuntimeContext,
45
+ } from './runtime/registry';
40
46
  export { default as Portal } from './specs/PortalViewNativeComponent';
41
47
  export type {
42
48
  AppRequest,
@@ -44,6 +50,9 @@ export type {
44
50
  MicroFrontendAdapter,
45
51
  MicroFrontendBundle,
46
52
  MicroFrontendBundleRequest,
53
+ MicroFrontendLifecycleCallback,
54
+ MicroFrontendLifecycleEvent,
55
+ MicroFrontendLifecycleSession,
47
56
  MicroFrontendRuntimeApi,
48
57
  MicroFrontendRuntimeEvent,
49
58
  MicroFrontendRuntimeEventSubscription,
@@ -2,6 +2,7 @@ import path from 'path';
2
2
  import { globalContextScript } from './globalContextScript';
3
3
  import type { MicroFrontendPluginOptions } from './types';
4
4
  import { CONTAINER_PAIRING_KEY } from '../runtime/containerPairing';
5
+ import { captureStackFrames, resolveCurrentSourceURL } from '../runtime/runtimeSourceURL';
5
6
 
6
7
  export interface MicroFrontendPreludeConfig {
7
8
  readonly banner: string;
@@ -28,6 +29,8 @@ export function getPreludeConfig(options: MicroFrontendPluginOptions, appName?:
28
29
  });
29
30
  const containerConfig = JSON.stringify({ shared: options.shared });
30
31
  const containerName = appName == null ? 'global.__granite.app.name' : JSON.stringify(appName);
32
+ const captureFrames = captureStackFrames.toString();
33
+ const resolveSourceURL = resolveCurrentSourceURL.toString();
31
34
 
32
35
  return {
33
36
  banner: [
@@ -91,7 +94,9 @@ export function getPreludeConfig(options: MicroFrontendPluginOptions, appName?:
91
94
  ' if (!Object.isExtensible(containers) || !Object.isExtensible(instances)) {',
92
95
  ' throw new Error("Cannot establish the micro-frontend global context: registry-is-not-extensible");',
93
96
  ' }',
94
- ' const modernContainer = { appName, config, exposedModules: {} };',
97
+ ` const stackFrames = (${captureFrames})();`,
98
+ ` const sourceURL = (${resolveSourceURL})(stackFrames);`,
99
+ ' const modernContainer = { appName, config, exposedModules: {}, runtime: { sourceURL } };',
95
100
  ' const legacyContainer = { name: appName, config, exposeMap: {} };',
96
101
  ' try {',
97
102
  ' if (!Reflect.defineProperty(instances, appName, {',
@@ -14,10 +14,12 @@ import {
14
14
  import { AppContainerAlreadyRegisteredError } from './errors';
15
15
  import { getMicroFrontendGlobalContext, MicroFrontendGlobalContextCompatibilityError } from './globalContext';
16
16
  import type { AppContainer, AppContainerConfig } from './registry';
17
+ import { captureStackFrames, resolveCurrentSourceURL } from './runtimeSourceURL';
17
18
 
18
19
  export { exposeContainerModule as exposeModule } from './containerModuleExposure';
19
20
 
20
21
  export function createContainer(appName: string, config: AppContainerConfig = {}): AppContainer {
22
+ const sourceURL = resolveCurrentSourceURL(captureStackFrames());
21
23
  const context = getMicroFrontendGlobalContext();
22
24
  const canonicalValue: unknown = Reflect.get(context.__CONTAINERS__, appName);
23
25
  const legacyIndex: unknown = Reflect.get(context.__INSTANCES__, appName);
@@ -28,7 +30,12 @@ export function createContainer(appName: string, config: AppContainerConfig = {}
28
30
  throw new MicroFrontendGlobalContextCompatibilityError('registry-is-not-extensible');
29
31
  }
30
32
 
31
- const modernContainer: AppContainer = { appName, config, exposedModules: {} };
33
+ const modernContainer: AppContainer = {
34
+ appName,
35
+ config,
36
+ exposedModules: {},
37
+ runtime: { sourceURL },
38
+ };
32
39
  const legacyContainer: LegacyAppContainer = { name: appName, config, exposeMap: {} };
33
40
  const containerIndex = context.__INSTANCES__.length;
34
41
 
@@ -222,11 +229,13 @@ function normalizeLegacyModule(exposedModule: string): string {
222
229
  }
223
230
 
224
231
  function isAppContainer(value: unknown): value is AppContainer {
232
+ const runtime: unknown = isObjectRecord(value) ? Reflect.get(value, 'runtime') : null;
225
233
  return (
226
234
  isObjectRecord(value) &&
227
235
  typeof Reflect.get(value, 'appName') === 'string' &&
228
236
  isAppContainerConfig(Reflect.get(value, 'config')) &&
229
- isObjectRecord(Reflect.get(value, 'exposedModules'))
237
+ isObjectRecord(Reflect.get(value, 'exposedModules')) &&
238
+ (runtime == null || (isObjectRecord(runtime) && typeof Reflect.get(runtime, 'sourceURL') === 'string'))
230
239
  );
231
240
  }
232
241
 
@@ -1,12 +1,14 @@
1
1
  import type {
2
2
  AppRequest,
3
3
  MicroFrontendAdapter,
4
+ MicroFrontendLifecycleEvent,
4
5
  MicroFrontendRuntimeApi,
5
6
  MicroFrontendRuntimeEvent,
6
7
  MicroFrontendRuntimeEventSubscription,
7
8
  } from '../types';
8
9
  import { AppContainerNotFoundError, InvalidAppNameError } from './errors';
9
10
  import { getMicroFrontendGlobalContext } from './globalContext';
11
+ import { setMicroFrontendLifecycleCallback } from './lifecycle';
10
12
  import { installNativeComponentRegistryCompatibility } from './nativeComponentRegistryCompatibility';
11
13
  import { parseAppRequest } from './parseAppRequest';
12
14
 
@@ -38,6 +40,7 @@ export interface CreateMicroFrontendRuntimeDependencies {
38
40
  readonly adapter: MicroFrontendAdapter;
39
41
  readonly nativeRuntime: NativeMicroFrontendRuntime;
40
42
  readonly onPreloadError: (error: unknown) => void;
43
+ readonly onLifecycleEvent?: (event: MicroFrontendLifecycleEvent) => void;
41
44
  readonly registry: MicroFrontendModuleRegistry;
42
45
  readonly removePendingHostComponentRoutes: (appName: string) => void;
43
46
  readonly parseEvent: (event: NativeMicroFrontendRuntimeEvent) => MicroFrontendRuntimeEvent;
@@ -90,7 +93,7 @@ export function createMicroFrontendRuntimeWithDependencies(
90
93
  }
91
94
  }
92
95
 
93
- return {
96
+ const runtime: MicroFrontendRuntimeApi = {
94
97
  evaluateScript,
95
98
  preloadApp,
96
99
  async importApp<TModule>(request: AppRequest): Promise<TModule> {
@@ -120,4 +123,8 @@ export function createMicroFrontendRuntimeWithDependencies(
120
123
  return subscription;
121
124
  },
122
125
  };
126
+
127
+ setMicroFrontendLifecycleCallback(runtime, dependencies.onLifecycleEvent);
128
+
129
+ return runtime;
123
130
  }
@@ -0,0 +1,46 @@
1
+ import { getMicroFrontendRuntimeContext, type AppContainer } from './registry';
2
+ import { captureStackFrames, resolveCurrentSourceURL, type RuntimeStackFrame } from './runtimeSourceURL';
3
+
4
+ export function resolveAppNameBySourceURL(
5
+ sourceURL: string,
6
+ containers: Readonly<Record<string, AppContainer>>
7
+ ): string | null {
8
+ let resolvedAppName: string | null = null;
9
+ for (const container of Object.values(containers)) {
10
+ if (container.runtime?.sourceURL !== sourceURL) {
11
+ continue;
12
+ }
13
+ if (resolvedAppName != null && resolvedAppName !== container.appName) {
14
+ return null;
15
+ }
16
+ resolvedAppName = container.appName;
17
+ }
18
+ return resolvedAppName;
19
+ }
20
+
21
+ export function findAppNameBySourceURL(sourceURL: string): string | null {
22
+ return resolveAppNameBySourceURL(sourceURL, getMicroFrontendRuntimeContext().containers);
23
+ }
24
+
25
+ export function resolveAppNameFromStackFrames(
26
+ frames: readonly RuntimeStackFrame[],
27
+ containers: Readonly<Record<string, AppContainer>>
28
+ ): string {
29
+ const sourceURL = resolveCurrentSourceURL(frames);
30
+ const appName = resolveAppNameBySourceURL(sourceURL, containers);
31
+ if (appName != null) {
32
+ return appName;
33
+ }
34
+
35
+ throw new Error('Cannot resolve the current micro-frontend app name');
36
+ }
37
+
38
+ export function getAppName(): string {
39
+ const sourceURL = resolveCurrentSourceURL(captureStackFrames());
40
+ const appName = findAppNameBySourceURL(sourceURL);
41
+ if (appName != null) {
42
+ return appName;
43
+ }
44
+
45
+ throw new Error('Cannot resolve the current micro-frontend app name');
46
+ }
@@ -0,0 +1,28 @@
1
+ import type { MicroFrontendLifecycleEvent } from '../types';
2
+
3
+ const lifecycleCallbackByRuntime = new WeakMap<object, (event: MicroFrontendLifecycleEvent) => void>();
4
+
5
+ export function setMicroFrontendLifecycleCallback(
6
+ runtime: object,
7
+ callback: ((event: MicroFrontendLifecycleEvent) => void) | undefined
8
+ ): void {
9
+ if (callback == null) {
10
+ lifecycleCallbackByRuntime.delete(runtime);
11
+ return;
12
+ }
13
+
14
+ lifecycleCallbackByRuntime.set(runtime, callback);
15
+ }
16
+
17
+ export function emitMicroFrontendLifecycleEvent(runtime: object, event: MicroFrontendLifecycleEvent): void {
18
+ const callback = lifecycleCallbackByRuntime.get(runtime);
19
+ if (callback == null) {
20
+ return;
21
+ }
22
+
23
+ try {
24
+ callback(event);
25
+ } catch (error) {
26
+ console.error('Failed to run a micro-frontend lifecycle callback', error);
27
+ }
28
+ }
@@ -16,10 +16,15 @@ export interface AppContainerConfig {
16
16
  readonly shared?: SharedConfig;
17
17
  }
18
18
 
19
+ export interface AppContainerRuntime {
20
+ readonly sourceURL: string;
21
+ }
22
+
19
23
  export interface AppContainer {
20
24
  readonly appName: string;
21
25
  readonly config: AppContainerConfig;
22
26
  readonly exposedModules: Record<string, unknown>;
27
+ readonly runtime?: AppContainerRuntime;
23
28
  }
24
29
 
25
30
  export type AppDisposeCallback = () => void | Promise<void>;
@@ -0,0 +1,48 @@
1
+ export interface RuntimeStackFrame {
2
+ readonly sourceURL: string | null;
3
+ }
4
+
5
+ export function captureStackFrames(): readonly RuntimeStackFrame[] {
6
+ const prepareStackTraceDescriptor = Object.getOwnPropertyDescriptor(Error, 'prepareStackTrace');
7
+ Object.defineProperty(Error, 'prepareStackTrace', {
8
+ configurable: true,
9
+ value: (_error: unknown, callSites: readonly unknown[]) => callSites,
10
+ writable: true,
11
+ });
12
+
13
+ const frames: RuntimeStackFrame[] = [];
14
+ try {
15
+ const callSites: unknown = new Error().stack;
16
+ if (!Array.isArray(callSites)) {
17
+ throw new Error('Cannot capture structured micro-frontend stack frames');
18
+ }
19
+ for (const callSite of callSites) {
20
+ if (typeof callSite !== 'object' || callSite == null) {
21
+ continue;
22
+ }
23
+ if (!('getFileName' in callSite)) {
24
+ continue;
25
+ }
26
+ const getFileName: unknown = 'getFileName' in callSite ? callSite.getFileName : undefined;
27
+ const sourceURL: unknown = typeof getFileName === 'function' ? getFileName.call(callSite) : null;
28
+ frames.push({ sourceURL: typeof sourceURL === 'string' ? sourceURL : null });
29
+ }
30
+ } finally {
31
+ if (prepareStackTraceDescriptor == null) {
32
+ Reflect.deleteProperty(Error, 'prepareStackTrace');
33
+ } else {
34
+ Object.defineProperty(Error, 'prepareStackTrace', prepareStackTraceDescriptor);
35
+ }
36
+ }
37
+
38
+ return frames;
39
+ }
40
+
41
+ export function resolveCurrentSourceURL(frames: readonly RuntimeStackFrame[]): string {
42
+ for (const frame of frames) {
43
+ if (frame.sourceURL != null && frame.sourceURL.length > 0) {
44
+ return frame.sourceURL;
45
+ }
46
+ }
47
+ throw new Error('Cannot determine the caller micro-frontend sourceURL');
48
+ }
@@ -1,7 +1,13 @@
1
1
  import { useEffect, useLayoutEffect, useReducer, useRef } from 'react';
2
2
  import { installPendingHostComponentBridge, resetPendingHostComponent } from '../host/pendingHostComponentStore';
3
+ import { emitMicroFrontendLifecycleEvent } from '../runtime/lifecycle';
3
4
  import { disposeAppResources } from '../runtime/registry';
4
- import type { MicroFrontendRuntimeApi, MicroFrontendSessionEvent } from '../types';
5
+ import type {
6
+ MicroFrontendLifecycleEvent,
7
+ MicroFrontendLifecycleSession,
8
+ MicroFrontendRuntimeApi,
9
+ MicroFrontendSessionEvent,
10
+ } from '../types';
5
11
 
6
12
  export interface MicroFrontendSessionState {
7
13
  readonly appName: string;
@@ -53,19 +59,46 @@ export function useMicroFrontendSessions(
53
59
  previousSessionsRef.current = sessions;
54
60
  const activeSessionIds = new Set(sessions.map(({ sessionId }) => sessionId));
55
61
  const activeAppNames = new Set(sessions.map(({ appName }) => appName));
62
+ const mountedSessions = sessions.filter(
63
+ ({ sessionId }) => !previousSessions.some((previousSession) => previousSession.sessionId === sessionId)
64
+ );
65
+ const inactiveSessions = previousSessions.filter(({ sessionId }) => !activeSessionIds.has(sessionId));
56
66
  const inactiveAppNames = new Set(
57
- previousSessions
58
- .filter(({ sessionId }) => !activeSessionIds.has(sessionId))
59
- .map(({ appName }) => appName)
60
- .filter((appName) => !activeAppNames.has(appName))
67
+ inactiveSessions.map(({ appName }) => appName).filter((appName) => !activeAppNames.has(appName))
68
+ );
69
+
70
+ mountedSessions.forEach((session) => {
71
+ emitMicroFrontendLifecycleEvent(runtime, createLifecycleEvent('mounted', session, sessions));
72
+ });
73
+
74
+ const appDisposals = new Map<string, Promise<void>>(
75
+ Array.from(
76
+ inactiveAppNames,
77
+ (appName) =>
78
+ [
79
+ appName,
80
+ disposeAppResources(appName).catch((error) => {
81
+ console.error(`Failed to dispose micro-frontend app resources for '${appName}'`, error);
82
+ }),
83
+ ] as const
84
+ )
61
85
  );
62
86
 
63
- inactiveAppNames.forEach((appName) => {
64
- void disposeAppResources(appName).catch((error) => {
65
- console.error(`Failed to dispose micro-frontend app resources for '${appName}'`, error);
87
+ inactiveSessions.forEach((session) => {
88
+ const appDisposal = appDisposals.get(session.appName);
89
+ if (appDisposal == null) {
90
+ emitMicroFrontendLifecycleEvent(runtime, createLifecycleEvent('unmounted', session, sessions));
91
+ return;
92
+ }
93
+
94
+ void appDisposal.then(() => {
95
+ emitMicroFrontendLifecycleEvent(
96
+ runtime,
97
+ createLifecycleEvent('unmounted', session, previousSessionsRef.current)
98
+ );
66
99
  });
67
100
  });
68
- }, [sessions]);
101
+ }, [runtime, sessions]);
69
102
 
70
103
  useLayoutEffect(() => {
71
104
  installPendingHostComponentBridge();
@@ -81,3 +114,22 @@ export function useMicroFrontendSessions(
81
114
 
82
115
  return sessions;
83
116
  }
117
+
118
+ function createLifecycleEvent(
119
+ phase: MicroFrontendLifecycleEvent['phase'],
120
+ session: MicroFrontendSessionState,
121
+ activeSessions: readonly MicroFrontendSessionState[]
122
+ ): MicroFrontendLifecycleEvent {
123
+ return {
124
+ phase,
125
+ session: toLifecycleSession(session),
126
+ activeSessions: activeSessions.map(toLifecycleSession),
127
+ };
128
+ }
129
+
130
+ function toLifecycleSession(session: MicroFrontendSessionState): MicroFrontendLifecycleSession {
131
+ return {
132
+ appName: session.appName,
133
+ id: session.sessionId,
134
+ };
135
+ }
package/src/types.ts CHANGED
@@ -47,6 +47,20 @@ export interface MicroFrontendRuntimeEventSubscription {
47
47
  readonly remove: () => void;
48
48
  }
49
49
 
50
+ export interface MicroFrontendLifecycleSession {
51
+ readonly appName: string;
52
+ readonly id: string;
53
+ }
54
+
55
+ export interface MicroFrontendLifecycleEvent {
56
+ readonly phase: 'mounted' | 'unmounted';
57
+ readonly session: MicroFrontendLifecycleSession;
58
+ /** Active sessions across every app when the callback is emitted. */
59
+ readonly activeSessions: readonly MicroFrontendLifecycleSession[];
60
+ }
61
+
62
+ export type MicroFrontendLifecycleCallback = (event: MicroFrontendLifecycleEvent) => void;
63
+
50
64
  export interface MicroFrontendRuntimeApi {
51
65
  readonly evaluateScript: (filePath: string) => Promise<void>;
52
66
  readonly preloadApp: (appName: string) => Promise<void>;