@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/cjs/backend-federation-build/codegen.js +29 -18
- package/dist/cjs/backend-federation-build/config.js +84 -45
- package/dist/cjs/backend-federation-build/emit.js +63 -22
- package/dist/cjs/build-config/build-environment.js +25 -162
- package/dist/cjs/build-config/internal-effect-discovery.js +143 -0
- package/dist/cjs/build-config/public.js +2 -5
- package/dist/cjs/build-config/remote-address.js +58 -0
- package/dist/cjs/cloudflare/artifacts.js +8 -19
- package/dist/cjs/cloudflare/delivery-unit.js +125 -43
- package/dist/cjs/cloudflare/index.js +14 -4
- package/dist/cjs/cloudflare/native-renderer.js +100 -0
- package/dist/cjs/cloudflare/renderer-identity.js +106 -0
- package/dist/cjs/cloudflare/worker-manifest.js +54 -13
- package/dist/cjs/cloudflare/worker-options.js +48 -0
- package/dist/cjs/cloudflare/wrangler-config.js +210 -13
- package/dist/cjs/cloudflare-builder.js +307 -89
- package/dist/cjs/cloudflare-output-contract.js +36 -4
- package/dist/cjs/cloudflare-output-verifier/identity.js +112 -23
- package/dist/cjs/cloudflare-output-verifier/index.js +10 -0
- package/dist/cjs/cloudflare-output-verifier/manifest.js +46 -0
- package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +7 -1
- package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +10 -5
- package/dist/cjs/config.js +10 -5
- package/dist/cjs/deploy-output/npmAliases.js +92 -6
- package/dist/cjs/deploy-output/plugin.js +27 -6
- package/dist/cjs/deploy-output/public-assets.js +146 -0
- package/dist/cjs/deploy-output/target.js +57 -1
- package/dist/cjs/deploy-output/trace-files.js +99 -0
- package/dist/cjs/module-federation-config/exposes.js +70 -0
- package/dist/cjs/module-federation-config/index.js +73 -0
- package/dist/cjs/module-federation-config/inspect.js +103 -0
- package/dist/cjs/module-federation-config/object-literal.js +87 -0
- package/dist/cjs/module-federation-config/syntax.js +151 -0
- package/dist/cjs/module-federation-config/types.js +18 -0
- package/dist/cjs/native-type-checker.js +130 -13
- package/dist/cjs/policy-defaults.js +38 -29
- package/dist/cjs/release-envelope/canonical.js +2 -9
- package/dist/cjs/release-envelope/contract.js +68 -0
- package/dist/cjs/release-envelope/framework-output.js +296 -105
- package/dist/cjs/release-envelope/index.js +150 -36
- package/dist/cjs/release-envelope/plugin.js +24 -15
- package/dist/cjs/release-envelope/renderer-output-stamp.js +170 -0
- package/dist/cjs/release-envelope/types.js +10 -8
- package/dist/cjs/release-identity.js +8 -5
- package/dist/cjs/renderer-build-identity.js +134 -0
- package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
- package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/cjs/workspace-topology.js +84 -0
- package/dist/esm/backend-federation-build/codegen.mjs +29 -18
- package/dist/esm/backend-federation-build/config.mjs +74 -38
- package/dist/esm/backend-federation-build/emit.mjs +64 -23
- package/dist/esm/build-config/build-environment.mjs +26 -160
- package/dist/esm/build-config/internal-effect-discovery.mjs +102 -0
- package/dist/esm/build-config/public.mjs +1 -1
- package/dist/esm/build-config/remote-address.mjs +20 -0
- package/dist/esm/cloudflare/artifacts.mjs +8 -19
- package/dist/esm/cloudflare/delivery-unit.mjs +124 -45
- package/dist/esm/cloudflare/index.mjs +15 -5
- package/dist/esm/cloudflare/native-renderer.mjs +48 -0
- package/dist/esm/cloudflare/renderer-identity.mjs +57 -0
- package/dist/esm/cloudflare/worker-manifest.mjs +55 -14
- package/dist/esm/cloudflare/worker-options.mjs +10 -0
- package/dist/esm/cloudflare/wrangler-config.mjs +203 -12
- package/dist/esm/cloudflare-builder.mjs +301 -89
- package/dist/esm/cloudflare-output-contract.mjs +29 -3
- package/dist/esm/cloudflare-output-verifier/identity.mjs +113 -24
- package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
- package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
- package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
- package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +11 -6
- package/dist/esm/config.mjs +3 -1
- package/dist/esm/deploy-output/npmAliases.mjs +92 -6
- package/dist/esm/deploy-output/plugin.mjs +24 -6
- package/dist/esm/deploy-output/public-assets.mjs +82 -0
- package/dist/esm/deploy-output/target.mjs +50 -3
- package/dist/esm/deploy-output/trace-files.mjs +47 -0
- package/dist/esm/module-federation-config/exposes.mjs +18 -0
- package/dist/esm/module-federation-config/index.mjs +4 -0
- package/dist/esm/module-federation-config/inspect.mjs +65 -0
- package/dist/esm/module-federation-config/object-literal.mjs +43 -0
- package/dist/esm/module-federation-config/syntax.mjs +101 -0
- package/dist/esm/module-federation-config/types.mjs +0 -0
- package/dist/esm/native-type-checker.mjs +124 -13
- package/dist/esm/policy-defaults.mjs +36 -30
- package/dist/esm/release-envelope/canonical.mjs +2 -9
- package/dist/esm/release-envelope/contract.mjs +21 -0
- package/dist/esm/release-envelope/framework-output.mjs +297 -106
- package/dist/esm/release-envelope/index.mjs +149 -38
- package/dist/esm/release-envelope/plugin.mjs +24 -15
- package/dist/esm/release-envelope/renderer-output-stamp.mjs +112 -0
- package/dist/esm/release-envelope/types.mjs +2 -3
- package/dist/esm/release-identity.mjs +8 -5
- package/dist/esm/renderer-build-identity.mjs +82 -0
- package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
- package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/esm/workspace-topology.mjs +21 -0
- package/dist/esm-node/backend-federation-build/codegen.mjs +29 -18
- package/dist/esm-node/backend-federation-build/config.mjs +74 -38
- package/dist/esm-node/backend-federation-build/emit.mjs +64 -23
- package/dist/esm-node/build-config/build-environment.mjs +26 -160
- package/dist/esm-node/build-config/internal-effect-discovery.mjs +103 -0
- package/dist/esm-node/build-config/public.mjs +1 -1
- package/dist/esm-node/build-config/remote-address.mjs +21 -0
- package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
- package/dist/esm-node/cloudflare/delivery-unit.mjs +124 -45
- package/dist/esm-node/cloudflare/index.mjs +15 -5
- package/dist/esm-node/cloudflare/native-renderer.mjs +49 -0
- package/dist/esm-node/cloudflare/renderer-identity.mjs +58 -0
- package/dist/esm-node/cloudflare/worker-manifest.mjs +55 -14
- package/dist/esm-node/cloudflare/worker-options.mjs +11 -0
- package/dist/esm-node/cloudflare/wrangler-config.mjs +203 -12
- package/dist/esm-node/cloudflare-builder.mjs +301 -89
- package/dist/esm-node/cloudflare-output-contract.mjs +29 -3
- package/dist/esm-node/cloudflare-output-verifier/identity.mjs +113 -24
- package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
- package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
- package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
- package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +11 -6
- package/dist/esm-node/config.mjs +3 -1
- package/dist/esm-node/deploy-output/npmAliases.mjs +92 -6
- package/dist/esm-node/deploy-output/plugin.mjs +24 -6
- package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
- package/dist/esm-node/deploy-output/target.mjs +50 -3
- package/dist/esm-node/deploy-output/trace-files.mjs +48 -0
- package/dist/esm-node/module-federation-config/exposes.mjs +19 -0
- package/dist/esm-node/module-federation-config/index.mjs +5 -0
- package/dist/esm-node/module-federation-config/inspect.mjs +66 -0
- package/dist/esm-node/module-federation-config/object-literal.mjs +44 -0
- package/dist/esm-node/module-federation-config/syntax.mjs +102 -0
- package/dist/esm-node/module-federation-config/types.mjs +1 -0
- package/dist/esm-node/native-type-checker.mjs +124 -13
- package/dist/esm-node/policy-defaults.mjs +36 -30
- package/dist/esm-node/release-envelope/canonical.mjs +2 -9
- package/dist/esm-node/release-envelope/contract.mjs +22 -0
- package/dist/esm-node/release-envelope/framework-output.mjs +297 -106
- package/dist/esm-node/release-envelope/index.mjs +149 -38
- package/dist/esm-node/release-envelope/plugin.mjs +24 -15
- package/dist/esm-node/release-envelope/renderer-output-stamp.mjs +113 -0
- package/dist/esm-node/release-envelope/types.mjs +2 -3
- package/dist/esm-node/release-identity.mjs +8 -5
- package/dist/esm-node/renderer-build-identity.mjs +83 -0
- package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
- package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/dist/esm-node/workspace-topology.mjs +22 -0
- package/dist/types/backend-federation-build/codegen.d.ts +30 -0
- package/dist/types/backend-federation-build/config.d.ts +10 -57
- package/dist/types/backend-federation-build/emit.d.ts +12 -2
- package/dist/types/backend-federation-build/index.d.ts +1 -1
- package/dist/types/build-config/build-environment.d.ts +1 -9
- package/dist/types/build-config/internal-effect-discovery.d.ts +4 -0
- package/dist/types/build-config/public.d.ts +1 -1
- package/dist/types/build-config/remote-address.d.ts +3 -0
- package/dist/types/cloudflare/artifacts.d.ts +7 -6
- package/dist/types/cloudflare/constants.d.ts +1 -1
- package/dist/types/cloudflare/delivery-unit.d.ts +38 -7
- package/dist/types/cloudflare/native-renderer.d.ts +30 -0
- package/dist/types/cloudflare/renderer-identity.d.ts +25 -0
- package/dist/types/cloudflare/worker-manifest.d.ts +17 -2
- package/dist/types/cloudflare/worker-options.d.ts +20 -0
- package/dist/types/cloudflare/wrangler-config.d.ts +55 -2
- package/dist/types/cloudflare-builder.d.ts +51 -8
- package/dist/types/cloudflare-output-contract.d.ts +5 -3
- package/dist/types/cloudflare-output-verifier/identity.d.ts +7 -3
- package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
- package/dist/types/config.d.ts +98 -13
- package/dist/types/deploy-output/plugin.d.ts +29 -9
- package/dist/types/deploy-output/public-assets.d.ts +51 -0
- package/dist/types/deploy-output/target.d.ts +28 -5
- package/dist/types/deploy-output/trace-files.d.ts +17 -0
- package/dist/types/module-federation-config/exposes.d.ts +11 -0
- package/dist/types/module-federation-config/index.d.ts +5 -0
- package/dist/types/module-federation-config/inspect.d.ts +2 -0
- package/dist/types/module-federation-config/object-literal.d.ts +4 -0
- package/dist/types/module-federation-config/syntax.d.ts +7 -0
- package/dist/types/module-federation-config/types.d.ts +20 -0
- package/dist/types/native-type-checker.d.ts +26 -3
- package/dist/types/policy-defaults.d.ts +12 -2
- package/dist/types/release-envelope/canonical.d.ts +5 -5
- package/dist/types/release-envelope/contract.d.mts +8 -0
- package/dist/types/release-envelope/framework-output.d.ts +23 -13
- package/dist/types/release-envelope/index.d.ts +17 -5
- package/dist/types/release-envelope/plugin.d.ts +10 -6
- package/dist/types/release-envelope/renderer-output-stamp.d.ts +34 -0
- package/dist/types/release-envelope/types.d.ts +42 -4
- package/dist/types/release-identity.d.ts +3 -2
- package/dist/types/renderer-build-identity.d.ts +30 -0
- package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
- package/dist/types/workspace-topology.d.ts +91 -0
- package/package.json +87 -27
- package/src/backend-federation-build/codegen.ts +28 -19
- package/src/backend-federation-build/config.ts +189 -123
- package/src/backend-federation-build/emit.ts +119 -38
- package/src/backend-federation-build/index.ts +4 -1
- package/src/build-config/build-environment.ts +59 -285
- package/src/build-config/internal-effect-discovery.ts +239 -0
- package/src/build-config/public.ts +0 -1
- package/src/build-config/remote-address.ts +33 -0
- package/src/cloudflare/artifacts.ts +22 -43
- package/src/cloudflare/delivery-unit.ts +283 -60
- package/src/cloudflare/index.ts +35 -19
- package/src/cloudflare/native-renderer.ts +117 -0
- package/src/cloudflare/renderer-identity.ts +171 -0
- package/src/cloudflare/worker-manifest.ts +108 -10
- package/src/cloudflare/worker-options.ts +60 -0
- package/src/cloudflare/wrangler-config.ts +390 -14
- package/src/cloudflare-builder.ts +543 -170
- package/src/cloudflare-output-contract.ts +45 -2
- package/src/cloudflare-output-verifier/identity.ts +138 -7
- package/src/cloudflare-output-verifier/index.ts +20 -0
- package/src/cloudflare-output-verifier/manifest.ts +77 -0
- package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
- package/src/cloudflare-output-verifier/worker-bundles.ts +27 -11
- package/src/config.ts +101 -19
- package/src/deploy-output/npmAliases.ts +141 -4
- package/src/deploy-output/plugin.ts +55 -18
- package/src/deploy-output/public-assets.ts +224 -0
- package/src/deploy-output/target.ts +97 -14
- package/src/deploy-output/trace-files.ts +80 -0
- package/src/module-federation-config/exposes.ts +46 -0
- package/src/module-federation-config/index.ts +22 -0
- package/src/module-federation-config/inspect.ts +157 -0
- package/src/module-federation-config/object-literal.ts +76 -0
- package/src/module-federation-config/syntax.ts +212 -0
- package/src/module-federation-config/types.ts +22 -0
- package/src/native-type-checker.ts +233 -20
- package/src/policy-defaults.ts +47 -17
- package/src/release-envelope/canonical.ts +6 -18
- package/src/release-envelope/contract.mjs +28 -0
- package/src/release-envelope/framework-output.ts +681 -156
- package/src/release-envelope/index.ts +315 -60
- package/src/release-envelope/plugin.ts +54 -38
- package/src/release-envelope/renderer-output-stamp.ts +210 -0
- package/src/release-envelope/types.ts +75 -6
- package/src/release-identity.ts +19 -2
- package/src/renderer-build-identity.ts +168 -0
- package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
- package/src/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
- package/src/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
- package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
- package/src/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
- package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
- package/src/workspace-topology.ts +125 -0
- package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
- package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
- package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
- package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
- package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
- package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
- package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
- package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
- package/src/templates/cloudflare-worker-path.mjs +0 -98
|
@@ -18,60 +18,24 @@ import {
|
|
|
18
18
|
validateUltramodernBuildArtifact,
|
|
19
19
|
} from '@modern-js/backend-federation-contracts';
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
versionBoundary?: {
|
|
40
|
-
ui?: {
|
|
41
|
-
manifestUrl?: unknown;
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
executionSurfaces?: {
|
|
45
|
-
node?: {
|
|
46
|
-
remoteName?: unknown;
|
|
47
|
-
manifestUrl?: unknown;
|
|
48
|
-
containerEntry?: unknown;
|
|
49
|
-
remoteType?: unknown;
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
};
|
|
53
|
-
deliveryUnit?: {
|
|
54
|
-
unitId?: unknown;
|
|
55
|
-
buildMarker?: unknown;
|
|
56
|
-
sourceRevision?: unknown;
|
|
57
|
-
packageName?: unknown;
|
|
58
|
-
version?: unknown;
|
|
59
|
-
};
|
|
60
|
-
serverExecution?: {
|
|
61
|
-
node?: {
|
|
62
|
-
remoteName?: unknown;
|
|
63
|
-
manifestUrl?: unknown;
|
|
64
|
-
containerEntry?: unknown;
|
|
65
|
-
remoteType?: unknown;
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export type CompactConfig = {
|
|
71
|
-
topology?: {
|
|
72
|
-
apps?: CompactApp[];
|
|
73
|
-
};
|
|
74
|
-
};
|
|
21
|
+
import {
|
|
22
|
+
DEVELOPMENT_OVERLAY_PATH,
|
|
23
|
+
type DevelopmentOverlay,
|
|
24
|
+
normalizeRelativePath,
|
|
25
|
+
REFERENCE_TOPOLOGY_PATH,
|
|
26
|
+
type ReferenceTopology,
|
|
27
|
+
type TopologyApp,
|
|
28
|
+
} from '../workspace-topology';
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
DEVELOPMENT_OVERLAY_PATH,
|
|
32
|
+
type DevelopmentOverlay,
|
|
33
|
+
findWorkspaceRoot,
|
|
34
|
+
normalizeRelativePath,
|
|
35
|
+
REFERENCE_TOPOLOGY_PATH,
|
|
36
|
+
type ReferenceTopology,
|
|
37
|
+
type TopologyApp,
|
|
38
|
+
} from '../workspace-topology';
|
|
75
39
|
|
|
76
40
|
export type BackendFederationApp = {
|
|
77
41
|
id: string;
|
|
@@ -84,13 +48,15 @@ export type BackendFederationApp = {
|
|
|
84
48
|
deliveryUnit?: DeliveryUnitContractBlock;
|
|
85
49
|
port: number;
|
|
86
50
|
apiPrefix: string;
|
|
51
|
+
apiProtocol: 'rest' | 'rpc';
|
|
52
|
+
rpcPath?: string;
|
|
87
53
|
apiStem: string;
|
|
88
54
|
backendName: string;
|
|
89
55
|
manifestUrl: string;
|
|
90
56
|
containerEntry: string;
|
|
91
57
|
remoteType: string;
|
|
92
58
|
uiManifestUrl?: string;
|
|
93
|
-
|
|
59
|
+
topologyDeliveryUnit?: {
|
|
94
60
|
unitId?: string;
|
|
95
61
|
buildMarker?: string;
|
|
96
62
|
sourceRevision?: string;
|
|
@@ -109,9 +75,6 @@ export type BackendFederationBuildIdentity = {
|
|
|
109
75
|
artifact?: UltramodernBuildArtifact;
|
|
110
76
|
};
|
|
111
77
|
|
|
112
|
-
export const normalizeRelativePath = (value: string) =>
|
|
113
|
-
value.replace(/\\/gu, '/').replace(/^\.\/+/u, '');
|
|
114
|
-
|
|
115
78
|
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
116
79
|
typeof value === 'object' && value !== null;
|
|
117
80
|
|
|
@@ -169,11 +132,10 @@ const toPascalCase = (value: string) =>
|
|
|
169
132
|
const stringValue = (value: unknown) =>
|
|
170
133
|
typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
171
134
|
|
|
172
|
-
const createBackendName = (app:
|
|
135
|
+
const createBackendName = (app: TopologyApp, id: string) => {
|
|
173
136
|
const configuredName =
|
|
174
137
|
stringValue(app.backendFederation?.name) ??
|
|
175
|
-
stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName)
|
|
176
|
-
stringValue(app.serverExecution?.node?.remoteName);
|
|
138
|
+
stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName);
|
|
177
139
|
|
|
178
140
|
if (configuredName) {
|
|
179
141
|
return configuredName;
|
|
@@ -183,20 +145,27 @@ const createBackendName = (app: CompactApp, id: string) => {
|
|
|
183
145
|
return mfName ? `${mfName}Backend` : `vertical${toPascalCase(id)}Backend`;
|
|
184
146
|
};
|
|
185
147
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
148
|
+
const rebaseDefaultLocalUrl = (
|
|
149
|
+
value: string,
|
|
150
|
+
defaultPort: number,
|
|
151
|
+
publicOrigin: string,
|
|
152
|
+
) => {
|
|
153
|
+
let url: URL;
|
|
154
|
+
try {
|
|
155
|
+
url = new URL(value);
|
|
156
|
+
} catch {
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
if (
|
|
160
|
+
url.protocol !== 'http:' ||
|
|
161
|
+
url.hostname !== 'localhost' ||
|
|
162
|
+
Number(url.port) !== defaultPort ||
|
|
163
|
+
url.username ||
|
|
164
|
+
url.password
|
|
165
|
+
) {
|
|
166
|
+
return value;
|
|
199
167
|
}
|
|
168
|
+
return `${publicOrigin}${url.pathname}${url.search}${url.hash}`;
|
|
200
169
|
};
|
|
201
170
|
|
|
202
171
|
export const resolveWorkspaceSourceRevision = async (workspaceRoot: string) => {
|
|
@@ -240,50 +209,121 @@ export const createStampedDeliveryUnit = (input: {
|
|
|
240
209
|
return deliveryUnitContractBlock(record as DeliveryUnitRecord);
|
|
241
210
|
};
|
|
242
211
|
|
|
243
|
-
export const
|
|
212
|
+
export const createAppFromTopology = (
|
|
244
213
|
workspaceRoot: string,
|
|
245
214
|
appDirectory: string,
|
|
246
|
-
|
|
215
|
+
topologyApp: TopologyApp,
|
|
216
|
+
overlay: DevelopmentOverlay,
|
|
217
|
+
packageManifest: { name?: unknown; version?: unknown },
|
|
247
218
|
): BackendFederationApp | undefined => {
|
|
248
|
-
const id = stringValue(
|
|
249
|
-
const appPath = stringValue(
|
|
219
|
+
const id = stringValue(topologyApp.id);
|
|
220
|
+
const appPath = stringValue(topologyApp.path);
|
|
250
221
|
|
|
251
|
-
if (
|
|
222
|
+
if (
|
|
223
|
+
!id ||
|
|
224
|
+
!appPath ||
|
|
225
|
+
topologyApp.kind !== 'vertical' ||
|
|
226
|
+
!isRecord(topologyApp.api) ||
|
|
227
|
+
!isRecord(topologyApp.backendFederation)
|
|
228
|
+
) {
|
|
252
229
|
return undefined;
|
|
253
230
|
}
|
|
254
231
|
|
|
255
|
-
const directory = appPath
|
|
256
|
-
? normalizeRelativePath(appPath)
|
|
257
|
-
: `verticals/${id}`;
|
|
232
|
+
const directory = normalizeRelativePath(appPath);
|
|
258
233
|
if (path.resolve(workspaceRoot, directory) !== path.resolve(appDirectory)) {
|
|
259
234
|
return undefined;
|
|
260
235
|
}
|
|
261
236
|
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
237
|
+
const defaultPort = overlay.ports?.[id];
|
|
238
|
+
if (
|
|
239
|
+
typeof defaultPort !== 'number' ||
|
|
240
|
+
!Number.isInteger(defaultPort) ||
|
|
241
|
+
defaultPort < 1 ||
|
|
242
|
+
defaultPort > 65535
|
|
243
|
+
) {
|
|
244
|
+
throw new Error(
|
|
245
|
+
`[backend-federation-build] Invalid development port for ${id}.`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
const portEnv =
|
|
249
|
+
stringValue(topologyApp.portEnv) ??
|
|
250
|
+
`VERTICAL_${(stringValue(topologyApp.domain) ?? id)
|
|
251
|
+
.replace(/[^a-zA-Z0-9]/gu, '_')
|
|
252
|
+
.toUpperCase()}_PORT`;
|
|
253
|
+
const port = Number(process.env[portEnv] ?? defaultPort);
|
|
254
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
255
|
+
throw new Error(
|
|
256
|
+
`[backend-federation-build] Invalid ${portEnv} development port for ${id}.`,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
const publicUrlEnv = stringValue(topologyApp.cloudflare?.publicUrlEnv);
|
|
260
|
+
const configuredPublicUrl = publicUrlEnv
|
|
261
|
+
? process.env[publicUrlEnv]?.trim()
|
|
262
|
+
: undefined;
|
|
263
|
+
let publicOrigin = `http://localhost:${port}`;
|
|
264
|
+
if (configuredPublicUrl) {
|
|
265
|
+
let url: URL;
|
|
266
|
+
try {
|
|
267
|
+
url = new URL(configuredPublicUrl);
|
|
268
|
+
} catch {
|
|
269
|
+
throw new Error(
|
|
270
|
+
`[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`,
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
if (
|
|
274
|
+
!['http:', 'https:'].includes(url.protocol) ||
|
|
275
|
+
url.username ||
|
|
276
|
+
url.password
|
|
277
|
+
) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
`[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`,
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
publicOrigin = url.origin;
|
|
266
283
|
}
|
|
267
284
|
|
|
268
|
-
const apiPrefix = stringValue(
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
285
|
+
const apiPrefix = stringValue(topologyApp.api.bff?.prefix) ?? `/${id}-api`;
|
|
286
|
+
const apiProtocol = topologyApp.api.protocol ?? 'rest';
|
|
287
|
+
if (apiProtocol !== 'rest' && apiProtocol !== 'rpc') {
|
|
288
|
+
throw new Error(
|
|
289
|
+
`[backend-federation-build] Unsupported API protocol for ${id}.`,
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
const rpcPath =
|
|
293
|
+
apiProtocol === 'rpc' ? stringValue(topologyApp.api.rpcPath) : undefined;
|
|
294
|
+
if (
|
|
295
|
+
apiProtocol === 'rpc' &&
|
|
296
|
+
(!rpcPath || topologyApp.api.rpcSerialization !== 'json')
|
|
297
|
+
) {
|
|
298
|
+
throw new Error(
|
|
299
|
+
`[backend-federation-build] Missing JSON RPC route metadata for ${id}.`,
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
const apiStem = stringValue(topologyApp.api.stem) ?? id;
|
|
303
|
+
const backendName = createBackendName(topologyApp, id);
|
|
304
|
+
const nodeOverlay = overlay.serverExecution?.[id]?.node;
|
|
305
|
+
if (!isRecord(nodeOverlay)) {
|
|
306
|
+
throw new Error(
|
|
307
|
+
`[backend-federation-build] Missing declared Node server execution for ${id}.`,
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
const manifestUrl = rebaseDefaultLocalUrl(
|
|
311
|
+
stringValue(nodeOverlay?.manifestUrl) ??
|
|
312
|
+
`http://localhost:${defaultPort}/${BACKEND_MANIFEST_FILE}`,
|
|
313
|
+
defaultPort,
|
|
314
|
+
publicOrigin,
|
|
315
|
+
);
|
|
316
|
+
const containerEntry = rebaseDefaultLocalUrl(
|
|
317
|
+
stringValue(nodeOverlay?.containerEntry) ??
|
|
318
|
+
`http://localhost:${defaultPort}/${BACKEND_REMOTE_ENTRY_FILE}`,
|
|
319
|
+
defaultPort,
|
|
320
|
+
publicOrigin,
|
|
321
|
+
);
|
|
283
322
|
const configuredRemoteType =
|
|
323
|
+
stringValue(nodeOverlay?.remoteType) ??
|
|
284
324
|
stringValue(
|
|
285
|
-
|
|
286
|
-
)
|
|
325
|
+
topologyApp.backendFederation?.executionSurfaces?.node?.remoteType,
|
|
326
|
+
);
|
|
287
327
|
if (
|
|
288
328
|
configuredRemoteType !== undefined &&
|
|
289
329
|
configuredRemoteType !== 'commonjs-module'
|
|
@@ -300,18 +340,24 @@ export const createAppFromCompactMetadata = (
|
|
|
300
340
|
);
|
|
301
341
|
}
|
|
302
342
|
const remoteType = 'commonjs-module';
|
|
303
|
-
const packageName = stringValue(
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
343
|
+
const packageName = stringValue(packageManifest.name);
|
|
344
|
+
const version = stringValue(packageManifest.version);
|
|
345
|
+
if (stringValue(topologyApp.package) !== packageName || !version) {
|
|
346
|
+
throw new Error(
|
|
347
|
+
`[backend-federation-build] Topology package identity must match package.json for ${id}.`,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
const declaredUiManifestUrl = stringValue(overlay.manifests?.[id]);
|
|
351
|
+
const uiManifestUrl = declaredUiManifestUrl
|
|
352
|
+
? rebaseDefaultLocalUrl(declaredUiManifestUrl, defaultPort, publicOrigin)
|
|
353
|
+
: undefined;
|
|
354
|
+
const topologyDeliveryUnit = isRecord(topologyApp.deliveryUnit)
|
|
309
355
|
? {
|
|
310
|
-
unitId: stringValue(
|
|
311
|
-
buildMarker: stringValue(
|
|
312
|
-
sourceRevision: stringValue(
|
|
313
|
-
packageName: stringValue(
|
|
314
|
-
version: stringValue(
|
|
356
|
+
unitId: stringValue(topologyApp.deliveryUnit.unitId),
|
|
357
|
+
buildMarker: stringValue(topologyApp.deliveryUnit.buildMarker),
|
|
358
|
+
sourceRevision: stringValue(topologyApp.deliveryUnit.sourceRevision),
|
|
359
|
+
packageName: stringValue(topologyApp.deliveryUnit.packageName),
|
|
360
|
+
version: stringValue(topologyApp.deliveryUnit.version),
|
|
315
361
|
}
|
|
316
362
|
: undefined;
|
|
317
363
|
|
|
@@ -319,15 +365,18 @@ export const createAppFromCompactMetadata = (
|
|
|
319
365
|
id,
|
|
320
366
|
directory,
|
|
321
367
|
packageName,
|
|
368
|
+
version,
|
|
322
369
|
port,
|
|
323
370
|
apiPrefix,
|
|
371
|
+
apiProtocol,
|
|
372
|
+
rpcPath,
|
|
324
373
|
apiStem,
|
|
325
374
|
backendName,
|
|
326
375
|
manifestUrl,
|
|
327
376
|
containerEntry,
|
|
328
377
|
remoteType,
|
|
329
378
|
uiManifestUrl,
|
|
330
|
-
|
|
379
|
+
topologyDeliveryUnit,
|
|
331
380
|
};
|
|
332
381
|
};
|
|
333
382
|
|
|
@@ -335,22 +384,39 @@ export const findBackendFederationApp = async (
|
|
|
335
384
|
workspaceRoot: string,
|
|
336
385
|
appDirectory: string,
|
|
337
386
|
) => {
|
|
338
|
-
const
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
387
|
+
const topologyPath = path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
|
|
388
|
+
const topology = await readJsonFile<ReferenceTopology>(topologyPath);
|
|
389
|
+
if (!isRecord(topology) || !Array.isArray(topology.verticals)) {
|
|
390
|
+
throw new Error(
|
|
391
|
+
`[backend-federation-build] Invalid declared topology at ${topologyPath}.`,
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
const overlayPath = path.join(workspaceRoot, DEVELOPMENT_OVERLAY_PATH);
|
|
395
|
+
const overlay = await readJsonFile<DevelopmentOverlay>(overlayPath);
|
|
396
|
+
if (!isRecord(overlay) || !isRecord(overlay.ports)) {
|
|
397
|
+
throw new Error(
|
|
398
|
+
`[backend-federation-build] Invalid development overlay at ${overlayPath}.`,
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
const packageManifest = await readJsonFile<{
|
|
402
|
+
name?: unknown;
|
|
403
|
+
version?: unknown;
|
|
404
|
+
}>(path.join(appDirectory, 'package.json'));
|
|
343
405
|
|
|
344
|
-
for (const app of
|
|
345
|
-
const resolved =
|
|
406
|
+
for (const app of topology.verticals) {
|
|
407
|
+
const resolved = createAppFromTopology(
|
|
346
408
|
workspaceRoot,
|
|
347
409
|
appDirectory,
|
|
348
410
|
app,
|
|
411
|
+
overlay,
|
|
412
|
+
packageManifest,
|
|
349
413
|
);
|
|
350
414
|
if (resolved) {
|
|
351
415
|
return resolved;
|
|
352
416
|
}
|
|
353
417
|
}
|
|
354
418
|
|
|
355
|
-
|
|
419
|
+
throw new Error(
|
|
420
|
+
`[backend-federation-build] ${appDirectory} is missing from the declared reference topology.`,
|
|
421
|
+
);
|
|
356
422
|
};
|
|
@@ -9,6 +9,14 @@ import {
|
|
|
9
9
|
ULTRAMODERN_BUILD_ARTIFACT_FILE,
|
|
10
10
|
} from '@modern-js/backend-federation-contracts';
|
|
11
11
|
import { createBackendFederationEntryIntegrity } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
|
|
12
|
+
import {
|
|
13
|
+
emitRendererBuildArtifact,
|
|
14
|
+
type FinalizedRendererBuildOutput,
|
|
15
|
+
type RendererBuildOutputContext,
|
|
16
|
+
type RendererBuildOutputOptions,
|
|
17
|
+
stampFinalizedRendererBuildArtifact,
|
|
18
|
+
validateFinalizedRendererBuild,
|
|
19
|
+
} from '../release-envelope/renderer-output-stamp';
|
|
12
20
|
import {
|
|
13
21
|
createBackendManifest,
|
|
14
22
|
createBackendRemoteEntrySource,
|
|
@@ -16,10 +24,10 @@ import {
|
|
|
16
24
|
import {
|
|
17
25
|
type BackendFederationApp,
|
|
18
26
|
buildArtifactPathFor,
|
|
19
|
-
COMPACT_CONFIG_PATH,
|
|
20
27
|
createStampedDeliveryUnit,
|
|
21
28
|
findBackendFederationApp,
|
|
22
29
|
findWorkspaceRoot,
|
|
30
|
+
REFERENCE_TOPOLOGY_PATH,
|
|
23
31
|
readBuildIdentity,
|
|
24
32
|
resolveWorkspaceSourceRevision,
|
|
25
33
|
} from './config';
|
|
@@ -35,9 +43,16 @@ export type BackendFederationArtifactResult = {
|
|
|
35
43
|
remoteType: string;
|
|
36
44
|
};
|
|
37
45
|
|
|
46
|
+
export type BackendFederationBuildOptions = {
|
|
47
|
+
resolveRendererBuild?: RendererBuildOutputOptions['resolveRendererBuild'];
|
|
48
|
+
rendererBuildPlugin?: RendererBuildOutputOptions['rendererBuildPlugin'];
|
|
49
|
+
entrypoints?: RendererBuildOutputContext['entrypoints'];
|
|
50
|
+
};
|
|
51
|
+
|
|
38
52
|
export const emitBackendFederationArtifacts = async (
|
|
39
53
|
appDirectory: string,
|
|
40
54
|
distDirectory: string,
|
|
55
|
+
options: BackendFederationBuildOptions = {},
|
|
41
56
|
): Promise<BackendFederationArtifactResult | undefined> => {
|
|
42
57
|
const workspaceRoot = findWorkspaceRoot(appDirectory);
|
|
43
58
|
if (!workspaceRoot) {
|
|
@@ -58,13 +73,13 @@ export const emitBackendFederationArtifacts = async (
|
|
|
58
73
|
return undefined;
|
|
59
74
|
}
|
|
60
75
|
const buildIdentity = await readBuildIdentity(appDirectory);
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
76
|
+
const topologyDeliveryUnit = app.topologyDeliveryUnit;
|
|
77
|
+
const hasTopologyDeliveryUnit =
|
|
78
|
+
topologyDeliveryUnit !== undefined &&
|
|
79
|
+
(topologyDeliveryUnit.unitId !== undefined ||
|
|
80
|
+
topologyDeliveryUnit.buildMarker !== undefined ||
|
|
81
|
+
topologyDeliveryUnit.packageName !== undefined ||
|
|
82
|
+
topologyDeliveryUnit.version !== undefined);
|
|
68
83
|
const hasBuildIdentity =
|
|
69
84
|
buildIdentity.unitId !== undefined ||
|
|
70
85
|
buildIdentity.buildVersion !== undefined ||
|
|
@@ -72,7 +87,7 @@ export const emitBackendFederationArtifacts = async (
|
|
|
72
87
|
buildIdentity.version !== undefined;
|
|
73
88
|
|
|
74
89
|
if (hasBuildIdentity) {
|
|
75
|
-
const
|
|
90
|
+
const topologyPath = path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
|
|
76
91
|
const buildIdentityPath = buildArtifactPathFor(appDirectory);
|
|
77
92
|
const mismatches: string[] = [];
|
|
78
93
|
const compare = (
|
|
@@ -89,45 +104,73 @@ export const emitBackendFederationArtifacts = async (
|
|
|
89
104
|
};
|
|
90
105
|
compare('appId', app.id, buildIdentity.appId, 'topology');
|
|
91
106
|
|
|
92
|
-
if (
|
|
93
|
-
compare('unitId',
|
|
107
|
+
if (hasTopologyDeliveryUnit) {
|
|
108
|
+
compare('unitId', topologyDeliveryUnit?.unitId, buildIdentity.unitId);
|
|
94
109
|
compare(
|
|
95
110
|
'buildMarker/build',
|
|
96
|
-
|
|
111
|
+
topologyDeliveryUnit?.buildMarker,
|
|
97
112
|
buildIdentity.buildVersion,
|
|
98
113
|
);
|
|
99
114
|
compare(
|
|
100
115
|
'packageName',
|
|
101
|
-
|
|
116
|
+
topologyDeliveryUnit?.packageName,
|
|
102
117
|
buildIdentity.packageName,
|
|
103
118
|
);
|
|
104
|
-
compare('version',
|
|
119
|
+
compare('version', topologyDeliveryUnit?.version, buildIdentity.version);
|
|
105
120
|
}
|
|
121
|
+
compare(
|
|
122
|
+
'packageName',
|
|
123
|
+
app.packageName,
|
|
124
|
+
buildIdentity.packageName,
|
|
125
|
+
'package.json',
|
|
126
|
+
);
|
|
127
|
+
compare(
|
|
128
|
+
'packageName',
|
|
129
|
+
topologyDeliveryUnit?.packageName,
|
|
130
|
+
app.packageName,
|
|
131
|
+
'topology',
|
|
132
|
+
);
|
|
133
|
+
compare('version', app.version, buildIdentity.version, 'package.json');
|
|
134
|
+
compare('version', topologyDeliveryUnit?.version, app.version, 'topology');
|
|
106
135
|
|
|
107
136
|
if (mismatches.length > 0) {
|
|
108
137
|
throw new Error(
|
|
109
|
-
`[backend-federation-build] Delivery-unit identity drift between ${
|
|
138
|
+
`[backend-federation-build] Delivery-unit identity drift between ${topologyPath}, package.json and ${buildIdentityPath}: ${mismatches.join('; ')}`,
|
|
110
139
|
);
|
|
111
140
|
}
|
|
112
141
|
}
|
|
113
142
|
|
|
114
|
-
const unitId =
|
|
143
|
+
const unitId = topologyDeliveryUnit?.unitId ?? buildIdentity.unitId;
|
|
115
144
|
const generationBuildMarker =
|
|
116
|
-
|
|
117
|
-
|
|
145
|
+
topologyDeliveryUnit?.buildMarker ?? buildIdentity.buildVersion;
|
|
146
|
+
let finalizedRendererBuild: FinalizedRendererBuildOutput | undefined;
|
|
147
|
+
if (options.resolveRendererBuild && buildIdentity.artifact?.surfaces.ui) {
|
|
148
|
+
if (!options.entrypoints?.length)
|
|
149
|
+
throw new Error(
|
|
150
|
+
'[backend-federation-build] Renderer output stamping requires the actual finalized application entries.',
|
|
151
|
+
);
|
|
152
|
+
const context = {
|
|
153
|
+
appDirectory,
|
|
154
|
+
distDirectory,
|
|
155
|
+
entrypoints: options.entrypoints,
|
|
156
|
+
};
|
|
157
|
+
finalizedRendererBuild = await options.resolveRendererBuild(context);
|
|
158
|
+
validateFinalizedRendererBuild(finalizedRendererBuild, context, app.id);
|
|
159
|
+
}
|
|
160
|
+
const sourceRevision =
|
|
161
|
+
finalizedRendererBuild?.sourceRevision ??
|
|
162
|
+
(await resolveWorkspaceSourceRevision(workspaceRoot));
|
|
118
163
|
const buildVersion =
|
|
119
|
-
|
|
164
|
+
finalizedRendererBuild?.buildMarker ??
|
|
165
|
+
(generationBuildMarker && unitId
|
|
120
166
|
? resolveUltramodernReleaseIdentity({
|
|
121
167
|
generationBuildMarker,
|
|
122
168
|
unitId,
|
|
123
169
|
workspaceRoot,
|
|
124
170
|
}).buildMarker
|
|
125
|
-
: undefined;
|
|
126
|
-
const packageName =
|
|
127
|
-
|
|
128
|
-
buildIdentity.packageName ??
|
|
129
|
-
app.packageName;
|
|
130
|
-
const version = compactDeliveryUnit?.version ?? buildIdentity.version;
|
|
171
|
+
: undefined);
|
|
172
|
+
const packageName = app.packageName;
|
|
173
|
+
const version = app.version;
|
|
131
174
|
const deliveryUnit = createStampedDeliveryUnit({
|
|
132
175
|
appId: app.id,
|
|
133
176
|
unitId,
|
|
@@ -136,13 +179,20 @@ export const emitBackendFederationArtifacts = async (
|
|
|
136
179
|
version,
|
|
137
180
|
sourceRevision,
|
|
138
181
|
});
|
|
139
|
-
|
|
182
|
+
let stampedBuildArtifact = buildIdentity.artifact
|
|
140
183
|
? stampUltramodernBuildArtifactIdentity(buildIdentity.artifact, {
|
|
141
184
|
buildMarker:
|
|
142
185
|
buildVersion ?? buildIdentity.artifact.deliveryUnit.buildMarker,
|
|
143
186
|
sourceRevision,
|
|
144
187
|
})
|
|
145
188
|
: undefined;
|
|
189
|
+
if (finalizedRendererBuild && stampedBuildArtifact?.surfaces.ui) {
|
|
190
|
+
stampedBuildArtifact = stampFinalizedRendererBuildArtifact(
|
|
191
|
+
stampedBuildArtifact,
|
|
192
|
+
finalizedRendererBuild,
|
|
193
|
+
{ appDirectory, distDirectory, entrypoints: options.entrypoints! },
|
|
194
|
+
);
|
|
195
|
+
}
|
|
146
196
|
|
|
147
197
|
const resolvedApp: BackendFederationApp = {
|
|
148
198
|
...app,
|
|
@@ -188,15 +238,46 @@ export const emitBackendFederationArtifacts = async (
|
|
|
188
238
|
};
|
|
189
239
|
};
|
|
190
240
|
|
|
191
|
-
export default (
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
241
|
+
export default (
|
|
242
|
+
options: Omit<BackendFederationBuildOptions, 'entrypoints'> = {},
|
|
243
|
+
) => {
|
|
244
|
+
if (options.resolveRendererBuild && !options.rendererBuildPlugin) {
|
|
245
|
+
throw new Error(
|
|
246
|
+
'[backend-federation-build] A finalized renderer resolver requires its owning metadata producer plugin.',
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
name: '@modern-js/backend-federation-build',
|
|
251
|
+
pre: options.resolveRendererBuild ? [options.rendererBuildPlugin!] : [],
|
|
252
|
+
required: options.resolveRendererBuild
|
|
253
|
+
? [options.rendererBuildPlugin!]
|
|
254
|
+
: [],
|
|
255
|
+
setup(api: {
|
|
256
|
+
getAppContext(): {
|
|
257
|
+
appDirectory: string;
|
|
258
|
+
distDirectory: string;
|
|
259
|
+
entrypoints?: RendererBuildOutputContext['entrypoints'];
|
|
260
|
+
apiOnly?: boolean;
|
|
261
|
+
};
|
|
262
|
+
onAfterBuild(handler: () => Promise<void>): void;
|
|
263
|
+
}) {
|
|
264
|
+
api.onAfterBuild(async () => {
|
|
265
|
+
const { appDirectory, distDirectory, entrypoints, apiOnly } =
|
|
266
|
+
api.getAppContext();
|
|
267
|
+
if (options.resolveRendererBuild && !apiOnly) {
|
|
268
|
+
await emitRendererBuildArtifact(
|
|
269
|
+
{ appDirectory, distDirectory, entrypoints: entrypoints ?? [] },
|
|
270
|
+
{
|
|
271
|
+
resolveRendererBuild: options.resolveRendererBuild,
|
|
272
|
+
rendererBuildPlugin: options.rendererBuildPlugin!,
|
|
273
|
+
},
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
await emitBackendFederationArtifacts(appDirectory, distDirectory, {
|
|
277
|
+
...options,
|
|
278
|
+
entrypoints,
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
};
|