@softarc/native-federation-orchestrator 4.9.0 → 4.10.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 (42) hide show
  1. package/README.md +12 -12
  2. package/fesm2022/@softarc/native-federation-orchestrator.mjs +490 -123
  3. package/fesm2022/@softarc/native-federation-orchestrator.mjs.map +4 -4
  4. package/fesm2022/module-federation.mjs.map +2 -2
  5. package/fesm2022/node.mjs +495 -123
  6. package/fesm2022/node.mjs.map +4 -4
  7. package/fesm2022/options.mjs +25 -2
  8. package/fesm2022/options.mjs.map +3 -3
  9. package/fesm2022/registry.mjs.map +2 -2
  10. package/package.json +3 -3
  11. package/quickstart.mjs +15 -13
  12. package/types/lib/core/1.domain/externals/basis.d.ts +2 -2
  13. package/types/lib/core/1.domain/externals/version.contract.d.ts +3 -0
  14. package/types/lib/core/1.domain/import-map/eager-preloads.d.ts +10 -0
  15. package/types/lib/core/1.domain/pooling/builds.d.ts +7 -1
  16. package/types/lib/core/1.domain/remote/remote-module.contract.d.ts +1 -0
  17. package/types/lib/core/1.domain/remote-entry/remote-entry.contract.d.ts +2 -2
  18. package/types/lib/core/2.app/config/import-map.contract.d.ts +4 -7
  19. package/types/lib/core/2.app/config/index.d.ts +2 -2
  20. package/types/lib/core/2.app/config/mode.contract.d.ts +1 -0
  21. package/types/lib/core/2.app/driver-ports/init/flow.contract.d.ts +2 -4
  22. package/types/lib/core/2.app/driver-ports/init/for-exposing-module-loader.port.d.ts +6 -2
  23. package/types/lib/core/2.app/driving-ports/for-browser-tasks.d.ts +1 -0
  24. package/types/lib/core/2.app/driving-ports/for-remote-info-storage.port.d.ts +1 -0
  25. package/types/lib/core/2.app/steps/collect-eager-preloads.d.ts +4 -0
  26. package/types/lib/core/2.app/steps/preload-hint.d.ts +4 -0
  27. package/types/lib/core/2.app/steps/store-remote-entry.d.ts +0 -14
  28. package/types/lib/core/4.config/import-map/index.d.ts +2 -0
  29. package/types/lib/core/4.config/import-map/no-preload.d.ts +2 -0
  30. package/types/lib/core/4.config/import-map/preload-in-dom.d.ts +2 -0
  31. package/types/lib/core/5.di/federation-result.factory.d.ts +3 -2
  32. package/types/lib/core/init-federation.contract.d.ts +2 -0
  33. package/types/lib/index.d.ts +1 -1
  34. package/types/lib/node/init-federation.node.d.ts +2 -7
  35. package/types/lib/node.index.d.ts +1 -1
  36. package/types/lib/registry/event-registry.contract.d.ts +1 -0
  37. package/types/lib/registry/event.contract.d.ts +6 -0
  38. package/types/lib/registry/for-managing-events.port.d.ts +1 -0
  39. package/types/lib/registry/registry.contract.d.ts +2 -0
  40. package/types/lib/registry/setup-registry.d.ts +1 -0
  41. package/types/scripts/announce-init-ready.d.ts +2 -0
  42. package/types/scripts/init-registry.d.ts +1 -0
@@ -28,9 +28,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  mod
29
29
  ));
30
30
 
31
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js
31
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/debug.js
32
32
  var require_debug = __commonJS({
33
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports, module) {
33
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/debug.js"(exports, module) {
34
34
  "use strict";
35
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) : () => {
36
36
  };
@@ -38,9 +38,9 @@ var require_debug = __commonJS({
38
38
  }
39
39
  });
40
40
 
