@softarc/native-federation-orchestrator 4.9.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +2 -2
  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/package.json +3 -3
  10. package/quickstart.mjs +15 -13
  11. package/types/lib/core/1.domain/externals/basis.d.ts +2 -2
  12. package/types/lib/core/1.domain/externals/version.contract.d.ts +3 -0
  13. package/types/lib/core/1.domain/import-map/eager-preloads.d.ts +10 -0
  14. package/types/lib/core/1.domain/pooling/builds.d.ts +7 -1
  15. package/types/lib/core/1.domain/remote/remote-module.contract.d.ts +1 -0
  16. package/types/lib/core/1.domain/remote-entry/remote-entry.contract.d.ts +2 -2
  17. package/types/lib/core/2.app/config/import-map.contract.d.ts +4 -7
  18. package/types/lib/core/2.app/config/index.d.ts +2 -2
  19. package/types/lib/core/2.app/config/mode.contract.d.ts +1 -0
  20. package/types/lib/core/2.app/driver-ports/init/flow.contract.d.ts +2 -4
  21. package/types/lib/core/2.app/driver-ports/init/for-exposing-module-loader.port.d.ts +6 -2
  22. package/types/lib/core/2.app/driving-ports/for-browser-tasks.d.ts +1 -0
  23. package/types/lib/core/2.app/driving-ports/for-remote-info-storage.port.d.ts +1 -0
  24. package/types/lib/core/2.app/steps/collect-eager-preloads.d.ts +4 -0
  25. package/types/lib/core/2.app/steps/preload-hint.d.ts +4 -0
  26. package/types/lib/core/2.app/steps/store-remote-entry.d.ts +0 -14
  27. package/types/lib/core/4.config/import-map/index.d.ts +2 -0
  28. package/types/lib/core/4.config/import-map/no-preload.d.ts +2 -0
  29. package/types/lib/core/4.config/import-map/preload-in-dom.d.ts +2 -0
  30. package/types/lib/core/5.di/federation-result.factory.d.ts +3 -2
  31. package/types/lib/core/init-federation.contract.d.ts +2 -0
  32. package/types/lib/index.d.ts +1 -1
  33. package/types/lib/node/init-federation.node.d.ts +2 -7
  34. package/types/lib/node.index.d.ts +1 -1
