@softarc/native-federation-orchestrator 4.2.2 → 4.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 (156) hide show
  1. package/fesm2022/@softarc/native-federation-orchestrator.mjs +884 -917
  2. package/fesm2022/@softarc/native-federation-orchestrator.mjs.map +4 -4
  3. package/fesm2022/audit.mjs +2 -2
  4. package/fesm2022/audit.mjs.map +2 -2
  5. package/fesm2022/node.mjs +424 -444
  6. package/fesm2022/node.mjs.map +4 -4
  7. package/fesm2022/options.mjs +13 -13
  8. package/fesm2022/options.mjs.map +3 -3
  9. package/fesm2022/registry.mjs +2 -2
  10. package/fesm2022/registry.mjs.map +3 -3
  11. package/fesm2022/sdk.mjs +2 -2
  12. package/fesm2022/sdk.mjs.map +2 -2
  13. package/init-registry.mjs +1 -1
  14. package/node-loader/loader.mjs +1 -1
  15. package/node-loader/loader.mjs.map +1 -1
  16. package/package.json +2 -5
  17. package/quickstart.mjs +13 -13
  18. package/types/lib/audit/externals-audit.d.ts +4 -0
  19. package/types/lib/{2.app/driver-ports/audit → audit}/for-auditing-externals.port.d.ts +1 -1
  20. package/types/lib/audit.index.d.ts +2 -2
  21. package/types/lib/{2.app → core/2.app}/driver-ports/init/drivers.contract.d.ts +6 -0
  22. package/types/lib/core/2.app/driver-ports/init/flow.contract.d.ts +14 -0
  23. package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-getting-remote-entry.port.d.ts +1 -1
  24. package/types/lib/{2.app → core/2.app}/driver-ports/init/index.d.ts +3 -0
  25. package/types/lib/{2.app → core/2.app}/driving-ports/for-remote-info-storage.port.d.ts +1 -1
  26. package/types/lib/{2.app → core/2.app}/driving-ports/for-scoped-externals-storage.port.d.ts +1 -1
  27. package/types/lib/{2.app → core/2.app}/driving-ports/for-shared-chunks-storage.port.d.ts +1 -1
  28. package/types/lib/{2.app → core/2.app}/driving-ports/for-shared-externals-storage.port.d.ts +1 -1
  29. package/types/lib/core/2.app/flows/init-remote-entry.flow.d.ts +4 -0
  30. package/types/lib/core/2.app/flows/init.flow.d.ts +4 -0
  31. package/types/lib/core/2.app/steps/commit-changes.d.ts +4 -0
  32. package/types/lib/core/2.app/steps/convert-to-import-map.d.ts +4 -0
  33. package/types/lib/core/2.app/steps/determine-shared-externals.d.ts +5 -0
  34. package/types/lib/core/2.app/steps/expose-module-loader.d.ts +4 -0
  35. package/types/lib/core/2.app/steps/generate-import-map.d.ts +5 -0
  36. package/types/lib/core/2.app/steps/get-remote-entries.d.ts +6 -0
  37. package/types/lib/core/2.app/steps/get-remote-entry.d.ts +5 -0
  38. package/types/lib/core/2.app/steps/process-remote-entries.d.ts +5 -0
  39. package/types/lib/core/2.app/steps/store-remote-entry.d.ts +23 -0
  40. package/types/lib/core/2.app/steps/update-cache.d.ts +5 -0
  41. package/types/lib/{3.adapters → core/3.adapters}/browser/sse-handler.d.ts +1 -1
  42. package/types/lib/core/5.di/federation-result.factory.d.ts +12 -0
  43. package/types/lib/core/5.di/init.factory.d.ts +12 -0
  44. package/types/lib/{init-federation.contract.d.ts → core/init-federation.contract.d.ts} +1 -1
  45. package/types/lib/index.d.ts +10 -8
  46. package/types/lib/{3.adapters/node → node/adapters}/fs-manifest-provider.d.ts +1 -1
  47. package/types/lib/{3.adapters/node → node/adapters}/fs-remote-entry-provider.d.ts +1 -1
  48. package/types/lib/{3.adapters/node → node/adapters}/node-loader.client.d.ts +1 -1
  49. package/types/lib/node/adapters/noop-sse.d.ts +3 -0
  50. package/types/lib/{init-federation.node.d.ts → node/init-federation.node.d.ts} +5 -5
  51. package/types/lib/{4.config/import-map → node}/resolve-host-instances.d.ts +3 -3
  52. package/types/lib/{4.config/import-map → node}/use-node.d.ts +2 -2
  53. package/types/lib/{utils/node → node/utils}/to-url.d.ts +1 -1
  54. package/types/lib/node.index.d.ts +5 -5
  55. package/types/lib/options.index.d.ts +5 -5
  56. package/types/lib/registry/for-managing-events.port.d.ts +2 -0
  57. package/types/lib/registry/setup-registry.d.ts +3 -0
  58. package/types/lib/registry.index.d.ts +5 -4
  59. package/types/lib/sdk.index.d.ts +4 -5
  60. package/types/lib/testing/handlers/log.handler.d.ts +3 -0
  61. package/types/lib/utils/clone-entry.d.ts +1 -1
  62. package/types/{init-registry.d.ts → scripts/init-registry.d.ts} +1 -1
  63. package/types/lib/1.domain/registry/index.d.ts +0 -2
  64. package/types/lib/2.app/driver-ports/audit/index.d.ts +0 -1
  65. package/types/lib/2.app/driver-ports/dynamic-init/drivers.contract.d.ts +0 -13
  66. package/types/lib/2.app/driver-ports/dynamic-init/flow.contract.d.ts +0 -8
  67. package/types/lib/2.app/driver-ports/dynamic-init/index.d.ts +0 -5
  68. package/types/lib/2.app/driver-ports/init/flow.contract.d.ts +0 -6
  69. package/types/lib/2.app/driver-ports/registry/for-managing-events.port.d.ts +0 -2
  70. package/types/lib/2.app/flows/audit/externals-audit.d.ts +0 -4
  71. package/types/lib/2.app/flows/dynamic-init/convert-to-import-map.d.ts +0 -4
  72. package/types/lib/2.app/flows/dynamic-init/get-remote-entry.d.ts +0 -5
  73. package/types/lib/2.app/flows/dynamic-init/update-cache.d.ts +0 -5
  74. package/types/lib/2.app/flows/init/commit-changes.d.ts +0 -4
  75. package/types/lib/2.app/flows/init/determine-shared-externals.d.ts +0 -5
  76. package/types/lib/2.app/flows/init/expose-module-loader.d.ts +0 -4
  77. package/types/lib/2.app/flows/init/generate-import-map.d.ts +0 -5
  78. package/types/lib/2.app/flows/init/get-remote-entries.d.ts +0 -6
  79. package/types/lib/2.app/flows/init/process-remote-entries.d.ts +0 -5
  80. package/types/lib/2.app/flows/registry/setup-registry.d.ts +0 -3
  81. package/types/lib/3.adapters/node/noop-sse.d.ts +0 -3
  82. package/types/lib/5.di/flows/dynamic-init.factory.d.ts +0 -14
  83. package/types/lib/5.di/flows/init.factory.d.ts +0 -14
  84. package/types/lib/6.mocks/handlers/log.handler.d.ts +0 -2
  85. /package/types/lib/{1.domain → core/1.domain}/externals/chunks.contract.d.ts +0 -0
  86. /package/types/lib/{1.domain → core/1.domain}/externals/external.contract.d.ts +0 -0
  87. /package/types/lib/{1.domain → core/1.domain}/externals/version.contract.d.ts +0 -0
  88. /package/types/lib/{1.domain → core/1.domain}/import-map/import-map.contract.d.ts +0 -0
  89. /package/types/lib/{1.domain → core/1.domain}/index.d.ts +0 -0
  90. /package/types/lib/{1.domain → core/1.domain}/remote/remote-info.contract.d.ts +0 -0
  91. /package/types/lib/{1.domain → core/1.domain}/remote/remote-module.contract.d.ts +0 -0
  92. /package/types/lib/{1.domain → core/1.domain}/remote-entry/manifest.contract.d.ts +0 -0
  93. /package/types/lib/{1.domain → core/1.domain}/remote-entry/remote-entry.contract.d.ts +0 -0
  94. /package/types/lib/{2.app → core/2.app}/config/config.contract.d.ts +0 -0
  95. /package/types/lib/{2.app → core/2.app}/config/host.contract.d.ts +0 -0
  96. /package/types/lib/{2.app → core/2.app}/config/import-map.contract.d.ts +0 -0
  97. /package/types/lib/{2.app → core/2.app}/config/index.d.ts +0 -0
  98. /package/types/lib/{2.app → core/2.app}/config/log.contract.d.ts +0 -0
  99. /package/types/lib/{2.app → core/2.app}/config/mode.contract.d.ts +0 -0
  100. /package/types/lib/{2.app → core/2.app}/config/storage.contract.d.ts +0 -0
  101. /package/types/lib/{2.app → core/2.app}/driver-ports/flow-factory.contract.d.ts +0 -0
  102. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-committing-changes.port.d.ts +0 -0
  103. /package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-converting-to-import-map.d.ts +0 -0
  104. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-determining-shared-externals.port.d.ts +0 -0
  105. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-exposing-module-loader.port.d.ts +0 -0
  106. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-generating-import-map.d.ts +0 -0
  107. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-getting-remote-entries.port.d.ts +0 -0
  108. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-processing-remote-entries.port.d.ts +0 -0
  109. /package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-updating-cache.d.ts +0 -0
  110. /package/types/lib/{2.app → core/2.app}/driving-ports/driving.contract.d.ts +0 -0
  111. /package/types/lib/{2.app → core/2.app}/driving-ports/for-browser-tasks.d.ts +0 -0
  112. /package/types/lib/{2.app → core/2.app}/driving-ports/for-providing-manifest.port.d.ts +0 -0
  113. /package/types/lib/{2.app → core/2.app}/driving-ports/for-providing-remote-entries.port.d.ts +0 -0
  114. /package/types/lib/{2.app → core/2.app}/driving-ports/for-sse.port.d.ts +0 -0
  115. /package/types/lib/{2.app → core/2.app}/driving-ports/for-version-checking.port.d.ts +0 -0
  116. /package/types/lib/{2.app → core/2.app}/driving-ports/index.d.ts +0 -0
  117. /package/types/lib/{3.adapters → core/3.adapters}/browser/browser.d.ts +0 -0
  118. /package/types/lib/{3.adapters → core/3.adapters}/checks/version.check.d.ts +0 -0
  119. /package/types/lib/{3.adapters → core/3.adapters}/http/manifest-provider.d.ts +0 -0
  120. /package/types/lib/{3.adapters → core/3.adapters}/http/remote-entry-provider.d.ts +0 -0
  121. /package/types/lib/{3.adapters → core/3.adapters}/storage/chunk.repository.d.ts +0 -0
  122. /package/types/lib/{3.adapters → core/3.adapters}/storage/remote-info.repository.d.ts +0 -0
  123. /package/types/lib/{3.adapters → core/3.adapters}/storage/scoped-externals.repository.d.ts +0 -0
  124. /package/types/lib/{3.adapters → core/3.adapters}/storage/shared-externals.repository.d.ts +0 -0
  125. /package/types/lib/{4.config → core/4.config}/host/host.config.d.ts +0 -0
  126. /package/types/lib/{4.config → core/4.config}/import-map/import-map.config.d.ts +0 -0
  127. /package/types/lib/{4.config → core/4.config}/import-map/index.d.ts +0 -0
  128. /package/types/lib/{4.config → core/4.config}/import-map/replace-in-dom.d.ts +0 -0
  129. /package/types/lib/{4.config → core/4.config}/import-map/trusted-types.d.ts +0 -0
  130. /package/types/lib/{4.config → core/4.config}/import-map/use-default.d.ts +0 -0
  131. /package/types/lib/{4.config → core/4.config}/import-map/use-import-shim.d.ts +0 -0
  132. /package/types/lib/{4.config → core/4.config}/logging/console.logger.d.ts +0 -0
  133. /package/types/lib/{4.config → core/4.config}/logging/index.d.ts +0 -0
  134. /package/types/lib/{4.config → core/4.config}/logging/log.config.d.ts +0 -0
  135. /package/types/lib/{4.config → core/4.config}/logging/log.handler.d.ts +0 -0
  136. /package/types/lib/{4.config → core/4.config}/logging/noop.logger.d.ts +0 -0
  137. /package/types/lib/{4.config → core/4.config}/mode/caching.profile.d.ts +0 -0
  138. /package/types/lib/{4.config → core/4.config}/mode/default.profile.d.ts +0 -0
  139. /package/types/lib/{4.config → core/4.config}/mode/index.d.ts +0 -0
  140. /package/types/lib/{4.config → core/4.config}/mode/mode.config.d.ts +0 -0
  141. /package/types/lib/{4.config → core/4.config}/storage/global-this.storage.d.ts +0 -0
  142. /package/types/lib/{4.config → core/4.config}/storage/index.d.ts +0 -0
  143. /package/types/lib/{4.config → core/4.config}/storage/local.storage.d.ts +0 -0
  144. /package/types/lib/{4.config → core/4.config}/storage/session.storage.d.ts +0 -0
  145. /package/types/lib/{4.config → core/4.config}/storage/storage.config.d.ts +0 -0
  146. /package/types/lib/{5.di → core/5.di}/config.factory.d.ts +0 -0
  147. /package/types/lib/{5.di → core/5.di}/driving.factory.d.ts +0 -0
  148. /package/types/lib/{init-federation.d.ts → core/init-federation.d.ts} +0 -0
  149. /package/types/lib/{native-federation.error.d.ts → core/native-federation.error.d.ts} +0 -0
  150. /package/types/lib/{3.adapters/node → node/adapters}/loader-url.d.ts +0 -0
  151. /package/types/lib/{utils/node → node/utils}/read-source.d.ts +0 -0
  152. /package/types/lib/{1.domain/registry → registry}/event-registry.contract.d.ts +0 -0
  153. /package/types/lib/{1.domain/registry → registry}/event.contract.d.ts +0 -0
  154. /package/types/lib/{2.app/config → registry}/registry.contract.d.ts +0 -0
  155. /package/types/{node-loader.d.ts → scripts/node-loader.d.ts} +0 -0
  156. /package/types/{quickstart.d.ts → scripts/quickstart.d.ts} +0 -0