41
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js
41
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/constants.js
42
42
  var require_constants = __commonJS({
43
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports, module) {
43
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/constants.js"(exports, module) {
44
44
  "use strict";
45
45
  var SEMVER_SPEC_VERSION = "2.0.0";
46
46
  var MAX_LENGTH = 256;
@@ -48,6 +48,33 @@ var require_constants = __commonJS({
48
48
  9007199254740991;
49
49
  var MAX_SAFE_COMPONENT_LENGTH = 16;
50
50
  var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
51
+ var WHITESPACE_CHARACTERS = [
52
+ " ",
53
+ "\n",
54
+ "\v",
55
+ "\f",
56
+ "\r",
57
+ " ",
58
+ "\xA0",
59
+ "\u1680",
60
+ "\u2000",
61
+ "\u2001",
62
+ "\u2002",
63
+ "\u2003",
64
+ "\u2004",
65
+ "\u2005",
66
+ "\u2006",
67
+ "\u2007",
68
+ "\u2008",
69
+ "\u2009",
70
+ "\u200A",
71
+ "\u2028",
72
+ "\u2029",
73
+ "\u202F",
74
+ "\u205F",
75
+ "\u3000",
76
+ "\uFEFF"
77
+ ];
51
78
  var RELEASE_TYPES = [
52
79
  "major",
53
80
  "premajor",
@@ -62,6 +89,7 @@ var require_constants = __commonJS({
62
89
  MAX_SAFE_COMPONENT_LENGTH,
63
90
  MAX_SAFE_BUILD_LENGTH,
64
91
  MAX_SAFE_INTEGER,
92
+ WHITESPACE_CHARACTERS,
65
93
  RELEASE_TYPES,
66
94
  SEMVER_SPEC_VERSION,
67
95
  FLAG_INCLUDE_PRERELEASE: 1,
@@ -70,9 +98,9 @@ var require_constants = __commonJS({
70
98
  }
71
99
  });
72
100
 
73
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js
101
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/re.js
74
102
  var require_re = __commonJS({
75
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports, module) {
103
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/re.js"(exports, module) {
76
104
  "use strict";
77
105
  var {
78
106
  MAX_SAFE_COMPONENT_LENGTH,
@@ -158,9 +186,9 @@ var require_re = __commonJS({
158
186
  }
159
187
  });
160
188
 
161
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js
189
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/parse-options.js
162
190
  var require_parse_options = __commonJS({
163
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports, module) {
191
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/parse-options.js"(exports, module) {
164
192
  "use strict";
165
193
  var looseOption = Object.freeze({ loose: true });
166
194
  var emptyOpts = Object.freeze({});
@@ -177,9 +205,9 @@ var require_parse_options = __commonJS({
177
205
  }
178
206
  });
179
207
 
180
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js
208
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/identifiers.js
181
209
  var require_identifiers = __commonJS({
182
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports, module) {
210
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/identifiers.js"(exports, module) {
183
211
  "use strict";
184
212
  var numeric = /^[0-9]+$/;
185
213
  var compareIdentifiers = (a, b) => {
@@ -202,9 +230,9 @@ var require_identifiers = __commonJS({
202
230
  }
203
231
  });
204
232
 
205
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js
233
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/semver.js
206
234
  var require_semver = __commonJS({
207
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports, module) {
235
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/semver.js"(exports, module) {
208
236
  "use strict";
209
237
  var debug = require_debug();
210
238
  var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
@@ -494,9 +522,9 @@ var require_semver = __commonJS({
494
522
  }
495
523
  });
496
524
 
497
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js
525
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/parse.js
498
526
  var require_parse = __commonJS({
499
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports, module) {
527
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/parse.js"(exports, module) {
500
528
  "use strict";
501
529
  var SemVer2 = require_semver();
502
530
  var parse = (version, options, throwErrors = false) => {
@@ -516,9 +544,9 @@ var require_parse = __commonJS({
516
544
  }
517
545
  });
518
546
 
519
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js
547
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/valid.js
520
548
  var require_valid = __commonJS({
521
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports, module) {
549
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/valid.js"(exports, module) {
522
550
  "use strict";
523
551
  var parse = require_parse();
524
552
  var valid = (version, options) => {
@@ -529,9 +557,9 @@ var require_valid = __commonJS({
529
557
  }
530
558
  });
531
559
 
532
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js
560
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/lrucache.js
533
561
  var require_lrucache = __commonJS({
534
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports, module) {
562
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/lrucache.js"(exports, module) {
535
563
  "use strict";
536
564
  var LRUCache = class {
537
565
  constructor() {
@@ -567,9 +595,9 @@ var require_lrucache = __commonJS({
567
595
  }
568
596
  });
569
597
 
570
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js
598
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/compare.js
571
599
  var require_compare = __commonJS({
572
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports, module) {
600
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/compare.js"(exports, module) {
573
601
  "use strict";
574
602
  var SemVer2 = require_semver();
575
603
  var compare = (a, b, loose) => new SemVer2(a, loose).compare(new SemVer2(b, loose));
@@ -577,9 +605,9 @@ var require_compare = __commonJS({
577
605
  }
578
606
  });
579
607
 
580
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js
608
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/eq.js
581
609
  var require_eq = __commonJS({
582
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports, module) {
610
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/eq.js"(exports, module) {
583
611
  "use strict";
584
612
  var compare = require_compare();
585
613
  var eq = (a, b, loose) => compare(a, b, loose) === 0;
@@ -587,9 +615,9 @@ var require_eq = __commonJS({
587
615
  }
588
616
  });
589
617
 
590
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js
618
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/neq.js
591
619
  var require_neq = __commonJS({
592
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports, module) {
620
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/neq.js"(exports, module) {
593
621
  "use strict";
594
622
  var compare = require_compare();
595
623
  var neq = (a, b, loose) => compare(a, b, loose) !== 0;
@@ -597,9 +625,9 @@ var require_neq = __commonJS({
597
625
  }
598
626
  });
599
627
 
600
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js
628
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/gt.js
601
629
  var require_gt = __commonJS({
602
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports, module) {
630
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/gt.js"(exports, module) {
603
631
  "use strict";
604
632
  var compare = require_compare();
605
633
  var gt = (a, b, loose) => compare(a, b, loose) > 0;
@@ -607,9 +635,9 @@ var require_gt = __commonJS({
607
635
  }
608
636
  });
609
637
 
610
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js
638
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/gte.js
611
639
  var require_gte = __commonJS({
612
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports, module) {
640
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/gte.js"(exports, module) {
613
641
  "use strict";
614
642
  var compare = require_compare();
615
643
  var gte = (a, b, loose) => compare(a, b, loose) >= 0;
@@ -617,9 +645,9 @@ var require_gte = __commonJS({
617
645
  }
618
646
  });
619
647
 
620
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js
648
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/lt.js
621
649
  var require_lt = __commonJS({
622
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports, module) {
650
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/lt.js"(exports, module) {
623
651
  "use strict";
624
652
  var compare = require_compare();
625
653
  var lt = (a, b, loose) => compare(a, b, loose) < 0;
@@ -627,9 +655,9 @@ var require_lt = __commonJS({
627
655
  }
628
656
  });
629
657
 
630
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js
658
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/lte.js
631
659
  var require_lte = __commonJS({
632
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports, module) {
660
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/lte.js"(exports, module) {
633
661
  "use strict";
634
662
  var compare = require_compare();
635
663
  var lte = (a, b, loose) => compare(a, b, loose) <= 0;
@@ -637,9 +665,9 @@ var require_lte = __commonJS({
637
665
  }
638
666
  });
639
667
 
640
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js
668
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/cmp.js
641
669
  var require_cmp = __commonJS({
642
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports, module) {
670
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/cmp.js"(exports, module) {
643
671
  "use strict";
644
672
  var eq = require_eq();
645
673
  var neq = require_neq();
@@ -687,9 +715,9 @@ var require_cmp = __commonJS({
687
715
  }
688
716
  });
689
717
 
690
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js
718
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/comparator.js
691
719
  var require_comparator = __commonJS({
692
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports, module) {
720
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/comparator.js"(exports, module) {
693
721
  "use strict";
694
722
  var ANY = /* @__PURE__ */ Symbol("SemVer ANY");
695
723
  var Comparator = class _Comparator {
@@ -800,9 +828,200 @@ var require_comparator = __commonJS({
800
828
  }
801
829
  });
802
830
 
803
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js
831
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/trim-comparator-whitespace.js
832
+ var require_trim_comparator_whitespace = __commonJS({
833
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/internal/trim-comparator-whitespace.js"(exports, module) {
834
+ "use strict";
835
+ var {
836
+ MAX_LENGTH,
837
+ MAX_SAFE_BUILD_LENGTH,
838
+ WHITESPACE_CHARACTERS
839
+ } = require_constants();
840
+ var whitespace = new Uint8Array(65536);
841
+ for (const char of WHITESPACE_CHARACTERS) {
842
+ whitespace[char.charCodeAt(0)] = 1;
843
+ }
844
+ var isWhitespace = (char) => char !== void 0 && whitespace[char.charCodeAt(0)] === 1;
845
+ var isVersionPrefix = (char) => char === "v" || char === "=" || isWhitespace(char);
846
+ var isDigit = (char) => char !== void 0 && char >= "0" && char <= "9";
847
+ var isLetter = (char) => char !== void 0 && (char >= "a" && char <= "z" || char >= "A" && char <= "Z");
848
+ var isIdentifierCharacter = (char) => isDigit(char) || isLetter(char) || char === "-";
849
+ var isVersionStart = (char) => isDigit(char) || char === "x" || char === "X" || char === "*";
850
+ var findDigitsEndIndex = (range, start, limit, digitRuns) => {
851
+ if (!isDigit(range[start])) {
852
+ return start;
853
+ }
854
+ if (start >= digitRuns.start && start < digitRuns.end) {
855
+ return Math.min(start + limit, digitRuns.end);
856
+ }
857
+ if (start >= digitRuns.previousStart && start < digitRuns.previousEnd) {
858
+ return Math.min(start + limit, digitRuns.previousEnd);
859
+ }
860
+ let end = start + 1;
861
+ while (isDigit(range[end])) {
862
+ end++;
863
+ }
864
+ digitRuns.previousStart = digitRuns.start;
865
+ digitRuns.previousEnd = digitRuns.end;
866
+ digitRuns.start = start;
867
+ digitRuns.end = end;
868
+ return Math.min(start + limit, end);
869
+ };
870
+ var findVersionNumberEndIndex = (range, start, loose, digitRuns) => {
871
+ if (!loose && range[start] === "0") {
872
+ return start + 1;
873
+ }
874
+ return findDigitsEndIndex(range, start, loose ? MAX_LENGTH : MAX_LENGTH + 1, digitRuns);
875
+ };
876
+ var findPrereleaseIdentifierEndIndex = (range, start, loose, digitRuns) => {
877
+ const digitsEnd = findDigitsEndIndex(range, start, MAX_LENGTH, digitRuns);
878
+ if (isLetter(range[digitsEnd]) || range[digitsEnd] === "-") {
879
+ let end = digitsEnd + 1;
880
+ const limit = end + MAX_SAFE_BUILD_LENGTH;
881
+ while (end < limit && isIdentifierCharacter(range[end])) {
882
+ end++;
883
+ }
884
+ return end;
885
+ }
886
+ return findVersionNumberEndIndex(range, start, loose, digitRuns);
887
+ };
888
+ var findPrereleaseEndIndex = (range, start, loose, digitRuns) => {
889
+ const hyphen = range[start] === "-";
890
+ if (!loose && !hyphen) {
891
+ return start;
892
+ }
893
+ const identifierStart = start + (hyphen ? 1 : 0);
894
+ let end = findPrereleaseIdentifierEndIndex(range, identifierStart, loose, digitRuns);
895
+ if (end === identifierStart) {
896
+ if (!loose || !hyphen) {
897
+ return start;
898
+ }
899
+ end = findPrereleaseIdentifierEndIndex(range, start, loose, digitRuns);
900
+ }
901
+ while (range[end] === ".") {
902
+ const next = findPrereleaseIdentifierEndIndex(range, end + 1, loose, digitRuns);
903
+ if (next === end + 1) {
904
+ break;
905
+ }
906
+ end = next;
907
+ }
908
+ return end;
909
+ };
910
+ var findBuildIdentifierEndIndex = (range, start) => {
911
+ let end = start;
912
+ while (end - start < MAX_SAFE_BUILD_LENGTH && isIdentifierCharacter(range[end])) {
913
+ end++;
914
+ }
915
+ return end;
916
+ };
917
+ var findBuildEndIndex = (range, start) => {
918
+ if (range[start] !== "+") {
919
+ return start;
920
+ }
921
+ let end = findBuildIdentifierEndIndex(range, start + 1);
922
+ if (end === start + 1) {
923
+ return start;
924
+ }
925
+ while (range[end] === ".") {
926
+ const next = findBuildIdentifierEndIndex(range, end + 1);
927
+ if (next === end + 1) {
928
+ break;
929
+ }
930
+ end = next;
931
+ }
932
+ return end;
933
+ };
934
+ var findLooseFullVersionEndIndex = (range, start, digitRuns) => {
935
+ let end = start;
936
+ for (let component = 0; component < 3; component++) {
937
+ const next = findVersionNumberEndIndex(range, end, true, digitRuns);
938
+ if (next === end) {
939
+ return start;
940
+ }
941
+ end = next;
942
+ if (component < 2) {
943
+ if (range[end] !== ".") {
944
+ return start;
945
+ }
946
+ end++;
947
+ }
948
+ }
949
+ const prereleaseEnd = findPrereleaseEndIndex(range, end, true, digitRuns);
950
+ return findBuildEndIndex(range, prereleaseEnd);
951
+ };
952
+ var findPartialVersionComponentEndIndex = (range, start, digitRuns) => {
953
+ if (isDigit(range[start])) {
954
+ return findVersionNumberEndIndex(range, start, false, digitRuns);
955
+ }
956
+ return isVersionStart(range[start]) ? start + 1 : start;
957
+ };
958
+ var findPartialVersionEndIndex = (range, start, digitRuns) => {
959
+ let end = findPartialVersionComponentEndIndex(range, start, digitRuns);
960
+ for (let component = 0; component < 2; component++) {
961
+ if (range[end] !== ".") {
962
+ return end;
963
+ }
964
+ const next = findPartialVersionComponentEndIndex(range, end + 1, digitRuns);
965
+ if (next === end + 1) {
966
+ return end;
967
+ }
968
+ end = next;
969
+ }
970
+ const prereleaseEnd = findPrereleaseEndIndex(range, end, false, digitRuns);
971
+ return findBuildEndIndex(range, prereleaseEnd);
972
+ };
973
+ var findVersionEndIndex = (range, start, digitRuns) => {
974
+ const fullVersionEnd = findLooseFullVersionEndIndex(range, start, digitRuns);
975
+ return fullVersionEnd !== start ? fullVersionEnd : findPartialVersionEndIndex(range, start, digitRuns);
976
+ };
977
+ var findRemovableWhitespaceIndex = (range, matchStart) => {
978
+ let position = matchStart;
979
+ if (isWhitespace(range[position])) {
980
+ position++;
981
+ }
982
+ if (range[position] === "<" || range[position] === ">") {
983
+ position++;
984
+ }
985
+ if (range[position] === "=") {
986
+ position++;
987
+ }
988
+ return isWhitespace(range[position]) ? position : -1;
989
+ };
990
+ var trimComparatorWhitespace = (range) => {
991
+ let result = "";
992
+ let copyFrom = 0;
993
+ let cursor = 0;
994
+ const digitRuns = { start: -1, end: -1, previousStart: -1, previousEnd: -1 };
995
+ while (cursor < range.length) {
996
+ const matchStart = cursor;
997
+ if (range[cursor] === "<" || range[cursor] === ">") {
998
+ cursor++;
999
+ } else if (!isVersionPrefix(range[cursor]) && !isVersionStart(range[cursor])) {
1000
+ cursor++;
1001
+ continue;
1002
+ }
1003
+ while (cursor < range.length && isVersionPrefix(range[cursor])) {
1004
+ cursor++;
1005
+ }
1006
+ if (!isVersionStart(range[cursor])) {
1007
+ continue;
1008
+ }
1009
+ const whitespacePosition = findRemovableWhitespaceIndex(range, matchStart);
1010
+ if (whitespacePosition !== -1) {
1011
+ result += range.slice(copyFrom, whitespacePosition);
1012
+ copyFrom = whitespacePosition + 1;
1013
+ }
1014
+ cursor = findVersionEndIndex(range, cursor, digitRuns);
1015
+ }
1016
+ return result + range.slice(copyFrom);
1017
+ };
1018
+ module.exports = trimComparatorWhitespace;
1019
+ }
1020
+ });
1021
+
1022
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/range.js
804
1023
  var require_range = __commonJS({
805
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports, module) {
1024
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/classes/range.js"(exports, module) {
806
1025
  "use strict";
807
1026
  var SPACE_CHARACTERS = /\s+/g;
808
1027
  var Range = class _Range {
@@ -881,7 +1100,7 @@ var require_range = __commonJS({
881
1100
  const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
882
1101
  range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
883
1102
  debug("hyphen replace", range);
884
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
1103
+ range = trimComparatorWhitespace(range);
885
1104
  debug("comparator trim", range);
886
1105
  range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
887
1106
  debug("tilde trim", range);
@@ -951,11 +1170,11 @@ var require_range = __commonJS({
951
1170
  var Comparator = require_comparator();
952
1171
  var debug = require_debug();
953
1172
  var SemVer2 = require_semver();
1173
+ var trimComparatorWhitespace = require_trim_comparator_whitespace();
954
1174
  var {
955
1175
  safeRe: re,
956
1176
  src,
957
1177
  t,
958
- comparatorTrimReplace,
959
1178
  tildeTrimReplace,
960
1179
  caretTrimReplace
961
1180
  } = require_re();
@@ -1185,9 +1404,9 @@ var require_range = __commonJS({
1185
1404
  }
1186
1405
  });
1187
1406
 
1188
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js
1407
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/satisfies.js
1189
1408
  var require_satisfies = __commonJS({
1190
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports, module) {
1409
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/functions/satisfies.js"(exports, module) {
1191
1410
  "use strict";
1192
1411
  var Range = require_range();
1193
1412
  var satisfies = (version, range, options) => {
@@ -1202,9 +1421,9 @@ var require_satisfies = __commonJS({
1202
1421
  }
1203
1422
  });
1204
1423
 
1205
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js
1424
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/ranges/min-version.js
1206
1425
  var require_min_version = __commonJS({
1207
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports, module) {
1426
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/ranges/min-version.js"(exports, module) {
1208
1427
  "use strict";
1209
1428
  var SemVer2 = require_semver();
1210
1429
  var Range = require_range();
@@ -1261,9 +1480,9 @@ var require_min_version = __commonJS({
1261
1480
  }
1262
1481
  });
1263
1482
 
1264
- // node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js
1483
+ // node_modules/.pnpm/semver@7.8.6/node_modules/semver/ranges/valid.js
1265
1484
  var require_valid2 = __commonJS({
1266
- "node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports, module) {
1485
+ "node_modules/.pnpm/semver@7.8.6/node_modules/semver/ranges/valid.js"(exports, module) {
1267
1486
  "use strict";
1268
1487
  var Range = require_range();
1269
1488
  var validRange = (range, options) => {
@@ -1283,10 +1502,10 @@ var createInitFlow = ({
1283
1502
  adapters,
1284
1503
  config
1285
1504
  }) => {
1286
- return (remotesOrManifestUrl) => flow.getRemoteEntries(remotesOrManifestUrl).then(flow.processRemoteEntries).then(flow.poolSharedExternals).then(flow.determineSharedExternals).then(flow.decideServingBuilds).then(flow.generateImportMap).then((importMap) => flow.commitChanges(importMap, { override: true })).then(flow.exposeModuleLoader).then((loadRemoteModule) => ({
1505
+ return (remotesOrManifestUrl) => flow.getRemoteEntries(remotesOrManifestUrl).then(flow.processRemoteEntries).then(flow.poolSharedExternals).then(flow.determineSharedExternals).then(flow.decideServingBuilds).then(flow.generateImportMap).then((importMap) => flow.commitChanges(importMap, { override: true })).then(flow.exposeModuleLoader).then((access) => ({
1287
1506
  config,
1288
1507
  adapters,
1289
- loadRemoteModule
1508
+ ...access
1290
1509
  }));
1291
1510
  };
1292
1511
 
@@ -1346,10 +1565,14 @@ function createStoreRemoteEntry(config, ports, logStep) {
1346
1565
  function addRemoteInfoToStorage({ name, url, exposes, integrity }) {
1347
1566
  ports.remoteInfoRepo.addOrUpdate(name, {
1348
1567
  scopeUrl: getScope(url),
1349
- exposes: Object.values(exposes ?? []).map((m) => ({
1350
- moduleName: m.key,
1351
- file: m.outFileName
1352
- })),
1568
+ exposes: Object.values(exposes ?? []).map((m) => {
1569
+ const chunks = Object.values(m.chunks ?? {}).filter((c) => c.initial).map((c) => c.file);
1570
+ return {
1571
+ moduleName: m.key,
1572
+ file: m.outFileName,
1573
+ ...chunks.length ? { chunks } : {}
1574
+ };
1575
+ }),
1353
1576
  ...integrity ? { integrity } : {}
1354
1577
  });
1355
1578
  }
@@ -1380,10 +1603,13 @@ function createStoreRemoteEntry(config, ports, logStep) {
1380
1603
  });
1381
1604
  }
1382
1605
  function addScopedExternal(remoteEntry, sharedInfo, tag) {
1383
- ports.scopedExternalsRepo.addExternal(remoteEntry.name, sharedInfo.packageName, {
1606
+ const { packageName, entries } = sharedInfo;
1607
+ const key = packageName in entries ? packageName : Object.keys(entries)[0] ?? packageName;
1608
+ ports.scopedExternalsRepo.addExternal(remoteEntry.name, key, {
1384
1609
  tag,
1385
1610
  bundle: sharedInfo.bundle,
1386
- entries: sharedInfo.entries
1611
+ entries,
1612
+ ...sharedInfo.preload ? { preload: true } : {}
1387
1613
  });
1388
1614
  }
1389
1615
  function resolveVersion(remoteEntry, external) {
@@ -1412,7 +1638,9 @@ function createStoreRemoteEntry(config, ports, logStep) {
1412
1638
  requiredVersion: scopeType === "strict" ? tag : sharedInfo.requiredVersion || tag,
1413
1639
  ...sharedInfo.pool?.trim() ? { pool: sharedInfo.pool } : {},
1414
1640
  ...sharedInfo.dense ? { dense: true } : {},
1415
- entries: sharedInfo.entries
1641
+ entries: sharedInfo.entries,
1642
+ ...sharedInfo.preload ? { preload: true } : {},
1643
+ ...sharedInfo.dev ? { dev: true } : {}
1416
1644
  };
1417
1645
  let stored;
1418
1646
  const readRecord = () => stored ??= ports.sharedExternalsRepo.tryGet(sharedInfo.packageName, sharedInfo.shareScope).get() ?? { dirty: false, versions: [] };
@@ -1436,7 +1664,9 @@ function createStoreRemoteEntry(config, ports, logStep) {
1436
1664
  sharedInfo.packageName,
1437
1665
  {
1438
1666
  ...readRecord(),
1439
- versions: readRecord().versions.sort((a, b) => ports.versionCheck.compare(b.tag, a.tag))
1667
+ versions: readRecord().versions.sort(
1668
+ (a, b) => ports.versionCheck.compare(b.tag, a.tag)
1669
+ )
1440
1670
  },
1441
1671
  sharedInfo.shareScope
1442
1672
  );
@@ -1577,19 +1807,20 @@ function compareStrings(a, b) {
1577
1807
 
1578
1808
  // src/lib/core/1.domain/externals/basis.ts
1579
1809
  var coverage = (remote) => Object.keys(remote.entries).length;
1580
- function isBetterBasis(candidate, basis) {
1810
+ function isBetterBasis(candidate, basis, preferDev = false) {
1811
+ if (preferDev && Boolean(basis.dev) !== Boolean(candidate.dev)) return Boolean(candidate.dev);
1581
1812
  if (basis.cached !== candidate.cached) return candidate.cached;
1582
1813
  const byCoverage = coverage(candidate) - coverage(basis);
1583
1814
  return byCoverage === 0 ? compareStrings(candidate.name, basis.name) < 0 : byCoverage > 0;
1584
1815
  }
1585
- function addRemoteToVersion(version, remote, isHost = false) {
1816
+ function addRemoteToVersion(version, remote, isHost = false, preferDev = false) {
1586
1817
  if (isHost) {
1587
1818
  version.host = true;
1588
1819
  version.remotes.unshift(remote);
1589
1820
  return;
1590
1821
  }
1591
1822
  const basis = version.remotes[0];
1592
- if (basis && !version.host && isBetterBasis(remote, basis)) {
1823
+ if (basis && !version.host && isBetterBasis(remote, basis, preferDev)) {
1593
1824
  version.remotes.unshift(remote);
1594
1825
  return;
1595
1826
  }
@@ -1747,7 +1978,12 @@ function createProcessRemoteEntries(config, ports) {
1747
1978
  const matchingVersion = findVersionForTag(cached.versions, tag);
1748
1979
  if (matchingVersion) {
1749
1980
  assertSameVersionCompatibility(matchingVersion);
1750
- addRemoteToVersion(matchingVersion, remote, !matchingVersion.host && !!remoteEntry?.host);
1981
+ addRemoteToVersion(
1982
+ matchingVersion,
1983
+ remote,
1984
+ !matchingVersion.host && !!remoteEntry?.host,
1985
+ config.profile.enableDebugging
1986
+ );
1751
1987
  } else {
1752
1988
  cached.versions.push({
1753
1989
  tag,
@@ -2015,14 +2251,11 @@ function groupByPackage(items, nameOf, packageOf) {
2015
2251
  // src/lib/core/1.domain/pooling/builds.ts
2016
2252
  function copiesByRemote(members) {
2017
2253
  const shipped = /* @__PURE__ */ new Map();
2018
- for (const member of members) {
2019
- const seen = /* @__PURE__ */ new Set();
2020
- for (const version of member.external.versions)
2021
- for (const meta of version.remotes) {
2022
- if (seen.has(meta.name)) continue;
2023
- seen.add(meta.name);
2024
- let copies = shipped.get(meta.name);
2025
- if (!copies) shipped.set(meta.name, copies = []);
2254
+ for (const member of members)
2255
+ for (const [remote, records] of recordsByRemote(member)) {
2256
+ let copies = shipped.get(remote);
2257
+ if (!copies) shipped.set(remote, copies = []);
2258
+ for (const { version, meta } of records)
2026
2259
  copies.push({
2027
2260
  member: member.name,
2028
2261
  tag: version.tag,
@@ -2031,10 +2264,19 @@ function copiesByRemote(members) {
2031
2264
  host: version.host && meta === version.remotes[0],
2032
2265
  specifiers: Object.keys(meta.entries)
2033
2266
  });
2034
- }
2035
- }
2267
+ }
2036
2268
  return shipped;
2037
2269
  }
2270
+ function recordsByRemote(member) {
2271
+ const records = /* @__PURE__ */ new Map();
2272
+ for (const version of member.external.versions)
2273
+ for (const meta of version.remotes) {
2274
+ const mine = records.get(meta.name);
2275
+ if (!mine) records.set(meta.name, [{ version, meta }]);
2276
+ else if (mine[0].version.tag === version.tag) mine.push({ version, meta });
2277
+ }
2278
+ return records;
2279
+ }
2038
2280
  var specifierCount = (copies) => copies.reduce((n, copy) => n + copy.specifiers.length, 0);
2039
2281
  function buildOf(owner, copies, packageOf) {
2040
2282
  const tags = new SpecifierTags(packageOf);
@@ -2411,7 +2653,7 @@ function memberRecord(member, pool, compare) {
2411
2653
  const row = { tag, host: false, action, remotes: [meta] };
2412
2654
  placed.push(row);
2413
2655
  if (meta.name !== pool.winner) return;
2414
- winnerRow = row;
2656
+ winnerRow ??= row;
2415
2657
  row.host = pool.winnerIsHost;
2416
2658
  };
2417
2659
  for (const version of member.external.versions)
@@ -2425,9 +2667,9 @@ function memberRecord(member, pool, compare) {
2425
2667
  place(version.tag, "skip", { ...meta, servedBy: placement.owner });
2426
2668
  else place(version.tag, "scope", { ...meta, poolCause: placement.cause });
2427
2669
  }
2670
+ const rank2 = (name) => name === pool.winner ? 0 : claimsGlobally(name) ? 1 : 2;
2428
2671
  const rows = mergeRows(placed, winnerRow);
2429
- for (const row of rows)
2430
- row.remotes.sort((a, b) => Number(!claimsGlobally(a.name)) - Number(!claimsGlobally(b.name)));
2672
+ for (const row of rows) row.remotes.sort((a, b) => rank2(a.name) - rank2(b.name));
2431
2673
  const order = { share: 0, skip: 1, scope: 2 };
2432
2674
  const newest = byTag(compare);
2433
2675
  const versions = rows.sort((a, b) => newest(a, b) || order[a.action] - order[b.action]);
@@ -2448,14 +2690,16 @@ function moveCopy(external, remote, move, compare) {
2448
2690
  if ("fromMap" in move) return recordFromMap(external, remote);
2449
2691
  const moved = [];
2450
2692
  const versions = external.versions.map((v) => {
2451
- const copy = v.remotes.find((r) => r.name === remote);
2452
- if (!copy) return v;
2453
- const { servedBy: _servedBy, ...rest } = copy;
2454
- const meta = { ...rest, cached: true, poolCause: move.cause };
2455
- if (v.action === "scope")
2456
- return { ...v, remotes: v.remotes.map((r) => r === copy ? meta : r) };
2457
- moved.push({ tag: v.tag, meta });
2458
- return { ...v, remotes: v.remotes.filter((r) => r !== copy) };
2693
+ const replaced = /* @__PURE__ */ new Map();
2694
+ for (const copy of v.remotes) {
2695
+ if (copy.name !== remote) continue;
2696
+ const { servedBy: _servedBy, ...rest } = copy;
2697
+ replaced.set(copy, { ...rest, cached: true, poolCause: move.cause });
2698
+ }
2699
+ if (replaced.size === 0) return v;
2700
+ if (v.action === "scope") return { ...v, remotes: v.remotes.map((r) => replaced.get(r) ?? r) };
2701
+ for (const meta of replaced.values()) moved.push({ tag: v.tag, meta });
2702
+ return { ...v, remotes: v.remotes.filter((r) => !replaced.has(r)) };
2459
2703
  }).filter((v) => v.remotes.length > 0);
2460
2704
  for (const { tag, meta } of moved) {
2461
2705
  const scoped = rowAt(versions, tag, "scope");
@@ -2468,10 +2712,10 @@ function recordFromMap(external, remote) {
2468
2712
  const opened = external.versions.find(
2469
2713
  (v) => v.action !== "skip" && v.remotes.some((r) => r.name === remote)
2470
2714
  );
2471
- const meta = { ...opened.remotes.find((r) => r.name === remote), cached: false };
2472
2715
  const joined = rowAt(external.versions, opened.tag, "skip");
2473
2716
  const into = joined ? { ...joined, remotes: [...joined.remotes] } : { ...opened, action: "skip", remotes: [] };
2474
- addRemoteToVersion(into, meta);
2717
+ for (const copy of opened.remotes)
2718
+ if (copy.name === remote) addRemoteToVersion(into, { ...copy, cached: false });
2475
2719
  const versions = external.versions.flatMap((v) => {
2476
2720
  if (v === joined) return [into];
2477
2721
  if (v !== opened) return [v];
@@ -2656,11 +2900,12 @@ function cheapestBuild(field, costOf) {
2656
2900
  }
2657
2901
  function shareServingCopies(external, serving) {
2658
2902
  for (const row of external.versions) {
2659
- const copy = row.remotes.find((c) => c.name === serving.remote);
2660
- if (row.action !== "skip" || !copy || rowAt(external.versions, row.tag, "share")) continue;
2903
+ if (row.action !== "skip" || rowAt(external.versions, row.tag, "share")) continue;
2904
+ const own = row.remotes.filter((c) => c.name === serving.remote);
2905
+ if (own.length === 0) continue;
2661
2906
  row.action = "share";
2662
- if (row.remotes[0] !== copy) row.host = false;
2663
- row.remotes = [copy, ...row.remotes.filter((c) => c !== copy)];
2907
+ if (row.remotes[0] !== own[0]) row.host = false;
2908
+ row.remotes = [...own, ...row.remotes.filter((c) => c.name !== serving.remote)];
2664
2909
  }
2665
2910
  }
2666
2911
  function followServingBuild(external, serving, accepts) {
@@ -2705,20 +2950,20 @@ function shareRows(external) {
2705
2950
  return external?.versions.filter((v) => v.action === "share") ?? [];
2706
2951
  }
2707
2952
  function buildsOf(rows, rootRows, consumers) {
2708
- const candidates = /* @__PURE__ */ new Map();
2953
+ const builds = /* @__PURE__ */ new Map();
2709
2954
  for (const row of rows)
2710
2955
  for (const copy of row.remotes) {
2711
2956
  const key = `${row.tag}|${copy.name}`;
2712
- if (copy.servedBy || candidates.has(key) || shipsTwoTags(consumers.get(copy.name))) continue;
2957
+ if (copy.servedBy || builds.has(key) || shipsTwoTags(consumers.get(copy.name))) continue;
2713
2958
  const basis = copy === row.remotes[0];
2714
- candidates.set(key, {
2959
+ builds.set(key, {
2715
2960
  remote: copy.name,
2716
2961
  tag: row.tag,
2717
2962
  host: basis && row.host,
2718
2963
  rootBasis: basis && rootRows.includes(row)
2719
2964
  });
2720
2965
  }
2721
- return [...candidates.values()];
2966
+ return [...builds.values()];
2722
2967
  }
2723
2968
  function pooledBuild(externals, rows) {
2724
2969
  const winner = externals.find(([, e]) => e.poolWinner !== void 0)?.[1].poolWinner;
@@ -2727,10 +2972,7 @@ function pooledBuild(externals, rows) {
2727
2972
  );
2728
2973
  const own = shipped.find((c) => c.remote === winner);
2729
2974
  if (own) return own;
2730
- const width = ({ remote, tag }) => externals.reduce((n, [, e]) => {
2731
- const copy = shareRows(e).find((row) => row.tag === tag)?.remotes.find((c) => c.name === remote);
2732
- return n + Object.keys(copy?.entries ?? {}).length;
2733
- }, 0);
2975
+ const width = ({ remote, tag }) => externals.flatMap(([, e]) => shareRows(e).find((row) => row.tag === tag)?.remotes ?? []).filter((copy) => copy.name === remote).reduce((n, copy) => n + Object.keys(copy.entries).length, 0);
2734
2976
  return shipped.map((c) => ({ c, width: width(c) })).sort((a, b) => b.width - a.width || compareStrings(a.c.remote, b.c.remote))[0]?.c;
2735
2977
  }
2736
2978
  function consumersOf(externals) {
@@ -2971,7 +3213,7 @@ function versionClaims(version, servingBuild) {
2971
3213
  return claims;
2972
3214
  }
2973
3215
 
2974
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/domain/core/build-notification-options.contract.js
3216
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/domain/core/build-notification-options.contract.js
2975
3217
  var BuildNotificationType = /* @__PURE__ */ ((BuildNotificationType2) => {
2976
3218
  BuildNotificationType2["COMPLETED"] = "federation-rebuild-complete";
2977
3219
  BuildNotificationType2["ERROR"] = "federation-rebuild-error";
@@ -2979,7 +3221,7 @@ var BuildNotificationType = /* @__PURE__ */ ((BuildNotificationType2) => {
2979
3221
  return BuildNotificationType2;
2980
3222
  })(BuildNotificationType || {});
2981
3223
 
2982
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/domain/core/chunk.js
3224
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/domain/core/chunk.js
2983
3225
  var CHUNK_PREFIX = "@nf-internal";
2984
3226
  var SCRIPT_EXTENSION = /\.(m|c)?js$/;
2985
3227
  function toChunkImport(fileName) {
@@ -3376,16 +3618,99 @@ function shipsOnly(version, served) {
3376
3618
  return only;
3377
3619
  }
3378
3620
 
3621
+ // src/lib/core/2.app/steps/preload-hint.ts
3622
+ function createPreloadHint(log, browser, logStep) {
3623
+ const ignore = (error) => log.debug(logStep, "Ignored a failing preload hint.", error);
3624
+ return (collectUrls) => {
3625
+ if (!browser.preloadModules) return;
3626
+ try {
3627
+ const urls = collectUrls();
3628
+ if (urls.length === 0) return;
3629
+ void Promise.resolve(browser.preloadModules(urls)).catch(ignore);
3630
+ } catch (error) {
3631
+ ignore(error);
3632
+ }
3633
+ };
3634
+ }
3635
+
3636
+ // src/lib/core/1.domain/import-map/eager-preloads.ts
3637
+ function eagerPreloadUrls(importMap, candidates) {
3638
+ let mapped;
3639
+ const urls = /* @__PURE__ */ new Set();
3640
+ const bundlesAdded = /* @__PURE__ */ new Set();
3641
+ for (const { scopeUrl, entryFiles, bundle } of candidates) {
3642
+ mapped ??= mappedUrls(importMap);
3643
+ const entryUrls = entryFiles.map((file) => join(scopeUrl, file));
3644
+ const served = entryUrls.length > 0 && entryUrls.every((url) => mapped.has(url));
3645
+ if (!served) continue;
3646
+ entryUrls.forEach((url) => urls.add(url));
3647
+ if (!bundle) continue;
3648
+ const bundleKey = `${scopeUrl}
3649
+ ${bundle.name}`;
3650
+ if (bundlesAdded.has(bundleKey)) continue;
3651
+ bundlesAdded.add(bundleKey);
3652
+ bundle.chunkFiles.forEach((file) => urls.add(join(scopeUrl, file)));
3653
+ }
3654
+ return [...urls];
3655
+ }
3656
+ var mappedUrls = (importMap) => /* @__PURE__ */ new Set([
3657
+ ...Object.values(importMap.imports),
3658
+ ...Object.values(importMap.scopes ?? {}).flatMap((scope) => Object.values(scope))
3659
+ ]);
3660
+
3661
+ // src/lib/core/2.app/steps/collect-eager-preloads.ts
3662
+ function createCollectEagerPreloads(ports) {
3663
+ return (importMap) => eagerPreloadUrls(importMap, candidates());
3664
+ function* candidates() {
3665
+ for (const [remoteName, copy] of storedCopies()) {
3666
+ if (!copy.preload) continue;
3667
+ const scopeUrl = ports.remoteInfoRepo.tryGet(remoteName).get()?.scopeUrl;
3668
+ if (!scopeUrl) continue;
3669
+ yield {
3670
+ scopeUrl,
3671
+ entryFiles: Object.values(copy.entries),
3672
+ ...copy.bundle && {
3673
+ bundle: {
3674
+ name: copy.bundle,
3675
+ chunkFiles: ports.sharedChunksRepo.tryGet(remoteName, copy.bundle).orElse([])
3676
+ }
3677
+ }
3678
+ };
3679
+ }
3680
+ }
3681
+ function* storedCopies() {
3682
+ const shared = ports.sharedExternalsRepo;
3683
+ for (const shareScope of shared.getScopes())
3684
+ for (const external of Object.values(shared.getFromScope(shareScope)))
3685
+ for (const version of external.versions)
3686
+ for (const copy of version.remotes) yield [copy.name, copy];
3687
+ for (const [remoteName, externals] of Object.entries(ports.scopedExternalsRepo.getAll()))
3688
+ for (const copy of Object.values(externals)) yield [remoteName, copy];
3689
+ }
3690
+ }
3691
+
3379
3692
  // src/lib/core/2.app/steps/commit-changes.ts
3380
3693
  function createCommitChanges(config, ports) {
3381
- return (importMap, { markUndecided = false, ...browserOpts } = {}) => Promise.resolve(importMap).then((map) => addToBrowser(map, browserOpts)).then(() => {
3694
+ const preload = createPreloadHint(config.log, ports.browser, 5);
3695
+ const collectEagerPreloads = createCollectEagerPreloads(ports);
3696
+ return (importMap, { markUndecided = false, ...browserOpts } = {}) => Promise.resolve(importMap).then((map) => addToBrowser(map, browserOpts)).then((added) => {
3382
3697
  if (markUndecided) markUndecidedScopes();
3383
3698
  persistRepositoryChanges();
3699
+ preloadOnceAdded(added, importMap);
3384
3700
  });
3385
3701
  function addToBrowser(importMap, opts) {
3386
- ports.browser.setImportMapFn(importMap, opts);
3702
+ const added = ports.browser.setImportMapFn(importMap, opts);
3387
3703
  config.log.debug(5, "Added import map to browser.", importMap);
3388
- return importMap;
3704
+ return { added };
3705
+ }
3706
+ function preloadOnceAdded({ added }, importMap) {
3707
+ Promise.resolve(added).then(
3708
+ () => preload(() => collectEagerPreloads(importMap)),
3709
+ (error) => {
3710
+ config.log.error(5, "Could not add the import map.", error);
3711
+ return Promise.reject(error);
3712
+ }
3713
+ );
3389
3714
  }
3390
3715
  function markUndecidedScopes() {
3391
3716
  const repo = ports.sharedExternalsRepo;
@@ -3426,6 +3751,7 @@ function createRollbackChanges(config, ports) {
3426
3751
 
3427
3752
  // src/lib/core/2.app/steps/expose-module-loader.ts
3428
3753
  function createExposeModuleLoader(config, ports) {
3754
+ const preload = createPreloadHint(config.log, ports.browser, 6);
3429
3755
  const loadRemoteModule = (remoteName, exposedModule) => {
3430
3756
  try {
3431
3757
  if (!ports.remoteInfoRepo.contains(remoteName)) {
@@ -3437,6 +3763,7 @@ function createExposeModuleLoader(config, ports) {
3437
3763
  )
3438
3764
  );
3439
3765
  config.log.debug(6, `Loading initialized module '${remoteModuleUrl}'`);
3766
+ preload(() => ports.remoteInfoRepo.getModuleChunkUrls(remoteName, exposedModule));
3440
3767
  return ports.browser.importModule(remoteModuleUrl);
3441
3768
  } catch (error) {
3442
3769
  config.log.error(6, `Failed to load module ${join(remoteName, exposedModule)}: `, {
@@ -3447,7 +3774,15 @@ function createExposeModuleLoader(config, ports) {
3447
3774
  );
3448
3775
  }
3449
3776
  };
3450
- return () => Promise.resolve(loadRemoteModule);
3777
+ const preloadRemoteModule = (remoteName, exposedModule) => preload(() => {
3778
+ const url = ports.remoteInfoRepo.tryGetModule(remoteName, exposedModule);
3779
+ if (!url.isPresent()) {
3780
+ config.log.debug(6, `Nothing to preload for '${remoteName}/${exposedModule}'.`);
3781
+ return [];
3782
+ }
3783
+ return [url.get(), ...ports.remoteInfoRepo.getModuleChunkUrls(remoteName, exposedModule)];
3784
+ });
3785
+ return () => Promise.resolve({ loadRemoteModule, preloadRemoteModule });
3451
3786
  }
3452
3787
 
3453
3788
  // src/lib/utils/optional.ts
@@ -3849,11 +4184,15 @@ function coverFromMap(remote, mine, view, actions, policy) {
3849
4184
  const files = [];
3850
4185
  for (const member of mine) {
3851
4186
  const action = actions[member.name];
3852
- const copy = member.external.versions.flatMap((v) => v.remotes).find((r) => r.name === remote);
3853
- if (!copy) continue;
3854
- const mapped = mapFiles(copy, view, policy, action);
4187
+ const copies = recordsByRemote(member).get(remote);
4188
+ if (!copies) continue;
4189
+ const entries = {};
4190
+ for (const { meta } of copies)
4191
+ for (const [specifier, file] of Object.entries(meta.entries)) entries[specifier] ??= file;
4192
+ const inShareRow = copies.some(({ version }) => version.action === "share");
4193
+ const mapped = mapFiles(entries, view, policy, action);
3855
4194
  if ("unmapped" in mapped) return mapped;
3856
- files.push({ member, action, copy, ...mapped });
4195
+ files.push({ member, action, entries, inShareRow, ...mapped });
3857
4196
  }
3858
4197
  const reaches = reachesOf(remote, files, view);
3859
4198
  const bound = boundByFile(reaches, view);
@@ -3863,19 +4202,19 @@ function coverFromMap(remote, mine, view, actions, policy) {
3863
4202
  if (gap !== void 0) return { gap };
3864
4203
  return { covers: files.filter(covering).map(coverOf) };
3865
4204
  }
3866
- function gapOf({ copy, covered }, servedPackages, packageOf) {
3867
- const entrypoints = Object.keys(copy.entries);
4205
+ function gapOf({ entries, covered }, servedPackages, packageOf) {
4206
+ const entrypoints = Object.keys(entries);
3868
4207
  const missing = entrypoints.filter((specifier) => !covered.has(specifier));
3869
4208
  if (missing.length < entrypoints.length) return missing[0];
3870
4209
  return missing.find((specifier) => servedPackages.has(packageOf(specifier)));
3871
4210
  }
3872
- function covering({ action, copy, covered }) {
4211
+ function covering({ action, entries, covered }) {
3873
4212
  if (action.action === "skip") return true;
3874
- const entrypoints = Object.keys(copy.entries);
4213
+ const entrypoints = Object.keys(entries);
3875
4214
  return entrypoints.length > 0 && entrypoints.every((specifier) => covered.has(specifier));
3876
4215
  }
3877
- function coverOf({ member, action, copy, covered, override }) {
3878
- const toSkip = action.action !== "skip" || covered.size > action.covered.length && member.external.versions.some((v) => v.action === "share" && v.remotes.includes(copy));
4216
+ function coverOf({ member, action, inShareRow, covered, override }) {
4217
+ const toSkip = action.action !== "skip" || covered.size > action.covered.length && inShareRow;
3879
4218
  return { name: member.name, toSkip, override };
3880
4219
  }
3881
4220
  function reachesOf(remote, files, view) {
@@ -3886,7 +4225,7 @@ function reachesOf(remote, files, view) {
3886
4225
  };
3887
4226
  for (const file of files) {
3888
4227
  const takesMap = covering(file);
3889
- for (const [specifier, own] of Object.entries(file.copy.entries)) {
4228
+ for (const [specifier, own] of Object.entries(file.entries)) {
3890
4229
  if (!takesMap || !file.covered.has(specifier)) reaches.set(specifier, { remote, file: own });
3891
4230
  else {
3892
4231
  const reach = fromMap(specifier);
@@ -3913,10 +4252,10 @@ function boundByFile(reaches, view) {
3913
4252
  }
3914
4253
  return void 0;
3915
4254
  }
3916
- function mapFiles(copy, view, policy, action) {
4255
+ function mapFiles(entries, view, policy, action) {
3917
4256
  const covered = new Set(action.covered);
3918
4257
  const override = { ...action.override };
3919
- for (const specifier in copy.entries) {
4258
+ for (const specifier in entries) {
3920
4259
  const source = view.global.get(specifier);
3921
4260
  if (!source) continue;
3922
4261
  if (policy.shareScope !== GLOBAL_SCOPE) {
@@ -4239,7 +4578,8 @@ var INIT_FLOW_FACTORY = ({
4239
4578
  var createBrowser = (config) => {
4240
4579
  return {
4241
4580
  setImportMapFn: config.setImportMapFn,
4242
- importModule: config.loadModuleFn
4581
+ importModule: config.loadModuleFn,
4582
+ preloadModules: config.preloadModulesFn
4243
4583
  };
4244
4584
  };
4245
4585
 
@@ -4347,7 +4687,7 @@ function markDense(shared) {
4347
4687
  return shared.map((entry) => "entries" in entry ? { ...entry, dense: true } : entry);
4348
4688
  }
4349
4689
 
4350
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/utils/normalize.js
4690
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/utils/normalize.js
4351
4691
  function inferPackageFromSecondary(secondary) {
4352
4692
  const parts = secondary.split("/");
4353
4693
  if (secondary.startsWith("@") && parts.length >= 2) {
@@ -4356,7 +4696,7 @@ function inferPackageFromSecondary(secondary) {
4356
4696
  return parts[0];
4357
4697
  }
4358
4698
 
4359
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/core/output/densify-externals.js
4699
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/core/output/densify-externals.js
4360
4700
  function isDense(entry) {
4361
4701
  return "entries" in entry;
4362
4702
  }
@@ -4480,6 +4820,11 @@ var createRemoteInfoRepository = (config) => {
4480
4820
  (m) => join(_cache[remoteName].scopeUrl, m.file)
4481
4821
  );
4482
4822
  },
4823
+ getModuleChunkUrls: function(remoteName, exposedModule) {
4824
+ const remote = _cache[remoteName];
4825
+ const chunks = remote?.exposes.find((m) => m.moduleName === exposedModule)?.chunks ?? [];
4826
+ return chunks.map((file) => join(remote.scopeUrl, file));
4827
+ },
4483
4828
  getAll: function() {
4484
4829
  return _cache;
4485
4830
  },
@@ -4914,6 +5259,18 @@ var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts
4914
5259
  return Promise.resolve(importMap);
4915
5260
  };
4916
5261
 
5262
+ // src/lib/core/4.config/import-map/preload-in-dom.ts
5263
+ var preloadInDOM = (rel) => {
5264
+ const preloaded = /* @__PURE__ */ new Set();
5265
+ return (urls) => {
5266
+ for (const href of urls) {
5267
+ if (preloaded.has(href)) continue;
5268
+ preloaded.add(href);
5269
+ document.head.appendChild(Object.assign(document.createElement("link"), { rel, href }));
5270
+ }
5271
+ };
5272
+ };
5273
+
4917
5274
  // src/lib/core/4.config/import-map/use-default.ts
4918
5275
  var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
4919
5276
  loadModuleFn: (url) => {
@@ -4924,20 +5281,27 @@ var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
4924
5281
  );
4925
5282
  },
4926
5283
  setImportMapFn: replaceInDOM("importmap", trustedTypesPolicyName),
5284
+ preloadModulesFn: preloadInDOM("modulepreload"),
4927
5285
  reloadBrowserFn: () => {
4928
5286
  window.location.reload();
4929
5287
  }
4930
5288
  });
4931
5289
 
5290
+ // src/lib/core/4.config/import-map/no-preload.ts
5291
+ var noPreload = () => {
5292
+ };
5293
+
4932
5294
  // src/lib/core/4.config/import-map/import-map.config.ts
4933
5295
  var createImportMapConfig = (o) => {
4934
5296
  const fallback = useDefaultImportMap(o.trustedTypesPolicyName);
4935
5297
  return {
4936
5298
  setImportMapFn: o.setImportMapFn ?? fallback.setImportMapFn,
4937
5299
  loadModuleFn: o.loadModuleFn ?? fallback.loadModuleFn,
4938
- reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn
5300
+ reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn,
5301
+ preloadModulesFn: o.preloadModulesFn ?? defaultPreload(o, fallback)
4939
5302
  };
4940
5303
  };
5304
+ var defaultPreload = (o, fallback) => o.loadModuleFn ? noPreload : fallback.preloadModulesFn;
4941
5305
 
4942
5306
  // src/lib/core/4.config/host/host.config.ts
4943
5307
  var createHostConfig = (override) => {
@@ -5044,7 +5408,7 @@ globalThisStorageEntry.type = "globalThis";
5044
5408
  Object.freeze(globalThisStorageEntry);
5045
5409
 
5046
5410
  // src/lib/core/4.config/orchestrator-version.ts
5047
- var ORCHESTRATOR_VERSION = true ? "4.9.0" : "dev";
5411
+ var ORCHESTRATOR_VERSION = true ? "4.10.1" : "dev";
5048
5412
 
5049
5413
  // src/lib/core/4.config/storage/publish-storage-info.ts
5050
5414
  var KEYS = Object.freeze(Object.values(STORAGE_KEYS));
@@ -5149,7 +5513,8 @@ var defaultProfile = {
5149
5513
  skipInvalidExternalVersions: false,
5150
5514
  overrideCachedRemotes: "init-only",
5151
5515
  overrideCachedRemotesIfURLMatches: false,
5152
- mergeManifests: true
5516
+ mergeManifests: true,
5517
+ enableDebugging: false
5153
5518
  };
5154
5519
 
5155
5520
  // src/lib/core/4.config/mode/mode.config.ts
@@ -5193,6 +5558,9 @@ var createFederationResult = ({
5193
5558
  config,
5194
5559
  adapters,
5195
5560
  loadRemoteModule,
5561
+ // A host composing init by hand may not pass it.
5562
+ preloadRemoteModule = () => {
5563
+ },
5196
5564
  initRemoteEntryFlow,
5197
5565
  afterInitRemoteEntry
5198
5566
  }) => {
@@ -5208,6 +5576,7 @@ var createFederationResult = ({
5208
5576
  adapters,
5209
5577
  loadRemoteModule,
5210
5578
  load: loadRemoteModule,
5579
+ preloadRemoteModule,
5211
5580
  as: () => ({
5212
5581
  loadRemoteModule,
5213
5582
  load: loadRemoteModule
@@ -5223,9 +5592,7 @@ var initFederation = (remotesOrManifestUrl, options = {}) => {
5223
5592
  const factory = INIT_FLOW_FACTORY({ adapters, config });
5224
5593
  const initFlow = createInitFlow(factory);
5225
5594
  const initRemoteEntryFlow = createInitRemoteEntryFlow(factory);
5226
- return initFlow(remotesOrManifestUrl).then(
5227
- ({ loadRemoteModule }) => createFederationResult({ config, adapters, loadRemoteModule, initRemoteEntryFlow })
5228
- ).catch((e) => {
5595
+ return initFlow(remotesOrManifestUrl).then((access) => createFederationResult({ config, adapters, ...access, initRemoteEntryFlow })).catch((e) => {
5229
5596
  createStateDump(config, adapters)(`[init] STATE DUMP`);
5230
5597
  return Promise.reject(e);
5231
5598
  });