@softarc/native-federation-orchestrator 4.2.2 → 4.3.1

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 (157) hide show
  1. package/README.md +2 -2
  2. package/fesm2022/@softarc/native-federation-orchestrator.mjs +905 -922
  3. package/fesm2022/@softarc/native-federation-orchestrator.mjs.map +4 -4
  4. package/fesm2022/audit.mjs +2 -2
  5. package/fesm2022/audit.mjs.map +2 -2
  6. package/fesm2022/node.mjs +444 -456
  7. package/fesm2022/node.mjs.map +4 -4
  8. package/fesm2022/options.mjs +17 -15
  9. package/fesm2022/options.mjs.map +3 -3
  10. package/fesm2022/registry.mjs +2 -2
  11. package/fesm2022/registry.mjs.map +3 -3
  12. package/fesm2022/sdk.mjs +2 -2
  13. package/fesm2022/sdk.mjs.map +2 -2
  14. package/init-registry.mjs +1 -1
  15. package/node-loader/loader.mjs +1 -1
  16. package/node-loader/loader.mjs.map +1 -1
  17. package/package.json +2 -5
  18. package/quickstart.mjs +13 -13
  19. package/types/lib/audit/externals-audit.d.ts +4 -0
  20. package/types/lib/{2.app/driver-ports/audit → audit}/for-auditing-externals.port.d.ts +1 -1
  21. package/types/lib/audit.index.d.ts +2 -2
  22. package/types/lib/{2.app → core/2.app}/config/mode.contract.d.ts +1 -0
  23. package/types/lib/{2.app → core/2.app}/driver-ports/init/drivers.contract.d.ts +6 -0
  24. package/types/lib/core/2.app/driver-ports/init/flow.contract.d.ts +14 -0
  25. package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-getting-remote-entry.port.d.ts +1 -1
  26. package/types/lib/{2.app → core/2.app}/driver-ports/init/index.d.ts +3 -0
  27. package/types/lib/{2.app → core/2.app}/driving-ports/for-remote-info-storage.port.d.ts +1 -1
  28. package/types/lib/{2.app → core/2.app}/driving-ports/for-scoped-externals-storage.port.d.ts +1 -1
  29. package/types/lib/{2.app → core/2.app}/driving-ports/for-shared-chunks-storage.port.d.ts +1 -1
  30. package/types/lib/{2.app → core/2.app}/driving-ports/for-shared-externals-storage.port.d.ts +1 -1
  31. package/types/lib/core/2.app/flows/init-remote-entry.flow.d.ts +4 -0
  32. package/types/lib/core/2.app/flows/init.flow.d.ts +4 -0
  33. package/types/lib/core/2.app/steps/commit-changes.d.ts +4 -0
  34. package/types/lib/core/2.app/steps/convert-to-import-map.d.ts +4 -0
  35. package/types/lib/core/2.app/steps/determine-shared-externals.d.ts +5 -0
  36. package/types/lib/core/2.app/steps/expose-module-loader.d.ts +4 -0
  37. package/types/lib/core/2.app/steps/generate-import-map.d.ts +5 -0
  38. package/types/lib/core/2.app/steps/get-remote-entries.d.ts +6 -0
  39. package/types/lib/core/2.app/steps/get-remote-entry.d.ts +5 -0
  40. package/types/lib/core/2.app/steps/process-remote-entries.d.ts +5 -0
  41. package/types/lib/core/2.app/steps/store-remote-entry.d.ts +23 -0
  42. package/types/lib/core/2.app/steps/update-cache.d.ts +5 -0
  43. package/types/lib/{3.adapters → core/3.adapters}/browser/sse-handler.d.ts +1 -1
  44. package/types/lib/{4.config → core/4.config}/import-map/trusted-types.d.ts +5 -1
  45. package/types/lib/core/5.di/federation-result.factory.d.ts +12 -0
  46. package/types/lib/core/5.di/init.factory.d.ts +12 -0
  47. package/types/lib/{init-federation.contract.d.ts → core/init-federation.contract.d.ts} +1 -1
  48. package/types/lib/index.d.ts +10 -8
  49. package/types/lib/{3.adapters/node → node/adapters}/fs-manifest-provider.d.ts +1 -1
  50. package/types/lib/{3.adapters/node → node/adapters}/fs-remote-entry-provider.d.ts +1 -1
  51. package/types/lib/{3.adapters/node → node/adapters}/node-loader.client.d.ts +1 -1
  52. package/types/lib/node/adapters/noop-sse.d.ts +3 -0
  53. package/types/lib/{init-federation.node.d.ts → node/init-federation.node.d.ts} +5 -5
  54. package/types/lib/{4.config/import-map → node}/resolve-host-instances.d.ts +3 -3
  55. package/types/lib/{4.config/import-map → node}/use-node.d.ts +2 -2
  56. package/types/lib/{utils/node → node/utils}/to-url.d.ts +1 -1
  57. package/types/lib/node.index.d.ts +5 -5
  58. package/types/lib/options.index.d.ts +5 -5
  59. package/types/lib/registry/for-managing-events.port.d.ts +2 -0
  60. package/types/lib/registry/setup-registry.d.ts +3 -0
  61. package/types/lib/registry.index.d.ts +5 -4
  62. package/types/lib/sdk.index.d.ts +4 -5
  63. package/types/lib/testing/handlers/log.handler.d.ts +3 -0
  64. package/types/lib/utils/clone-entry.d.ts +1 -1
  65. package/types/{init-registry.d.ts → scripts/init-registry.d.ts} +1 -1
  66. package/types/lib/1.domain/registry/index.d.ts +0 -2
  67. package/types/lib/2.app/driver-ports/audit/index.d.ts +0 -1
  68. package/types/lib/2.app/driver-ports/dynamic-init/drivers.contract.d.ts +0 -13
  69. package/types/lib/2.app/driver-ports/dynamic-init/flow.contract.d.ts +0 -8
  70. package/types/lib/2.app/driver-ports/dynamic-init/index.d.ts +0 -5
  71. package/types/lib/2.app/driver-ports/init/flow.contract.d.ts +0 -6
  72. package/types/lib/2.app/driver-ports/registry/for-managing-events.port.d.ts +0 -2
  73. package/types/lib/2.app/flows/audit/externals-audit.d.ts +0 -4
  74. package/types/lib/2.app/flows/dynamic-init/convert-to-import-map.d.ts +0 -4
  75. package/types/lib/2.app/flows/dynamic-init/get-remote-entry.d.ts +0 -5
  76. package/types/lib/2.app/flows/dynamic-init/update-cache.d.ts +0 -5
  77. package/types/lib/2.app/flows/init/commit-changes.d.ts +0 -4
  78. package/types/lib/2.app/flows/init/determine-shared-externals.d.ts +0 -5
  79. package/types/lib/2.app/flows/init/expose-module-loader.d.ts +0 -4
  80. package/types/lib/2.app/flows/init/generate-import-map.d.ts +0 -5
  81. package/types/lib/2.app/flows/init/get-remote-entries.d.ts +0 -6
  82. package/types/lib/2.app/flows/init/process-remote-entries.d.ts +0 -5
  83. package/types/lib/2.app/flows/registry/setup-registry.d.ts +0 -3
  84. package/types/lib/3.adapters/node/noop-sse.d.ts +0 -3
  85. package/types/lib/5.di/flows/dynamic-init.factory.d.ts +0 -14
  86. package/types/lib/5.di/flows/init.factory.d.ts +0 -14
  87. package/types/lib/6.mocks/handlers/log.handler.d.ts +0 -2
  88. /package/types/lib/{1.domain → core/1.domain}/externals/chunks.contract.d.ts +0 -0
  89. /package/types/lib/{1.domain → core/1.domain}/externals/external.contract.d.ts +0 -0
  90. /package/types/lib/{1.domain → core/1.domain}/externals/version.contract.d.ts +0 -0
  91. /package/types/lib/{1.domain → core/1.domain}/import-map/import-map.contract.d.ts +0 -0
  92. /package/types/lib/{1.domain → core/1.domain}/index.d.ts +0 -0
  93. /package/types/lib/{1.domain → core/1.domain}/remote/remote-info.contract.d.ts +0 -0
  94. /package/types/lib/{1.domain → core/1.domain}/remote/remote-module.contract.d.ts +0 -0
  95. /package/types/lib/{1.domain → core/1.domain}/remote-entry/manifest.contract.d.ts +0 -0
  96. /package/types/lib/{1.domain → core/1.domain}/remote-entry/remote-entry.contract.d.ts +0 -0
  97. /package/types/lib/{2.app → core/2.app}/config/config.contract.d.ts +0 -0
  98. /package/types/lib/{2.app → core/2.app}/config/host.contract.d.ts +0 -0
  99. /package/types/lib/{2.app → core/2.app}/config/import-map.contract.d.ts +0 -0
  100. /package/types/lib/{2.app → core/2.app}/config/index.d.ts +0 -0
  101. /package/types/lib/{2.app → core/2.app}/config/log.contract.d.ts +0 -0
  102. /package/types/lib/{2.app → core/2.app}/config/storage.contract.d.ts +0 -0
  103. /package/types/lib/{2.app → core/2.app}/driver-ports/flow-factory.contract.d.ts +0 -0
  104. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-committing-changes.port.d.ts +0 -0
  105. /package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-converting-to-import-map.d.ts +0 -0
  106. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-determining-shared-externals.port.d.ts +0 -0
  107. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-exposing-module-loader.port.d.ts +0 -0
  108. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-generating-import-map.d.ts +0 -0
  109. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-getting-remote-entries.port.d.ts +0 -0
  110. /package/types/lib/{2.app → core/2.app}/driver-ports/init/for-processing-remote-entries.port.d.ts +0 -0
  111. /package/types/lib/{2.app/driver-ports/dynamic-init → core/2.app/driver-ports/init}/for-updating-cache.d.ts +0 -0
  112. /package/types/lib/{2.app → core/2.app}/driving-ports/driving.contract.d.ts +0 -0
  113. /package/types/lib/{2.app → core/2.app}/driving-ports/for-browser-tasks.d.ts +0 -0
  114. /package/types/lib/{2.app → core/2.app}/driving-ports/for-providing-manifest.port.d.ts +0 -0
  115. /package/types/lib/{2.app → core/2.app}/driving-ports/for-providing-remote-entries.port.d.ts +0 -0
  116. /package/types/lib/{2.app → core/2.app}/driving-ports/for-sse.port.d.ts +0 -0
  117. /package/types/lib/{2.app → core/2.app}/driving-ports/for-version-checking.port.d.ts +0 -0
  118. /package/types/lib/{2.app → core/2.app}/driving-ports/index.d.ts +0 -0
  119. /package/types/lib/{3.adapters → core/3.adapters}/browser/browser.d.ts +0 -0
  120. /package/types/lib/{3.adapters → core/3.adapters}/checks/version.check.d.ts +0 -0
  121. /package/types/lib/{3.adapters → core/3.adapters}/http/manifest-provider.d.ts +0 -0
  122. /package/types/lib/{3.adapters → core/3.adapters}/http/remote-entry-provider.d.ts +0 -0
  123. /package/types/lib/{3.adapters → core/3.adapters}/storage/chunk.repository.d.ts +0 -0
  124. /package/types/lib/{3.adapters → core/3.adapters}/storage/remote-info.repository.d.ts +0 -0
  125. /package/types/lib/{3.adapters → core/3.adapters}/storage/scoped-externals.repository.d.ts +0 -0
  126. /package/types/lib/{3.adapters → core/3.adapters}/storage/shared-externals.repository.d.ts +0 -0
  127. /package/types/lib/{4.config → core/4.config}/host/host.config.d.ts +0 -0
  128. /package/types/lib/{4.config → core/4.config}/import-map/import-map.config.d.ts +0 -0
  129. /package/types/lib/{4.config → core/4.config}/import-map/index.d.ts +0 -0
  130. /package/types/lib/{4.config → core/4.config}/import-map/replace-in-dom.d.ts +0 -0
  131. /package/types/lib/{4.config → core/4.config}/import-map/use-default.d.ts +0 -0
  132. /package/types/lib/{4.config → core/4.config}/import-map/use-import-shim.d.ts +0 -0
  133. /package/types/lib/{4.config → core/4.config}/logging/console.logger.d.ts +0 -0
  134. /package/types/lib/{4.config → core/4.config}/logging/index.d.ts +0 -0
  135. /package/types/lib/{4.config → core/4.config}/logging/log.config.d.ts +0 -0
  136. /package/types/lib/{4.config → core/4.config}/logging/log.handler.d.ts +0 -0
  137. /package/types/lib/{4.config → core/4.config}/logging/noop.logger.d.ts +0 -0
  138. /package/types/lib/{4.config → core/4.config}/mode/caching.profile.d.ts +0 -0
  139. /package/types/lib/{4.config → core/4.config}/mode/default.profile.d.ts +0 -0
  140. /package/types/lib/{4.config → core/4.config}/mode/index.d.ts +0 -0
  141. /package/types/lib/{4.config → core/4.config}/mode/mode.config.d.ts +0 -0
  142. /package/types/lib/{4.config → core/4.config}/storage/global-this.storage.d.ts +0 -0
  143. /package/types/lib/{4.config → core/4.config}/storage/index.d.ts +0 -0
  144. /package/types/lib/{4.config → core/4.config}/storage/local.storage.d.ts +0 -0
  145. /package/types/lib/{4.config → core/4.config}/storage/session.storage.d.ts +0 -0
  146. /package/types/lib/{4.config → core/4.config}/storage/storage.config.d.ts +0 -0
  147. /package/types/lib/{5.di → core/5.di}/config.factory.d.ts +0 -0
  148. /package/types/lib/{5.di → core/5.di}/driving.factory.d.ts +0 -0
  149. /package/types/lib/{init-federation.d.ts → core/init-federation.d.ts} +0 -0
  150. /package/types/lib/{native-federation.error.d.ts → core/native-federation.error.d.ts} +0 -0
  151. /package/types/lib/{3.adapters/node → node/adapters}/loader-url.d.ts +0 -0
  152. /package/types/lib/{utils/node → node/utils}/read-source.d.ts +0 -0
  153. /package/types/lib/{1.domain/registry → registry}/event-registry.contract.d.ts +0 -0
  154. /package/types/lib/{1.domain/registry → registry}/event.contract.d.ts +0 -0
  155. /package/types/lib/{2.app/config → registry}/registry.contract.d.ts +0 -0
  156. /package/types/{node-loader.d.ts → scripts/node-loader.d.ts} +0 -0
  157. /package/types/{quickstart.d.ts → scripts/quickstart.d.ts} +0 -0
@@ -5,7 +5,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
7
  var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
8
+ try {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ } catch (e) {
11
+ throw mod = 0, e;
12
+ }
9
13
  };
10
14
  var __copyProps = (to, from, except, desc) => {
11
15
  if (from && typeof from === "object" || typeof from === "function") {
@@ -24,9 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
28
  mod
25
29
  ));