@@ -1,11 +1,11 @@
1
- // src/lib/2.app/config/log.contract.ts
1
+ // src/lib/core/2.app/config/log.contract.ts
2
2
  var LogLevel = {
3
3
  debug: 0,
4
4
  warn: 1,
5
5
  error: 2
6
6
  };
7
7
 
8
- // src/lib/4.config/logging/console.logger.ts
8
+ // src/lib/core/4.config/logging/console.logger.ts
9
9
  var consoleLogger = {
10
10
  /* eslint no-console: "off", curly: "error" */
11
11
  debug: (step, msg, err) => !!err ? console.log(`[DEBUG][${step}]: ${msg}`, err) : console.log(`[DEBUG][${step}]: ${msg}`),
@@ -13,7 +13,7 @@ var consoleLogger = {
13
13
  warn: (step, msg, err) => !!err ? console.warn(`[NF][${step}]: ${msg}`, err) : console.warn(`[NF][${step}]: ${msg}`)
14
14
  };
15
15
 
16
- // src/lib/4.config/logging/noop.logger.ts
16
+ // src/lib/core/4.config/logging/noop.logger.ts
17
17
  var noopLogger = {
18
18
  debug: () => {
19
19
  },
@@ -23,7 +23,7 @@ var noopLogger = {
23
23
  }
24
24
  };
25
25
 
26
- // src/lib/native-federation.error.ts
26
+ // src/lib/core/native-federation.error.ts
27
27
  var NFError = class extends Error {
28
28
  constructor(message, cause) {
29
29
  super(message, cause);
@@ -46,7 +46,7 @@ var cloneEntry = (name, raw) => {
46
46
  throw new NFError(`Could not clone entry '${String(name)}'`);
47
47
  };
48
48
 
49
- // src/lib/4.config/storage/global-this.storage.ts
49
+ // src/lib/core/4.config/storage/global-this.storage.ts
50
50
  var globalThisStorageEntry = (namespace) => (key, initialValue) => {
51
51
  if (!globalThis[namespace]) {
52
52
  globalThis[namespace] = {};
@@ -69,7 +69,7 @@ var globalThisStorageEntry = (namespace) => (key, initialValue) => {
69
69
  return entry;
70
70
  };
71
71
 
72
- // src/lib/4.config/storage/local.storage.ts
72
+ // src/lib/core/4.config/storage/local.storage.ts
73
73
  var localStorageEntry = (namespace) => (key, initialValue) => {
74
74
  if (!localStorage.getItem(`${namespace}.${String(key)}`)) {
75
75
  localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));
@@ -92,7 +92,7 @@ var localStorageEntry = (namespace) => (key, initialValue) => {
92
92
  return entry;
93
93
  };
94
94
 
95
- // src/lib/4.config/storage/session.storage.ts
95
+ // src/lib/core/4.config/storage/session.storage.ts
96
96
  var sessionStorageEntry = (namespace) => (key, initialValue) => {
97
97
  if (!sessionStorage.getItem(`${namespace}.${String(key)}`)) {
98
98
  sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));
@@ -115,7 +115,7 @@ var sessionStorageEntry = (namespace) => (key, initialValue) => {
115
115
  return entry;
116
116
  };
117
117
 
118
- // src/lib/4.config/import-map/trusted-types.ts
118
+ // src/lib/core/4.config/import-map/trusted-types.ts
119
119
  var IMPORT_MAP_KEYS = /* @__PURE__ */ new Set(["imports", "scopes", "integrity"]);
120
120
  var validateImportMapJSON = (input) => {
121
121
  let parsed;
@@ -173,7 +173,7 @@ var getTrustedTypesPolicy = (name = "nfo") => {
173
173
  return cachedPolicy;
174
174
  };
175
175
 
176
- // src/lib/4.config/import-map/replace-in-dom.ts
176
+ // src/lib/core/4.config/import-map/replace-in-dom.ts
177
177
  var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts = {}) => {
178
178
  if (opts?.override) {
179
179
  document.head.querySelectorAll(`script[type="${mapType}"]`).forEach((importMap2) => importMap2.remove());
@@ -188,7 +188,7 @@ var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts
188
188
  return Promise.resolve(importMap);
189
189
  };
190
190
 
191
- // src/lib/4.config/import-map/use-import-shim.ts
191
+ // src/lib/core/4.config/import-map/use-import-shim.ts
192
192
  var useShimImportMap = (cfg = { shimMode: false }, trustedTypesPolicyName = "nfo") => ({
193
193
  loadModuleFn: (url) => {
194
194
  const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);
@@ -203,7 +203,7 @@ var useShimImportMap = (cfg = { shimMode: false }, trustedTypesPolicyName = "nfo
203
203
  }
204
204
  });
205
205
 
206
- // src/lib/4.config/import-map/use-default.ts
206
+ // src/lib/core/4.config/import-map/use-default.ts
207
207
  var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
208
208
  loadModuleFn: (url) => {
209
209
  const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);
@@ -218,14 +218,14 @@ var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
218
218
  }
219
219
  });
220
220
 
221
- // src/lib/4.config/mode/default.profile.ts
221
+ // src/lib/core/4.config/mode/default.profile.ts
222
222
  var defaultProfile = {
223
223
  latestSharedExternal: false,
224
224
  overrideCachedRemotes: "init-only",
225
225
  overrideCachedRemotesIfURLMatches: false
226
226
  };
227
227
 
228
- // src/lib/4.config/mode/caching.profile.ts
228
+ // src/lib/core/4.config/mode/caching.profile.ts
229
229
  var cachingProfile = {
230
230
  latestSharedExternal: false,
231
231
  overrideCachedRemotes: "never",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/lib/2.app/config/log.contract.ts", "../../src/lib/4.config/logging/console.logger.ts", "../../src/lib/4.config/logging/noop.logger.ts", "../../src/lib/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts", "../../src/lib/4.config/storage/global-this.storage.ts", "../../src/lib/4.config/storage/local.storage.ts", "../../src/lib/4.config/storage/session.storage.ts", "../../src/lib/4.config/import-map/trusted-types.ts", "../../src/lib/4.config/import-map/replace-in-dom.ts", "../../src/lib/4.config/import-map/use-import-shim.ts", "../../src/lib/4.config/import-map/use-default.ts", "../../src/lib/4.config/mode/default.profile.ts", "../../src/lib/4.config/mode/caching.profile.ts"],
4
- "sourcesContent": ["export const LogLevel = {\n debug: 0,\n warn: 1,\n error: 2,\n};\n\nexport type LogType = keyof typeof LogLevel;\n\nexport type Logger = {\n error: (step: number, msg: string, details?: unknown) => void;\n warn: (step: number, msg: string, details?: unknown) => void;\n debug: (step: number, msg: string, details?: unknown) => void;\n};\n\nexport type LogHandler = Logger & {\n level: LogType;\n};\n\nexport type LoggingConfig = {\n log: LogHandler;\n sse: boolean;\n};\n\nexport type LoggingOptions = {\n logger?: Logger;\n logLevel?: LogType;\n sse?: boolean;\n};\n", "import type { Logger } from 'lib/2.app/config/log.contract';\n\nconst consoleLogger: Logger = {\n /* eslint no-console: \"off\", curly: \"error\" */\n debug: (step: number, msg: string, err) =>\n !!err ? console.log(`[DEBUG][${step}]: ${msg}`, err) : console.log(`[DEBUG][${step}]: ${msg}`),\n error: (step: number, msg: string, err) =>\n !!err ? console.error(`[NF][${step}]: ${msg}`, err) : console.error(`[NF][${step}]: ${msg}`),\n warn: (step: number, msg: string, err) =>\n !!err ? console.warn(`[NF][${step}]: ${msg}`, err) : console.warn(`[NF][${step}]: ${msg}`),\n};\n\nexport { consoleLogger };\n", "import type { Logger } from 'lib/2.app/config/log.contract';\n\nconst noopLogger: Logger = {\n debug: () => {},\n error: () => {},\n warn: () => {},\n};\n\nexport { noopLogger };\n", "class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/2.app/config/storage.contract';\nimport { NFError } from 'lib/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n", "import { cloneEntry } from '../../utils/clone-entry';\nimport { type StorageEntryCreator, type StorageEntry } from 'lib/2.app/config/storage.contract';\n\nconst globalThisStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!(globalThis as unknown as { [namespace]: unknown })[namespace]) {\n (globalThis as unknown as { [namespace]: unknown })[namespace] = {};\n }\n\n const storage = (globalThis as unknown as { [namespace]: { [P in typeof key]: TValue } })[\n namespace\n ]!;\n if (!storage[key]) storage[key] = initialValue;\n\n const entry: StorageEntry<TValue> = {\n get(): TValue {\n return cloneEntry(key, storage[key])!;\n },\n set(value: TValue): StorageEntry<TValue> {\n storage[key] = cloneEntry(key, value);\n return entry;\n },\n clear(): StorageEntry<TValue> {\n storage[key] = cloneEntry(key, initialValue);\n return this;\n },\n };\n\n return entry;\n };\n\nexport { globalThisStorageEntry };\n", "import type { StorageEntryCreator, StorageEntry } from 'lib/2.app/config/storage.contract';\n\nconst localStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!localStorage.getItem(`${namespace}.${String(key)}`)) {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n }\n const entry: StorageEntry<TValue> = {\n get() {\n const fromCache = localStorage.getItem(`${namespace}.${String(key)}`);\n if (!fromCache) return undefined;\n return JSON.parse(fromCache);\n },\n set(value: TValue): StorageEntry<TValue> {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(value));\n return entry;\n },\n clear(): StorageEntry<TValue> {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n return this;\n },\n };\n return entry;\n };\n\nexport { localStorageEntry };\n", "import type { StorageEntryCreator, StorageEntry } from 'lib/2.app/config/storage.contract';\n\nconst sessionStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!sessionStorage.getItem(`${namespace}.${String(key)}`)) {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n }\n const entry: StorageEntry<TValue> = {\n get() {\n const fromCache = sessionStorage.getItem(`${namespace}.${String(key)}`);\n if (!fromCache) return undefined;\n return JSON.parse(fromCache);\n },\n set(value: TValue): StorageEntry<TValue> {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(value));\n return entry;\n },\n clear(): StorageEntry<TValue> {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n return this;\n },\n };\n return entry;\n };\n\nexport { sessionStorageEntry };\n", "type TTCreateScript = (input: string) => string;\ntype TTCreateScriptURL = (input: string) => string;\n\ntype TTPolicyRules = {\n createScript?: TTCreateScript;\n createScriptURL?: TTCreateScriptURL;\n};\n\ntype TTPolicy = {\n createScript: TTCreateScript;\n createScriptURL: TTCreateScriptURL;\n};\n\ntype TTFactory = {\n createPolicy: (name: string, rules: TTPolicyRules) => TTPolicy;\n};\n\nexport type NFTrustedTypesPolicy = {\n createScript: (input: string) => string;\n createScriptURL: (input: string) => string;\n};\n\nconst IMPORT_MAP_KEYS = new Set(['imports', 'scopes', 'integrity']);\n\nconst validateImportMapJSON = (input: string): string => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch {\n throw new TypeError('[nf-orchestrator] trusted-types: import map is not valid JSON');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new TypeError('[nf-orchestrator] trusted-types: import map must be a plain object');\n }\n for (const key of Object.keys(parsed as Record<string, unknown>)) {\n if (!IMPORT_MAP_KEYS.has(key)) {\n throw new TypeError(`[nf-orchestrator] trusted-types: unexpected key \"${key}\" in import map`);\n }\n }\n return input;\n};\n\nconst validateScriptURL = (input: string): string => {\n const base = typeof location !== 'undefined' ? location.href : 'http://localhost/';\n let url: URL;\n try {\n url = new URL(input, base);\n } catch {\n throw new TypeError(`[nf-orchestrator] trusted-types: invalid script URL \"${input}\"`);\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new TypeError(\n `[nf-orchestrator] trusted-types: disallowed protocol \"${url.protocol}\" for script URL`\n );\n }\n return input;\n};\n\nconst passThroughPolicy: NFTrustedTypesPolicy = {\n createScript: input => input,\n createScriptURL: input => input,\n};\n\nlet cachedPolicy: NFTrustedTypesPolicy | null = null;\n\nexport const getTrustedTypesPolicy = (\n name: string | false = 'nfo'\n): NFTrustedTypesPolicy => {\n if (name === false) return passThroughPolicy;\n if (cachedPolicy) return cachedPolicy;\n\n const factory = (globalThis as { trustedTypes?: TTFactory }).trustedTypes;\n if (!factory) {\n cachedPolicy = passThroughPolicy;\n return cachedPolicy;\n }\n\n const native = factory.createPolicy(name, {\n createScript: validateImportMapJSON,\n createScriptURL: validateScriptURL,\n });\n\n cachedPolicy = {\n createScript: input => native.createScript(input) as unknown as string,\n createScriptURL: input => native.createScriptURL(input) as unknown as string,\n };\n return cachedPolicy;\n};\n\nexport const __resetTrustedTypesPolicyForTests = (): void => {\n cachedPolicy = null;\n};\n", "import type { ImportMap } from 'lib/1.domain';\nimport type { SetImportMap } from 'lib/2.app/config/import-map.contract';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\nexport const replaceInDOM =\n (mapType: string, trustedTypesPolicyName: string | false = 'nfo'): SetImportMap =>\n (importMap: ImportMap, opts = {}) => {\n if (opts?.override) {\n document.head\n .querySelectorAll(`script[type=\"${mapType}\"]`)\n .forEach(importMap => importMap.remove());\n }\n\n const policy = getTrustedTypesPolicy(trustedTypesPolicyName);\n document.head.appendChild(\n Object.assign(document.createElement('script'), {\n type: mapType,\n text: policy.createScript(JSON.stringify(importMap)),\n })\n );\n return Promise.resolve(importMap);\n };\n", "import type { ImportMapConfig } from 'lib/2.app/config/import-map.contract';\nimport { replaceInDOM } from './replace-in-dom';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\ndeclare function importShim<T>(url: string): T;\n\nconst useShimImportMap = (\n cfg: { shimMode: boolean } = { shimMode: false },\n trustedTypesPolicyName: string | false = 'nfo'\n): ImportMapConfig => ({\n loadModuleFn: url => {\n const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);\n return importShim(String(trusted));\n },\n setImportMapFn: replaceInDOM(\n cfg.shimMode ? 'importmap-shim' : 'importmap',\n trustedTypesPolicyName\n ),\n reloadBrowserFn: () => {\n window.location.reload();\n },\n});\n\nexport { useShimImportMap };\n", "import type { ImportMapConfig } from 'lib/2.app/config/import-map.contract';\nimport { replaceInDOM } from './replace-in-dom';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\nconst useDefaultImportMap = (\n trustedTypesPolicyName: string | false = 'nfo'\n): ImportMapConfig => ({\n loadModuleFn: url => {\n const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);\n return import(/* @vite-ignore */ trusted);\n },\n setImportMapFn: replaceInDOM('importmap', trustedTypesPolicyName),\n reloadBrowserFn: () => {\n window.location.reload();\n },\n});\n\nexport { useDefaultImportMap };\n", "import type { ModeProfileConfig } from 'lib/2.app/config/mode.contract';\n\nexport const defaultProfile: ModeProfileConfig = {\n latestSharedExternal: false,\n overrideCachedRemotes: 'init-only',\n overrideCachedRemotesIfURLMatches: false,\n};\n", "import type { ModeProfileConfig } from 'lib/2.app/config/mode.contract';\n\nexport const cachingProfile: ModeProfileConfig = {\n latestSharedExternal: false,\n overrideCachedRemotes: 'never',\n overrideCachedRemotesIfURLMatches: false,\n};\n"],
5
- "mappings": "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",
3
+ "sources": ["../../src/lib/core/2.app/config/log.contract.ts", "../../src/lib/core/4.config/logging/console.logger.ts", "../../src/lib/core/4.config/logging/noop.logger.ts", "../../src/lib/core/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts", "../../src/lib/core/4.config/storage/global-this.storage.ts", "../../src/lib/core/4.config/storage/local.storage.ts", "../../src/lib/core/4.config/storage/session.storage.ts", "../../src/lib/core/4.config/import-map/trusted-types.ts", "../../src/lib/core/4.config/import-map/replace-in-dom.ts", "../../src/lib/core/4.config/import-map/use-import-shim.ts", "../../src/lib/core/4.config/import-map/use-default.ts", "../../src/lib/core/4.config/mode/default.profile.ts", "../../src/lib/core/4.config/mode/caching.profile.ts"],
4
+ "sourcesContent": ["export const LogLevel = {\n debug: 0,\n warn: 1,\n error: 2,\n};\n\nexport type LogType = keyof typeof LogLevel;\n\nexport type Logger = {\n error: (step: number, msg: string, details?: unknown) => void;\n warn: (step: number, msg: string, details?: unknown) => void;\n debug: (step: number, msg: string, details?: unknown) => void;\n};\n\nexport type LogHandler = Logger & {\n level: LogType;\n};\n\nexport type LoggingConfig = {\n log: LogHandler;\n sse: boolean;\n};\n\nexport type LoggingOptions = {\n logger?: Logger;\n logLevel?: LogType;\n sse?: boolean;\n};\n", "import type { Logger } from 'lib/core/2.app/config/log.contract';\n\nconst consoleLogger: Logger = {\n /* eslint no-console: \"off\", curly: \"error\" */\n debug: (step: number, msg: string, err) =>\n !!err ? console.log(`[DEBUG][${step}]: ${msg}`, err) : console.log(`[DEBUG][${step}]: ${msg}`),\n error: (step: number, msg: string, err) =>\n !!err ? console.error(`[NF][${step}]: ${msg}`, err) : console.error(`[NF][${step}]: ${msg}`),\n warn: (step: number, msg: string, err) =>\n !!err ? console.warn(`[NF][${step}]: ${msg}`, err) : console.warn(`[NF][${step}]: ${msg}`),\n};\n\nexport { consoleLogger };\n", "import type { Logger } from 'lib/core/2.app/config/log.contract';\n\nconst noopLogger: Logger = {\n debug: () => {},\n error: () => {},\n warn: () => {},\n};\n\nexport { noopLogger };\n", "class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/core/2.app/config/storage.contract';\nimport { NFError } from 'lib/core/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n", "import { cloneEntry } from 'lib/utils/clone-entry';\nimport {\n type StorageEntryCreator,\n type StorageEntry,\n} from 'lib/core/2.app/config/storage.contract';\n\nconst globalThisStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!(globalThis as unknown as { [namespace]: unknown })[namespace]) {\n (globalThis as unknown as { [namespace]: unknown })[namespace] = {};\n }\n\n const storage = (globalThis as unknown as { [namespace]: { [P in typeof key]: TValue } })[\n namespace\n ]!;\n if (!storage[key]) storage[key] = initialValue;\n\n const entry: StorageEntry<TValue> = {\n get(): TValue {\n return cloneEntry(key, storage[key])!;\n },\n set(value: TValue): StorageEntry<TValue> {\n storage[key] = cloneEntry(key, value);\n return entry;\n },\n clear(): StorageEntry<TValue> {\n storage[key] = cloneEntry(key, initialValue);\n return this;\n },\n };\n\n return entry;\n };\n\nexport { globalThisStorageEntry };\n", "import type { StorageEntryCreator, StorageEntry } from 'lib/core/2.app/config/storage.contract';\n\nconst localStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!localStorage.getItem(`${namespace}.${String(key)}`)) {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n }\n const entry: StorageEntry<TValue> = {\n get() {\n const fromCache = localStorage.getItem(`${namespace}.${String(key)}`);\n if (!fromCache) return undefined;\n return JSON.parse(fromCache);\n },\n set(value: TValue): StorageEntry<TValue> {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(value));\n return entry;\n },\n clear(): StorageEntry<TValue> {\n localStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n return this;\n },\n };\n return entry;\n };\n\nexport { localStorageEntry };\n", "import type { StorageEntryCreator, StorageEntry } from 'lib/core/2.app/config/storage.contract';\n\nconst sessionStorageEntry: StorageEntryCreator =\n (namespace: string) =>\n <TValue>(key: string, initialValue: TValue) => {\n if (!sessionStorage.getItem(`${namespace}.${String(key)}`)) {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n }\n const entry: StorageEntry<TValue> = {\n get() {\n const fromCache = sessionStorage.getItem(`${namespace}.${String(key)}`);\n if (!fromCache) return undefined;\n return JSON.parse(fromCache);\n },\n set(value: TValue): StorageEntry<TValue> {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(value));\n return entry;\n },\n clear(): StorageEntry<TValue> {\n sessionStorage.setItem(`${namespace}.${String(key)}`, JSON.stringify(initialValue));\n return this;\n },\n };\n return entry;\n };\n\nexport { sessionStorageEntry };\n", "type TTCreateScript = (input: string) => string;\ntype TTCreateScriptURL = (input: string) => string;\n\ntype TTPolicyRules = {\n createScript?: TTCreateScript;\n createScriptURL?: TTCreateScriptURL;\n};\n\ntype TTPolicy = {\n createScript: TTCreateScript;\n createScriptURL: TTCreateScriptURL;\n};\n\ntype TTFactory = {\n createPolicy: (name: string, rules: TTPolicyRules) => TTPolicy;\n};\n\nexport type NFTrustedTypesPolicy = {\n createScript: (input: string) => string;\n createScriptURL: (input: string) => string;\n};\n\nconst IMPORT_MAP_KEYS = new Set(['imports', 'scopes', 'integrity']);\n\nconst validateImportMapJSON = (input: string): string => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch {\n throw new TypeError('[nf-orchestrator] trusted-types: import map is not valid JSON');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new TypeError('[nf-orchestrator] trusted-types: import map must be a plain object');\n }\n for (const key of Object.keys(parsed as Record<string, unknown>)) {\n if (!IMPORT_MAP_KEYS.has(key)) {\n throw new TypeError(`[nf-orchestrator] trusted-types: unexpected key \"${key}\" in import map`);\n }\n }\n return input;\n};\n\nconst validateScriptURL = (input: string): string => {\n const base = typeof location !== 'undefined' ? location.href : 'http://localhost/';\n let url: URL;\n try {\n url = new URL(input, base);\n } catch {\n throw new TypeError(`[nf-orchestrator] trusted-types: invalid script URL \"${input}\"`);\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new TypeError(\n `[nf-orchestrator] trusted-types: disallowed protocol \"${url.protocol}\" for script URL`\n );\n }\n return input;\n};\n\nconst passThroughPolicy: NFTrustedTypesPolicy = {\n createScript: input => input,\n createScriptURL: input => input,\n};\n\nlet cachedPolicy: NFTrustedTypesPolicy | null = null;\n\nexport const getTrustedTypesPolicy = (\n name: string | false = 'nfo'\n): NFTrustedTypesPolicy => {\n if (name === false) return passThroughPolicy;\n if (cachedPolicy) return cachedPolicy;\n\n const factory = (globalThis as { trustedTypes?: TTFactory }).trustedTypes;\n if (!factory) {\n cachedPolicy = passThroughPolicy;\n return cachedPolicy;\n }\n\n const native = factory.createPolicy(name, {\n createScript: validateImportMapJSON,\n createScriptURL: validateScriptURL,\n });\n\n cachedPolicy = {\n createScript: input => native.createScript(input) as unknown as string,\n createScriptURL: input => native.createScriptURL(input) as unknown as string,\n };\n return cachedPolicy;\n};\n\nexport const __resetTrustedTypesPolicyForTests = (): void => {\n cachedPolicy = null;\n};\n", "import type { ImportMap } from 'lib/core/1.domain';\nimport type { SetImportMap } from 'lib/core/2.app/config/import-map.contract';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\nexport const replaceInDOM =\n (mapType: string, trustedTypesPolicyName: string | false = 'nfo'): SetImportMap =>\n (importMap: ImportMap, opts = {}) => {\n if (opts?.override) {\n document.head\n .querySelectorAll(`script[type=\"${mapType}\"]`)\n .forEach(importMap => importMap.remove());\n }\n\n const policy = getTrustedTypesPolicy(trustedTypesPolicyName);\n document.head.appendChild(\n Object.assign(document.createElement('script'), {\n type: mapType,\n text: policy.createScript(JSON.stringify(importMap)),\n })\n );\n return Promise.resolve(importMap);\n };\n", "import type { ImportMapConfig } from 'lib/core/2.app/config/import-map.contract';\nimport { replaceInDOM } from './replace-in-dom';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\ndeclare function importShim<T>(url: string): T;\n\nconst useShimImportMap = (\n cfg: { shimMode: boolean } = { shimMode: false },\n trustedTypesPolicyName: string | false = 'nfo'\n): ImportMapConfig => ({\n loadModuleFn: url => {\n const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);\n return importShim(String(trusted));\n },\n setImportMapFn: replaceInDOM(\n cfg.shimMode ? 'importmap-shim' : 'importmap',\n trustedTypesPolicyName\n ),\n reloadBrowserFn: () => {\n window.location.reload();\n },\n});\n\nexport { useShimImportMap };\n", "import type { ImportMapConfig } from 'lib/core/2.app/config/import-map.contract';\nimport { replaceInDOM } from './replace-in-dom';\nimport { getTrustedTypesPolicy } from './trusted-types';\n\nconst useDefaultImportMap = (trustedTypesPolicyName: string | false = 'nfo'): ImportMapConfig => ({\n loadModuleFn: url => {\n const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);\n return import(/* @vite-ignore */ trusted);\n },\n setImportMapFn: replaceInDOM('importmap', trustedTypesPolicyName),\n reloadBrowserFn: () => {\n window.location.reload();\n },\n});\n\nexport { useDefaultImportMap };\n", "import type { ModeProfileConfig } from 'lib/core/2.app/config/mode.contract';\n\nexport const defaultProfile: ModeProfileConfig = {\n latestSharedExternal: false,\n overrideCachedRemotes: 'init-only',\n overrideCachedRemotesIfURLMatches: false,\n};\n", "import type { ModeProfileConfig } from 'lib/core/2.app/config/mode.contract';\n\nexport const cachingProfile: ModeProfileConfig = {\n latestSharedExternal: false,\n overrideCachedRemotes: 'never',\n overrideCachedRemotesIfURLMatches: false,\n};\n"],
5
+ "mappings": ";AAAO,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACT;;;ACFA,IAAM,gBAAwB;AAAA;AAAA,EAE5B,OAAO,CAAC,MAAc,KAAa,QACjC,CAAC,CAAC,MAAM,QAAQ,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,QAAQ,IAAI,WAAW,IAAI,MAAM,GAAG,EAAE;AAAA,EAC/F,OAAO,CAAC,MAAc,KAAa,QACjC,CAAC,CAAC,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,QAAQ,MAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAAA,EAC7F,MAAM,CAAC,MAAc,KAAa,QAChC,CAAC,CAAC,MAAM,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,GAAG,EAAE;AAC7F;;;ACRA,IAAM,aAAqB;AAAA,EACzB,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,OAAO,MAAM;AAAA,EAAC;AAAA,EACd,MAAM,MAAM;AAAA,EAAC;AACf;;;ACNA,IAAM,UAAN,cAAsB,MAAM;AAAA,EAC1B,YAAY,SAAiB,OAAe;AAC1C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACAA,IAAM,aAAyB,CAAI,MAAuB,QAAW;AACnE,MAAI;AACF,QAAI,OAAO,oBAAoB,YAAY;AACzC,aAAO,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,QAAM,IAAI,QAAQ,0BAA0B,OAAO,IAAI,CAAC,GAAG;AAC7D;;;ACbA,IAAM,yBACJ,CAAC,cACD,CAAS,KAAa,iBAAyB;AAC7C,MAAI,CAAE,WAAmD,SAAS,GAAG;AACnE,IAAC,WAAmD,SAAS,IAAI,CAAC;AAAA,EACpE;AAEA,QAAM,UAAW,WACf,SACF;AACA,MAAI,CAAC,QAAQ,GAAG,EAAG,SAAQ,GAAG,IAAI;AAElC,QAAM,QAA8B;AAAA,IAClC,MAAc;AACZ,aAAO,WAAW,KAAK,QAAQ,GAAG,CAAC;AAAA,IACrC;AAAA,IACA,IAAI,OAAqC;AACvC,cAAQ,GAAG,IAAI,WAAW,KAAK,KAAK;AACpC,aAAO;AAAA,IACT;AAAA,IACA,QAA8B;AAC5B,cAAQ,GAAG,IAAI,WAAW,KAAK,YAAY;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;AC/BF,IAAM,oBACJ,CAAC,cACD,CAAS,KAAa,iBAAyB;AAC7C,MAAI,CAAC,aAAa,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE,GAAG;AACxD,iBAAa,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,YAAY,CAAC;AAAA,EAClF;AACA,QAAM,QAA8B;AAAA,IAClC,MAAM;AACJ,YAAM,YAAY,aAAa,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE;AACpE,UAAI,CAAC,UAAW,QAAO;AACvB,aAAO,KAAK,MAAM,SAAS;AAAA,IAC7B;AAAA,IACA,IAAI,OAAqC;AACvC,mBAAa,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC;AACzE,aAAO;AAAA,IACT;AAAA,IACA,QAA8B;AAC5B,mBAAa,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,YAAY,CAAC;AAChF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACtBF,IAAM,sBACJ,CAAC,cACD,CAAS,KAAa,iBAAyB;AAC7C,MAAI,CAAC,eAAe,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE,GAAG;AAC1D,mBAAe,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,YAAY,CAAC;AAAA,EACpF;AACA,QAAM,QAA8B;AAAA,IAClC,MAAM;AACJ,YAAM,YAAY,eAAe,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,EAAE;AACtE,UAAI,CAAC,UAAW,QAAO;AACvB,aAAO,KAAK,MAAM,SAAS;AAAA,IAC7B;AAAA,IACA,IAAI,OAAqC;AACvC,qBAAe,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC;AAC3E,aAAO;AAAA,IACT;AAAA,IACA,QAA8B;AAC5B,qBAAe,QAAQ,GAAG,SAAS,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,YAAY,CAAC;AAClF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACFF,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,UAAU,WAAW,CAAC;AAElE,IAAM,wBAAwB,CAAC,UAA0B;AACvD,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,UAAU,+DAA+D;AAAA,EACrF;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,UAAU,oEAAoE;AAAA,EAC1F;AACA,aAAW,OAAO,OAAO,KAAK,MAAiC,GAAG;AAChE,QAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,YAAM,IAAI,UAAU,oDAAoD,GAAG,iBAAiB;AAAA,IAC9F;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,UAA0B;AACnD,QAAM,OAAO,OAAO,aAAa,cAAc,SAAS,OAAO;AAC/D,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,OAAO,IAAI;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,UAAU,wDAAwD,KAAK,GAAG;AAAA,EACtF;AACA,MAAI,IAAI,aAAa,YAAY,IAAI,aAAa,SAAS;AACzD,UAAM,IAAI;AAAA,MACR,yDAAyD,IAAI,QAAQ;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,oBAA0C;AAAA,EAC9C,cAAc,WAAS;AAAA,EACvB,iBAAiB,WAAS;AAC5B;AAEA,IAAI,eAA4C;AAEzC,IAAM,wBAAwB,CACnC,OAAuB,UACE;AACzB,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,aAAc,QAAO;AAEzB,QAAM,UAAW,WAA4C;AAC7D,MAAI,CAAC,SAAS;AACZ,mBAAe;AACf,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,aAAa,MAAM;AAAA,IACxC,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB,CAAC;AAED,iBAAe;AAAA,IACb,cAAc,WAAS,OAAO,aAAa,KAAK;AAAA,IAChD,iBAAiB,WAAS,OAAO,gBAAgB,KAAK;AAAA,EACxD;AACA,SAAO;AACT;;;ACnFO,IAAM,eACX,CAAC,SAAiB,yBAAyC,UAC3D,CAAC,WAAsB,OAAO,CAAC,MAAM;AACnC,MAAI,MAAM,UAAU;AAClB,aAAS,KACN,iBAAiB,gBAAgB,OAAO,IAAI,EAC5C,QAAQ,CAAAA,eAAaA,WAAU,OAAO,CAAC;AAAA,EAC5C;AAEA,QAAM,SAAS,sBAAsB,sBAAsB;AAC3D,WAAS,KAAK;AAAA,IACZ,OAAO,OAAO,SAAS,cAAc,QAAQ,GAAG;AAAA,MAC9C,MAAM;AAAA,MACN,MAAM,OAAO,aAAa,KAAK,UAAU,SAAS,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,QAAQ,SAAS;AAClC;;;ACfF,IAAM,mBAAmB,CACvB,MAA6B,EAAE,UAAU,MAAM,GAC/C,yBAAyC,WACpB;AAAA,EACrB,cAAc,SAAO;AACnB,UAAM,UAAU,sBAAsB,sBAAsB,EAAE,gBAAgB,GAAG;AACjF,WAAO,WAAW,OAAO,OAAO,CAAC;AAAA,EACnC;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI,WAAW,mBAAmB;AAAA,IAClC;AAAA,EACF;AAAA,EACA,iBAAiB,MAAM;AACrB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF;;;ACjBA,IAAM,sBAAsB,CAAC,yBAAyC,WAA4B;AAAA,EAChG,cAAc,SAAO;AACnB,UAAM,UAAU,sBAAsB,sBAAsB,EAAE,gBAAgB,GAAG;AACjF,WAAO;AAAA;AAAA,MAA0B;AAAA;AAAA,EACnC;AAAA,EACA,gBAAgB,aAAa,aAAa,sBAAsB;AAAA,EAChE,iBAAiB,MAAM;AACrB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF;;;ACXO,IAAM,iBAAoC;AAAA,EAC/C,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,mCAAmC;AACrC;;;ACJO,IAAM,iBAAoC;AAAA,EAC/C,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,mCAAmC;AACrC;",
6
6
  "names": ["importMap"]
7
7
  }
@@ -1,4 +1,4 @@
1
- // src/lib/native-federation.error.ts
1
+ // src/lib/core/native-federation.error.ts
2
2
  var NFError = class extends Error {
3
3
  constructor(message, cause) {
4
4
  super(message, cause);
@@ -21,7 +21,7 @@ var cloneEntry = (name, raw) => {
21
21
  throw new NFError(`Could not clone entry '${String(name)}'`);
22
22
  };
23
23
 
24
- // src/lib/2.app/flows/registry/setup-registry.ts
24
+ // src/lib/registry/setup-registry.ts
25
25
  function createRegistry(opts) {
26
26
  const cfg = {
27
27
  maxStreams: opts.maxStreams,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/lib/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts", "../../src/lib/2.app/flows/registry/setup-registry.ts"],
4
- "sourcesContent": ["class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/2.app/config/storage.contract';\nimport { NFError } from 'lib/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n", "import type {\n NFEventConsumer,\n NFEventData,\n NFEventProvider,\n NFEventUnsubscribe,\n} from '../../../1.domain/registry/event.contract';\nimport type { ForManagingEvents } from 'lib/2.app/driver-ports/registry/for-managing-events.port';\nimport type {\n NFEventRegistryConfig,\n NFEventRegistryOptions,\n} from 'lib/2.app/config/registry.contract';\nimport { cloneEntry } from 'lib/sdk.index';\n\nexport function createRegistry(opts: NFEventRegistryOptions): ForManagingEvents {\n const cfg: NFEventRegistryConfig = {\n maxStreams: opts.maxStreams,\n maxEvents: opts.maxEvents ?? 1,\n removePercentage: opts.removePercentage,\n };\n\n // resources\n const resources = new Map<string, unknown>();\n const pending = new Map<string, Set<NFEventConsumer<any>>>();\n\n // events\n const events = new Map<string, NFEventData[]>();\n const listeners = new Map<string, Set<NFEventConsumer<NFEventData<any>>>>();\n const recentlyUsedStreams = new Set<string>();\n\n // Clamp to (maxEvents - 1) so at least one event always survives the trim.\n // Without this, maxEvents=1 (or any config where REMOVE_EVENTS == maxEvents)\n // would compute slice(-0), which returns the whole array and never trims.\n const REMOVE_EVENTS = Math.min(\n cfg.maxEvents - 1,\n cfg.removePercentage ? Math.ceil(cfg.maxEvents * cfg.removePercentage) : 1\n );\n\n /**\n * Mark `type` as the most-recently-used stream. When `maxStreams` is set and\n * the LRU set grows past that bound, the oldest stream (and its history) is\n * dropped. No-op when `maxStreams` is undefined \u2014 streams are then unbounded.\n */\n const touchStream = (type: string): void => {\n if (!cfg.maxStreams) return;\n recentlyUsedStreams.delete(type);\n recentlyUsedStreams.add(type);\n\n if (recentlyUsedStreams.size > cfg.maxStreams) {\n const oldest = recentlyUsedStreams.values().next().value;\n if (oldest) {\n recentlyUsedStreams.delete(oldest);\n events.delete(oldest);\n }\n }\n };\n\n /**\n * Append an event to `type`'s history, trim the history if it exceeds\n * `maxEvents`, and synchronously notify all current listeners. Trimming is\n * batched: when the history overflows, it is sliced down to\n * `(maxEvents - REMOVE_EVENTS)` items so subsequent emits don't slice on\n * every call.\n */\n const appendAndNotify = <T>(type: string, event: NFEventData<T>): void => {\n let history = events.get(type) ?? [];\n history.push(event);\n\n if (history.length > cfg.maxEvents) {\n history = history.slice(-(cfg.maxEvents - REMOVE_EVENTS));\n }\n\n events.set(type, history);\n\n const typeListeners = listeners.get(type);\n if (typeListeners && typeListeners.size > 0) {\n typeListeners.forEach(listener => listener(event));\n }\n };\n\n /**\n * RESOURCE: Register a resource by name. If the resource is a provider function, it is\n * invoked to obtain the actual resource. All callbacks waiting for this\n * resource via `onReady` are invoked once the resource is registered.\n */\n const register = async <T>(type: string, resource: T | NFEventProvider<T>): Promise<void> => {\n const value =\n typeof resource === 'function' ? await (resource as NFEventProvider<T>)() : resource;\n\n resources.set(type, value);\n\n const callbacks = pending.get(type);\n if (callbacks) {\n pending.delete(type);\n callbacks.forEach(cb => cb(value));\n }\n };\n\n /**\n * RESOURCE: Subscribe to the readiness of a resource. If the resource is already\n * registered, the callback is invoked immediately. Otherwise, the callback\n * is invoked once the resource is registered.\n */\n const onReady = <T>(type: string, callback: NFEventConsumer<T>): NFEventUnsubscribe => {\n const existing = resources.get(type);\n if (existing !== undefined) {\n callback(existing as T);\n return () => {};\n }\n\n let callbacks = pending.get(type);\n if (!callbacks) {\n callbacks = new Set();\n pending.set(type, callbacks);\n }\n callbacks.add(callback);\n\n return () => {\n callbacks!.delete(callback);\n if (callbacks!.size === 0) {\n pending.delete(type);\n }\n };\n };\n\n /**\n * EVENT: Subscribe to events of a specific type. The callback is invoked for\n * all future events of that type, and \u2014 when `opts.replay > 0` \u2014 for the\n * most recent `opts.replay` events already in history. Replay deliveries are\n * scheduled via `queueMicrotask`, so the unsubscribe handle is returned\n * synchronously and the callback fires after the current task completes.\n *\n * @param type Stream identifier.\n * @param callback Listener invoked with each event (replay + future).\n * @param opts.replay Number of buffered events to replay on subscribe, taken\n * from the tail of history (most recent first, delivered\n * in chronological order). Defaults to `1`, matching the\n * BehaviorSubject pattern: a fresh subscriber receives\n * the latest state. Pass `0` to suppress replay; pass a\n * larger value (capped by `maxEvents`) to receive more\n * history.\n * @returns Function that unsubscribes the listener.\n */\n const on = <T>(\n type: string,\n callback: NFEventConsumer<NFEventData<T>>,\n opts: { replay?: number } = {}\n ): NFEventUnsubscribe => {\n const replay = opts.replay ?? 1;\n const history = events.get(type);\n\n let typeListeners = listeners.get(type);\n if (!typeListeners) {\n typeListeners = new Set();\n listeners.set(type, typeListeners);\n }\n typeListeners.add(callback);\n\n if (history && history.length > 0 && replay > 0) {\n queueMicrotask(() => {\n const start = Math.max(0, history.length - replay);\n for (let i = start; i < history.length; i++) {\n callback(cloneEntry('event channel ' + type, history[i]!));\n }\n });\n }\n\n return () => {\n typeListeners!.delete(callback);\n if (typeListeners!.size === 0) {\n listeners.delete(type);\n }\n };\n };\n\n /**\n * EVENT: Publish a new event on `type`. The event is appended to the stream's\n * history and delivered synchronously to every current listener. When\n * `maxEvents` is exceeded the history is batch-trimmed; when `maxStreams` is\n * set, emitting to a new type may evict the least-recently-used stream.\n */\n const emit = <T>(type: string, data: T): void => {\n touchStream(type);\n appendAndNotify(type, { data, timestamp: Date.now() });\n };\n\n /**\n * EVENT: Publish a new event on `type` derived from the previous value, in\n * the style of a state reducer. `updateFn` receives a structured clone of\n * the last event's data (or `undefined` if the stream is empty), and its\n * return value becomes the next event. The clone protects historical events\n * from accidental mutation inside `updateFn`.\n *\n * Use this instead of `emit` when the new state depends on the old one \u2014 it\n * collapses the read-modify-write into a single, race-free call. Requires\n * `data` to be structured-clone-able when the stream is non-empty.\n *\n * @param type Stream identifier.\n * @param updateFn Reducer: `(current | undefined) => next`. Called with a\n * cloned snapshot of the last value (or `undefined` on\n * first emit).\n */\n const update = <T>(type: string, updateFn: (current: T | undefined) => T): void => {\n touchStream(type);\n\n const history = events.get(type) ?? [];\n const lastEvent = history[history.length - 1];\n const current =\n lastEvent === undefined ? undefined : cloneEntry('event channel ' + type, lastEvent.data);\n\n appendAndNotify(type, {\n data: updateFn(current),\n timestamp: Date.now(),\n });\n };\n\n const clear = (type?: string): void => {\n if (type) {\n // Clear event-related data\n events.delete(type);\n listeners.delete(type);\n\n // Clear resource-related data\n resources.delete(type);\n pending.delete(type);\n\n recentlyUsedStreams.delete(type);\n } else {\n // Clear all data\n events.clear();\n listeners.clear();\n pending.clear();\n resources.clear();\n recentlyUsedStreams.clear();\n }\n };\n\n return () => ({\n register,\n onReady,\n emit,\n update,\n on,\n clear,\n });\n}\n"],
5
- "mappings": ";AAAA,IAAM,UAAN,cAAsB,MAAM;AAAA,EAC1B,YAAY,SAAiB,OAAe;AAC1C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACAA,IAAM,aAAyB,CAAI,MAAuB,QAAW;AACnE,MAAI;AACF,QAAI,OAAO,oBAAoB,YAAY;AACzC,aAAO,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,QAAM,IAAI,QAAQ,0BAA0B,OAAO,IAAI,CAAC,GAAG;AAC7D;;;ACNO,SAAS,eAAe,MAAiD;AAC9E,QAAM,MAA6B;AAAA,IACjC,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK,aAAa;AAAA,IAC7B,kBAAkB,KAAK;AAAA,EACzB;AAGA,QAAM,YAAY,oBAAI,IAAqB;AAC3C,QAAM,UAAU,oBAAI,IAAuC;AAG3D,QAAM,SAAS,oBAAI,IAA2B;AAC9C,QAAM,YAAY,oBAAI,IAAoD;AAC1E,QAAM,sBAAsB,oBAAI,IAAY;AAK5C,QAAM,gBAAgB,KAAK;AAAA,IACzB,IAAI,YAAY;AAAA,IAChB,IAAI,mBAAmB,KAAK,KAAK,IAAI,YAAY,IAAI,gBAAgB,IAAI;AAAA,EAC3E;AAOA,QAAM,cAAc,CAAC,SAAuB;AAC1C,QAAI,CAAC,IAAI,WAAY;AACrB,wBAAoB,OAAO,IAAI;AAC/B,wBAAoB,IAAI,IAAI;AAE5B,QAAI,oBAAoB,OAAO,IAAI,YAAY;AAC7C,YAAM,SAAS,oBAAoB,OAAO,EAAE,KAAK,EAAE;AACnD,UAAI,QAAQ;AACV,4BAAoB,OAAO,MAAM;AACjC,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AASA,QAAM,kBAAkB,CAAI,MAAc,UAAgC;AACxE,QAAI,UAAU,OAAO,IAAI,IAAI,KAAK,CAAC;AACnC,YAAQ,KAAK,KAAK;AAElB,QAAI,QAAQ,SAAS,IAAI,WAAW;AAClC,gBAAU,QAAQ,MAAM,EAAE,IAAI,YAAY,cAAc;AAAA,IAC1D;AAEA,WAAO,IAAI,MAAM,OAAO;AAExB,UAAM,gBAAgB,UAAU,IAAI,IAAI;AACxC,QAAI,iBAAiB,cAAc,OAAO,GAAG;AAC3C,oBAAc,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,IACnD;AAAA,EACF;AAOA,QAAM,WAAW,OAAU,MAAc,aAAoD;AAC3F,UAAM,QACJ,OAAO,aAAa,aAAa,MAAO,SAAgC,IAAI;AAE9E,cAAU,IAAI,MAAM,KAAK;AAEzB,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAI,WAAW;AACb,cAAQ,OAAO,IAAI;AACnB,gBAAU,QAAQ,QAAM,GAAG,KAAK,CAAC;AAAA,IACnC;AAAA,EACF;AAOA,QAAM,UAAU,CAAI,MAAc,aAAqD;AACrF,UAAM,WAAW,UAAU,IAAI,IAAI;AACnC,QAAI,aAAa,QAAW;AAC1B,eAAS,QAAa;AACtB,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAEA,QAAI,YAAY,QAAQ,IAAI,IAAI;AAChC,QAAI,CAAC,WAAW;AACd,kBAAY,oBAAI,IAAI;AACpB,cAAQ,IAAI,MAAM,SAAS;AAAA,IAC7B;AACA,cAAU,IAAI,QAAQ;AAEtB,WAAO,MAAM;AACX,gBAAW,OAAO,QAAQ;AAC1B,UAAI,UAAW,SAAS,GAAG;AACzB,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAoBA,QAAM,KAAK,CACT,MACA,UACAA,QAA4B,CAAC,MACN;AACvB,UAAM,SAASA,MAAK,UAAU;AAC9B,UAAM,UAAU,OAAO,IAAI,IAAI;AAE/B,QAAI,gBAAgB,UAAU,IAAI,IAAI;AACtC,QAAI,CAAC,eAAe;AAClB,sBAAgB,oBAAI,IAAI;AACxB,gBAAU,IAAI,MAAM,aAAa;AAAA,IACnC;AACA,kBAAc,IAAI,QAAQ;AAE1B,QAAI,WAAW,QAAQ,SAAS,KAAK,SAAS,GAAG;AAC/C,qBAAe,MAAM;AACnB,cAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,SAAS,MAAM;AACjD,iBAAS,IAAI,OAAO,IAAI,QAAQ,QAAQ,KAAK;AAC3C,mBAAS,WAAW,mBAAmB,MAAM,QAAQ,CAAC,CAAE,CAAC;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,MAAM;AACX,oBAAe,OAAO,QAAQ;AAC9B,UAAI,cAAe,SAAS,GAAG;AAC7B,kBAAU,OAAO,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAQA,QAAM,OAAO,CAAI,MAAc,SAAkB;AAC/C,gBAAY,IAAI;AAChB,oBAAgB,MAAM,EAAE,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EACvD;AAkBA,QAAM,SAAS,CAAI,MAAc,aAAkD;AACjF,gBAAY,IAAI;AAEhB,UAAM,UAAU,OAAO,IAAI,IAAI,KAAK,CAAC;AACrC,UAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC;AAC5C,UAAM,UACJ,cAAc,SAAY,SAAY,WAAW,mBAAmB,MAAM,UAAU,IAAI;AAE1F,oBAAgB,MAAM;AAAA,MACpB,MAAM,SAAS,OAAO;AAAA,MACtB,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,MAAM;AAER,aAAO,OAAO,IAAI;AAClB,gBAAU,OAAO,IAAI;AAGrB,gBAAU,OAAO,IAAI;AACrB,cAAQ,OAAO,IAAI;AAEnB,0BAAoB,OAAO,IAAI;AAAA,IACjC,OAAO;AAEL,aAAO,MAAM;AACb,gBAAU,MAAM;AAChB,cAAQ,MAAM;AACd,gBAAU,MAAM;AAChB,0BAAoB,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
3
+ "sources": ["../../src/lib/core/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts", "../../src/lib/registry/setup-registry.ts"],
4
+ "sourcesContent": ["class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/core/2.app/config/storage.contract';\nimport { NFError } from 'lib/core/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n", "import type {\n NFEventConsumer,\n NFEventData,\n NFEventProvider,\n NFEventUnsubscribe,\n} from './event.contract';\nimport type { ForManagingEvents } from './for-managing-events.port';\nimport type { NFEventRegistryConfig, NFEventRegistryOptions } from './registry.contract';\nimport { cloneEntry } from 'lib/utils/clone-entry';\n\nexport function createRegistry(opts: NFEventRegistryOptions): ForManagingEvents {\n const cfg: NFEventRegistryConfig = {\n maxStreams: opts.maxStreams,\n maxEvents: opts.maxEvents ?? 1,\n removePercentage: opts.removePercentage,\n };\n\n // resources\n const resources = new Map<string, unknown>();\n const pending = new Map<string, Set<NFEventConsumer<any>>>();\n\n // events\n const events = new Map<string, NFEventData[]>();\n const listeners = new Map<string, Set<NFEventConsumer<NFEventData<any>>>>();\n const recentlyUsedStreams = new Set<string>();\n\n // Clamp to (maxEvents - 1) so at least one event always survives the trim.\n // Without this, maxEvents=1 (or any config where REMOVE_EVENTS == maxEvents)\n // would compute slice(-0), which returns the whole array and never trims.\n const REMOVE_EVENTS = Math.min(\n cfg.maxEvents - 1,\n cfg.removePercentage ? Math.ceil(cfg.maxEvents * cfg.removePercentage) : 1\n );\n\n /**\n * Mark `type` as the most-recently-used stream. When `maxStreams` is set and\n * the LRU set grows past that bound, the oldest stream (and its history) is\n * dropped. No-op when `maxStreams` is undefined \u2014 streams are then unbounded.\n */\n const touchStream = (type: string): void => {\n if (!cfg.maxStreams) return;\n recentlyUsedStreams.delete(type);\n recentlyUsedStreams.add(type);\n\n if (recentlyUsedStreams.size > cfg.maxStreams) {\n const oldest = recentlyUsedStreams.values().next().value;\n if (oldest) {\n recentlyUsedStreams.delete(oldest);\n events.delete(oldest);\n }\n }\n };\n\n /**\n * Append an event to `type`'s history, trim the history if it exceeds\n * `maxEvents`, and synchronously notify all current listeners. Trimming is\n * batched: when the history overflows, it is sliced down to\n * `(maxEvents - REMOVE_EVENTS)` items so subsequent emits don't slice on\n * every call.\n */\n const appendAndNotify = <T>(type: string, event: NFEventData<T>): void => {\n let history = events.get(type) ?? [];\n history.push(event);\n\n if (history.length > cfg.maxEvents) {\n history = history.slice(-(cfg.maxEvents - REMOVE_EVENTS));\n }\n\n events.set(type, history);\n\n const typeListeners = listeners.get(type);\n if (typeListeners && typeListeners.size > 0) {\n typeListeners.forEach(listener => listener(event));\n }\n };\n\n /**\n * RESOURCE: Register a resource by name. If the resource is a provider function, it is\n * invoked to obtain the actual resource. All callbacks waiting for this\n * resource via `onReady` are invoked once the resource is registered.\n */\n const register = async <T>(type: string, resource: T | NFEventProvider<T>): Promise<void> => {\n const value =\n typeof resource === 'function' ? await (resource as NFEventProvider<T>)() : resource;\n\n resources.set(type, value);\n\n const callbacks = pending.get(type);\n if (callbacks) {\n pending.delete(type);\n callbacks.forEach(cb => cb(value));\n }\n };\n\n /**\n * RESOURCE: Subscribe to the readiness of a resource. If the resource is already\n * registered, the callback is invoked immediately. Otherwise, the callback\n * is invoked once the resource is registered.\n */\n const onReady = <T>(type: string, callback: NFEventConsumer<T>): NFEventUnsubscribe => {\n const existing = resources.get(type);\n if (existing !== undefined) {\n callback(existing as T);\n return () => {};\n }\n\n let callbacks = pending.get(type);\n if (!callbacks) {\n callbacks = new Set();\n pending.set(type, callbacks);\n }\n callbacks.add(callback);\n\n return () => {\n callbacks!.delete(callback);\n if (callbacks!.size === 0) {\n pending.delete(type);\n }\n };\n };\n\n /**\n * EVENT: Subscribe to events of a specific type. The callback is invoked for\n * all future events of that type, and \u2014 when `opts.replay > 0` \u2014 for the\n * most recent `opts.replay` events already in history. Replay deliveries are\n * scheduled via `queueMicrotask`, so the unsubscribe handle is returned\n * synchronously and the callback fires after the current task completes.\n *\n * @param type Stream identifier.\n * @param callback Listener invoked with each event (replay + future).\n * @param opts.replay Number of buffered events to replay on subscribe, taken\n * from the tail of history (most recent first, delivered\n * in chronological order). Defaults to `1`, matching the\n * BehaviorSubject pattern: a fresh subscriber receives\n * the latest state. Pass `0` to suppress replay; pass a\n * larger value (capped by `maxEvents`) to receive more\n * history.\n * @returns Function that unsubscribes the listener.\n */\n const on = <T>(\n type: string,\n callback: NFEventConsumer<NFEventData<T>>,\n opts: { replay?: number } = {}\n ): NFEventUnsubscribe => {\n const replay = opts.replay ?? 1;\n const history = events.get(type);\n\n let typeListeners = listeners.get(type);\n if (!typeListeners) {\n typeListeners = new Set();\n listeners.set(type, typeListeners);\n }\n typeListeners.add(callback);\n\n if (history && history.length > 0 && replay > 0) {\n queueMicrotask(() => {\n const start = Math.max(0, history.length - replay);\n for (let i = start; i < history.length; i++) {\n callback(cloneEntry('event channel ' + type, history[i]!));\n }\n });\n }\n\n return () => {\n typeListeners!.delete(callback);\n if (typeListeners!.size === 0) {\n listeners.delete(type);\n }\n };\n };\n\n /**\n * EVENT: Publish a new event on `type`. The event is appended to the stream's\n * history and delivered synchronously to every current listener. When\n * `maxEvents` is exceeded the history is batch-trimmed; when `maxStreams` is\n * set, emitting to a new type may evict the least-recently-used stream.\n */\n const emit = <T>(type: string, data: T): void => {\n touchStream(type);\n appendAndNotify(type, { data, timestamp: Date.now() });\n };\n\n /**\n * EVENT: Publish a new event on `type` derived from the previous value, in\n * the style of a state reducer. `updateFn` receives a structured clone of\n * the last event's data (or `undefined` if the stream is empty), and its\n * return value becomes the next event. The clone protects historical events\n * from accidental mutation inside `updateFn`.\n *\n * Use this instead of `emit` when the new state depends on the old one \u2014 it\n * collapses the read-modify-write into a single, race-free call. Requires\n * `data` to be structured-clone-able when the stream is non-empty.\n *\n * @param type Stream identifier.\n * @param updateFn Reducer: `(current | undefined) => next`. Called with a\n * cloned snapshot of the last value (or `undefined` on\n * first emit).\n */\n const update = <T>(type: string, updateFn: (current: T | undefined) => T): void => {\n touchStream(type);\n\n const history = events.get(type) ?? [];\n const lastEvent = history[history.length - 1];\n const current =\n lastEvent === undefined ? undefined : cloneEntry('event channel ' + type, lastEvent.data);\n\n appendAndNotify(type, {\n data: updateFn(current),\n timestamp: Date.now(),\n });\n };\n\n const clear = (type?: string): void => {\n if (type) {\n // Clear event-related data\n events.delete(type);\n listeners.delete(type);\n\n // Clear resource-related data\n resources.delete(type);\n pending.delete(type);\n\n recentlyUsedStreams.delete(type);\n } else {\n // Clear all data\n events.clear();\n listeners.clear();\n pending.clear();\n resources.clear();\n recentlyUsedStreams.clear();\n }\n };\n\n return () => ({\n register,\n onReady,\n emit,\n update,\n on,\n clear,\n });\n}\n"],
5
+ "mappings": ";AAAA,IAAM,UAAN,cAAsB,MAAM;AAAA,EAC1B,YAAY,SAAiB,OAAe;AAC1C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACAA,IAAM,aAAyB,CAAI,MAAuB,QAAW;AACnE,MAAI;AACF,QAAI,OAAO,oBAAoB,YAAY;AACzC,aAAO,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,QAAM,IAAI,QAAQ,0BAA0B,OAAO,IAAI,CAAC,GAAG;AAC7D;;;ACTO,SAAS,eAAe,MAAiD;AAC9E,QAAM,MAA6B;AAAA,IACjC,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK,aAAa;AAAA,IAC7B,kBAAkB,KAAK;AAAA,EACzB;AAGA,QAAM,YAAY,oBAAI,IAAqB;AAC3C,QAAM,UAAU,oBAAI,IAAuC;AAG3D,QAAM,SAAS,oBAAI,IAA2B;AAC9C,QAAM,YAAY,oBAAI,IAAoD;AAC1E,QAAM,sBAAsB,oBAAI,IAAY;AAK5C,QAAM,gBAAgB,KAAK;AAAA,IACzB,IAAI,YAAY;AAAA,IAChB,IAAI,mBAAmB,KAAK,KAAK,IAAI,YAAY,IAAI,gBAAgB,IAAI;AAAA,EAC3E;AAOA,QAAM,cAAc,CAAC,SAAuB;AAC1C,QAAI,CAAC,IAAI,WAAY;AACrB,wBAAoB,OAAO,IAAI;AAC/B,wBAAoB,IAAI,IAAI;AAE5B,QAAI,oBAAoB,OAAO,IAAI,YAAY;AAC7C,YAAM,SAAS,oBAAoB,OAAO,EAAE,KAAK,EAAE;AACnD,UAAI,QAAQ;AACV,4BAAoB,OAAO,MAAM;AACjC,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AASA,QAAM,kBAAkB,CAAI,MAAc,UAAgC;AACxE,QAAI,UAAU,OAAO,IAAI,IAAI,KAAK,CAAC;AACnC,YAAQ,KAAK,KAAK;AAElB,QAAI,QAAQ,SAAS,IAAI,WAAW;AAClC,gBAAU,QAAQ,MAAM,EAAE,IAAI,YAAY,cAAc;AAAA,IAC1D;AAEA,WAAO,IAAI,MAAM,OAAO;AAExB,UAAM,gBAAgB,UAAU,IAAI,IAAI;AACxC,QAAI,iBAAiB,cAAc,OAAO,GAAG;AAC3C,oBAAc,QAAQ,cAAY,SAAS,KAAK,CAAC;AAAA,IACnD;AAAA,EACF;AAOA,QAAM,WAAW,OAAU,MAAc,aAAoD;AAC3F,UAAM,QACJ,OAAO,aAAa,aAAa,MAAO,SAAgC,IAAI;AAE9E,cAAU,IAAI,MAAM,KAAK;AAEzB,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAI,WAAW;AACb,cAAQ,OAAO,IAAI;AACnB,gBAAU,QAAQ,QAAM,GAAG,KAAK,CAAC;AAAA,IACnC;AAAA,EACF;AAOA,QAAM,UAAU,CAAI,MAAc,aAAqD;AACrF,UAAM,WAAW,UAAU,IAAI,IAAI;AACnC,QAAI,aAAa,QAAW;AAC1B,eAAS,QAAa;AACtB,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAEA,QAAI,YAAY,QAAQ,IAAI,IAAI;AAChC,QAAI,CAAC,WAAW;AACd,kBAAY,oBAAI,IAAI;AACpB,cAAQ,IAAI,MAAM,SAAS;AAAA,IAC7B;AACA,cAAU,IAAI,QAAQ;AAEtB,WAAO,MAAM;AACX,gBAAW,OAAO,QAAQ;AAC1B,UAAI,UAAW,SAAS,GAAG;AACzB,gBAAQ,OAAO,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAoBA,QAAM,KAAK,CACT,MACA,UACAA,QAA4B,CAAC,MACN;AACvB,UAAM,SAASA,MAAK,UAAU;AAC9B,UAAM,UAAU,OAAO,IAAI,IAAI;AAE/B,QAAI,gBAAgB,UAAU,IAAI,IAAI;AACtC,QAAI,CAAC,eAAe;AAClB,sBAAgB,oBAAI,IAAI;AACxB,gBAAU,IAAI,MAAM,aAAa;AAAA,IACnC;AACA,kBAAc,IAAI,QAAQ;AAE1B,QAAI,WAAW,QAAQ,SAAS,KAAK,SAAS,GAAG;AAC/C,qBAAe,MAAM;AACnB,cAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,SAAS,MAAM;AACjD,iBAAS,IAAI,OAAO,IAAI,QAAQ,QAAQ,KAAK;AAC3C,mBAAS,WAAW,mBAAmB,MAAM,QAAQ,CAAC,CAAE,CAAC;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,MAAM;AACX,oBAAe,OAAO,QAAQ;AAC9B,UAAI,cAAe,SAAS,GAAG;AAC7B,kBAAU,OAAO,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAQA,QAAM,OAAO,CAAI,MAAc,SAAkB;AAC/C,gBAAY,IAAI;AAChB,oBAAgB,MAAM,EAAE,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EACvD;AAkBA,QAAM,SAAS,CAAI,MAAc,aAAkD;AACjF,gBAAY,IAAI;AAEhB,UAAM,UAAU,OAAO,IAAI,IAAI,KAAK,CAAC;AACrC,UAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC;AAC5C,UAAM,UACJ,cAAc,SAAY,SAAY,WAAW,mBAAmB,MAAM,UAAU,IAAI;AAE1F,oBAAgB,MAAM;AAAA,MACpB,MAAM,SAAS,OAAO;AAAA,MACtB,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,MAAM;AAER,aAAO,OAAO,IAAI;AAClB,gBAAU,OAAO,IAAI;AAGrB,gBAAU,OAAO,IAAI;AACrB,cAAQ,OAAO,IAAI;AAEnB,0BAAoB,OAAO,IAAI;AAAA,IACjC,OAAO;AAEL,aAAO,MAAM;AACb,gBAAU,MAAM;AAChB,cAAQ,MAAM;AACd,gBAAU,MAAM;AAChB,0BAAoB,MAAM;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": ["opts"]
7
7
  }
package/fesm2022/sdk.mjs CHANGED
@@ -4,7 +4,7 @@ var __export = (target, all) => {
4
4
  __defProp(target, name, { get: all[name], enumerable: true });
5
5
  };
6
6
 
7
- // src/lib/1.domain/externals/external.contract.ts
7
+ // src/lib/core/1.domain/externals/external.contract.ts
8
8
  var GLOBAL_SCOPE = "__GLOBAL__";
9
9
  var STRICT_SCOPE = "strict";
10
10
 
@@ -68,7 +68,7 @@ function getScope(path) {
68
68
  return `${parts.join("/")}/`;
69
69
  }
70
70
 
71
- // src/lib/native-federation.error.ts
71
+ // src/lib/core/native-federation.error.ts
72
72
  var NFError = class extends Error {
73
73
  constructor(message, cause) {
74
74
  super(message, cause);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/lib/1.domain/externals/external.contract.ts", "../../src/lib/utils/optional.ts", "../../src/lib/utils/path.ts", "../../src/lib/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts"],
4
- "sourcesContent": ["import type { SharedVersion, ScopedVersion } from './version.contract';\n\nexport type ExternalName = string;\n\nexport type ScopedExternals = Record<string, ScopedExternal>;\n\nexport const GLOBAL_SCOPE = '__GLOBAL__';\n\nexport const STRICT_SCOPE = 'strict';\n\nexport type SharedExternal = {\n dirty: boolean;\n versions: SharedVersion[];\n};\n\nexport type shareScope = Record<string, SharedExternal>;\n\nexport type SharedExternals = Record<string, shareScope> & { [GLOBAL_SCOPE]: shareScope };\n\nexport type ScopedExternal = Record<string, ScopedVersion>;\n", "export class Optional<T> {\n private constructor(private item?: T) {}\n\n public static of<T>(item?: T): Optional<T> {\n return new Optional(item);\n }\n public static empty<U>(): Optional<U> {\n return Optional.of<U>(undefined);\n }\n\n public isPresent() {\n return typeof this.item !== 'undefined' && this.item !== null;\n }\n public set<U>(other: U) {\n return Optional.of(other);\n }\n\n public ifPresent(callback: (_: T) => void): void {\n if (this.isPresent()) callback(this.item as T);\n }\n\n public map<U>(callback: (_: NonNullable<T>) => U | Optional<U>): Optional<U> {\n if (!this.isPresent()) return Optional.empty();\n\n const result = callback(this.item as NonNullable<T>);\n return result instanceof Optional ? result : Optional.of(result);\n }\n\n public orElse(other: Required<T>): NonNullable<T> {\n return this.isPresent() ? (this.item as NonNullable<T>) : (other as NonNullable<T>);\n }\n\n public orThrow(error: Error | string | (() => Error)): NonNullable<T> {\n if (this.isPresent()) return this.item as NonNullable<T>;\n if (typeof error === 'function') throw error();\n throw typeof error === 'string' ? new Error(error) : error;\n }\n\n public get(): T | undefined {\n return this.item;\n }\n}\n", "function join(pathA: string, pathB: string): string {\n pathA = pathA.endsWith('/') ? pathA.slice(0, -1) : pathA;\n pathB = pathB.startsWith('/') ? pathB.slice(1) : pathB;\n return `${pathA}/${pathB}`;\n}\n\nfunction getScope(path: string) {\n if (!path) return '';\n\n const parts = path.split('/');\n\n if (parts[parts.length - 1] === '' || parts[parts.length - 1]!.includes('.')) {\n parts.pop();\n }\n if (parts.length < 1) return '';\n\n return `${parts.join('/')}/`;\n}\n\nexport { join, getScope };\n", "class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/2.app/config/storage.contract';\nimport { NFError } from 'lib/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n"],
3
+ "sources": ["../../src/lib/core/1.domain/externals/external.contract.ts", "../../src/lib/utils/optional.ts", "../../src/lib/utils/path.ts", "../../src/lib/core/native-federation.error.ts", "../../src/lib/utils/clone-entry.ts"],
4
+ "sourcesContent": ["import type { SharedVersion, ScopedVersion } from './version.contract';\n\nexport type ExternalName = string;\n\nexport type ScopedExternals = Record<string, ScopedExternal>;\n\nexport const GLOBAL_SCOPE = '__GLOBAL__';\n\nexport const STRICT_SCOPE = 'strict';\n\nexport type SharedExternal = {\n dirty: boolean;\n versions: SharedVersion[];\n};\n\nexport type shareScope = Record<string, SharedExternal>;\n\nexport type SharedExternals = Record<string, shareScope> & { [GLOBAL_SCOPE]: shareScope };\n\nexport type ScopedExternal = Record<string, ScopedVersion>;\n", "export class Optional<T> {\n private constructor(private item?: T) {}\n\n public static of<T>(item?: T): Optional<T> {\n return new Optional(item);\n }\n public static empty<U>(): Optional<U> {\n return Optional.of<U>(undefined);\n }\n\n public isPresent() {\n return typeof this.item !== 'undefined' && this.item !== null;\n }\n public set<U>(other: U) {\n return Optional.of(other);\n }\n\n public ifPresent(callback: (_: T) => void): void {\n if (this.isPresent()) callback(this.item as T);\n }\n\n public map<U>(callback: (_: NonNullable<T>) => U | Optional<U>): Optional<U> {\n if (!this.isPresent()) return Optional.empty();\n\n const result = callback(this.item as NonNullable<T>);\n return result instanceof Optional ? result : Optional.of(result);\n }\n\n public orElse(other: Required<T>): NonNullable<T> {\n return this.isPresent() ? (this.item as NonNullable<T>) : (other as NonNullable<T>);\n }\n\n public orThrow(error: Error | string | (() => Error)): NonNullable<T> {\n if (this.isPresent()) return this.item as NonNullable<T>;\n if (typeof error === 'function') throw error();\n throw typeof error === 'string' ? new Error(error) : error;\n }\n\n public get(): T | undefined {\n return this.item;\n }\n}\n", "function join(pathA: string, pathB: string): string {\n pathA = pathA.endsWith('/') ? pathA.slice(0, -1) : pathA;\n pathB = pathB.startsWith('/') ? pathB.slice(1) : pathB;\n return `${pathA}/${pathB}`;\n}\n\nfunction getScope(path: string) {\n if (!path) return '';\n\n const parts = path.split('/');\n\n if (parts[parts.length - 1] === '' || parts[parts.length - 1]!.includes('.')) {\n parts.pop();\n }\n if (parts.length < 1) return '';\n\n return `${parts.join('/')}/`;\n}\n\nexport { join, getScope };\n", "class NFError extends Error {\n constructor(message: string, cause?: Error) {\n super(message, cause);\n this.name = 'NFError';\n }\n}\n\nexport { NFError };\n", "import type { StorageEntryKey } from 'lib/core/2.app/config/storage.contract';\nimport { NFError } from 'lib/core/native-federation.error';\n\ntype CloneEntry = <T>(name: StorageEntryKey, raw: T) => T;\n\nconst cloneEntry: CloneEntry = <T>(name: StorageEntryKey, raw: T) => {\n try {\n if (typeof structuredClone === 'function') {\n return structuredClone(raw);\n }\n } catch {\n /* structured clone is unavailable */\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n /* object is not stringifyable */\n }\n throw new NFError(`Could not clone entry '${String(name)}'`);\n};\n\nexport { CloneEntry, cloneEntry };\n"],
5
5
  "mappings": ";;;;;;;AAMO,IAAM,eAAe;AAErB,IAAM,eAAe;;;ACRrB,IAAM,WAAN,MAAM,UAAY;AAAA,EACf,YAAoB,MAAU;AAAV;AAAA,EAAW;AAAA,EAAX;AAAA,EAE5B,OAAc,GAAM,MAAuB;AACzC,WAAO,IAAI,UAAS,IAAI;AAAA,EAC1B;AAAA,EACA,OAAc,QAAwB;AACpC,WAAO,UAAS,GAAM,MAAS;AAAA,EACjC;AAAA,EAEO,YAAY;AACjB,WAAO,OAAO,KAAK,SAAS,eAAe,KAAK,SAAS;AAAA,EAC3D;AAAA,EACO,IAAO,OAAU;AACtB,WAAO,UAAS,GAAG,KAAK;AAAA,EAC1B;AAAA,EAEO,UAAU,UAAgC;AAC/C,QAAI,KAAK,UAAU,EAAG,UAAS,KAAK,IAAS;AAAA,EAC/C;AAAA,EAEO,IAAO,UAA+D;AAC3E,QAAI,CAAC,KAAK,UAAU,EAAG,QAAO,UAAS,MAAM;AAE7C,UAAM,SAAS,SAAS,KAAK,IAAsB;AACnD,WAAO,kBAAkB,YAAW,SAAS,UAAS,GAAG,MAAM;AAAA,EACjE;AAAA,EAEO,OAAO,OAAoC;AAChD,WAAO,KAAK,UAAU,IAAK,KAAK,OAA2B;AAAA,EAC7D;AAAA,EAEO,QAAQ,OAAuD;AACpE,QAAI,KAAK,UAAU,EAAG,QAAO,KAAK;AAClC,QAAI,OAAO,UAAU,WAAY,OAAM,MAAM;AAC7C,UAAM,OAAO,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI;AAAA,EACvD;AAAA,EAEO,MAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AACF;;;ACzCA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,KAAK,OAAe,OAAuB;AAClD,UAAQ,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AACnD,UAAQ,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AACjD,SAAO,GAAG,KAAK,IAAI,KAAK;AAC1B;AAEA,SAAS,SAAS,MAAc;AAC9B,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAE5B,MAAI,MAAM,MAAM,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC,EAAG,SAAS,GAAG,GAAG;AAC5E,UAAM,IAAI;AAAA,EACZ;AACA,MAAI,MAAM,SAAS,EAAG,QAAO;AAE7B,SAAO,GAAG,MAAM,KAAK,GAAG,CAAC;AAC3B;;;ACjBA,IAAM,UAAN,cAAsB,MAAM;AAAA,EAC1B,YAAY,SAAiB,OAAe;AAC1C,UAAM,SAAS,KAAK;AACpB,SAAK,OAAO;AAAA,EACd;AACF;;;ACAA,IAAM,aAAyB,CAAI,MAAuB,QAAW;AACnE,MAAI;AACF,QAAI,OAAO,oBAAoB,YAAY;AACzC,aAAO,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,QAAM,IAAI,QAAQ,0BAA0B,OAAO,IAAI,CAAC,GAAG;AAC7D;",
6
6
  "names": []
7
7
  }
package/init-registry.mjs CHANGED
@@ -1 +1 @@
1
- var f=class extends Error{constructor(o,a){super(o,a),this.name="NFError"}};var l=(s,o)=>{try{if(typeof structuredClone=="function")return structuredClone(o)}catch{}try{return JSON.parse(JSON.stringify(o))}catch{}throw new f(`Could not clone entry '${String(s)}'`)};function u(s){let o={maxStreams:s.maxStreams,maxEvents:s.maxEvents??1,removePercentage:s.removePercentage},a=new Map,c=new Map,m=new Map,d=new Map,g=new Set,N=Math.min(o.maxEvents-1,o.removePercentage?Math.ceil(o.maxEvents*o.removePercentage):1),p=e=>{if(o.maxStreams&&(g.delete(e),g.add(e),g.size>o.maxStreams)){let t=g.values().next().value;t&&(g.delete(t),m.delete(t))}},y=(e,t)=>{let r=m.get(e)??[];r.push(t),r.length>o.maxEvents&&(r=r.slice(-(o.maxEvents-N))),m.set(e,r);let n=d.get(e);n&&n.size>0&&n.forEach(i=>i(t))},x=async(e,t)=>{let r=typeof t=="function"?await t():t;a.set(e,r);let n=c.get(e);n&&(c.delete(e),n.forEach(i=>i(r)))},F=(e,t)=>{let r=a.get(e);if(r!==void 0)return t(r),()=>{};let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&c.delete(e)}},T=(e,t,r={})=>{let n=r.replay??1,i=m.get(e),v=d.get(e);return v||(v=new Set,d.set(e,v)),v.add(t),i&&i.length>0&&n>0&&queueMicrotask(()=>{let w=Math.max(0,i.length-n);for(let E=w;E<i.length;E++)t(l("event channel "+e,i[E]))}),()=>{v.delete(t),v.size===0&&d.delete(e)}},S=(e,t)=>{p(e),y(e,{data:t,timestamp:Date.now()})},h=(e,t)=>{p(e);let r=m.get(e)??[],n=r[r.length-1],i=n===void 0?void 0:l("event channel "+e,n.data);y(e,{data:t(i),timestamp:Date.now()})},R=e=>{e?(m.delete(e),d.delete(e),a.delete(e),c.delete(e),g.delete(e)):(m.clear(),d.clear(),c.clear(),a.clear(),g.clear())};return()=>({register:x,onReady:F,emit:S,update:h,on:T,clear:R})}(function(){let s=document.currentScript,o={maxStreams:s?.dataset?.maxStreams?Number(s.dataset.maxStreams):void 0,maxEvents:s?.dataset?.maxEvents?Number(s.dataset.maxEvents):void 0,removePercentage:s?.dataset?.removePercentage?Number(s.dataset.removePercentage)/100:void 0},a=u(o);window.__NF_REGISTRY__=Object.freeze(a())})();
1
+ var l=class extends Error{constructor(s,i){super(s,i),this.name="NFError"}};var u=(o,s)=>{try{if(typeof structuredClone=="function")return structuredClone(s)}catch{}try{return JSON.parse(JSON.stringify(s))}catch{}throw new l(`Could not clone entry '${String(o)}'`)};function y(o){let s={maxStreams:o.maxStreams,maxEvents:o.maxEvents??1,removePercentage:o.removePercentage},i=new Map,c=new Map,m=new Map,d=new Map,g=new Set,F=Math.min(s.maxEvents-1,s.removePercentage?Math.ceil(s.maxEvents*s.removePercentage):1),f=e=>{if(s.maxStreams&&(g.delete(e),g.add(e),g.size>s.maxStreams)){let t=g.values().next().value;t&&(g.delete(t),m.delete(t))}},N=(e,t)=>{let r=m.get(e)??[];r.push(t),r.length>s.maxEvents&&(r=r.slice(-(s.maxEvents-F))),m.set(e,r);let n=d.get(e);n&&n.size>0&&n.forEach(a=>a(t))},p=async(e,t)=>{let r=typeof t=="function"?await t():t;i.set(e,r);let n=c.get(e);n&&(c.delete(e),n.forEach(a=>a(r)))},S=(e,t)=>{let r=i.get(e);if(r!==void 0)return t(r),()=>{};let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&c.delete(e)}},T=(e,t,r={})=>{let n=r.replay??1,a=m.get(e),v=d.get(e);return v||(v=new Set,d.set(e,v)),v.add(t),a&&a.length>0&&n>0&&queueMicrotask(()=>{let R=Math.max(0,a.length-n);for(let E=R;E<a.length;E++)t(u("event channel "+e,a[E]))}),()=>{v.delete(t),v.size===0&&d.delete(e)}},x=(e,t)=>{f(e),N(e,{data:t,timestamp:Date.now()})},h=(e,t)=>{f(e);let r=m.get(e)??[],n=r[r.length-1],a=n===void 0?void 0:u("event channel "+e,n.data);N(e,{data:t(a),timestamp:Date.now()})},w=e=>{e?(m.delete(e),d.delete(e),i.delete(e),c.delete(e),g.delete(e)):(m.clear(),d.clear(),c.clear(),i.clear(),g.clear())};return()=>({register:p,onReady:S,emit:x,update:h,on:T,clear:w})}(function(){let o=document.currentScript,s={maxStreams:o?.dataset?.maxStreams?Number(o.dataset.maxStreams):void 0,maxEvents:o?.dataset?.maxEvents?Number(o.dataset.maxEvents):void 0,removePercentage:o?.dataset?.removePercentage?Number(o.dataset.removePercentage)/100:void 0},i=y(s);window.__NF_REGISTRY__=Object.freeze(i())})();
@@ -1,4 +1,4 @@
1
- // src/node-loader.ts
1
+ // src/scripts/node-loader.ts
2
2
  var EMPTY_MAP = Object.freeze({ imports: {}, scopes: {} });
3
3
  var HOST_PREFIX = "nf-host:";
4
4
  var HOST_INSTANCES_GLOBAL = "__NF_HOST_INSTANCES__";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/node-loader.ts"],
3
+ "sources": ["../../src/scripts/node-loader.ts"],
4
4
  "sourcesContent": ["/**\n * Node.js module customization hooks for native-federation.\n *\n * Registered via `module.register(<this file>, import.meta.url, { data: { port }, transferList: [port] })`\n * from the orchestrator. The main thread posts the resolved import map over the\n * MessagePort whenever it changes; this loader rewrites `import` specifiers\n * accordingly and fetches http(s) modules into the loader as source text.\n */\n\nimport type { MessagePort } from 'node:worker_threads';\n\ntype Imports = Record<string, string>;\ntype Scopes = Record<string, Imports>;\ntype ImportMap = { imports: Imports; scopes?: Scopes };\n\n/** Per-specifier list of export names to re-export from the host's published instances. */\ntype HostInstanceKeys = Record<string, string[]>;\n\ntype InitData = {\n port?: MessagePort;\n initialImportMap?: ImportMap;\n};\n\ntype IncomingMessage =\n | { type: 'set-import-map'; map: ImportMap }\n | { type: 'set-host-instances'; keys?: HostInstanceKeys };\n\nconst EMPTY_MAP: ImportMap = Object.freeze({ imports: {}, scopes: {} });\n\n/** Synthetic URL scheme for specifiers bridged to the host's instances. */\nconst HOST_PREFIX = 'nf-host:';\n/** Global key on the main thread holding `{ [specifier]: namespaceObject }`. */\nconst HOST_INSTANCES_GLOBAL = '__NF_HOST_INSTANCES__';\n\nconst baseURL = (() => {\n const cwd = process.cwd();\n const url = new URL('file://');\n url.pathname = cwd.endsWith('/') ? cwd : cwd + '/';\n return url.href.endsWith('/') ? url.href : url.href + '/';\n})();\n\nlet activeMap: ImportMap = EMPTY_MAP;\nlet hostInstanceKeys: HostInstanceKeys = Object.create(null);\n\nexport function initialize(data: InitData = {}): void {\n if (data.initialImportMap) {\n activeMap = normalize(data.initialImportMap);\n }\n if (data.port) {\n data.port.on('message', (msg: IncomingMessage) => {\n if (msg && msg.type === 'set-import-map') {\n activeMap = normalize(msg.map);\n data.port!.postMessage({ type: 'import-map-applied' });\n } else if (msg && msg.type === 'set-host-instances') {\n hostInstanceKeys = msg.keys ?? Object.create(null);\n data.port!.postMessage({ type: 'host-instances-applied' });\n }\n });\n data.port.unref?.();\n }\n}\n\ntype ResolveContext = { parentURL?: string };\ntype ResolveResult = { url: string; format?: string | null; shortCircuit?: boolean };\ntype NextResolve = (specifier: string, context?: ResolveContext) => Promise<ResolveResult>;\n\nexport async function resolve(\n specifier: string,\n context: ResolveContext,\n nextResolve: NextResolve\n): Promise<ResolveResult> {\n // Bridged specifiers win over the import map: route them to a synthetic\n // module that re-exports from the host's published instances.\n if (Object.prototype.hasOwnProperty.call(hostInstanceKeys, specifier)) {\n return { url: HOST_PREFIX + encodeURIComponent(specifier), shortCircuit: true };\n }\n const mapped = resolveSpecifier(activeMap, specifier, context.parentURL);\n return nextResolve(mapped ?? specifier, context);\n}\n\ntype LoadContext = { format?: string | null };\ntype LoadResult = {\n format: string;\n source?: string | ArrayBuffer | Uint8Array;\n shortCircuit?: boolean;\n};\ntype NextLoad = (url: string, context?: LoadContext) => Promise<LoadResult>;\n\nexport async function load(\n url: string,\n context: LoadContext,\n nextLoad: NextLoad\n): Promise<LoadResult> {\n if (url.startsWith(HOST_PREFIX)) {\n const specifier = decodeURIComponent(url.slice(HOST_PREFIX.length));\n return {\n shortCircuit: true,\n format: 'module',\n source: synthHostModule(specifier, hostInstanceKeys[specifier]),\n };\n }\n if (url.startsWith('http://') || url.startsWith('https://')) {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch module from ${url}: ${res.status} ${res.statusText}`);\n }\n const source = await res.text();\n return { shortCircuit: true, format: 'module', source };\n }\n if (!url.startsWith('node:')) {\n context.format = 'module';\n }\n return nextLoad(url, context);\n}\n\n// --- host-instance bridge --------------------------------------------------\n// Synthesizes an in-memory ESM module whose exports forward to the namespace\n// the host published on `globalThis[HOST_INSTANCES_GLOBAL]`. The export-key\n// list is computed on the main thread (where the namespace lives) and shipped\n// over the port, so the loader realm never has to enumerate a namespace it\n// can't see. The `globalThis[...]` reads below run at module-eval time on the\n// main thread, where the instances actually exist.\n\nfunction synthHostModule(specifier: string, keys: string[] | undefined): string {\n const ID = /^[\\p{ID_Start}$_][\\p{ID_Continue}$]*$/u;\n const ref = `globalThis[${JSON.stringify(HOST_INSTANCES_GLOBAL)}][${JSON.stringify(specifier)}]`;\n const lines = [\n `const __ns = ${ref};`,\n `if (!__ns) throw new Error(${JSON.stringify(\n `[native-federation] host instance '${specifier}' not published`\n )});`,\n ];\n let hasDefault = false;\n for (const k of keys ?? []) {\n if (k === 'default') {\n hasDefault = true;\n continue;\n }\n // Defensive: only emit syntactically valid export identifiers. Angular's\n // \u0275\u2026 names pass \\p{ID_Start}; anything else is skipped.\n if (ID.test(k)) lines.push(`export const ${k} = __ns[${JSON.stringify(k)}];`);\n }\n if (hasDefault) lines.push(`export default __ns[\"default\"];`);\n return lines.join('\\n') + '\\n';\n}\n\n// --- WICG import-map resolve algorithm ------------------------------------\n// https://wicg.github.io/import-maps/#new-resolve-algorithm\n\nfunction resolveSpecifier(map: ImportMap, specifier: string, parentURL?: string): string | null {\n const currentBaseURL = parentURL ? parentURL.slice(0, parentURL.lastIndexOf('/') + 1) : baseURL;\n const normalizedSpecifier = parseURLLikeSpecifier(specifier, currentBaseURL) ?? specifier;\n\n if (map.scopes) {\n for (const scopePrefix in map.scopes) {\n if (\n scopePrefix === currentBaseURL ||\n (scopePrefix.endsWith('/') && currentBaseURL.startsWith(scopePrefix))\n ) {\n const match = resolveImportsMatch(normalizedSpecifier, map.scopes[scopePrefix]!);\n if (match) return match;\n }\n }\n }\n\n return resolveImportsMatch(normalizedSpecifier, map.imports);\n}\n\nfunction resolveImportsMatch(normalizedSpecifier: string, specifierMap: Imports): string | null {\n for (const specifierKey in specifierMap) {\n const resolutionResult = specifierMap[specifierKey];\n if (resolutionResult === undefined) continue;\n\n if (specifierKey === normalizedSpecifier) return resolutionResult;\n\n if (specifierKey.endsWith('/') && normalizedSpecifier.startsWith(specifierKey)) {\n const afterPrefix = normalizedSpecifier.slice(specifierKey.length);\n try {\n return new URL(afterPrefix, resolutionResult).href;\n } catch {\n throw new TypeError(\n `import-map resolution of '${specifierKey}' failed due to URL parse failure`\n );\n }\n }\n }\n return null;\n}\n\nfunction parseURLLikeSpecifier(specifier: string, base: string): string | null {\n const useBase =\n specifier.startsWith('/') || specifier.startsWith('./') || specifier.startsWith('../');\n try {\n return new URL(specifier, useBase ? base : undefined).href;\n } catch {\n return null;\n }\n}\n\nfunction normalize(parsed: ImportMap): ImportMap {\n return {\n imports: parsed.imports ?? {},\n scopes: parsed.scopes ?? {},\n };\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.2.2",
2
+ "version": "4.3.0",
3
3
  "name": "@softarc/native-federation-orchestrator",
4
4
  "author": "Aukevanoost",
5
5
  "keywords": [
@@ -11,12 +11,9 @@
11
11
  "type": "git",
12
12
  "url": "https://github.com/native-federation/orchestrator.git"
13
13
  },
14
- "pnpm": {
15
- "overrides": {}
16
- },
17
14
  "license": "MIT",
18
15
  "engines": {
19
- "node": ">=20.6.0"
16
+ "node": ">=22.14.0"
20
17
  },
21
18
  "sideEffects": false,
22
19
  "dependencies": {