package/fesm2022/node.mjs CHANGED
@@ -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) => {
@@ -1281,7 +1500,8 @@ var require_valid2 = __commonJS({
1281
1500
  var createBrowser = (config) => {
1282
1501
  return {
1283
1502
  setImportMapFn: config.setImportMapFn,
1284
- importModule: config.loadModuleFn
1503
+ importModule: config.loadModuleFn,
1504
+ preloadModules: config.preloadModulesFn
1285
1505
  };
1286
1506
  };
1287
1507
 
@@ -1411,7 +1631,7 @@ function markDense(shared) {
1411
1631
  return shared.map((entry) => "entries" in entry ? { ...entry, dense: true } : entry);
1412
1632
  }
1413
1633
 
1414
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/domain/core/chunk.js
1634
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/domain/core/chunk.js
1415
1635
  var CHUNK_PREFIX = "@nf-internal";
1416
1636
  var SCRIPT_EXTENSION = /\.(m|c)?js$/;
1417
1637
  function toChunkImport(fileName) {
@@ -1422,7 +1642,7 @@ function toChunkImport(fileName) {
1422
1642
  return CHUNK_PREFIX + "/" + packageName;
1423
1643
  }
1424
1644
 
1425
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/utils/normalize.js
1645
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/utils/normalize.js
1426
1646
  function inferPackageFromSecondary(secondary) {
1427
1647
  const parts = secondary.split("/");
1428
1648
  if (secondary.startsWith("@") && parts.length >= 2) {
@@ -1431,7 +1651,7 @@ function inferPackageFromSecondary(secondary) {
1431
1651
  return parts[0];
1432
1652
  }
1433
1653
 
1434
- // node_modules/.pnpm/@softarc+native-federation@4.9.0/node_modules/@softarc/native-federation/dist/lib/core/output/densify-externals.js
1654
+ // node_modules/.pnpm/@softarc+native-federation@4.10.0/node_modules/@softarc/native-federation/dist/lib/core/output/densify-externals.js
1435
1655
  function isDense(entry) {
1436
1656
  return "entries" in entry;
1437
1657
  }
@@ -1615,6 +1835,11 @@ var createRemoteInfoRepository = (config) => {
1615
1835
  (m) => join(_cache[remoteName].scopeUrl, m.file)
1616
1836
  );
1617
1837
  },
1838
+ getModuleChunkUrls: function(remoteName, exposedModule) {
1839
+ const remote = _cache[remoteName];
1840
+ const chunks = remote?.exposes.find((m) => m.moduleName === exposedModule)?.chunks ?? [];
1841
+ return chunks.map((file) => join(remote.scopeUrl, file));
1842
+ },
1618
1843
  getAll: function() {
1619
1844
  return _cache;
1620
1845
  },
@@ -1930,6 +2155,18 @@ var replaceInDOM = (mapType, trustedTypesPolicyName = "nfo") => (importMap, opts
1930
2155
  return Promise.resolve(importMap);
1931
2156
  };
1932
2157
 
2158
+ // src/lib/core/4.config/import-map/preload-in-dom.ts
2159
+ var preloadInDOM = (rel) => {
2160
+ const preloaded = /* @__PURE__ */ new Set();
2161
+ return (urls) => {
2162
+ for (const href of urls) {
2163
+ if (preloaded.has(href)) continue;
2164
+ preloaded.add(href);
2165
+ document.head.appendChild(Object.assign(document.createElement("link"), { rel, href }));
2166
+ }
2167
+ };
2168
+ };
2169
+
1933
2170
  // src/lib/core/4.config/import-map/use-default.ts
1934
2171
  var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
1935
2172
  loadModuleFn: (url) => {
@@ -1940,20 +2177,27 @@ var useDefaultImportMap = (trustedTypesPolicyName = "nfo") => ({
1940
2177
  );
1941
2178
  },
1942
2179
  setImportMapFn: replaceInDOM("importmap", trustedTypesPolicyName),
2180
+ preloadModulesFn: preloadInDOM("modulepreload"),
1943
2181
  reloadBrowserFn: () => {
1944
2182
  window.location.reload();
1945
2183
  }
1946
2184
  });
1947
2185
 
2186
+ // src/lib/core/4.config/import-map/no-preload.ts
2187
+ var noPreload = () => {
2188
+ };
2189
+
1948
2190
  // src/lib/core/4.config/import-map/import-map.config.ts
1949
2191
  var createImportMapConfig = (o) => {
1950
2192
  const fallback = useDefaultImportMap(o.trustedTypesPolicyName);
1951
2193
  return {
1952
2194
  setImportMapFn: o.setImportMapFn ?? fallback.setImportMapFn,
1953
2195
  loadModuleFn: o.loadModuleFn ?? fallback.loadModuleFn,
1954
- reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn
2196
+ reloadBrowserFn: o.reloadBrowserFn ?? fallback.reloadBrowserFn,
2197
+ preloadModulesFn: o.preloadModulesFn ?? defaultPreload(o, fallback)
1955
2198
  };
1956
2199
  };
2200
+ var defaultPreload = (o, fallback) => o.loadModuleFn ? noPreload : fallback.preloadModulesFn;
1957
2201
 
1958
2202
  // src/lib/core/4.config/host/host.config.ts
1959
2203
  var createHostConfig = (override) => {
@@ -2060,7 +2304,7 @@ globalThisStorageEntry.type = "globalThis";
2060
2304
  Object.freeze(globalThisStorageEntry);
2061
2305
 
2062
2306
  // src/lib/core/4.config/orchestrator-version.ts
2063
- var ORCHESTRATOR_VERSION = true ? "4.9.0" : "dev";
2307
+ var ORCHESTRATOR_VERSION = true ? "4.10.0" : "dev";
2064
2308
 
2065
2309
  // src/lib/core/4.config/storage/publish-storage-info.ts
2066
2310
  var KEYS = Object.freeze(Object.values(STORAGE_KEYS));
@@ -2165,7 +2409,8 @@ var defaultProfile = {
2165
2409
  skipInvalidExternalVersions: false,
2166
2410
  overrideCachedRemotes: "init-only",
2167
2411
  overrideCachedRemotesIfURLMatches: false,
2168
- mergeManifests: true
2412
+ mergeManifests: true,
2413
+ enableDebugging: false
2169
2414
  };
2170
2415
 
2171
2416
  // src/lib/core/4.config/mode/mode.config.ts
@@ -2210,10 +2455,10 @@ var createInitFlow = ({
2210
2455
  adapters,
2211
2456
  config
2212
2457
  }) => {
2213
- 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) => ({
2458
+ 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) => ({
2214
2459
  config,
2215
2460
  adapters,
2216
- loadRemoteModule
2461
+ ...access
2217
2462
  }));
2218
2463
  };
2219
2464
 
@@ -2249,10 +2494,14 @@ function createStoreRemoteEntry(config, ports, logStep) {
2249
2494
  function addRemoteInfoToStorage({ name, url, exposes, integrity }) {
2250
2495
  ports.remoteInfoRepo.addOrUpdate(name, {
2251
2496
  scopeUrl: getScope(url),
2252
- exposes: Object.values(exposes ?? []).map((m) => ({
2253
- moduleName: m.key,
2254
- file: m.outFileName
2255
- })),
2497
+ exposes: Object.values(exposes ?? []).map((m) => {
2498
+ const chunks = Object.values(m.chunks ?? {}).filter((c) => c.initial).map((c) => c.file);
2499
+ return {
2500
+ moduleName: m.key,
2501
+ file: m.outFileName,
2502
+ ...chunks.length ? { chunks } : {}
2503
+ };
2504
+ }),
2256
2505
  ...integrity ? { integrity } : {}
2257
2506
  });
2258
2507
  }
@@ -2283,10 +2532,13 @@ function createStoreRemoteEntry(config, ports, logStep) {
2283
2532
  });
2284
2533
  }
2285
2534
  function addScopedExternal(remoteEntry, sharedInfo, tag) {
2286
- ports.scopedExternalsRepo.addExternal(remoteEntry.name, sharedInfo.packageName, {
2535
+ const { packageName, entries } = sharedInfo;
2536
+ const key = packageName in entries ? packageName : Object.keys(entries)[0] ?? packageName;
2537
+ ports.scopedExternalsRepo.addExternal(remoteEntry.name, key, {
2287
2538
  tag,
2288
2539
  bundle: sharedInfo.bundle,
2289
- entries: sharedInfo.entries
2540
+ entries,
2541
+ ...sharedInfo.preload ? { preload: true } : {}
2290
2542
  });
2291
2543
  }
2292
2544
  function resolveVersion(remoteEntry, external) {
@@ -2315,7 +2567,9 @@ function createStoreRemoteEntry(config, ports, logStep) {
2315
2567
  requiredVersion: scopeType === "strict" ? tag : sharedInfo.requiredVersion || tag,
2316
2568
  ...sharedInfo.pool?.trim() ? { pool: sharedInfo.pool } : {},
2317
2569
  ...sharedInfo.dense ? { dense: true } : {},
2318
- entries: sharedInfo.entries
2570
+ entries: sharedInfo.entries,
2571
+ ...sharedInfo.preload ? { preload: true } : {},
2572
+ ...sharedInfo.dev ? { dev: true } : {}
2319
2573
  };
2320
2574
  let stored;
2321
2575
  const readRecord = () => stored ??= ports.sharedExternalsRepo.tryGet(sharedInfo.packageName, sharedInfo.shareScope).get() ?? { dirty: false, versions: [] };
@@ -2339,7 +2593,9 @@ function createStoreRemoteEntry(config, ports, logStep) {
2339
2593
  sharedInfo.packageName,
2340
2594
  {
2341
2595
  ...readRecord(),
2342
- versions: readRecord().versions.sort((a, b) => ports.versionCheck.compare(b.tag, a.tag))
2596
+ versions: readRecord().versions.sort(
2597
+ (a, b) => ports.versionCheck.compare(b.tag, a.tag)
2598
+ )
2343
2599
  },
2344
2600
  sharedInfo.shareScope
2345
2601
  );
@@ -2480,19 +2736,20 @@ function compareStrings(a, b) {
2480
2736
 
2481
2737
  // src/lib/core/1.domain/externals/basis.ts
2482
2738
  var coverage = (remote) => Object.keys(remote.entries).length;
2483
- function isBetterBasis(candidate, basis) {
2739
+ function isBetterBasis(candidate, basis, preferDev = false) {
2740
+ if (preferDev && Boolean(basis.dev) !== Boolean(candidate.dev)) return Boolean(candidate.dev);
2484
2741
  if (basis.cached !== candidate.cached) return candidate.cached;
2485
2742
  const byCoverage = coverage(candidate) - coverage(basis);
2486
2743
  return byCoverage === 0 ? compareStrings(candidate.name, basis.name) < 0 : byCoverage > 0;
2487
2744
  }
2488
- function addRemoteToVersion(version, remote, isHost = false) {
2745
+ function addRemoteToVersion(version, remote, isHost = false, preferDev = false) {
2489
2746
  if (isHost) {
2490
2747
  version.host = true;
2491
2748
  version.remotes.unshift(remote);
2492
2749
  return;
2493
2750
  }
2494
2751
  const basis = version.remotes[0];
2495
- if (basis && !version.host && isBetterBasis(remote, basis)) {
2752
+ if (basis && !version.host && isBetterBasis(remote, basis, preferDev)) {
2496
2753
  version.remotes.unshift(remote);
2497
2754
  return;
2498
2755
  }
@@ -2650,7 +2907,12 @@ function createProcessRemoteEntries(config, ports) {
2650
2907
  const matchingVersion = findVersionForTag(cached2.versions, tag);
2651
2908
  if (matchingVersion) {
2652
2909
  assertSameVersionCompatibility(matchingVersion);
2653
- addRemoteToVersion(matchingVersion, remote, !matchingVersion.host && !!remoteEntry?.host);
2910
+ addRemoteToVersion(
2911
+ matchingVersion,
2912
+ remote,
2913
+ !matchingVersion.host && !!remoteEntry?.host,
2914
+ config.profile.enableDebugging
2915
+ );
2654
2916
  } else {
2655
2917
  cached2.versions.push({
2656
2918
  tag,
@@ -2914,14 +3176,11 @@ function groupByPackage(items, nameOf, packageOf) {
2914
3176
  // src/lib/core/1.domain/pooling/builds.ts
2915
3177
  function copiesByRemote(members) {
2916
3178
  const shipped = /* @__PURE__ */ new Map();
2917
- for (const member of members) {
2918
- const seen = /* @__PURE__ */ new Set();
2919
- for (const version of member.external.versions)
2920
- for (const meta of version.remotes) {
2921
- if (seen.has(meta.name)) continue;
2922
- seen.add(meta.name);
2923
- let copies = shipped.get(meta.name);
2924
- if (!copies) shipped.set(meta.name, copies = []);
3179
+ for (const member of members)
3180
+ for (const [remote, records] of recordsByRemote(member)) {
3181
+ let copies = shipped.get(remote);
3182
+ if (!copies) shipped.set(remote, copies = []);
3183
+ for (const { version, meta } of records)
2925
3184
  copies.push({
2926
3185
  member: member.name,
2927
3186
  tag: version.tag,
@@ -2930,10 +3189,19 @@ function copiesByRemote(members) {
2930
3189
  host: version.host && meta === version.remotes[0],
2931
3190
  specifiers: Object.keys(meta.entries)
2932
3191
  });
2933
- }
2934
- }
3192
+ }
2935
3193
  return shipped;
2936
3194
  }
3195
+ function recordsByRemote(member) {
3196
+ const records = /* @__PURE__ */ new Map();
3197
+ for (const version of member.external.versions)
3198
+ for (const meta of version.remotes) {
3199
+ const mine = records.get(meta.name);
3200
+ if (!mine) records.set(meta.name, [{ version, meta }]);
3201
+ else if (mine[0].version.tag === version.tag) mine.push({ version, meta });
3202
+ }
3203
+ return records;
3204
+ }
2937
3205
  var specifierCount = (copies) => copies.reduce((n, copy) => n + copy.specifiers.length, 0);
2938
3206
  function buildOf(owner, copies, packageOf) {
2939
3207
  const tags = new SpecifierTags(packageOf);
@@ -3310,7 +3578,7 @@ function memberRecord(member, pool, compare) {
3310
3578
  const row = { tag, host: false, action, remotes: [meta] };
3311
3579
  placed.push(row);
3312
3580
  if (meta.name !== pool.winner) return;
3313
- winnerRow = row;
3581
+ winnerRow ??= row;
3314
3582
  row.host = pool.winnerIsHost;
3315
3583
  };
3316
3584
  for (const version of member.external.versions)
@@ -3324,9 +3592,9 @@ function memberRecord(member, pool, compare) {
3324
3592
  place(version.tag, "skip", { ...meta, servedBy: placement.owner });
3325
3593
  else place(version.tag, "scope", { ...meta, poolCause: placement.cause });
3326
3594
  }
3595
+ const rank2 = (name) => name === pool.winner ? 0 : claimsGlobally(name) ? 1 : 2;
3327
3596
  const rows = mergeRows(placed, winnerRow);
3328
- for (const row of rows)
3329
- row.remotes.sort((a, b) => Number(!claimsGlobally(a.name)) - Number(!claimsGlobally(b.name)));
3597
+ for (const row of rows) row.remotes.sort((a, b) => rank2(a.name) - rank2(b.name));
3330
3598
  const order = { share: 0, skip: 1, scope: 2 };
3331
3599
  const newest = byTag(compare);
3332
3600
  const versions = rows.sort((a, b) => newest(a, b) || order[a.action] - order[b.action]);
@@ -3347,14 +3615,16 @@ function moveCopy(external, remote, move, compare) {
3347
3615
  if ("fromMap" in move) return recordFromMap(external, remote);
3348
3616
  const moved = [];
3349
3617
  const versions = external.versions.map((v) => {
3350
- const copy = v.remotes.find((r) => r.name === remote);
3351
- if (!copy) return v;
3352
- const { servedBy: _servedBy, ...rest } = copy;
3353
- const meta = { ...rest, cached: true, poolCause: move.cause };
3354
- if (v.action === "scope")
3355
- return { ...v, remotes: v.remotes.map((r) => r === copy ? meta : r) };
3356
- moved.push({ tag: v.tag, meta });
3357
- return { ...v, remotes: v.remotes.filter((r) => r !== copy) };
3618
+ const replaced = /* @__PURE__ */ new Map();
3619
+ for (const copy of v.remotes) {
3620
+ if (copy.name !== remote) continue;
3621
+ const { servedBy: _servedBy, ...rest } = copy;
3622
+ replaced.set(copy, { ...rest, cached: true, poolCause: move.cause });
3623
+ }
3624
+ if (replaced.size === 0) return v;
3625
+ if (v.action === "scope") return { ...v, remotes: v.remotes.map((r) => replaced.get(r) ?? r) };
3626
+ for (const meta of replaced.values()) moved.push({ tag: v.tag, meta });
3627
+ return { ...v, remotes: v.remotes.filter((r) => !replaced.has(r)) };
3358
3628
  }).filter((v) => v.remotes.length > 0);
3359
3629
  for (const { tag, meta } of moved) {
3360
3630
  const scoped = rowAt(versions, tag, "scope");
@@ -3367,10 +3637,10 @@ function recordFromMap(external, remote) {
3367
3637
  const opened = external.versions.find(
3368
3638
  (v) => v.action !== "skip" && v.remotes.some((r) => r.name === remote)
3369
3639
  );
3370
- const meta = { ...opened.remotes.find((r) => r.name === remote), cached: false };
3371
3640
  const joined = rowAt(external.versions, opened.tag, "skip");
3372
3641
  const into = joined ? { ...joined, remotes: [...joined.remotes] } : { ...opened, action: "skip", remotes: [] };
3373
- addRemoteToVersion(into, meta);
3642
+ for (const copy of opened.remotes)
3643
+ if (copy.name === remote) addRemoteToVersion(into, { ...copy, cached: false });
3374
3644
  const versions = external.versions.flatMap((v) => {
3375
3645
  if (v === joined) return [into];
3376
3646
  if (v !== opened) return [v];
@@ -3555,11 +3825,12 @@ function cheapestBuild(field, costOf) {
3555
3825
  }
3556
3826
  function shareServingCopies(external, serving) {
3557
3827
  for (const row of external.versions) {
3558
- const copy = row.remotes.find((c) => c.name === serving.remote);
3559
- if (row.action !== "skip" || !copy || rowAt(external.versions, row.tag, "share")) continue;
3828
+ if (row.action !== "skip" || rowAt(external.versions, row.tag, "share")) continue;
3829
+ const own = row.remotes.filter((c) => c.name === serving.remote);
3830
+ if (own.length === 0) continue;
3560
3831
  row.action = "share";
3561
- if (row.remotes[0] !== copy) row.host = false;
3562
- row.remotes = [copy, ...row.remotes.filter((c) => c !== copy)];
3832
+ if (row.remotes[0] !== own[0]) row.host = false;
3833
+ row.remotes = [...own, ...row.remotes.filter((c) => c.name !== serving.remote)];
3563
3834
  }
3564
3835
  }
3565
3836
  function followServingBuild(external, serving, accepts) {
@@ -3604,20 +3875,20 @@ function shareRows(external) {
3604
3875
  return external?.versions.filter((v) => v.action === "share") ?? [];
3605
3876
  }
3606
3877
  function buildsOf(rows, rootRows, consumers) {
3607
- const candidates = /* @__PURE__ */ new Map();
3878
+ const builds = /* @__PURE__ */ new Map();
3608
3879
  for (const row of rows)
3609
3880
  for (const copy of row.remotes) {
3610
3881
  const key = `${row.tag}|${copy.name}`;
3611
- if (copy.servedBy || candidates.has(key) || shipsTwoTags(consumers.get(copy.name))) continue;
3882
+ if (copy.servedBy || builds.has(key) || shipsTwoTags(consumers.get(copy.name))) continue;
3612
3883
  const basis = copy === row.remotes[0];
3613
- candidates.set(key, {
3884
+ builds.set(key, {
3614
3885
  remote: copy.name,
3615
3886
  tag: row.tag,
3616
3887
  host: basis && row.host,
3617
3888
  rootBasis: basis && rootRows.includes(row)
3618
3889
  });
3619
3890
  }
3620
- return [...candidates.values()];
3891
+ return [...builds.values()];
3621
3892
  }
3622
3893
  function pooledBuild(externals, rows) {
3623
3894
  const winner = externals.find(([, e]) => e.poolWinner !== void 0)?.[1].poolWinner;
@@ -3626,10 +3897,7 @@ function pooledBuild(externals, rows) {
3626
3897
  );
3627
3898
  const own = shipped.find((c) => c.remote === winner);
3628
3899
  if (own) return own;
3629
- const width = ({ remote, tag }) => externals.reduce((n, [, e]) => {
3630
- const copy = shareRows(e).find((row) => row.tag === tag)?.remotes.find((c) => c.name === remote);
3631
- return n + Object.keys(copy?.entries ?? {}).length;
3632
- }, 0);
3900
+ 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);
3633
3901
  return shipped.map((c) => ({ c, width: width(c) })).sort((a, b) => b.width - a.width || compareStrings(a.c.remote, b.c.remote))[0]?.c;
3634
3902
  }
3635
3903
  function consumersOf(externals) {
@@ -4256,16 +4524,99 @@ function shipsOnly(version, served) {
4256
4524
  return only;
4257
4525
  }
4258
4526
 
4527
+ // src/lib/core/2.app/steps/preload-hint.ts
4528
+ function createPreloadHint(log, browser, logStep) {
4529
+ const ignore = (error) => log.debug(logStep, "Ignored a failing preload hint.", error);
4530
+ return (collectUrls) => {
4531
+ if (!browser.preloadModules) return;
4532
+ try {
4533
+ const urls = collectUrls();
4534
+ if (urls.length === 0) return;
4535
+ void Promise.resolve(browser.preloadModules(urls)).catch(ignore);
4536
+ } catch (error) {
4537
+ ignore(error);
4538
+ }
4539
+ };
4540
+ }
4541
+
4542
+ // src/lib/core/1.domain/import-map/eager-preloads.ts
4543
+ function eagerPreloadUrls(importMap, candidates) {
4544
+ let mapped;
4545
+ const urls = /* @__PURE__ */ new Set();
4546
+ const bundlesAdded = /* @__PURE__ */ new Set();
4547
+ for (const { scopeUrl, entryFiles, bundle } of candidates) {
4548
+ mapped ??= mappedUrls(importMap);
4549
+ const entryUrls = entryFiles.map((file) => join(scopeUrl, file));
4550
+ const served = entryUrls.length > 0 && entryUrls.every((url) => mapped.has(url));
4551
+ if (!served) continue;
4552
+ entryUrls.forEach((url) => urls.add(url));
4553
+ if (!bundle) continue;
4554
+ const bundleKey = `${scopeUrl}
4555
+ ${bundle.name}`;
4556
+ if (bundlesAdded.has(bundleKey)) continue;
4557
+ bundlesAdded.add(bundleKey);
4558
+ bundle.chunkFiles.forEach((file) => urls.add(join(scopeUrl, file)));
4559
+ }
4560
+ return [...urls];
4561
+ }
4562
+ var mappedUrls = (importMap) => /* @__PURE__ */ new Set([
4563
+ ...Object.values(importMap.imports),
4564
+ ...Object.values(importMap.scopes ?? {}).flatMap((scope) => Object.values(scope))
4565
+ ]);
4566
+
4567
+ // src/lib/core/2.app/steps/collect-eager-preloads.ts
4568
+ function createCollectEagerPreloads(ports) {
4569
+ return (importMap) => eagerPreloadUrls(importMap, candidates());
4570
+ function* candidates() {
4571
+ for (const [remoteName, copy] of storedCopies()) {
4572
+ if (!copy.preload) continue;
4573
+ const scopeUrl = ports.remoteInfoRepo.tryGet(remoteName).get()?.scopeUrl;
4574
+ if (!scopeUrl) continue;
4575
+ yield {
4576
+ scopeUrl,
4577
+ entryFiles: Object.values(copy.entries),
4578
+ ...copy.bundle && {
4579
+ bundle: {
4580
+ name: copy.bundle,
4581
+ chunkFiles: ports.sharedChunksRepo.tryGet(remoteName, copy.bundle).orElse([])
4582
+ }
4583
+ }
4584
+ };
4585
+ }
4586
+ }
4587
+ function* storedCopies() {
4588
+ const shared = ports.sharedExternalsRepo;
4589
+ for (const shareScope of shared.getScopes())
4590
+ for (const external of Object.values(shared.getFromScope(shareScope)))
4591
+ for (const version of external.versions)
4592
+ for (const copy of version.remotes) yield [copy.name, copy];
4593
+ for (const [remoteName, externals] of Object.entries(ports.scopedExternalsRepo.getAll()))
4594
+ for (const copy of Object.values(externals)) yield [remoteName, copy];
4595
+ }
4596
+ }
4597
+
4259
4598
  // src/lib/core/2.app/steps/commit-changes.ts
4260
4599
  function createCommitChanges(config, ports) {
4261
- return (importMap, { markUndecided = false, ...browserOpts } = {}) => Promise.resolve(importMap).then((map) => addToBrowser(map, browserOpts)).then(() => {
4600
+ const preload = createPreloadHint(config.log, ports.browser, 5);
4601
+ const collectEagerPreloads = createCollectEagerPreloads(ports);
4602
+ return (importMap, { markUndecided = false, ...browserOpts } = {}) => Promise.resolve(importMap).then((map) => addToBrowser(map, browserOpts)).then((added) => {
4262
4603
  if (markUndecided) markUndecidedScopes();
4263
4604
  persistRepositoryChanges();
4605
+ preloadOnceAdded(added, importMap);
4264
4606
  });
4265
4607
  function addToBrowser(importMap, opts) {
4266
- ports.browser.setImportMapFn(importMap, opts);
4608
+ const added = ports.browser.setImportMapFn(importMap, opts);
4267
4609
  config.log.debug(5, "Added import map to browser.", importMap);
4268
- return importMap;
4610
+ return { added };
4611
+ }
4612
+ function preloadOnceAdded({ added }, importMap) {
4613
+ Promise.resolve(added).then(
4614
+ () => preload(() => collectEagerPreloads(importMap)),
4615
+ (error) => {
4616
+ config.log.error(5, "Could not add the import map.", error);
4617
+ return Promise.reject(error);
4618
+ }
4619
+ );
4269
4620
  }
4270
4621
  function markUndecidedScopes() {
4271
4622
  const repo = ports.sharedExternalsRepo;
@@ -4306,6 +4657,7 @@ function createRollbackChanges(config, ports) {
4306
4657
 
4307
4658
  // src/lib/core/2.app/steps/expose-module-loader.ts
4308
4659
  function createExposeModuleLoader(config, ports) {
4660
+ const preload = createPreloadHint(config.log, ports.browser, 6);
4309
4661
  const loadRemoteModule = (remoteName, exposedModule) => {
4310
4662
  try {
4311
4663
  if (!ports.remoteInfoRepo.contains(remoteName)) {
@@ -4317,6 +4669,7 @@ function createExposeModuleLoader(config, ports) {
4317
4669
  )
4318
4670
  );
4319
4671
  config.log.debug(6, `Loading initialized module '${remoteModuleUrl}'`);
4672
+ preload(() => ports.remoteInfoRepo.getModuleChunkUrls(remoteName, exposedModule));
4320
4673
  return ports.browser.importModule(remoteModuleUrl);
4321
4674
  } catch (error) {
4322
4675
  config.log.error(6, `Failed to load module ${join(remoteName, exposedModule)}: `, {
@@ -4327,7 +4680,15 @@ function createExposeModuleLoader(config, ports) {
4327
4680
  );
4328
4681
  }
4329
4682
  };
4330
- return () => Promise.resolve(loadRemoteModule);
4683
+ const preloadRemoteModule = (remoteName, exposedModule) => preload(() => {
4684
+ const url = ports.remoteInfoRepo.tryGetModule(remoteName, exposedModule);
4685
+ if (!url.isPresent()) {
4686
+ config.log.debug(6, `Nothing to preload for '${remoteName}/${exposedModule}'.`);
4687
+ return [];
4688
+ }
4689
+ return [url.get(), ...ports.remoteInfoRepo.getModuleChunkUrls(remoteName, exposedModule)];
4690
+ });
4691
+ return () => Promise.resolve({ loadRemoteModule, preloadRemoteModule });
4331
4692
  }
4332
4693
 
4333
4694
  // src/lib/core/2.app/steps/get-remote-entry.ts
@@ -4690,11 +5051,15 @@ function coverFromMap(remote, mine, view, actions, policy) {
4690
5051
  const files = [];
4691
5052
  for (const member of mine) {
4692
5053
  const action = actions[member.name];
4693
- const copy = member.external.versions.flatMap((v) => v.remotes).find((r) => r.name === remote);
4694
- if (!copy) continue;
4695
- const mapped = mapFiles(copy, view, policy, action);
5054
+ const copies = recordsByRemote(member).get(remote);
5055
+ if (!copies) continue;
5056
+ const entries = {};
5057
+ for (const { meta } of copies)
5058
+ for (const [specifier, file] of Object.entries(meta.entries)) entries[specifier] ??= file;
5059
+ const inShareRow = copies.some(({ version }) => version.action === "share");
5060
+ const mapped = mapFiles(entries, view, policy, action);
4696
5061
  if ("unmapped" in mapped) return mapped;
4697
- files.push({ member, action, copy, ...mapped });
5062
+ files.push({ member, action, entries, inShareRow, ...mapped });
4698
5063
  }
4699
5064
  const reaches = reachesOf(remote, files, view);
4700
5065
  const bound = boundByFile(reaches, view);
@@ -4704,19 +5069,19 @@ function coverFromMap(remote, mine, view, actions, policy) {
4704
5069
  if (gap !== void 0) return { gap };
4705
5070
  return { covers: files.filter(covering).map(coverOf) };
4706
5071
  }
4707
- function gapOf({ copy, covered }, servedPackages, packageOf) {
4708
- const entrypoints = Object.keys(copy.entries);
5072
+ function gapOf({ entries, covered }, servedPackages, packageOf) {
5073
+ const entrypoints = Object.keys(entries);
4709
5074
  const missing = entrypoints.filter((specifier) => !covered.has(specifier));
4710
5075
  if (missing.length < entrypoints.length) return missing[0];
4711
5076
  return missing.find((specifier) => servedPackages.has(packageOf(specifier)));
4712
5077
  }
4713
- function covering({ action, copy, covered }) {
5078
+ function covering({ action, entries, covered }) {
4714
5079
  if (action.action === "skip") return true;
4715
- const entrypoints = Object.keys(copy.entries);
5080
+ const entrypoints = Object.keys(entries);
4716
5081
  return entrypoints.length > 0 && entrypoints.every((specifier) => covered.has(specifier));
4717
5082
  }
4718
- function coverOf({ member, action, copy, covered, override }) {
4719
- const toSkip = action.action !== "skip" || covered.size > action.covered.length && member.external.versions.some((v) => v.action === "share" && v.remotes.includes(copy));
5083
+ function coverOf({ member, action, inShareRow, covered, override }) {
5084
+ const toSkip = action.action !== "skip" || covered.size > action.covered.length && inShareRow;
4720
5085
  return { name: member.name, toSkip, override };
4721
5086
  }
4722
5087
  function reachesOf(remote, files, view) {
@@ -4727,7 +5092,7 @@ function reachesOf(remote, files, view) {
4727
5092
  };
4728
5093
  for (const file of files) {
4729
5094
  const takesMap = covering(file);
4730
- for (const [specifier, own] of Object.entries(file.copy.entries)) {
5095
+ for (const [specifier, own] of Object.entries(file.entries)) {
4731
5096
  if (!takesMap || !file.covered.has(specifier)) reaches.set(specifier, { remote, file: own });
4732
5097
  else {
4733
5098
  const reach = fromMap(specifier);
@@ -4754,10 +5119,10 @@ function boundByFile(reaches, view) {
4754
5119
  }
4755
5120
  return void 0;
4756
5121
  }
4757
- function mapFiles(copy, view, policy, action) {
5122
+ function mapFiles(entries, view, policy, action) {
4758
5123
  const covered = new Set(action.covered);
4759
5124
  const override = { ...action.override };
4760
- for (const specifier in copy.entries) {
5125
+ for (const specifier in entries) {
4761
5126
  const source = view.global.get(specifier);
4762
5127
  if (!source) continue;
4763
5128
  if (policy.shareScope !== GLOBAL_SCOPE) {
@@ -5081,6 +5446,9 @@ var createFederationResult = ({
5081
5446
  config,
5082
5447
  adapters,
5083
5448
  loadRemoteModule,
5449
+ // A host composing init by hand may not pass it.
5450
+ preloadRemoteModule = () => {
5451
+ },
5084
5452
  initRemoteEntryFlow,
5085
5453
  afterInitRemoteEntry
5086
5454
  }) => {
@@ -5096,6 +5464,7 @@ var createFederationResult = ({
5096
5464
  adapters,
5097
5465
  loadRemoteModule,
5098
5466
  load: loadRemoteModule,
5467
+ preloadRemoteModule,
5099
5468
  as: () => ({
5100
5469
  loadRemoteModule,
5101
5470
  load: loadRemoteModule
@@ -5209,7 +5578,9 @@ var useNodeImportMap = () => {
5209
5578
  setImportMapFn: (importMap) => nodeLoader.setMap(importMap).then(() => importMap),
5210
5579
  setHostInstancesFn: (keys) => nodeLoader.setHostInstances(keys).then(() => keys),
5211
5580
  reloadBrowserFn: () => {
5212
- }
5581
+ },
5582
+ // import() would evaluate the module, and the loader thread reads a module only once it is imported.
5583
+ preloadModulesFn: noPreload
5213
5584
  };
5214
5585
  };
5215
5586
 
@@ -5288,6 +5659,7 @@ var initNodeFederation = (remotesOrManifestUrl, options = {}) => {
5288
5659
  loadModuleFn: options.loadModuleFn ?? nodeConfig.loadModuleFn,
5289
5660
  setImportMapFn: options.setImportMapFn ?? nodeConfig.setImportMapFn,
5290
5661
  reloadBrowserFn: options.reloadBrowserFn ?? nodeConfig.reloadBrowserFn,
5662
+ preloadModulesFn: options.preloadModulesFn ?? nodeConfig.preloadModulesFn,
5291
5663
  sse: false
5292
5664
  });
5293
5665
  const adapters = buildNodeAdapters(config);
@@ -5311,11 +5683,11 @@ var initNodeFederation = (remotesOrManifestUrl, options = {}) => {
5311
5683
  const factory = INIT_FLOW_FACTORY({ adapters, config });
5312
5684
  const initFlow = createInitFlow(factory);
5313
5685
  const initRemoteEntryFlow = createInitRemoteEntryFlow(factory);
5314
- return hostInstancesReady.then(() => initFlow(remotesOrManifestUrl)).then(({ loadRemoteModule }) => nodeConfig.nodeLoader.ready().then(() => loadRemoteModule)).then(
5315
- (loadRemoteModule) => createFederationResult({
5686
+ return hostInstancesReady.then(() => initFlow(remotesOrManifestUrl)).then((access) => nodeConfig.nodeLoader.ready().then(() => access)).then(
5687
+ (access) => createFederationResult({
5316
5688
  config,
5317
5689
  adapters,
5318
- loadRemoteModule,
5690
+ ...access,
5319
5691
  initRemoteEntryFlow,
5320
5692
  afterInitRemoteEntry: () => nodeConfig.nodeLoader.ready()
5321
5693
  })