26
30
 
27
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/debug.js
31
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js
28
32
  var require_debug = __commonJS({
29
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/debug.js"(exports, module) {
33
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports, module) {
30
34
  "use strict";
31
35
  var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
32
36
  };
@@ -34,9 +38,9 @@ var require_debug = __commonJS({
34
38
  }
35
39
  });
36
40
 
37
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/constants.js
41
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js
38
42
  var require_constants = __commonJS({
39
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/constants.js"(exports, module) {
43
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports, module) {
40
44
  "use strict";
41
45
  var SEMVER_SPEC_VERSION = "2.0.0";
42
46
  var MAX_LENGTH = 256;
@@ -66,9 +70,9 @@ var require_constants = __commonJS({
66
70
  }
67
71
  });
68
72
 
69
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/re.js
73
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js
70
74
  var require_re = __commonJS({
71
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/re.js"(exports, module) {
75
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports, module) {
72
76
  "use strict";
73
77
  var {
74
78
  MAX_SAFE_COMPONENT_LENGTH,
@@ -154,9 +158,9 @@ var require_re = __commonJS({
154
158
  }
155
159
  });
156
160
 
157
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/parse-options.js
161
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js
158
162
  var require_parse_options = __commonJS({
159
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/parse-options.js"(exports, module) {
163
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports, module) {
160
164
  "use strict";
161
165
  var looseOption = Object.freeze({ loose: true });
162
166
  var emptyOpts = Object.freeze({});
@@ -173,9 +177,9 @@ var require_parse_options = __commonJS({
173
177
  }
174
178
  });
175
179
 
176
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/identifiers.js
180
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js
177
181
  var require_identifiers = __commonJS({
178
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/identifiers.js"(exports, module) {
182
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports, module) {
179
183
  "use strict";
180
184
  var numeric = /^[0-9]+$/;
181
185
  var compareIdentifiers = (a, b) => {
@@ -198,15 +202,27 @@ var require_identifiers = __commonJS({
198
202
  }
199
203
  });
200
204
 
201
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/semver.js
205
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js
202
206
  var require_semver = __commonJS({
203
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/semver.js"(exports, module) {
207
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports, module) {
204
208
  "use strict";
205
209
  var debug = require_debug();
206
210
  var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
207
211
  var { safeRe: re, t } = require_re();
208
212
  var parseOptions = require_parse_options();
209
213
  var { compareIdentifiers } = require_identifiers();
214
+ var isPrereleaseIdentifier = (prerelease, identifier) => {
215
+ const identifiers = identifier.split(".");
216
+ if (identifiers.length > prerelease.length) {
217
+ return false;
218
+ }
219
+ for (let i = 0; i < identifiers.length; i++) {
220
+ if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) {
221
+ return false;
222
+ }
223
+ }
224
+ return true;
225
+ };
210
226
  var SemVer = class _SemVer {
211
227
  constructor(version, options) {
212
228
  options = parseOptions(options);
@@ -453,8 +469,9 @@ var require_semver = __commonJS({
453
469
  if (identifierBase === false) {
454
470
  prerelease = [identifier];
455
471
  }
456
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
457
- if (isNaN(this.prerelease[1])) {
472
+ if (isPrereleaseIdentifier(this.prerelease, identifier)) {
473
+ const prereleaseBase = this.prerelease[identifier.split(".").length];
474
+ if (isNaN(prereleaseBase)) {
458
475
  this.prerelease = prerelease;
459
476
  }
460
477
  } else {
@@ -477,9 +494,9 @@ var require_semver = __commonJS({
477
494
  }
478
495
  });
479
496
 
480
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/parse.js
497
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js
481
498
  var require_parse = __commonJS({
482
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/parse.js"(exports, module) {
499
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports, module) {
483
500
  "use strict";
484
501
  var SemVer = require_semver();
485
502
  var parse = (version, options, throwErrors = false) => {
@@ -499,9 +516,9 @@ var require_parse = __commonJS({
499
516
  }
500
517
  });
501
518
 
502
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/valid.js
519
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js
503
520
  var require_valid = __commonJS({
504
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/valid.js"(exports, module) {
521
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports, module) {
505
522
  "use strict";
506
523
  var parse = require_parse();
507
524
  var valid = (version, options) => {
@@ -512,9 +529,9 @@ var require_valid = __commonJS({
512
529
  }
513
530
  });
514
531
 
515
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/lrucache.js
532
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js
516
533
  var require_lrucache = __commonJS({
517
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/internal/lrucache.js"(exports, module) {
534
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports, module) {
518
535
  "use strict";
519
536
  var LRUCache = class {
520
537
  constructor() {
@@ -550,9 +567,9 @@ var require_lrucache = __commonJS({
550
567
  }
551
568
  });
552
569
 
553
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/compare.js
570
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js
554
571
  var require_compare = __commonJS({
555
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/compare.js"(exports, module) {
572
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports, module) {
556
573
  "use strict";
557
574
  var SemVer = require_semver();
558
575
  var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
@@ -560,9 +577,9 @@ var require_compare = __commonJS({
560
577
  }
561
578
  });
562
579
 
563
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/eq.js
580
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js
564
581
  var require_eq = __commonJS({
565
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/eq.js"(exports, module) {
582
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports, module) {
566
583
  "use strict";
567
584
  var compare = require_compare();
568
585
  var eq = (a, b, loose) => compare(a, b, loose) === 0;
@@ -570,9 +587,9 @@ var require_eq = __commonJS({
570
587
  }
571
588
  });
572
589
 
573
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/neq.js
590
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js
574
591
  var require_neq = __commonJS({
575
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/neq.js"(exports, module) {
592
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports, module) {
576
593
  "use strict";
577
594
  var compare = require_compare();
578
595
  var neq = (a, b, loose) => compare(a, b, loose) !== 0;
@@ -580,9 +597,9 @@ var require_neq = __commonJS({
580
597
  }
581
598
  });
582
599
 
583
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/gt.js
600
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js
584
601
  var require_gt = __commonJS({
585
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/gt.js"(exports, module) {
602
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports, module) {
586
603
  "use strict";
587
604
  var compare = require_compare();
588
605
  var gt = (a, b, loose) => compare(a, b, loose) > 0;
@@ -590,9 +607,9 @@ var require_gt = __commonJS({
590
607
  }
591
608
  });
592
609
 
593
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/gte.js
610
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js
594
611
  var require_gte = __commonJS({
595
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/gte.js"(exports, module) {
612
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports, module) {
596
613
  "use strict";
597
614
  var compare = require_compare();
598
615
  var gte = (a, b, loose) => compare(a, b, loose) >= 0;
@@ -600,9 +617,9 @@ var require_gte = __commonJS({
600
617
  }
601
618
  });
602
619
 
603
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/lt.js
620
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js
604
621
  var require_lt = __commonJS({
605
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/lt.js"(exports, module) {
622
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports, module) {
606
623
  "use strict";
607
624
  var compare = require_compare();
608
625
  var lt = (a, b, loose) => compare(a, b, loose) < 0;
@@ -610,9 +627,9 @@ var require_lt = __commonJS({
610
627
  }
611
628
  });
612
629
 
613
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/lte.js
630
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js
614
631
  var require_lte = __commonJS({
615
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/lte.js"(exports, module) {
632
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports, module) {
616
633
  "use strict";
617
634
  var compare = require_compare();
618
635
  var lte = (a, b, loose) => compare(a, b, loose) <= 0;
@@ -620,9 +637,9 @@ var require_lte = __commonJS({
620
637
  }
621
638
  });
622
639
 
623
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/cmp.js
640
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js
624
641
  var require_cmp = __commonJS({
625
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/cmp.js"(exports, module) {
642
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports, module) {
626
643
  "use strict";
627
644
  var eq = require_eq();
628
645
  var neq = require_neq();
@@ -670,9 +687,9 @@ var require_cmp = __commonJS({
670
687
  }
671
688
  });
672
689
 
673
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/comparator.js
690
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js
674
691
  var require_comparator = __commonJS({
675
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/comparator.js"(exports, module) {
692
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports, module) {
676
693
  "use strict";
677
694
  var ANY = /* @__PURE__ */ Symbol("SemVer ANY");
678
695
  var Comparator = class _Comparator {
@@ -783,9 +800,9 @@ var require_comparator = __commonJS({
783
800
  }
784
801
  });
785
802
 
786
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/range.js
803
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js
787
804
  var require_range = __commonJS({
788
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/classes/range.js"(exports, module) {
805
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports, module) {
789
806
  "use strict";
790
807
  var SPACE_CHARACTERS = /\s+/g;
791
808
  var Range = class _Range {
@@ -972,20 +989,22 @@ var require_range = __commonJS({
972
989
  return comp;
973
990
  };
974
991
  var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
992
+ var invalidXRangeOrder = (M, m, p) => isX(M) && !isX(m) || isX(m) && p && !isX(p);
975
993
  var replaceTildes = (comp, options) => {
976
994
  return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options)).join(" ");
977
995
  };
978
996
  var replaceTilde = (comp, options) => {
979
997
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
998
+ const z = options.includePrerelease ? "-0" : "";
980
999
  return comp.replace(r, (_, M, m, p, pr) => {
981
1000
  debug("tilde", comp, _, M, m, p, pr);
982
1001
  let ret;
983
1002
  if (isX(M)) {
984
1003
  ret = "";
985
1004
  } else if (isX(m)) {
986
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
1005
+ ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
987
1006
  } else if (isX(p)) {
988
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
1007
+ ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
989
1008
  } else if (pr) {
990
1009
  debug("replaceTilde pr", pr);
991
1010
  ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
@@ -1031,9 +1050,9 @@ var require_range = __commonJS({
1031
1050
  debug("no pr");
1032
1051
  if (M === "0") {
1033
1052
  if (m === "0") {
1034
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
1053
+ ret = `>=${M}.${m}.${p} <${M}.${m}.${+p + 1}-0`;
1035
1054
  } else {
1036
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
1055
+ ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
1037
1056
  }
1038
1057
  } else {
1039
1058
  ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
@@ -1052,6 +1071,9 @@ var require_range = __commonJS({
1052
1071
  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
1053
1072
  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
1054
1073
  debug("xRange", comp, ret, gtlt, M, m, p, pr);
1074
+ if (invalidXRangeOrder(M, m, p)) {
1075
+ return comp;
1076
+ }
1055
1077
  const xM = isX(M);
1056
1078
  const xm = xM || isX(m);
1057
1079
  const xp = xm || isX(p);
@@ -1163,9 +1185,9 @@ var require_range = __commonJS({
1163
1185
  }
1164
1186
  });
1165
1187
 
1166
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/satisfies.js
1188
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js
1167
1189
  var require_satisfies = __commonJS({
1168
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/functions/satisfies.js"(exports, module) {
1190
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports, module) {
1169
1191
  "use strict";
1170
1192
  var Range = require_range();
1171
1193
  var satisfies = (version, range, options) => {
@@ -1180,9 +1202,9 @@ var require_satisfies = __commonJS({
1180
1202
  }
1181
1203
  });
1182
1204
 
1183
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/ranges/min-version.js
1205
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js
1184
1206
  var require_min_version = __commonJS({
1185
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/ranges/min-version.js"(exports, module) {
1207
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports, module) {
1186
1208
  "use strict";
1187
1209
  var SemVer = require_semver();
1188
1210
  var Range = require_range();
@@ -1239,9 +1261,9 @@ var require_min_version = __commonJS({
1239
1261
  }
1240
1262
  });
1241
1263
 
1242
- // node_modules/.pnpm/semver@7.8.1/node_modules/semver/ranges/valid.js
1264
+ // node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js
1243
1265
  var require_valid2 = __commonJS({
1244
- "node_modules/.pnpm/semver@7.8.1/node_modules/semver/ranges/valid.js"(exports, module) {
1266
+ "node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports, module) {
1245
1267
  "use strict";
1246
1268
  var Range = require_range();
1247
1269
  var validRange = (range, options) => {
@@ -1255,7 +1277,28 @@ var require_valid2 = __commonJS({
1255
1277
  }
1256
1278
  });
1257
1279
 
1258
- // src/lib/native-federation.error.ts
1280
+ // src/lib/core/2.app/flows/init.flow.ts
1281
+ var createInitFlow = ({
1282
+ flow,
1283
+ adapters,
1284
+ config
1285
+ }) => {
1286
+ return (remotesOrManifestUrl) => flow.getRemoteEntries(remotesOrManifestUrl).then(flow.processRemoteEntries).then(flow.determineSharedExternals).then(flow.generateImportMap).then(flow.commitChanges).then(flow.exposeModuleLoader).then((loadRemoteModule) => ({
1287
+ config,
1288
+ adapters,
1289
+ loadRemoteModule
1290
+ }));
1291
+ };
1292
+
1293
+ // src/lib/core/2.app/flows/init-remote-entry.flow.ts
1294
+ var createInitRemoteEntryFlow = ({
1295
+ flow
1296
+ }) => {
1297
+ const processDynamicRemoteEntry = (remoteEntry) => flow.updateCache(remoteEntry).then(flow.convertToImportMap).then(flow.commitChanges);
1298
+ return (remoteEntryUrl, remote) => flow.getRemoteEntry(remoteEntryUrl, remote).then((entry) => entry.map(processDynamicRemoteEntry).orElse(Promise.resolve())).then(() => void 0);
1299
+ };
1300
+
1301
+ // src/lib/core/native-federation.error.ts
1259
1302
  var NFError = class extends Error {
1260
1303
  constructor(message, cause) {
1261
1304
  super(message, cause);
@@ -1279,7 +1322,7 @@ function getScope(path) {
1279
1322
  return `${parts.join("/")}/`;
1280
1323
  }
1281
1324
 
1282
- // src/lib/2.app/flows/init/get-remote-entries.ts
1325
+ // src/lib/core/2.app/steps/get-remote-entries.ts
1283
1326
  function createGetRemoteEntries(config, ports) {
1284
1327
  return (remotesOrManifestUrl = {}) => {
1285
1328
  const manifestPromise = config.manifestIntegrity ? ports.manifestProvider.provide(remotesOrManifestUrl, {
@@ -1373,20 +1416,13 @@ function createGetRemoteEntries(config, ports) {
1373
1416
  }
1374
1417
  }
1375
1418
 
1376
- // src/lib/2.app/flows/init/process-remote-entries.ts
1377
- function createProcessRemoteEntries(config, ports) {
1378
- return (remoteEntries) => {
1379
- try {
1380
- remoteEntries.forEach((remoteEntry) => {
1381
- if (remoteEntry?.override) removeCachedRemoteEntry(remoteEntry);
1382
- addRemoteInfoToStorage(remoteEntry);
1383
- addExternalsToStorage(remoteEntry);
1384
- addSharedChunksToStorage(remoteEntry);
1385
- });
1386
- return Promise.resolve(remoteEntries);
1387
- } catch (e) {
1388
- return Promise.reject(e);
1389
- }
1419
+ // src/lib/core/2.app/steps/store-remote-entry.ts
1420
+ function createStoreRemoteEntry(config, ports, logStep) {
1421
+ return (remoteEntry, onSharedExternal) => {
1422
+ if (remoteEntry?.override) removeCachedRemoteEntry(remoteEntry);
1423
+ addRemoteInfoToStorage(remoteEntry);
1424
+ addExternalsToStorage(remoteEntry, onSharedExternal);
1425
+ addSharedChunksToStorage(remoteEntry);
1390
1426
  };
1391
1427
  function removeCachedRemoteEntry(remoteEntry) {
1392
1428
  ports.remoteInfoRepo.remove(remoteEntry.name);
@@ -1403,92 +1439,134 @@ function createProcessRemoteEntries(config, ports) {
1403
1439
  ...integrity ? { integrity } : {}
1404
1440
  });
1405
1441
  }
1406
- function addExternalsToStorage(remoteEntry) {
1442
+ function addExternalsToStorage(remoteEntry, onSharedExternal) {
1407
1443
  remoteEntry.shared.forEach((external) => {
1408
- if (!external.version || !ports.versionCheck.isValidSemver(external.version)) {
1409
- const errorMsg = `[${remoteEntry.name}][${external.packageName}] Version '${external.version}' is not a valid version.`;
1410
- if (config.strict.strictExternalVersion) {
1411
- config.log.error(2, errorMsg);
1412
- throw new NFError(`Could not process remote '${remoteEntry.name}'`);
1413
- }
1414
- config.log.warn(2, errorMsg);
1415
- }
1444
+ const tag = resolveVersion(remoteEntry, external);
1445
+ if (tag === null) return;
1416
1446
  if (external.singleton) {
1417
- addSharedExternal(remoteEntry.name, external, remoteEntry);
1447
+ onSharedExternal(remoteEntry, external, sharedExternalContext(remoteEntry, external, tag));
1418
1448
  } else {
1419
- addScopedExternal(remoteEntry.name, external);
1449
+ addScopedExternal(remoteEntry, external, tag);
1420
1450
  }
1421
1451
  });
1422
1452
  }
1423
1453
  function addSharedChunksToStorage(remoteEntry) {
1424
1454
  if (!remoteEntry.chunks) return;
1425
1455
  config.log.debug(
1426
- 2,
1456
+ logStep,
1427
1457
  `Adding chunks for remote "${remoteEntry.name}", bundles: [${Object.keys(remoteEntry.chunks).join(", ")}]`
1428
1458
  );
1429
1459
  Object.entries(remoteEntry.chunks).forEach(([bundleName, chunks]) => {
1430
1460
  ports.sharedChunksRepo.addOrReplace(remoteEntry.name, bundleName, chunks);
1431
1461
  });
1432
1462
  }
1433
- function addSharedExternal(remoteName, sharedInfo, remoteEntry) {
1434
- let action = "skip";
1435
- const tag = sharedInfo.version ?? ports.versionCheck.smallestVersion(sharedInfo.requiredVersion);
1463
+ function addScopedExternal(remoteEntry, sharedInfo, tag) {
1464
+ ports.scopedExternalsRepo.addExternal(remoteEntry.name, sharedInfo.packageName, {
1465
+ tag,
1466
+ file: sharedInfo.outFileName,
1467
+ bundle: sharedInfo.bundle
1468
+ });
1469
+ }
1470
+ function resolveVersion(remoteEntry, external) {
1471
+ if (external.version && ports.versionCheck.isValidSemver(external.version)) {
1472
+ return external.version;
1473
+ }
1474
+ const errorMsg = `[${remoteEntry.name}][${external.packageName}] Version '${external.version}' is not a valid version.`;
1475
+ if (config.strict.strictExternalVersion) {
1476
+ config.log.error(logStep, errorMsg);
1477
+ throw new NFError(`Could not process remote '${remoteEntry.name}'`);
1478
+ }
1479
+ if (config.profile.skipInvalidExternalVersions) {
1480
+ config.log.warn(logStep, `${errorMsg} Skipping external.`);
1481
+ return null;
1482
+ }
1483
+ config.log.warn(logStep, errorMsg);
1484
+ return ports.versionCheck.smallestVersion(external.requiredVersion);
1485
+ }
1486
+ function sharedExternalContext(remoteEntry, sharedInfo, tag) {
1487
+ const scopeType = ports.sharedExternalsRepo.scopeType(sharedInfo.shareScope);
1436
1488
  const remote = {
1437
1489
  file: sharedInfo.outFileName,
1438
- name: remoteName,
1490
+ name: remoteEntry.name,
1439
1491
  bundle: sharedInfo.bundle,
1440
1492
  strictVersion: sharedInfo.strictVersion,
1441
1493
  cached: false,
1442
- requiredVersion: sharedInfo.requiredVersion || tag
1494
+ requiredVersion: scopeType === "strict" ? tag : sharedInfo.requiredVersion || tag
1443
1495
  };
1444
- const scopeType = ports.sharedExternalsRepo.scopeType(sharedInfo.shareScope);
1445
- if (scopeType === "strict") {
1446
- action = "share";
1447
- remote.requiredVersion = tag;
1448
- }
1449
1496
  const cached = ports.sharedExternalsRepo.tryGet(sharedInfo.packageName, sharedInfo.shareScope).orElse({ dirty: false, versions: [] });
1450
- const matchingVersion = cached.versions.find((version) => version.tag === sharedInfo.version);
1451
- let dirty = cached.dirty;
1452
- if (!!matchingVersion) {
1453
- if (remote.strictVersion && matchingVersion.remotes[0].requiredVersion !== remote.requiredVersion) {
1454
- const errorMsg = `[${remoteName}][${sharedInfo.packageName}@${sharedInfo.version}] Required version-range '${remote.requiredVersion}' does not match cached version-range '${matchingVersion.remotes[0].requiredVersion}'`;
1497
+ return {
1498
+ tag,
1499
+ remote,
1500
+ cached,
1501
+ scopeType,
1502
+ assertSameVersionCompatibility(matchingVersion) {
1503
+ if (!remote.strictVersion) return;
1504
+ if (matchingVersion.remotes[0].requiredVersion === remote.requiredVersion) return;
1505
+ const errorMsg = `[${remoteEntry.name}][${sharedInfo.packageName}@${sharedInfo.version}] Required version-range '${remote.requiredVersion}' does not match cached version-range '${matchingVersion.remotes[0].requiredVersion}'`;
1455
1506
  if (config.strict.strictExternalSameVersionCompatibility) {
1456
- config.log.error(2, errorMsg);
1507
+ config.log.error(logStep, errorMsg);
1457
1508
  throw new NFError(`Could not process remote '${remoteEntry.name}'`);
1458
1509
  }
1459
- config.log.warn(2, errorMsg);
1510
+ config.log.warn(logStep, errorMsg);
1511
+ },
1512
+ commit() {
1513
+ ports.sharedExternalsRepo.addOrUpdate(
1514
+ sharedInfo.packageName,
1515
+ {
1516
+ dirty: cached.dirty,
1517
+ versions: cached.versions.sort((a, b) => ports.versionCheck.compare(b.tag, a.tag))
1518
+ },
1519
+ sharedInfo.shareScope
1520
+ );
1460
1521
  }
1522
+ };
1523
+ }
1524
+ }
1525
+
1526
+ // src/lib/core/2.app/steps/process-remote-entries.ts
1527
+ function createProcessRemoteEntries(config, ports) {
1528
+ const storeRemoteEntry = createStoreRemoteEntry(config, ports, 2);
1529
+ return (remoteEntries) => {
1530
+ try {
1531
+ remoteEntries.forEach((remoteEntry) => storeRemoteEntry(remoteEntry, addSharedExternal));
1532
+ return Promise.resolve(remoteEntries);
1533
+ } catch (e) {
1534
+ return Promise.reject(e);
1535
+ }
1536
+ };
1537
+ function addSharedExternal(remoteEntry, _sharedInfo, {
1538
+ tag,
1539
+ remote,
1540
+ cached,
1541
+ scopeType,
1542
+ assertSameVersionCompatibility,
1543
+ commit
1544
+ }) {
1545
+ const matchingVersion = cached.versions.find((version) => version.tag === tag);
1546
+ if (matchingVersion) {
1547
+ assertSameVersionCompatibility(matchingVersion);
1461
1548
  if (!matchingVersion.host && !!remoteEntry?.host) {
1462
1549
  matchingVersion.host = true;
1463
1550
  matchingVersion.remotes.unshift(remote);
1464
1551
  } else matchingVersion.remotes.push(remote);
1465
1552
  } else {
1466
- if (scopeType !== "strict") dirty = true;
1467
- cached.versions.push({ tag, action, host: !!remoteEntry?.host, remotes: [remote] });
1553
+ if (scopeType !== "strict") cached.dirty = true;
1554
+ cached.versions.push({
1555
+ tag,
1556
+ action: scopeType === "strict" ? "share" : "skip",
1557
+ host: !!remoteEntry?.host,
1558
+ remotes: [remote]
1559
+ });
1468
1560
  }
1469
- ports.sharedExternalsRepo.addOrUpdate(
1470
- sharedInfo.packageName,
1471
- {
1472
- dirty,
1473
- versions: cached.versions.sort((a, b) => ports.versionCheck.compare(b.tag, a.tag))
1474
- },
1475
- sharedInfo.shareScope
1476
- );
1477
- }
1478
- function addScopedExternal(scope, sharedInfo) {
1479
- ports.scopedExternalsRepo.addExternal(scope, sharedInfo.packageName, {
1480
- tag: sharedInfo.version ?? ports.versionCheck.smallestVersion(sharedInfo.requiredVersion),
1481
- file: sharedInfo.outFileName,
1482
- bundle: sharedInfo.bundle
1483
- });
1561
+ commit();
1484
1562
  }
1485
1563
  }
1486
1564
 
1487
- // src/lib/1.domain/externals/external.contract.ts
1565
+ // src/lib/core/1.domain/externals/external.contract.ts
1488
1566
  var GLOBAL_SCOPE = "__GLOBAL__";
1489
1567
  var STRICT_SCOPE = "strict";
1490
1568
 
1491
- // src/lib/2.app/flows/init/determine-shared-externals.ts
1569
+ // src/lib/core/2.app/steps/determine-shared-externals.ts
1492
1570
  function createDetermineSharedExternals(config, ports) {
1493
1571
  return () => {
1494
1572
  for (const shareScope of ports.sharedExternalsRepo.getScopes()) {
@@ -1565,15 +1643,15 @@ function createDetermineSharedExternals(config, ports) {
1565
1643
  }
1566
1644
  }
1567
1645
 
1568
- // node_modules/.pnpm/@softarc+native-federation@4.1.3_typescript@5.9.3/node_modules/@softarc/native-federation/src/lib/domain/core/build-notification-options.contract.js
1569
- var BuildNotificationType;
1570
- (function(BuildNotificationType2) {
1646
+ // node_modules/.pnpm/@softarc+native-federation@4.2.0_typescript@6.0.3/node_modules/@softarc/native-federation/dist/lib/domain/core/build-notification-options.contract.js
1647
+ var BuildNotificationType = /* @__PURE__ */ ((BuildNotificationType2) => {
1571
1648
  BuildNotificationType2["COMPLETED"] = "federation-rebuild-complete";
1572
1649
  BuildNotificationType2["ERROR"] = "federation-rebuild-error";
1573
1650
  BuildNotificationType2["CANCELLED"] = "federation-rebuild-cancelled";
1574
- })(BuildNotificationType || (BuildNotificationType = {}));
1651
+ return BuildNotificationType2;
1652
+ })(BuildNotificationType || {});
1575
1653
 
1576
- // node_modules/.pnpm/@softarc+native-federation@4.1.3_typescript@5.9.3/node_modules/@softarc/native-federation/src/lib/domain/core/chunk.js
1654
+ // node_modules/.pnpm/@softarc+native-federation@4.2.0_typescript@6.0.3/node_modules/@softarc/native-federation/dist/lib/domain/core/chunk.js
1577
1655
  var CHUNK_PREFIX = "@nf-internal";
1578
1656
  function toChunkImport(fileName) {
1579
1657
  if (fileName.startsWith("./")) {
@@ -1583,7 +1661,7 @@ function toChunkImport(fileName) {
1583
1661
  return CHUNK_PREFIX + "/" + packageName;
1584
1662
  }
1585
1663
 
1586
- // src/lib/2.app/flows/init/generate-import-map.ts
1664
+ // src/lib/core/2.app/steps/generate-import-map.ts
1587
1665
  function createGenerateImportMap(config, ports) {
1588
1666
  return () => {
1589
1667
  const importMap = { imports: {} };
@@ -1608,7 +1686,12 @@ function createGenerateImportMap(config, ports) {
1608
1686
  });
1609
1687
  addToScope(importMap, remote.scopeUrl, createScopeModules(externals, remote.scopeUrl));
1610
1688
  for (const version of Object.values(externals)) {
1611
- addIntegrity(importMap, join(remote.scopeUrl, version.file), remoteName, version.file);
1689
+ addIntegrity(
1690
+ importMap,
1691
+ join(remote.scopeUrl, version.file),
1692
+ remoteName,
1693
+ version.file
1694
+ );
1612
1695
  }
1613
1696
  Object.values(externals).filter((e) => !!e.bundle).forEach((e) => registerBundleChunks(chunkBundles, remoteName, e.bundle));
1614
1697
  }
@@ -1817,7 +1900,7 @@ function createGenerateImportMap(config, ports) {
1817
1900
  }
1818
1901
  }
1819
1902
 
1820
- // src/lib/2.app/flows/init/commit-changes.ts
1903
+ // src/lib/core/2.app/steps/commit-changes.ts
1821
1904
  function createCommitChanges(config, ports) {
1822
1905
  return (importMap) => Promise.resolve(importMap).then(addToBrowser).then(persistRepositoryChanges);
1823
1906
  function addToBrowser(importMap) {
@@ -1834,7 +1917,7 @@ function createCommitChanges(config, ports) {
1834
1917
  }
1835
1918
  }
1836
1919
 
1837
- // src/lib/2.app/flows/init/expose-module-loader.ts
1920
+ // src/lib/core/2.app/steps/expose-module-loader.ts
1838
1921
  function createExposeModuleLoader(config, ports) {
1839
1922
  const loadRemoteModule = (remoteName, exposedModule) => {
1840
1923
  try {
@@ -1860,167 +1943,6 @@ function createExposeModuleLoader(config, ports) {
1860
1943
  return () => Promise.resolve(loadRemoteModule);
1861
1944
  }
1862
1945
 
1863
- // src/lib/5.di/flows/init.factory.ts
1864
- var createInitDrivers = ({
1865
- config,
1866
- adapters
1867
- }) => ({
1868
- getRemoteEntries: createGetRemoteEntries(config, adapters),
1869
- processRemoteEntries: createProcessRemoteEntries(config, adapters),
1870
- determineSharedExternals: createDetermineSharedExternals(config, adapters),
1871
- generateImportMap: createGenerateImportMap(config, adapters),
1872
- commitChanges: createCommitChanges(config, adapters),
1873
- exposeModuleLoader: createExposeModuleLoader(config, adapters)
1874
- });
1875
- var INIT_FLOW_FACTORY = ({
1876
- config,
1877
- adapters
1878
- }) => {
1879
- const flow = createInitDrivers({ config, adapters });
1880
- return {
1881
- flow,
1882
- adapters,
1883
- config
1884
- };
1885
- };
1886
- var createInitFlow = ({
1887
- flow,
1888
- adapters,
1889
- config
1890
- }) => {
1891
- return (remotesOrManifestUrl) => flow.getRemoteEntries(remotesOrManifestUrl).then(flow.processRemoteEntries).then(flow.determineSharedExternals).then(flow.generateImportMap).then(flow.commitChanges).then(flow.exposeModuleLoader).then((loadRemoteModule) => ({
1892
- config,
1893
- adapters,
1894
- loadRemoteModule
1895
- }));
1896
- };
1897
-
1898
- // src/lib/3.adapters/browser/browser.ts
1899
- var createBrowser = (config) => {
1900
- return {
1901
- setImportMapFn: config.setImportMapFn,
1902
- importModule: config.loadModuleFn
1903
- };
1904
- };
1905
-
1906
- // src/lib/3.adapters/checks/version.check.ts
1907
- var import_valid = __toESM(require_valid());
1908
- var import_satisfies = __toESM(require_satisfies());
1909
- var import_compare = __toESM(require_compare());
1910
- var import_min_version = __toESM(require_min_version());
1911
- var import_valid2 = __toESM(require_valid2());
1912
- var createVersionCheck = () => {
1913
- return {
1914
- isValidSemver: function(version) {
1915
- return (0, import_valid.default)(version) !== null;
1916
- },
1917
- isCompatible: function(version, range) {
1918
- return (0, import_satisfies.default)(version, range);
1919
- },
1920
- compare: function(versionA, versionB) {
1921
- return (0, import_compare.default)(versionA, versionB, true);
1922
- },
1923
- smallestVersion: function(versionRange) {
1924
- if (!(0, import_valid2.default)(versionRange)) return "0.0.0";
1925
- const minVersion = (0, import_min_version.default)(versionRange);
1926
- return minVersion?.raw ?? "0.0.0";
1927
- }
1928
- };
1929
- };
1930
-
1931
- // src/lib/utils/integrity.ts
1932
- var SUPPORTED_ALGORITHMS = {
1933
- "sha256-": "SHA-256",
1934
- "sha384-": "SHA-384",
1935
- "sha512-": "SHA-512"
1936
- };
1937
- var parseIntegrity = (integrity) => {
1938
- for (const prefix of Object.keys(SUPPORTED_ALGORITHMS)) {
1939
- if (integrity.startsWith(prefix)) {
1940
- return { algorithm: SUPPORTED_ALGORITHMS[prefix], expected: integrity };
1941
- }
1942
- }
1943
- return null;
1944
- };
1945
- var toBase64 = (bytes) => {
1946
- const view = new Uint8Array(bytes);
1947
- let bin = "";
1948
- for (let i = 0; i < view.length; i++) bin += String.fromCharCode(view[i]);
1949
- return btoa(bin);
1950
- };
1951
- var verifyIntegrity = async (bytes, integrity) => {
1952
- const parsed = parseIntegrity(integrity);
1953
- if (!parsed) {
1954
- throw new TypeError(
1955
- `Unsupported integrity prefix in '${integrity}'. Expected sha256-, sha384-, or sha512-.`
1956
- );
1957
- }
1958
- const subtle = typeof crypto !== "undefined" && crypto.subtle ? crypto.subtle : void 0;
1959
- if (!subtle) {
1960
- throw new Error("SubtleCrypto is not available in this environment.");
1961
- }
1962
- const digest = await subtle.digest(parsed.algorithm, bytes);
1963
- const actual = integrity.substring(0, integrity.indexOf("-") + 1) + toBase64(digest);
1964
- if (actual !== parsed.expected) {
1965
- throw new Error(`Integrity mismatch: expected ${parsed.expected}, got ${actual}`);
1966
- }
1967
- };
1968
-
1969
- // src/lib/3.adapters/http/manifest-provider.ts
1970
- var createManifestProvider = () => {
1971
- const ensureOk = (response) => {
1972
- if (!response.ok)
1973
- return Promise.reject(new NFError(`${response.status} - ${response.statusText}`));
1974
- return response;
1975
- };
1976
- const formatError = (manifestUrl) => (err) => {
1977
- const msg = err instanceof Error ? err.message : String(err);
1978
- throw new NFError(`Fetch of '${manifestUrl}' returned ${msg}`);
1979
- };
1980
- return {
1981
- provide: async function(remotesOrManifestUrl, opts = {}) {
1982
- if (typeof remotesOrManifestUrl !== "string") return Promise.resolve(remotesOrManifestUrl);
1983
- const parse = async (response) => {
1984
- if (!opts.integrity) return response.json();
1985
- const bytes = await response.arrayBuffer();
1986
- await verifyIntegrity(bytes, opts.integrity);
1987
- return JSON.parse(new TextDecoder().decode(bytes));
1988
- };
1989
- return fetch(remotesOrManifestUrl).then(ensureOk).then(parse).catch(formatError(remotesOrManifestUrl));
1990
- }
1991
- };
1992
- };
1993
-
1994
- // src/lib/3.adapters/http/remote-entry-provider.ts
1995
- var createRemoteEntryProvider = () => {
1996
- const ensureOk = (response) => {
1997
- if (!response.ok)
1998
- return Promise.reject(new Error(`${response.status} - ${response.statusText}`));
1999
- return response;
2000
- };
2001
- const fillEmptyFields = (remoteEntryUrl) => (remoteEntry) => {
2002
- if (!remoteEntry.exposes) remoteEntry.exposes = [];
2003
- if (!remoteEntry.shared) remoteEntry.shared = [];
2004
- if (!remoteEntry.url) remoteEntry.url = remoteEntryUrl;
2005
- return remoteEntry;
2006
- };
2007
- const formatError = (remoteEntryUrl) => (err) => {
2008
- const msg = err instanceof Error ? err.message : String(err);
2009
- throw new NFError(`Fetch of '${remoteEntryUrl}' returned ${msg}`);
2010
- };
2011
- return {
2012
- provide: async function(remoteEntryUrl, opts = {}) {
2013
- const parse = async (response) => {
2014
- if (!opts.integrity) return response.json();
2015
- const bytes = await response.arrayBuffer();
2016
- await verifyIntegrity(bytes, opts.integrity);
2017
- return JSON.parse(new TextDecoder().decode(bytes));
2018
- };
2019
- return fetch(remoteEntryUrl).then(ensureOk).then(parse).then(fillEmptyFields(remoteEntryUrl)).catch(formatError(remoteEntryUrl));
2020
- }
2021
- };
2022
- };
2023
-
2024
1946
  // src/lib/utils/optional.ts
2025
1947
  var Optional = class _Optional {
2026
1948
  constructor(item) {
@@ -2060,34 +1982,414 @@ var Optional = class _Optional {
2060
1982
  }
2061
1983
  };
2062
1984
 
2063
- // src/lib/3.adapters/storage/remote-info.repository.ts
2064
- var createRemoteInfoRepository = (config) => {
2065
- const STORAGE = config.storage("remotes", {});
2066
- if (config.clearStorage) STORAGE.clear();
2067
- const _cache = STORAGE.get() ?? {};
2068
- return {
2069
- contains: function(remoteName) {
2070
- return !!_cache[remoteName];
2071
- },
2072
- remove: function(remoteName) {
2073
- delete _cache[remoteName];
2074
- return this;
2075
- },
2076
- addOrUpdate: function(remoteName, remote) {
2077
- _cache[remoteName] = remote;
2078
- return this;
2079
- },
2080
- tryGet: function(remoteName) {
2081
- return Optional.of(_cache[remoteName]);
2082
- },
2083
- tryGetModule: function(remoteName, exposedModule) {
2084
- return Optional.of(_cache[remoteName]?.exposes.find((m) => m.moduleName === exposedModule)).map(
2085
- (m) => join(_cache[remoteName].scopeUrl, m.file)
2086
- );
2087
- },
2088
- getAll: function() {
2089
- return _cache;
2090
- },
1985
+ // src/lib/core/2.app/steps/get-remote-entry.ts
1986
+ var normalizeRemoteRef = (remote) => {
1987
+ if (!remote) return {};
1988
+ if (typeof remote === "string") return { name: remote };
1989
+ return remote;
1990
+ };
1991
+ function createGetRemoteEntry(config, ports) {
1992
+ return async (remoteEntryUrl, remote) => {
1993
+ const { name: remoteName, integrity } = normalizeRemoteRef(remote);
1994
+ if (!!remoteName && shouldSkipCachedRemote(remoteEntryUrl, remoteName)) {
1995
+ config.log.debug(7, `Found remote '${remoteName}' in storage, omitting fetch.`);
1996
+ return Optional.empty();
1997
+ }
1998
+ try {
1999
+ const remoteEntry = integrity ? await ports.remoteEntryProvider.provide(remoteEntryUrl, { integrity }) : await ports.remoteEntryProvider.provide(remoteEntryUrl);
2000
+ config.log.debug(
2001
+ 7,
2002
+ `[${remoteEntry.name}] Fetched from '${remoteEntry.url}', exposing: ${JSON.stringify(remoteEntry.exposes)}`
2003
+ );
2004
+ if (!!remoteName && remoteEntry.name !== remoteName) {
2005
+ const errorMsg = `Fetched remote '${remoteEntry.name}' does not match requested '${remoteName}'.`;
2006
+ if (config.strict.strictRemoteEntry) {
2007
+ config.log.error(7, errorMsg);
2008
+ throw new NFError("Could not fetch remote entry");
2009
+ }
2010
+ config.log.warn(7, errorMsg + " Omitting expected name.");
2011
+ }
2012
+ if (ports.remoteInfoRepo.contains(remoteEntry.name)) {
2013
+ remoteEntry.override = true;
2014
+ config.log.debug(7, `Overriding existing remote '${remoteName}' with '${remoteEntryUrl}'.`);
2015
+ }
2016
+ return Optional.of(checkForSSE(remoteEntry));
2017
+ } catch (error) {
2018
+ config.log.error(
2019
+ 7,
2020
+ `[${remoteName ?? "unknown"}] Could not fetch remoteEntry from ${remoteEntryUrl}.`,
2021
+ error
2022
+ );
2023
+ return Promise.reject(
2024
+ new NFError(`[${remoteName ?? remoteEntryUrl}] Could not fetch remoteEntry.`)
2025
+ );
2026
+ }
2027
+ };
2028
+ function shouldSkipCachedRemote(remoteEntryUrl, remoteName) {
2029
+ return ports.remoteInfoRepo.tryGet(remoteName).map(
2030
+ (cachedRemoteInfo) => config.profile.overrideCachedRemotes !== "always" || !config.profile.overrideCachedRemotesIfURLMatches && remoteEntryUrl === join(cachedRemoteInfo.scopeUrl, "remoteEntry.json")
2031
+ ).orElse(false);
2032
+ }
2033
+ function checkForSSE(entry) {
2034
+ if (config.sse) {
2035
+ if (entry.buildNotificationsEndpoint) {
2036
+ ports.sse.watchRemoteBuilds(
2037
+ join(getScope(entry.url), entry.buildNotificationsEndpoint)
2038
+ );
2039
+ config.log.debug(7, `Registered SSE endpoint of remote '${entry.name}' `);
2040
+ } else {
2041
+ config.log.debug(7, `Remote ${entry.name} has no defined 'buildNotificationsEndpoint'`);
2042
+ }
2043
+ }
2044
+ return entry;
2045
+ }
2046
+ }
2047
+
2048
+ // src/lib/core/2.app/steps/update-cache.ts
2049
+ function createUpdateCache(config, ports) {
2050
+ const storeRemoteEntry = createStoreRemoteEntry(config, ports, 8);
2051
+ return (remoteEntry) => {
2052
+ try {
2053
+ const actions = {};
2054
+ storeRemoteEntry(remoteEntry, (entry, external, ctx) => {
2055
+ const { action, sharedVersion } = resolveSharedExternal(entry, external, ctx);
2056
+ actions[external.packageName] = { action };
2057
+ if (action === "skip" && external.shareScope && sharedVersion?.remotes[0]?.file) {
2058
+ actions[external.packageName].override = resolveOverrideUrl(
2059
+ entry,
2060
+ external,
2061
+ sharedVersion
2062
+ );
2063
+ }
2064
+ });
2065
+ return Promise.resolve({ entry: remoteEntry, actions });
2066
+ } catch (error) {
2067
+ return Promise.reject(error);
2068
+ }
2069
+ };
2070
+ function resolveSharedExternal(remoteEntry, sharedInfo, {
2071
+ tag,
2072
+ remote,
2073
+ cached,
2074
+ scopeType,
2075
+ assertSameVersionCompatibility,
2076
+ commit
2077
+ }) {
2078
+ let action = scopeType === "strict" ? "share" : "skip";
2079
+ const sharedVersion = cached.versions.find((c) => c.action === "share");
2080
+ const isCompatible = !sharedVersion || ports.versionCheck.isCompatible(sharedVersion.tag, remote.requiredVersion);
2081
+ if (action === "skip" && !isCompatible && remote.strictVersion) {
2082
+ action = "scope";
2083
+ const errorMsg = `[${sharedInfo.shareScope ?? GLOBAL_SCOPE}][${remoteEntry.name}] ${sharedInfo.packageName}@${sharedInfo.version} Is not compatible with existing ${sharedInfo.packageName}@${sharedVersion.tag} requiredRange '${sharedVersion.remotes[0]?.requiredVersion}'`;
2084
+ if (config.strict.strictExternalCompatibility) {
2085
+ config.log.error(8, errorMsg);
2086
+ throw new NFError(`Could not process remote '${remoteEntry.name}'`);
2087
+ }
2088
+ config.log.warn(8, errorMsg);
2089
+ }
2090
+ const matchingVersion = cached.versions.find((cached2) => cached2.tag === tag);
2091
+ if (matchingVersion) {
2092
+ assertSameVersionCompatibility(matchingVersion);
2093
+ matchingVersion.remotes.push(remote);
2094
+ } else {
2095
+ if (!sharedVersion) action = "share";
2096
+ remote.cached = action !== "skip";
2097
+ cached.versions.push({ tag, action, host: false, remotes: [remote] });
2098
+ }
2099
+ commit();
2100
+ return { action, sharedVersion };
2101
+ }
2102
+ function resolveOverrideUrl(remoteEntry, external, sharedVersion) {
2103
+ return ports.remoteInfoRepo.tryGet(sharedVersion.remotes[0].name).map((remote) => join(remote.scopeUrl, sharedVersion.remotes[0].file)).orThrow(() => {
2104
+ config.log.error(
2105
+ 8,
2106
+ `[${external.shareScope ?? GLOBAL_SCOPE}][${remoteEntry.name}][${external.packageName}@${external.version}][override] Remote name not found in cache.`
2107
+ );
2108
+ return new NFError(
2109
+ `Could not find override url from remote ${sharedVersion.remotes[0].name}`
2110
+ );
2111
+ });
2112
+ }
2113
+ }
2114
+
2115
+ // src/lib/core/2.app/steps/convert-to-import-map.ts
2116
+ function createConvertToImportMap({ log }, ports) {
2117
+ return ({ entry, actions }) => {
2118
+ const importMap = { imports: {} };
2119
+ addExternals(entry, actions, importMap);
2120
+ addRemoteInfos(entry, importMap);
2121
+ log.debug(9, `[${entry.name}] Processed actions:`, actions);
2122
+ return Promise.resolve(importMap);
2123
+ };
2124
+ function addExternals(remoteEntry, actions, importMap) {
2125
+ if (!remoteEntry.shared) {
2126
+ return;
2127
+ }
2128
+ const remoteEntryScope = getScope(remoteEntry.url);
2129
+ const integrityMap = remoteEntry.integrity;
2130
+ const chunkBundles = /* @__PURE__ */ new Set(["mapping-or-exposed"]);
2131
+ remoteEntry.shared.forEach((external) => {
2132
+ if (!external.singleton) {
2133
+ const url2 = join(remoteEntryScope, external.outFileName);
2134
+ addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2135
+ addIntegrity(importMap, url2, integrityMap, external.outFileName);
2136
+ if (external?.bundle) chunkBundles.add(external?.bundle);
2137
+ return;
2138
+ }
2139
+ if (!actions[external.packageName]) {
2140
+ log.warn(
2141
+ 9,
2142
+ `[${remoteEntry.name}] No action defined for shared external '${external.packageName}', skipping.`
2143
+ );
2144
+ return;
2145
+ }
2146
+ if (actions[external.packageName].action === "skip") {
2147
+ if (!external.shareScope) return;
2148
+ if (actions[external.packageName].override) {
2149
+ addToScopes(
2150
+ remoteEntryScope,
2151
+ external.packageName,
2152
+ actions[external.packageName].override,
2153
+ importMap
2154
+ );
2155
+ return;
2156
+ }
2157
+ }
2158
+ if (external?.bundle) chunkBundles.add(external?.bundle);
2159
+ if (actions[external.packageName].action === "scope") {
2160
+ const url2 = join(remoteEntryScope, external.outFileName);
2161
+ addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2162
+ addIntegrity(importMap, url2, integrityMap, external.outFileName);
2163
+ return;
2164
+ }
2165
+ if (external.shareScope) {
2166
+ const url2 = join(remoteEntryScope, external.outFileName);
2167
+ addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2168
+ addIntegrity(importMap, url2, integrityMap, external.outFileName);
2169
+ return;
2170
+ }
2171
+ const url = join(remoteEntryScope, external.outFileName);
2172
+ importMap.imports[external.packageName] = url;
2173
+ addIntegrity(importMap, url, integrityMap, external.outFileName);
2174
+ });
2175
+ addChunkImports(importMap, remoteEntry, remoteEntryScope, chunkBundles);
2176
+ }
2177
+ function addToScopes(scope, packageName, url, importMap) {
2178
+ if (!importMap.scopes) importMap.scopes = {};
2179
+ if (!importMap.scopes[scope]) importMap.scopes[scope] = {};
2180
+ importMap.scopes[scope][packageName] = url;
2181
+ }
2182
+ function addRemoteInfos(remoteEntry, importMap) {
2183
+ if (!remoteEntry.exposes) return;
2184
+ const scope = getScope(remoteEntry.url);
2185
+ remoteEntry.exposes.forEach((exposed) => {
2186
+ const moduleName = join(remoteEntry.name, exposed.key);
2187
+ const moduleUrl = join(scope, exposed.outFileName);
2188
+ importMap.imports[moduleName] = moduleUrl;
2189
+ addIntegrity(importMap, moduleUrl, remoteEntry.integrity, exposed.outFileName);
2190
+ });
2191
+ }
2192
+ function addChunkImports(importMap, remoteEntry, remoteEntryScope, chunkBundles) {
2193
+ Array.from(chunkBundles).forEach((bundleName) => {
2194
+ ports.sharedChunksRepo.tryGet(remoteEntry.name, bundleName).ifPresent((files) => {
2195
+ files.forEach((file) => {
2196
+ const url = join(remoteEntryScope, file);
2197
+ addToScopes(remoteEntryScope, toChunkImport(file), url, importMap);
2198
+ addIntegrity(importMap, url, remoteEntry.integrity, file);
2199
+ });
2200
+ });
2201
+ });
2202
+ return importMap;
2203
+ }
2204
+ function addIntegrity(importMap, url, integrityMap, file) {
2205
+ const hash = integrityMap?.[file];
2206
+ if (!hash) return;
2207
+ if (!importMap.integrity) importMap.integrity = {};
2208
+ importMap.integrity[url] = hash;
2209
+ }
2210
+ }
2211
+
2212
+ // src/lib/core/5.di/init.factory.ts
2213
+ var createInitDrivers = ({
2214
+ config,
2215
+ adapters
2216
+ }) => ({
2217
+ getRemoteEntries: createGetRemoteEntries(config, adapters),
2218
+ processRemoteEntries: createProcessRemoteEntries(config, adapters),
2219
+ determineSharedExternals: createDetermineSharedExternals(config, adapters),
2220
+ generateImportMap: createGenerateImportMap(config, adapters),
2221
+ commitChanges: createCommitChanges(config, adapters),
2222
+ exposeModuleLoader: createExposeModuleLoader(config, adapters),
2223
+ getRemoteEntry: createGetRemoteEntry(config, adapters),
2224
+ updateCache: createUpdateCache(config, adapters),
2225
+ convertToImportMap: createConvertToImportMap(config, adapters)
2226
+ });
2227
+ var INIT_FLOW_FACTORY = ({
2228
+ config,
2229
+ adapters
2230
+ }) => {
2231
+ const flow = createInitDrivers({ config, adapters });
2232
+ return {
2233
+ flow,
2234
+ adapters,
2235
+ config
2236
+ };
2237
+ };
2238
+
2239
+ // src/lib/core/3.adapters/browser/browser.ts
2240
+ var createBrowser = (config) => {
2241
+ return {
2242
+ setImportMapFn: config.setImportMapFn,
2243
+ importModule: config.loadModuleFn
2244
+ };
2245
+ };
2246
+
2247
+ // src/lib/core/3.adapters/checks/version.check.ts
2248
+ var import_valid = __toESM(require_valid());
2249
+ var import_satisfies = __toESM(require_satisfies());
2250
+ var import_compare = __toESM(require_compare());
2251
+ var import_min_version = __toESM(require_min_version());
2252
+ var import_valid2 = __toESM(require_valid2());
2253
+ var createVersionCheck = () => {
2254
+ return {
2255
+ isValidSemver: function(version) {
2256
+ return (0, import_valid.default)(version) !== null;
2257
+ },
2258
+ isCompatible: function(version, range) {
2259
+ return (0, import_satisfies.default)(version, range);
2260
+ },
2261
+ compare: function(versionA, versionB) {
2262
+ return (0, import_compare.default)(versionA, versionB, true);
2263
+ },
2264
+ smallestVersion: function(versionRange) {
2265
+ if (!(0, import_valid2.default)(versionRange)) return "0.0.0";
2266
+ const minVersion = (0, import_min_version.default)(versionRange);
2267
+ return minVersion?.raw ?? "0.0.0";
2268
+ }
2269
+ };
2270
+ };
2271
+
2272
+ // src/lib/utils/integrity.ts
2273
+ var SUPPORTED_ALGORITHMS = {
2274
+ "sha256-": "SHA-256",
2275
+ "sha384-": "SHA-384",
2276
+ "sha512-": "SHA-512"
2277
+ };
2278
+ var parseIntegrity = (integrity) => {
2279
+ for (const prefix of Object.keys(SUPPORTED_ALGORITHMS)) {
2280
+ if (integrity.startsWith(prefix)) {
2281
+ return { algorithm: SUPPORTED_ALGORITHMS[prefix], expected: integrity };
2282
+ }
2283
+ }
2284
+ return null;
2285
+ };
2286
+ var toBase64 = (bytes) => {
2287
+ const view = new Uint8Array(bytes);
2288
+ let bin = "";
2289
+ for (let i = 0; i < view.length; i++) bin += String.fromCharCode(view[i]);
2290
+ return btoa(bin);
2291
+ };
2292
+ var verifyIntegrity = async (bytes, integrity) => {
2293
+ const parsed = parseIntegrity(integrity);
2294
+ if (!parsed) {
2295
+ throw new TypeError(
2296
+ `Unsupported integrity prefix in '${integrity}'. Expected sha256-, sha384-, or sha512-.`
2297
+ );
2298
+ }
2299
+ const subtle = typeof crypto !== "undefined" && crypto.subtle ? crypto.subtle : void 0;
2300
+ if (!subtle) {
2301
+ throw new Error("SubtleCrypto is not available in this environment.");
2302
+ }
2303
+ const digest = await subtle.digest(parsed.algorithm, bytes);
2304
+ const actual = integrity.substring(0, integrity.indexOf("-") + 1) + toBase64(digest);
2305
+ if (actual !== parsed.expected) {
2306
+ throw new Error(`Integrity mismatch: expected ${parsed.expected}, got ${actual}`);
2307
+ }
2308
+ };
2309
+
2310
+ // src/lib/core/3.adapters/http/manifest-provider.ts
2311
+ var createManifestProvider = () => {
2312
+ const ensureOk = (response) => {
2313
+ if (!response.ok)
2314
+ return Promise.reject(new NFError(`${response.status} - ${response.statusText}`));
2315
+ return response;
2316
+ };
2317
+ const formatError = (manifestUrl) => (err) => {
2318
+ const msg = err instanceof Error ? err.message : String(err);
2319
+ throw new NFError(`Fetch of '${manifestUrl}' returned ${msg}`);
2320
+ };
2321
+ return {
2322
+ provide: async function(remotesOrManifestUrl, opts = {}) {
2323
+ if (typeof remotesOrManifestUrl !== "string") return Promise.resolve(remotesOrManifestUrl);
2324
+ const parse = async (response) => {
2325
+ if (!opts.integrity) return response.json();
2326
+ const bytes = await response.arrayBuffer();
2327
+ await verifyIntegrity(bytes, opts.integrity);
2328
+ return JSON.parse(new TextDecoder().decode(bytes));
2329
+ };
2330
+ return fetch(remotesOrManifestUrl).then(ensureOk).then(parse).catch(formatError(remotesOrManifestUrl));
2331
+ }
2332
+ };
2333
+ };
2334
+
2335
+ // src/lib/core/3.adapters/http/remote-entry-provider.ts
2336
+ var createRemoteEntryProvider = () => {
2337
+ const ensureOk = (response) => {
2338
+ if (!response.ok)
2339
+ return Promise.reject(new Error(`${response.status} - ${response.statusText}`));
2340
+ return response;
2341
+ };
2342
+ const fillEmptyFields = (remoteEntryUrl) => (remoteEntry) => {
2343
+ if (!remoteEntry.exposes) remoteEntry.exposes = [];
2344
+ if (!remoteEntry.shared) remoteEntry.shared = [];
2345
+ if (!remoteEntry.url) remoteEntry.url = remoteEntryUrl;
2346
+ return remoteEntry;
2347
+ };
2348
+ const formatError = (remoteEntryUrl) => (err) => {
2349
+ const msg = err instanceof Error ? err.message : String(err);
2350
+ throw new NFError(`Fetch of '${remoteEntryUrl}' returned ${msg}`);
2351
+ };
2352
+ return {
2353
+ provide: async function(remoteEntryUrl, opts = {}) {
2354
+ const parse = async (response) => {
2355
+ if (!opts.integrity) return response.json();
2356
+ const bytes = await response.arrayBuffer();
2357
+ await verifyIntegrity(bytes, opts.integrity);
2358
+ return JSON.parse(new TextDecoder().decode(bytes));
2359
+ };
2360
+ return fetch(remoteEntryUrl).then(ensureOk).then(parse).then(fillEmptyFields(remoteEntryUrl)).catch(formatError(remoteEntryUrl));
2361
+ }
2362
+ };
2363
+ };
2364
+
2365
+ // src/lib/core/3.adapters/storage/remote-info.repository.ts
2366
+ var createRemoteInfoRepository = (config) => {
2367
+ const STORAGE = config.storage("remotes", {});
2368
+ if (config.clearStorage) STORAGE.clear();
2369
+ const _cache = STORAGE.get() ?? {};
2370
+ return {
2371
+ contains: function(remoteName) {
2372
+ return !!_cache[remoteName];
2373
+ },
2374
+ remove: function(remoteName) {
2375
+ delete _cache[remoteName];
2376
+ return this;
2377
+ },
2378
+ addOrUpdate: function(remoteName, remote) {
2379
+ _cache[remoteName] = remote;
2380
+ return this;
2381
+ },
2382
+ tryGet: function(remoteName) {
2383
+ return Optional.of(_cache[remoteName]);
2384
+ },
2385
+ tryGetModule: function(remoteName, exposedModule) {
2386
+ return Optional.of(_cache[remoteName]?.exposes.find((m) => m.moduleName === exposedModule)).map(
2387
+ (m) => join(_cache[remoteName].scopeUrl, m.file)
2388
+ );
2389
+ },
2390
+ getAll: function() {
2391
+ return _cache;
2392
+ },
2091
2393
  commit: function() {
2092
2394
  STORAGE.set(_cache);
2093
2395
  return this;
@@ -2095,7 +2397,7 @@ var createRemoteInfoRepository = (config) => {
2095
2397
  };
2096
2398
  };
2097
2399
 
2098
- // src/lib/3.adapters/storage/scoped-externals.repository.ts
2400
+ // src/lib/core/3.adapters/storage/scoped-externals.repository.ts
2099
2401
  var createScopedExternalsRepository = (config) => {
2100
2402
  const STORAGE = config.storage("scoped-externals", {});
2101
2403
  if (config.clearStorage) STORAGE.clear();
@@ -2123,7 +2425,7 @@ var createScopedExternalsRepository = (config) => {
2123
2425
  };
2124
2426
  };
2125
2427
 
2126
- // src/lib/3.adapters/storage/shared-externals.repository.ts
2428
+ // src/lib/core/3.adapters/storage/shared-externals.repository.ts
2127
2429
  var createSharedExternalsRepository = (config) => {
2128
2430
  const STORAGE = config.storage(
2129
2431
  "shared-externals",
@@ -2189,7 +2491,7 @@ var createSharedExternalsRepository = (config) => {
2189
2491
  };
2190
2492
  };
2191
2493
 
2192
- // src/lib/3.adapters/browser/sse-handler.ts
2494
+ // src/lib/core/3.adapters/browser/sse-handler.ts
2193
2495
  var createSSEHandler = (config) => {
2194
2496
  const subscribers = [];
2195
2497
  return {
@@ -2215,670 +2517,351 @@ var createSSEHandler = (config) => {
2215
2517
  };
2216
2518
  };
2217
2519
 
2218
- // src/lib/utils/clone-entry.ts
2219
- var cloneEntry = (name, raw) => {
2220
- try {
2221
- if (typeof structuredClone === "function") {
2222
- return structuredClone(raw);
2223
- }
2224
- } catch {
2225
- }
2226
- try {
2227
- return JSON.parse(JSON.stringify(raw));
2228
- } catch {
2229
- }
2230
- throw new NFError(`Could not clone entry '${String(name)}'`);
2231
- };
2232
-
2233
- // src/lib/3.adapters/storage/chunk.repository.ts
2520
+ // src/lib/core/3.adapters/storage/chunk.repository.ts
2234
2521
  var createChunkRepository = (config) => {
2235
2522
  const STORAGE = config.storage("shared-chunks", {});
2236
2523
  if (config.clearStorage) STORAGE.clear();
2237
2524
  const _cache = STORAGE.get() ?? {};
2238
2525
  return {
2239
2526
  addOrReplace: function(remoteName, bundleName, chunks) {
2240
- if (!_cache[remoteName]) _cache[remoteName] = {};
2241
- _cache[remoteName][bundleName] = chunks;
2242
- return this;
2243
- },
2244
- tryGet: function(remoteName, bundleName) {
2245
- return Optional.of(_cache[remoteName]?.[bundleName]);
2246
- },
2247
- commit: function() {
2248
- STORAGE.set(_cache);
2249
- return this;
2250
- }
2251
- };
2252
- };
2253
-
2254
- // src/lib/5.di/driving.factory.ts
2255
- var createDriving = (config) => {
2256
- const adapters = {
2257
- versionCheck: createVersionCheck(),
2258
- manifestProvider: createManifestProvider(),
2259
- remoteEntryProvider: createRemoteEntryProvider(),
2260
- remoteInfoRepo: createRemoteInfoRepository(config),
2261
- scopedExternalsRepo: createScopedExternalsRepository(config),
2262
- sharedExternalsRepo: createSharedExternalsRepository(config),
2263
- sharedChunksRepo: createChunkRepository(config),
2264
- browser: createBrowser(config),
2265
- sse: createSSEHandler(config)
2266
- };
2267
- return { adapters, config };
2268
- };
2269
-
2270
- // src/lib/4.config/import-map/trusted-types.ts
2271
- var IMPORT_MAP_KEYS = /* @__PURE__ */ new Set(["imports", "scopes", "integrity"]);
2272
- var validateImportMapJSON = (input) => {
2273
- let parsed;
2274
- try {
2275
- parsed = JSON.parse(input);
2276
- } catch {
2277
- throw new TypeError("[nf-orchestrator] trusted-types: import map is not valid JSON");
2278
- }
2279
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
2280
- throw new TypeError("[nf-orchestrator] trusted-types: import map must be a plain object");
2281
- }
2282
- for (const key of Object.keys(parsed)) {
2283
- if (!IMPORT_MAP_KEYS.has(key)) {
2284
- throw new TypeError(`[nf-orchestrator] trusted-types: unexpected key "${key}" in import map`);
2285
- }
2286
- }
2287
- return input;
2288
- };
2289
- var validateScriptURL = (input) => {
2290
- const base = typeof location !== "undefined" ? location.href : "http://localhost/";
2291
- let url;
2292
- try {
2293
- url = new URL(input, base);
2294
- } catch {
2295
- throw new TypeError(`[nf-orchestrator] trusted-types: invalid script URL "${input}"`);
2296
- }
2297
- if (url.protocol !== "https:" && url.protocol !== "http:") {
2298
- throw new TypeError(
2299
- `[nf-orchestrator] trusted-types: disallowed protocol "${url.protocol}" for script URL`
2300
- );
2301
- }
2302
- return input;
2303
- };
2304
- var passThroughPolicy = {
2305
- createScript: (input) => input,
2306
- createScriptURL: (input) => input
2307
- };
2308
- var cachedPolicy = null;
2309
- var getTrustedTypesPolicy = (name = "nfo") => {
2310
- if (name === false) return passThroughPolicy;
2311
- if (cachedPolicy) return cachedPolicy;
2312
- const factory = globalThis.trustedTypes;
2313
- if (!factory) {
2314
- cachedPolicy = passThroughPolicy;
2315
- return cachedPolicy;
2316
- }
2317
- const native = factory.createPolicy(name, {
2318
- createScript: validateImportMapJSON,
2319
- createScriptURL: validateScriptURL
2320
- });
2321
- cachedPolicy = {
2322
- createScript: (input) => native.createScript(input),
2323
- createScriptURL: (input) => native.createScriptURL(input)
2324
- };
2325
- return cachedPolicy;
2326
- };
2327
-
2328
- // src/lib/4.config/import-map/replace-in-dom.ts
2329
- var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts = {}) => {
2330
- if (opts?.override) {
2331
- document.head.querySelectorAll(`script[type="${mapType}"]`).forEach((importMap2) => importMap2.remove());
2332
- }
2333
- const policy = getTrustedTypesPolicy(trustedTypesPolicyName);
2334
- document.head.appendChild(
2335
- Object.assign(document.createElement("script"), {
2336
- type: mapType,
2337
- text: policy.createScript(JSON.stringify(importMap))
2338
- })
2339
- );
2340
- return Promise.resolve(importMap);
2341
- };
2342
-
2343
- // src/lib/4.config/import-map/use-default.ts
2344
- var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
2345
- loadModuleFn: (url) => {
2346
- const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);
2347
- return import(
2348
- /* @vite-ignore */
2349
- trusted
2350
- );
2351
- },
2352
- setImportMapFn: replaceInDOM("importmap", trustedTypesPolicyName),
2353
- reloadBrowserFn: () => {
2354
- window.location.reload();
2355
- }
2356
- });
2357
-
2358
- // src/lib/4.config/import-map/import-map.config.ts
2359
- var createImportMapConfig = (o) => {
2360
- const fallback = useDefaultImportMap(o.trustedTypesPolicyName);
2361
- return {
2362
- setImportMapFn: o.setImportMapFn ?? fallback.setImportMapFn,
2363
- loadModuleFn: o.loadModuleFn ?? fallback.loadModuleFn,
2364
- reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn
2365
- };
2366
- };
2367
-
2368
- // src/lib/4.config/host/host.config.ts
2369
- var createHostConfig = (override) => {
2370
- const extras = override?.manifestIntegrity ? { manifestIntegrity: override.manifestIntegrity } : {};
2371
- if (!override?.hostRemoteEntry) {
2372
- return { hostRemoteEntry: false, ...extras };
2373
- }
2374
- if (typeof override.hostRemoteEntry === "string") {
2375
- return {
2376
- hostRemoteEntry: {
2377
- name: "__NF-HOST__",
2378
- url: override.hostRemoteEntry
2379
- },
2380
- ...extras
2381
- };
2382
- }
2383
- return {
2384
- hostRemoteEntry: {
2385
- name: "__NF-HOST__",
2386
- ...override.hostRemoteEntry
2387
- },
2388
- ...extras
2389
- };
2390
- };
2391
-
2392
- // src/lib/4.config/logging/noop.logger.ts
2393
- var noopLogger = {
2394
- debug: () => {
2395
- },
2396
- error: () => {
2397
- },
2398
- warn: () => {
2399
- }
2400
- };
2401
-
2402
- // src/lib/2.app/config/log.contract.ts
2403
- var LogLevel = {
2404
- debug: 0,
2405
- warn: 1,
2406
- error: 2
2407
- };
2408
-
2409
- // src/lib/4.config/logging/log.handler.ts
2410
- var createLogHandler = (logger, logLevel) => {
2411
- const logTypes = Object.keys(LogLevel).filter((key) => isNaN(Number(key)));
2412
- return logTypes.reduce(
2413
- (acc, logMessageType) => {
2414
- return {
2415
- ...acc,
2416
- [logMessageType]: (step, message, details) => {
2417
- if (LogLevel[logMessageType] >= LogLevel[logLevel]) {
2418
- logger[logMessageType](step, message, details);
2419
- }
2420
- }
2421
- };
2422
- },
2423
- { level: logLevel }
2424
- );
2425
- };
2426
-
2427
- // src/lib/4.config/logging/log.config.ts
2428
- var createLogConfig = ({ logger, logLevel, sse }) => ({
2429
- log: createLogHandler(logger ?? noopLogger, logLevel ?? "error"),
2430
- sse: !!sse
2431
- });
2432
-
2433
- // src/lib/4.config/storage/global-this.storage.ts
2434
- var globalThisStorageEntry = (namespace) => (key, initialValue) => {
2435
- if (!globalThis[namespace]) {
2436
- globalThis[namespace] = {};
2437
- }
2438
- const storage = globalThis[namespace];
2439
- if (!storage[key]) storage[key] = initialValue;
2440
- const entry = {
2441
- get() {
2442
- return cloneEntry(key, storage[key]);
2527
+ if (!_cache[remoteName]) _cache[remoteName] = {};
2528
+ _cache[remoteName][bundleName] = chunks;
2529
+ return this;
2443
2530
  },
2444
- set(value) {
2445
- storage[key] = cloneEntry(key, value);
2446
- return entry;
2531
+ tryGet: function(remoteName, bundleName) {
2532
+ return Optional.of(_cache[remoteName]?.[bundleName]);
2447
2533
  },
2448
- clear() {
2449
- storage[key] = cloneEntry(key, initialValue);
2534
+ commit: function() {
2535
+ STORAGE.set(_cache);
2450
2536
  return this;
2451
2537
  }
2452
2538
  };
2453
- return entry;
2454
- };
2455
-
2456
- // src/lib/4.config/storage/storage.config.ts
2457
- var createStorageConfig = (override) => ({
2458
- storage: override.storage ? override.storage(override.storageNamespace ?? "__NATIVE_FEDERATION__") : globalThisStorageEntry(override.storageNamespace ?? "__NATIVE_FEDERATION__"),
2459
- clearStorage: override.clearStorage ?? false
2460
- });
2461
-
2462
- // src/lib/4.config/mode/default.profile.ts
2463
- var defaultProfile = {
2464
- latestSharedExternal: false,
2465
- overrideCachedRemotes: "init-only",
2466
- overrideCachedRemotesIfURLMatches: false
2467
2539
  };
2468
2540
 
2469
- // src/lib/4.config/mode/mode.config.ts
2470
- var createModeConfig = (override) => {
2471
- const strictnessConfig = typeof override.strict === "boolean" ? {
2472
- strictRemoteEntry: override.strict,
2473
- strictExternalCompatibility: override.strict,
2474
- strictExternalSameVersionCompatibility: override.strict,
2475
- strictExternalVersion: override.strict,
2476
- strictImportMap: override.strict
2477
- } : {
2478
- strictRemoteEntry: override.strict?.strictRemoteEntry ?? false,
2479
- strictExternalCompatibility: override.strict?.strictExternalCompatibility ?? false,
2480
- strictExternalSameVersionCompatibility: override.strict?.strictExternalSameVersionCompatibility ?? false,
2481
- strictExternalVersion: override.strict?.strictExternalVersion ?? false,
2482
- strictImportMap: override.strict?.strictImportMap ?? false
2483
- };
2484
- return {
2485
- strict: strictnessConfig,
2486
- profile: { ...defaultProfile, ...override.profile ?? {} }
2541
+ // src/lib/core/5.di/driving.factory.ts
2542
+ var createDriving = (config) => {
2543
+ const adapters = {
2544
+ versionCheck: createVersionCheck(),
2545
+ manifestProvider: createManifestProvider(),
2546
+ remoteEntryProvider: createRemoteEntryProvider(),
2547
+ remoteInfoRepo: createRemoteInfoRepository(config),
2548
+ scopedExternalsRepo: createScopedExternalsRepository(config),
2549
+ sharedExternalsRepo: createSharedExternalsRepository(config),
2550
+ sharedChunksRepo: createChunkRepository(config),
2551
+ browser: createBrowser(config),
2552
+ sse: createSSEHandler(config)
2487
2553
  };
2554
+ return { adapters, config };
2488
2555
  };
2489
2556
 
2490
- // src/lib/5.di/config.factory.ts
2491
- var createConfigHandlers = (overrides) => ({
2492
- ...createImportMapConfig(overrides),
2493
- ...createHostConfig(overrides),
2494
- ...createLogConfig(overrides),
2495
- ...createStorageConfig(overrides),
2496
- ...createModeConfig(overrides)
2497
- });
2498
-
2499
- // src/lib/2.app/flows/dynamic-init/convert-to-import-map.ts
2500
- function createConvertToImportMap({ log }, ports) {
2501
- return ({ entry, actions }) => {
2502
- const importMap = { imports: {} };
2503
- addExternals(entry, actions, importMap);
2504
- addRemoteInfos(entry, importMap);
2505
- log.debug(9, `[${entry.name}] Processed actions:`, actions);
2506
- return Promise.resolve(importMap);
2507
- };
2508
- function addExternals(remoteEntry, actions, importMap) {
2509
- if (!remoteEntry.shared) {
2510
- return;
2511
- }
2512
- const remoteEntryScope = getScope(remoteEntry.url);
2513
- const integrityMap = remoteEntry.integrity;
2514
- const chunkBundles = /* @__PURE__ */ new Set(["mapping-or-exposed"]);
2515
- remoteEntry.shared.forEach((external) => {
2516
- if (!external.singleton) {
2517
- const url2 = join(remoteEntryScope, external.outFileName);
2518
- addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2519
- addIntegrity(importMap, url2, integrityMap, external.outFileName);
2520
- if (external?.bundle) chunkBundles.add(external?.bundle);
2521
- return;
2522
- }
2523
- if (!actions[external.packageName]) {
2524
- log.warn(
2525
- 9,
2526
- `[${remoteEntry.name}] No action defined for shared external '${external.packageName}', skipping.`
2527
- );
2528
- return;
2529
- }
2530
- if (actions[external.packageName].action === "skip") {
2531
- if (!external.shareScope) return;
2532
- if (actions[external.packageName].override) {
2533
- addToScopes(
2534
- remoteEntryScope,
2535
- external.packageName,
2536
- actions[external.packageName].override,
2537
- importMap
2538
- );
2539
- return;
2540
- }
2541
- }
2542
- if (external?.bundle) chunkBundles.add(external?.bundle);
2543
- if (actions[external.packageName].action === "scope") {
2544
- const url2 = join(remoteEntryScope, external.outFileName);
2545
- addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2546
- addIntegrity(importMap, url2, integrityMap, external.outFileName);
2547
- return;
2548
- }
2549
- if (external.shareScope) {
2550
- const url2 = join(remoteEntryScope, external.outFileName);
2551
- addToScopes(remoteEntryScope, external.packageName, url2, importMap);
2552
- addIntegrity(importMap, url2, integrityMap, external.outFileName);
2553
- return;
2554
- }
2555
- const url = join(remoteEntryScope, external.outFileName);
2556
- importMap.imports[external.packageName] = url;
2557
- addIntegrity(importMap, url, integrityMap, external.outFileName);
2558
- });
2559
- addChunkImports(importMap, remoteEntry, remoteEntryScope, chunkBundles);
2557
+ // src/lib/core/4.config/import-map/trusted-types.ts
2558
+ var IMPORT_MAP_KEYS = /* @__PURE__ */ new Set(["imports", "scopes", "integrity"]);
2559
+ var validateImportMapJSON = (input) => {
2560
+ let parsed;
2561
+ try {
2562
+ parsed = JSON.parse(input);
2563
+ } catch {
2564
+ throw new TypeError("[nf-orchestrator] trusted-types: import map is not valid JSON");
2560
2565
  }
2561
- function addToScopes(scope, packageName, url, importMap) {
2562
- if (!importMap.scopes) importMap.scopes = {};
2563
- if (!importMap.scopes[scope]) importMap.scopes[scope] = {};
2564
- importMap.scopes[scope][packageName] = url;
2566
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
2567
+ throw new TypeError("[nf-orchestrator] trusted-types: import map must be a plain object");
2565
2568
  }
2566
- function addRemoteInfos(remoteEntry, importMap) {
2567
- if (!remoteEntry.exposes) return;
2568
- const scope = getScope(remoteEntry.url);
2569
- remoteEntry.exposes.forEach((exposed) => {
2570
- const moduleName = join(remoteEntry.name, exposed.key);
2571
- const moduleUrl = join(scope, exposed.outFileName);
2572
- importMap.imports[moduleName] = moduleUrl;
2573
- addIntegrity(importMap, moduleUrl, remoteEntry.integrity, exposed.outFileName);
2574
- });
2569
+ for (const key of Object.keys(parsed)) {
2570
+ if (!IMPORT_MAP_KEYS.has(key)) {
2571
+ throw new TypeError(`[nf-orchestrator] trusted-types: unexpected key "${key}" in import map`);
2572
+ }
2575
2573
  }
2576
- function addChunkImports(importMap, remoteEntry, remoteEntryScope, chunkBundles) {
2577
- Array.from(chunkBundles).forEach((bundleName) => {
2578
- ports.sharedChunksRepo.tryGet(remoteEntry.name, bundleName).ifPresent((files) => {
2579
- files.forEach((file) => {
2580
- const url = join(remoteEntryScope, file);
2581
- addToScopes(remoteEntryScope, toChunkImport(file), url, importMap);
2582
- addIntegrity(importMap, url, remoteEntry.integrity, file);
2583
- });
2584
- });
2585
- });
2586
- return importMap;
2574
+ return input;
2575
+ };
2576
+ var validateScriptURL = (input) => {
2577
+ const base = typeof location !== "undefined" ? location.href : "http://localhost/";
2578
+ let url;
2579
+ try {
2580
+ url = new URL(input, base);
2581
+ } catch {
2582
+ throw new TypeError(`[nf-orchestrator] trusted-types: invalid script URL "${input}"`);
2587
2583
  }
2588
- function addIntegrity(importMap, url, integrityMap, file) {
2589
- const hash = integrityMap?.[file];
2590
- if (!hash) return;
2591
- if (!importMap.integrity) importMap.integrity = {};
2592
- importMap.integrity[url] = hash;
2584
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
2585
+ throw new TypeError(
2586
+ `[nf-orchestrator] trusted-types: disallowed protocol "${url.protocol}" for script URL`
2587
+ );
2593
2588
  }
2594
- }
2595
-
2596
- // src/lib/2.app/flows/dynamic-init/get-remote-entry.ts
2597
- var normalizeRemoteRef = (remote) => {
2598
- if (!remote) return {};
2599
- if (typeof remote === "string") return { name: remote };
2600
- return remote;
2589
+ return input;
2601
2590
  };
2602
- function createGetRemoteEntry(config, ports) {
2603
- return async (remoteEntryUrl, remote) => {
2604
- const { name: remoteName, integrity } = normalizeRemoteRef(remote);
2605
- if (!!remoteName && shouldSkipCachedRemote(remoteEntryUrl, remoteName)) {
2606
- config.log.debug(7, `Found remote '${remoteName}' in storage, omitting fetch.`);
2607
- return Optional.empty();
2608
- }
2609
- try {
2610
- const remoteEntry = integrity ? await ports.remoteEntryProvider.provide(remoteEntryUrl, { integrity }) : await ports.remoteEntryProvider.provide(remoteEntryUrl);
2611
- config.log.debug(
2612
- 7,
2613
- `[${remoteEntry.name}] Fetched from '${remoteEntry.url}', exposing: ${JSON.stringify(remoteEntry.exposes)}`
2614
- );
2615
- if (!!remoteName && remoteEntry.name !== remoteName) {
2616
- const errorMsg = `Fetched remote '${remoteEntry.name}' does not match requested '${remoteName}'.`;
2617
- if (config.strict.strictRemoteEntry) {
2618
- config.log.error(7, errorMsg);
2619
- throw new NFError("Could not fetch remote entry");
2620
- }
2621
- config.log.warn(7, errorMsg + " Omitting expected name.");
2622
- }
2623
- if (ports.remoteInfoRepo.contains(remoteEntry.name)) {
2624
- remoteEntry.override = true;
2625
- config.log.debug(7, `Overriding existing remote '${remoteName}' with '${remoteEntryUrl}'.`);
2626
- }
2627
- return Optional.of(checkForSSE(remoteEntry));
2628
- } catch (error) {
2629
- config.log.error(
2630
- 7,
2631
- `[${remoteName ?? "unknown"}] Could not fetch remoteEntry from ${remoteEntryUrl}.`,
2632
- error
2633
- );
2634
- return Promise.reject(
2635
- new NFError(`[${remoteName ?? remoteEntryUrl}] Could not fetch remoteEntry.`)
2636
- );
2637
- }
2638
- };
2639
- function shouldSkipCachedRemote(remoteEntryUrl, remoteName) {
2640
- return ports.remoteInfoRepo.tryGet(remoteName).map(
2641
- (cachedRemoteInfo) => config.profile.overrideCachedRemotes !== "always" || !config.profile.overrideCachedRemotesIfURLMatches && remoteEntryUrl === join(cachedRemoteInfo.scopeUrl, "remoteEntry.json")
2642
- ).orElse(false);
2591
+ var passThroughPolicy = {
2592
+ createScript: (input) => input,
2593
+ createScriptURL: (input) => input
2594
+ };
2595
+ var cachedPolicy = null;
2596
+ var getTrustedTypesPolicy = (name = "nfo") => {
2597
+ if (name === false) return passThroughPolicy;
2598
+ if (cachedPolicy) return cachedPolicy;
2599
+ const factory = globalThis.trustedTypes;
2600
+ if (!factory) {
2601
+ cachedPolicy = passThroughPolicy;
2602
+ return cachedPolicy;
2643
2603
  }
2644
- function checkForSSE(entry) {
2645
- if (config.sse) {
2646
- if (entry.buildNotificationsEndpoint) {
2647
- ports.sse.watchRemoteBuilds(
2648
- join(getScope(entry.url), entry.buildNotificationsEndpoint)
2649
- );
2650
- config.log.debug(7, `Registered SSE endpoint of remote '${entry.name}' `);
2651
- } else {
2652
- config.log.debug(7, `Remote ${entry.name} has no defined 'buildNotificationsEndpoint'`);
2653
- }
2654
- }
2655
- return entry;
2604
+ const native = factory.createPolicy(name, {
2605
+ createScript: validateImportMapJSON,
2606
+ createScriptURL: validateScriptURL
2607
+ });
2608
+ cachedPolicy = {
2609
+ createScript: (input) => native.createScript(input),
2610
+ createScriptURL: (input) => String(native.createScriptURL(input))
2611
+ };
2612
+ return cachedPolicy;
2613
+ };
2614
+
2615
+ // src/lib/core/4.config/import-map/replace-in-dom.ts
2616
+ var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts = {}) => {
2617
+ if (opts?.override) {
2618
+ document.head.querySelectorAll(`script[type="${mapType}"]`).forEach((importMap2) => importMap2.remove());
2656
2619
  }
2657
- }
2620
+ const policy = getTrustedTypesPolicy(trustedTypesPolicyName);
2621
+ document.head.appendChild(
2622
+ Object.assign(document.createElement("script"), {
2623
+ type: mapType,
2624
+ text: policy.createScript(JSON.stringify(importMap))
2625
+ })
2626
+ );
2627
+ return Promise.resolve(importMap);
2628
+ };
2658
2629
 
2659
- // src/lib/2.app/flows/dynamic-init/update-cache.ts
2660
- function createUpdateCache(config, ports) {
2661
- return (remoteEntry) => {
2662
- try {
2663
- if (remoteEntry?.override) removeCachedRemoteEntry(remoteEntry);
2664
- addRemoteInfoToStorage(remoteEntry);
2665
- const actions = mergeExternalsIntoStorage(remoteEntry);
2666
- addSharedChunksToStorage(remoteEntry);
2667
- return Promise.resolve({ entry: remoteEntry, actions });
2668
- } catch (error) {
2669
- return Promise.reject(error);
2670
- }
2671
- };
2672
- function removeCachedRemoteEntry(remoteEntry) {
2673
- ports.remoteInfoRepo.remove(remoteEntry.name);
2674
- ports.scopedExternalsRepo.remove(remoteEntry.name);
2675
- ports.sharedExternalsRepo.removeFromAllScopes(remoteEntry.name);
2630
+ // src/lib/core/4.config/import-map/use-default.ts
2631
+ var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
2632
+ loadModuleFn: (url) => {
2633
+ const trusted = getTrustedTypesPolicy(trustedTypesPolicyName).createScriptURL(url);
2634
+ return import(
2635
+ /* @vite-ignore */
2636
+ trusted
2637
+ );
2638
+ },
2639
+ setImportMapFn: replaceInDOM("importmap", trustedTypesPolicyName),
2640
+ reloadBrowserFn: () => {
2641
+ window.location.reload();
2676
2642
  }
2677
- function addRemoteInfoToStorage({ name, url, exposes }) {
2678
- ports.remoteInfoRepo.addOrUpdate(name, {
2679
- scopeUrl: getScope(url),
2680
- exposes: Object.values(exposes ?? []).map((m) => ({
2681
- moduleName: m.key,
2682
- file: m.outFileName
2683
- }))
2684
- });
2643
+ });
2644
+
2645
+ // src/lib/core/4.config/import-map/import-map.config.ts
2646
+ var createImportMapConfig = (o) => {
2647
+ const fallback = useDefaultImportMap(o.trustedTypesPolicyName);
2648
+ return {
2649
+ setImportMapFn: o.setImportMapFn ?? fallback.setImportMapFn,
2650
+ loadModuleFn: o.loadModuleFn ?? fallback.loadModuleFn,
2651
+ reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn
2652
+ };
2653
+ };
2654
+
2655
+ // src/lib/core/4.config/host/host.config.ts
2656
+ var createHostConfig = (override) => {
2657
+ const extras = override?.manifestIntegrity ? { manifestIntegrity: override.manifestIntegrity } : {};
2658
+ if (!override?.hostRemoteEntry) {
2659
+ return { hostRemoteEntry: false, ...extras };
2685
2660
  }
2686
- function mergeExternalsIntoStorage(remoteEntry) {
2687
- const actions = {};
2688
- remoteEntry.shared.forEach((external) => {
2689
- if (!external.version || !ports.versionCheck.isValidSemver(external.version)) {
2690
- const errorMsg = `[${remoteEntry.name}][${external.packageName}] Version '${external.version}' is not a valid version.`;
2691
- if (config.strict.strictExternalVersion) {
2692
- config.log.error(8, errorMsg);
2693
- throw new NFError(`Could not process remote '${remoteEntry.name}'`);
2694
- }
2695
- config.log.warn(8, errorMsg);
2696
- }
2697
- if (external.singleton) {
2698
- const { action, sharedVersion } = addSharedExternal(remoteEntry.name, external);
2699
- actions[external.packageName] = { action };
2700
- if (action === "skip" && external.shareScope && sharedVersion?.remotes[0]?.file) {
2701
- actions[external.packageName].override = ports.remoteInfoRepo.tryGet(sharedVersion.remotes[0].name).map((remote) => join(remote.scopeUrl, sharedVersion.remotes[0].file)).orThrow(() => {
2702
- config.log.error(
2703
- 8,
2704
- `[${external.shareScope ?? GLOBAL_SCOPE}][${remoteEntry.name}][${external.packageName}@${external.version}][override] Remote name not found in cache.`
2705
- );
2706
- return new NFError(
2707
- `Could not find override url from remote ${sharedVersion.remotes[0].name}`
2708
- );
2709
- });
2710
- }
2711
- } else {
2712
- addScopedExternal(remoteEntry.name, external);
2713
- }
2714
- });
2715
- return actions;
2661
+ if (typeof override.hostRemoteEntry === "string") {
2662
+ return {
2663
+ hostRemoteEntry: {
2664
+ name: "__NF-HOST__",
2665
+ url: override.hostRemoteEntry
2666
+ },
2667
+ ...extras
2668
+ };
2716
2669
  }
2717
- function addSharedChunksToStorage(remoteEntry) {
2718
- if (!remoteEntry.chunks) return;
2719
- config.log.debug(
2720
- 8,
2721
- `Adding chunks for remote "${remoteEntry.name}", bundles: [${Object.keys(remoteEntry.chunks).join(", ")}]`
2722
- );
2723
- Object.entries(remoteEntry.chunks).forEach(([bundleName, chunks]) => {
2724
- ports.sharedChunksRepo.addOrReplace(remoteEntry.name, bundleName, chunks);
2725
- });
2670
+ return {
2671
+ hostRemoteEntry: {
2672
+ name: "__NF-HOST__",
2673
+ ...override.hostRemoteEntry
2674
+ },
2675
+ ...extras
2676
+ };
2677
+ };
2678
+
2679
+ // src/lib/core/4.config/logging/noop.logger.ts
2680
+ var noopLogger = {
2681
+ debug: () => {
2682
+ },
2683
+ error: () => {
2684
+ },
2685
+ warn: () => {
2726
2686
  }
2727
- function addSharedExternal(remoteName, sharedInfo) {
2728
- const cached = ports.sharedExternalsRepo.tryGet(sharedInfo.packageName, sharedInfo.shareScope).orElse({ dirty: false, versions: [] });
2729
- let action = "skip";
2730
- const tag = sharedInfo.version ?? ports.versionCheck.smallestVersion(sharedInfo.requiredVersion);
2731
- const remote = {
2732
- file: sharedInfo.outFileName,
2733
- strictVersion: sharedInfo.strictVersion,
2734
- requiredVersion: sharedInfo.requiredVersion || tag,
2735
- name: remoteName,
2736
- bundle: sharedInfo.bundle,
2737
- cached: false
2738
- };
2739
- const scopeType = ports.sharedExternalsRepo.scopeType(sharedInfo.shareScope);
2740
- if (scopeType === "strict") {
2741
- remote.requiredVersion = tag;
2742
- action = "share";
2743
- }
2744
- const sharedVersion = cached.versions.find((c) => c.action === "share");
2745
- const isCompatible = !sharedVersion || ports.versionCheck.isCompatible(sharedVersion.tag, remote.requiredVersion);
2746
- if (action === "skip" && !isCompatible && remote.strictVersion) {
2747
- action = "scope";
2748
- const errorMsg = `[${sharedInfo.shareScope ?? GLOBAL_SCOPE}][${remoteName}] ${sharedInfo.packageName}@${sharedInfo.version} Is not compatible with existing ${sharedInfo.packageName}@${sharedVersion.tag} requiredRange '${sharedVersion.remotes[0]?.requiredVersion}'`;
2749
- if (config.strict.strictExternalCompatibility) {
2750
- config.log.error(8, errorMsg);
2751
- throw new NFError(`Could not process remote '${remoteName}'`);
2752
- }
2753
- config.log.warn(8, errorMsg);
2754
- }
2755
- const matchingVersion = cached.versions.find((cached2) => cached2.tag === tag);
2756
- if (!!matchingVersion) {
2757
- if (remote.strictVersion && matchingVersion.remotes[0].requiredVersion !== remote.requiredVersion) {
2758
- const errorMsg = `[${remoteName}][${sharedInfo.packageName}@${sharedInfo.version}] Required version '${remote.requiredVersion}' does not match existing '${matchingVersion.remotes[0].requiredVersion}'`;
2759
- if (config.strict.strictExternalCompatibility) {
2760
- config.log.error(8, errorMsg);
2761
- throw new NFError(`Could not process remote '${remoteName}'`);
2687
+ };
2688
+
2689
+ // src/lib/core/2.app/config/log.contract.ts
2690
+ var LogLevel = {
2691
+ debug: 0,
2692
+ warn: 1,
2693
+ error: 2
2694
+ };
2695
+
2696
+ // src/lib/core/4.config/logging/log.handler.ts
2697
+ var createLogHandler = (logger, logLevel) => {
2698
+ const logTypes = Object.keys(LogLevel).filter((key) => isNaN(Number(key)));
2699
+ return logTypes.reduce(
2700
+ (acc, logMessageType) => {
2701
+ return {
2702
+ ...acc,
2703
+ [logMessageType]: (step, message, details) => {
2704
+ if (LogLevel[logMessageType] >= LogLevel[logLevel]) {
2705
+ logger[logMessageType](step, message, details);
2706
+ }
2762
2707
  }
2763
- config.log.warn(8, errorMsg);
2764
- }
2765
- matchingVersion.remotes.push(remote);
2766
- } else {
2767
- if (!sharedVersion) action = "share";
2768
- remote.cached = action !== "skip";
2769
- cached.versions.push({ tag, action, host: false, remotes: [remote] });
2708
+ };
2709
+ },
2710
+ { level: logLevel }
2711
+ );
2712
+ };
2713
+
2714
+ // src/lib/core/4.config/logging/log.config.ts
2715
+ var createLogConfig = ({ logger, logLevel, sse }) => ({
2716
+ log: createLogHandler(logger ?? noopLogger, logLevel ?? "error"),
2717
+ sse: !!sse
2718
+ });
2719
+
2720
+ // src/lib/utils/clone-entry.ts
2721
+ var cloneEntry = (name, raw) => {
2722
+ try {
2723
+ if (typeof structuredClone === "function") {
2724
+ return structuredClone(raw);
2770
2725
  }
2771
- ports.sharedExternalsRepo.addOrUpdate(
2772
- sharedInfo.packageName,
2773
- {
2774
- dirty: cached.dirty,
2775
- versions: cached.versions.sort((a, b) => ports.versionCheck.compare(b.tag, a.tag))
2776
- },
2777
- sharedInfo.shareScope
2778
- );
2779
- return { action, sharedVersion };
2726
+ } catch {
2780
2727
  }
2781
- function addScopedExternal(remoteName, sharedInfo) {
2782
- ports.scopedExternalsRepo.addExternal(remoteName, sharedInfo.packageName, {
2783
- tag: sharedInfo.version ?? ports.versionCheck.smallestVersion(sharedInfo.requiredVersion),
2784
- file: sharedInfo.outFileName,
2785
- bundle: sharedInfo.bundle
2786
- });
2728
+ try {
2729
+ return JSON.parse(JSON.stringify(raw));
2730
+ } catch {
2787
2731
  }
2788
- }
2732
+ throw new NFError(`Could not clone entry '${String(name)}'`);
2733
+ };
2789
2734
 
2790
- // src/lib/5.di/flows/dynamic-init.factory.ts
2791
- var createDynamicInitDrivers = ({
2792
- config,
2793
- adapters
2794
- }) => ({
2795
- getRemoteEntry: createGetRemoteEntry(config, adapters),
2796
- updateCache: createUpdateCache(config, adapters),
2797
- convertToImportMap: createConvertToImportMap(config, adapters),
2798
- commitChanges: createCommitChanges(config, adapters)
2735
+ // src/lib/core/4.config/storage/global-this.storage.ts
2736
+ var globalThisStorageEntry = (namespace) => (key, initialValue) => {
2737
+ if (!globalThis[namespace]) {
2738
+ globalThis[namespace] = {};
2739
+ }
2740
+ const storage = globalThis[namespace];
2741
+ if (!storage[key]) storage[key] = initialValue;
2742
+ const entry = {
2743
+ get() {
2744
+ return cloneEntry(key, storage[key]);
2745
+ },
2746
+ set(value) {
2747
+ storage[key] = cloneEntry(key, value);
2748
+ return entry;
2749
+ },
2750
+ clear() {
2751
+ storage[key] = cloneEntry(key, initialValue);
2752
+ return this;
2753
+ }
2754
+ };
2755
+ return entry;
2756
+ };
2757
+
2758
+ // src/lib/core/4.config/storage/storage.config.ts
2759
+ var createStorageConfig = (override) => ({
2760
+ storage: override.storage ? override.storage(override.storageNamespace ?? "__NATIVE_FEDERATION__") : globalThisStorageEntry(override.storageNamespace ?? "__NATIVE_FEDERATION__"),
2761
+ clearStorage: override.clearStorage ?? false
2799
2762
  });
2800
- var DYNAMIC_INIT_FLOW_FACTORY = ({
2801
- config,
2802
- adapters
2803
- }) => {
2804
- const flow = createDynamicInitDrivers({ config, adapters });
2763
+
2764
+ // src/lib/core/4.config/mode/default.profile.ts
2765
+ var defaultProfile = {
2766
+ latestSharedExternal: false,
2767
+ skipInvalidExternalVersions: false,
2768
+ overrideCachedRemotes: "init-only",
2769
+ overrideCachedRemotesIfURLMatches: false
2770
+ };
2771
+
2772
+ // src/lib/core/4.config/mode/mode.config.ts
2773
+ var createModeConfig = (override) => {
2774
+ const strictnessConfig = typeof override.strict === "boolean" ? {
2775
+ strictRemoteEntry: override.strict,
2776
+ strictExternalCompatibility: override.strict,
2777
+ strictExternalSameVersionCompatibility: override.strict,
2778
+ strictExternalVersion: override.strict,
2779
+ strictImportMap: override.strict
2780
+ } : {
2781
+ strictRemoteEntry: override.strict?.strictRemoteEntry ?? false,
2782
+ strictExternalCompatibility: override.strict?.strictExternalCompatibility ?? false,
2783
+ strictExternalSameVersionCompatibility: override.strict?.strictExternalSameVersionCompatibility ?? false,
2784
+ strictExternalVersion: override.strict?.strictExternalVersion ?? false,
2785
+ strictImportMap: override.strict?.strictImportMap ?? false
2786
+ };
2805
2787
  return {
2806
- flow,
2807
- adapters,
2808
- config
2788
+ strict: strictnessConfig,
2789
+ profile: { ...defaultProfile, ...override.profile ?? {} }
2809
2790
  };
2810
2791
  };
2811
- var createDynamicInitFlow = ({
2812
- flow,
2792
+
2793
+ // src/lib/core/5.di/config.factory.ts
2794
+ var createConfigHandlers = (overrides) => ({
2795
+ ...createImportMapConfig(overrides),
2796
+ ...createHostConfig(overrides),
2797
+ ...createLogConfig(overrides),
2798
+ ...createStorageConfig(overrides),
2799
+ ...createModeConfig(overrides)
2800
+ });
2801
+
2802
+ // src/lib/core/5.di/federation-result.factory.ts
2803
+ var createStateDump = (config, adapters) => (msg) => config.log.debug(0, msg, {
2804
+ remotes: { ...adapters.remoteInfoRepo.getAll() },
2805
+ "shared-externals": adapters.sharedExternalsRepo.getScopes({ includeGlobal: true }).reduce(
2806
+ (acc, scope) => ({ ...acc, [scope]: adapters.sharedExternalsRepo.getFromScope(scope) }),
2807
+ {}
2808
+ ),
2809
+ "scoped-externals": adapters.scopedExternalsRepo.getAll()
2810
+ });
2811
+ var createFederationResult = ({
2812
+ config,
2813
2813
  adapters,
2814
- config
2814
+ loadRemoteModule,
2815
+ initRemoteEntryFlow,
2816
+ afterInitRemoteEntry
2815
2817
  }) => {
2816
- const processDynamicRemoteEntry = async (remoteEntry) => {
2817
- return flow.updateCache(remoteEntry).then(flow.convertToImportMap).then(flow.commitChanges);
2818
+ const stateDump = createStateDump(config, adapters);
2819
+ const initRemoteEntry = async (remoteEntryUrl, remote) => {
2820
+ const remoteName = typeof remote === "string" ? remote : remote?.name;
2821
+ return initRemoteEntryFlow(remoteEntryUrl, remote).catch((e) => {
2822
+ stateDump(`[dynamic-init][${remoteName ?? remoteEntryUrl}] STATE DUMP`);
2823
+ if (config.strict.strictRemoteEntry) return Promise.reject(e);
2824
+ else console.warn("Failed to initialize remote entry, continuing anyway.");
2825
+ return Promise.resolve();
2826
+ }).then(() => afterInitRemoteEntry?.()).then(() => result);
2818
2827
  };
2819
- const initRemoteEntry = (remoteEntryUrl, remote) => flow.getRemoteEntry(remoteEntryUrl, remote).then((entry) => entry.map(processDynamicRemoteEntry).orElse(Promise.resolve())).then(() => ({
2828
+ const result = {
2820
2829
  config,
2821
2830
  adapters,
2831
+ loadRemoteModule,
2832
+ load: loadRemoteModule,
2833
+ as: () => ({
2834
+ loadRemoteModule,
2835
+ load: loadRemoteModule
2836
+ }),
2822
2837
  initRemoteEntry
2823
- }));
2824
- return initRemoteEntry;
2838
+ };
2839
+ return result;
2825
2840
  };
2826
2841
 
2827
- // src/lib/init-federation.ts
2842
+ // src/lib/core/init-federation.ts
2828
2843
  var initFederation = (remotesOrManifestUrl, options = {}) => {
2829
2844
  const { adapters, config } = createDriving(createConfigHandlers(options));
2830
- const stateDump = (msg) => config.log.debug(0, msg, {
2831
- remotes: { ...adapters.remoteInfoRepo.getAll() },
2832
- "shared-externals": adapters.sharedExternalsRepo.getScopes({ includeGlobal: true }).reduce(
2833
- (acc, scope) => ({ ...acc, [scope]: adapters.sharedExternalsRepo.getFromScope(scope) }),
2834
- {}
2835
- ),
2836
- "scoped-externals": adapters.scopedExternalsRepo.getAll()
2837
- });
2838
- const initFlow = createInitFlow(INIT_FLOW_FACTORY({ adapters, config }));
2839
- const dynamicInitFlow = createDynamicInitFlow(DYNAMIC_INIT_FLOW_FACTORY({ config, adapters }));
2840
- return initFlow(remotesOrManifestUrl).then(({ loadRemoteModule }) => {
2841
- const output = {
2842
- config,
2843
- adapters,
2844
- loadRemoteModule,
2845
- as: () => ({
2846
- loadRemoteModule,
2847
- load: loadRemoteModule
2848
- }),
2849
- load: loadRemoteModule
2850
- };
2851
- const initRemoteEntry = async (remoteEntryUrl, remote) => {
2852
- const remoteName = typeof remote === "string" ? remote : remote?.name;
2853
- return dynamicInitFlow(remoteEntryUrl, remote).catch((e) => {
2854
- stateDump(`[dynamic-init][${remoteName ?? remoteEntryUrl}] STATE DUMP`);
2855
- if (config.strict.strictRemoteEntry) return Promise.reject(e);
2856
- else console.warn("Failed to initialize remote entry, continuing anyway.");
2857
- return Promise.resolve();
2858
- }).then(() => ({
2859
- ...output,
2860
- initRemoteEntry
2861
- }));
2862
- };
2863
- return {
2864
- ...output,
2865
- initRemoteEntry
2866
- };
2867
- }).catch((e) => {
2868
- stateDump(`[init] STATE DUMP`);
2845
+ const factory = INIT_FLOW_FACTORY({ adapters, config });
2846
+ const initFlow = createInitFlow(factory);
2847
+ const initRemoteEntryFlow = createInitRemoteEntryFlow(factory);
2848
+ return initFlow(remotesOrManifestUrl).then(
2849
+ ({ loadRemoteModule }) => createFederationResult({ config, adapters, loadRemoteModule, initRemoteEntryFlow })
2850
+ ).catch((e) => {
2851
+ createStateDump(config, adapters)(`[init] STATE DUMP`);
2869
2852
  return Promise.reject(e);
2870
2853
  });
2871
2854
  };
2872
2855
  export {
2873
- DYNAMIC_INIT_FLOW_FACTORY,
2874
2856
  INIT_FLOW_FACTORY,
2875
2857
  NFError,
2876
2858
  createConfigHandlers,
2877
2859
  createDriving,
2878
- createDynamicInitDrivers,
2879
- createDynamicInitFlow,
2860
+ createFederationResult,
2880
2861
  createInitDrivers,
2881
2862
  createInitFlow,
2863
+ createInitRemoteEntryFlow,
2864
+ createStateDump,
2882
2865
  initFederation
2883
2866
  };
2884
2867
  //# sourceMappingURL=native-federation-orchestrator.mjs.map