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