@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.8 → 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 +164 -18
- package/dist/cjs/policy-defaults.js +110 -0
- 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/runtime-package-resolution.js +118 -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 +158 -18
- package/dist/esm/policy-defaults.mjs +51 -0
- 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/runtime-package-resolution.mjs +60 -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 +158 -18
- package/dist/esm-node/policy-defaults.mjs +52 -0
- 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/runtime-package-resolution.mjs +61 -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 +56 -0
- 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/runtime-package-resolution.d.ts +28 -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 +97 -26
- 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 +281 -26
- package/src/policy-defaults.ts +157 -0
- 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/runtime-package-resolution.ts +115 -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
|
@@ -40,6 +40,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
40
40
|
MICROVERTICAL_RELEASE_ENVELOPE_KIND: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
|
|
41
41
|
MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
|
|
42
42
|
MICROVERTICAL_RELEASE_TARGETS: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_TARGETS,
|
|
43
|
+
SHELL_RELEASE_ENVELOPE_KIND: ()=>external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND,
|
|
43
44
|
canonicalSerializeMicroVerticalReleaseEnvelope: ()=>external_canonical_js_namespaceObject.canonicalSerializeMicroVerticalReleaseEnvelope,
|
|
44
45
|
createMicroVerticalReleaseEnvelope: ()=>createMicroVerticalReleaseEnvelope,
|
|
45
46
|
verifyMicroVerticalReleaseEnvelope: ()=>verifyMicroVerticalReleaseEnvelope
|
|
@@ -49,6 +50,7 @@ const promises_namespaceObject = require("node:fs/promises");
|
|
|
49
50
|
var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
|
|
50
51
|
const external_node_path_namespaceObject = require("node:path");
|
|
51
52
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
53
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
52
54
|
const external_canonical_js_namespaceObject = require("./canonical.js");
|
|
53
55
|
const external_types_js_namespaceObject = require("./types.js");
|
|
54
56
|
const SHA256_PATTERN = /^[a-f0-9]{64}$/u;
|
|
@@ -74,6 +76,10 @@ const assertTarget = (value, location = 'target')=>{
|
|
|
74
76
|
if (!TARGETS.has(target)) throw new Error(`${location} must be one of: ${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_TARGETS.join(', ')}.`);
|
|
75
77
|
return target;
|
|
76
78
|
};
|
|
79
|
+
const assertEnvelopeKind = (value)=>{
|
|
80
|
+
if (value !== external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND && value !== external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND) throw new Error(`envelope.kind must be "${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND}" or "${external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND}".`);
|
|
81
|
+
return value;
|
|
82
|
+
};
|
|
77
83
|
const assertReleaseIdentity = (value, location = 'identity')=>{
|
|
78
84
|
const identity = assertRecord(value, location);
|
|
79
85
|
assertExactKeys(identity, [
|
|
@@ -232,7 +238,7 @@ const assertUniqueSortedArtifacts = (artifacts, location)=>{
|
|
|
232
238
|
if (paths.some((logicalPath, index)=>logicalPath !== sorted[index])) throw new Error(`${location} must be sorted by logicalPath.`);
|
|
233
239
|
};
|
|
234
240
|
const assertSurfacePaths = (value, location)=>{
|
|
235
|
-
if (!Array.isArray(value)
|
|
241
|
+
if (!Array.isArray(value)) throw new Error(`${location} must be an array of artifact paths.`);
|
|
236
242
|
const paths = value.map((item, index)=>assertNormalizedLogicalPath(item, `${location}[${index}]`));
|
|
237
243
|
const sorted = [
|
|
238
244
|
...paths
|
|
@@ -241,26 +247,51 @@ const assertSurfacePaths = (value, location)=>{
|
|
|
241
247
|
if (new Set(paths).size !== paths.length) throw new Error(`${location} must not contain duplicate artifact paths.`);
|
|
242
248
|
return paths;
|
|
243
249
|
};
|
|
244
|
-
const assertSurfaces = (value)=>{
|
|
250
|
+
const assertSurfaces = (value, kind)=>{
|
|
245
251
|
const surfaces = assertRecord(value, 'surfaces');
|
|
246
252
|
assertExactKeys(surfaces, [
|
|
247
253
|
'uiClient',
|
|
248
254
|
'ssr',
|
|
249
255
|
'apiBackend',
|
|
250
|
-
'backendFederation'
|
|
256
|
+
...kind !== external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND && Object.hasOwn(surfaces, 'backendFederation') ? [
|
|
257
|
+
'backendFederation'
|
|
258
|
+
] : []
|
|
251
259
|
], 'surfaces');
|
|
252
|
-
const backendFederation = assertRecord(surfaces.backendFederation, 'surfaces.backendFederation');
|
|
253
|
-
assertExactKeys(backendFederation, [
|
|
260
|
+
const backendFederation = Object.hasOwn(surfaces, 'backendFederation') ? assertRecord(surfaces.backendFederation, 'surfaces.backendFederation') : void 0;
|
|
261
|
+
if (backendFederation) assertExactKeys(backendFederation, [
|
|
254
262
|
'manifest',
|
|
255
263
|
'container'
|
|
256
264
|
], 'surfaces.backendFederation');
|
|
265
|
+
const uiClient = assertSurfacePaths(surfaces.uiClient, 'surfaces.uiClient');
|
|
266
|
+
const ssr = assertSurfacePaths(surfaces.ssr, 'surfaces.ssr');
|
|
267
|
+
const apiBackend = assertSurfacePaths(surfaces.apiBackend, 'surfaces.apiBackend');
|
|
268
|
+
if (uiClient.length > 0 && 0 === ssr.length) throw new Error('surfaces.ssr must contain at least one artifact path when UI/client is declared.');
|
|
269
|
+
if (ssr.length > 0 && 0 === uiClient.length) throw new Error('surfaces.uiClient must contain at least one artifact path when SSR is declared.');
|
|
270
|
+
if (0 === apiBackend.length && (backendFederation || 0 === uiClient.length)) throw new Error('surfaces.apiBackend must contain at least one artifact path.');
|
|
271
|
+
if (kind === external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND) {
|
|
272
|
+
if (0 === uiClient.length || 0 === ssr.length) throw new Error('Shell surfaces.uiClient and surfaces.ssr must each contain at least one artifact path.');
|
|
273
|
+
return {
|
|
274
|
+
kind,
|
|
275
|
+
surfaces: {
|
|
276
|
+
uiClient,
|
|
277
|
+
ssr,
|
|
278
|
+
apiBackend
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (apiBackend.length > 0 && !backendFederation) throw new Error('surfaces.backendFederation is required when API/backend is declared.');
|
|
257
283
|
return {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
284
|
+
kind,
|
|
285
|
+
surfaces: {
|
|
286
|
+
uiClient,
|
|
287
|
+
ssr,
|
|
288
|
+
apiBackend,
|
|
289
|
+
...backendFederation ? {
|
|
290
|
+
backendFederation: {
|
|
291
|
+
manifest: assertNormalizedLogicalPath(backendFederation.manifest, 'surfaces.backendFederation.manifest'),
|
|
292
|
+
container: assertNormalizedLogicalPath(backendFederation.container, 'surfaces.backendFederation.container')
|
|
293
|
+
}
|
|
294
|
+
} : {}
|
|
264
295
|
}
|
|
265
296
|
};
|
|
266
297
|
};
|
|
@@ -270,12 +301,14 @@ const assertSurfaceReferences = (artifacts, surfaces)=>{
|
|
|
270
301
|
uiClient: surfaces.uiClient,
|
|
271
302
|
ssr: surfaces.ssr,
|
|
272
303
|
apiBackend: surfaces.apiBackend,
|
|
273
|
-
'backendFederation
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
304
|
+
...'backendFederation' in surfaces && surfaces.backendFederation ? {
|
|
305
|
+
'backendFederation.manifest': [
|
|
306
|
+
surfaces.backendFederation.manifest
|
|
307
|
+
],
|
|
308
|
+
'backendFederation.container': [
|
|
309
|
+
surfaces.backendFederation.container
|
|
310
|
+
]
|
|
311
|
+
} : {}
|
|
279
312
|
}))for (const logicalPath of paths)if (!artifactPaths.has(logicalPath)) throw new Error(`surfaces.${surface} references unbound artifact "${logicalPath}".`);
|
|
280
313
|
};
|
|
281
314
|
const assertTargetSurfaceContract = (target, artifacts, surfaces)=>{
|
|
@@ -293,12 +326,14 @@ const assertTargetSurfaceContract = (target, artifacts, surfaces)=>{
|
|
|
293
326
|
assertRuntime(surfaces.uiClient, 'browser', 'UI/client');
|
|
294
327
|
assertRuntime(surfaces.ssr, 'node' === target ? 'nodejs' : 'workerd', 'SSR');
|
|
295
328
|
assertRuntime(surfaces.apiBackend, 'node' === target ? 'nodejs' : 'workerd-effect', 'API/backend');
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
329
|
+
if ('backendFederation' in surfaces && surfaces.backendFederation) {
|
|
330
|
+
assertRuntime([
|
|
331
|
+
surfaces.backendFederation.manifest
|
|
332
|
+
], 'module-federation-manifest', 'backend federation manifest');
|
|
333
|
+
assertRuntime([
|
|
334
|
+
surfaces.backendFederation.container
|
|
335
|
+
], 'node' === target ? 'nodejs' : 'commonjs-module', 'backend federation container');
|
|
336
|
+
}
|
|
302
337
|
};
|
|
303
338
|
const deepFreeze = (value)=>{
|
|
304
339
|
if (null !== value && 'object' == typeof value && !Object.isFrozen(value)) {
|
|
@@ -307,6 +342,51 @@ const deepFreeze = (value)=>{
|
|
|
307
342
|
}
|
|
308
343
|
return value;
|
|
309
344
|
};
|
|
345
|
+
const assertReleaseUi = (value, identity, surfaces)=>{
|
|
346
|
+
if (0 === surfaces.uiClient.length) {
|
|
347
|
+
if (void 0 !== value) throw new Error('envelope.ui is forbidden for an API-only release.');
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const ui = assertRecord(value, 'envelope.ui');
|
|
351
|
+
assertExactKeys(ui, [
|
|
352
|
+
'rendererIdentity',
|
|
353
|
+
'rendererProfile',
|
|
354
|
+
'routerBindings'
|
|
355
|
+
], 'envelope.ui');
|
|
356
|
+
const routerBindings = assertRecord(ui.routerBindings, 'envelope.ui.routerBindings');
|
|
357
|
+
const errors = [
|
|
358
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(ui.rendererIdentity, 'envelope.ui.rendererIdentity').errors,
|
|
359
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(ui.rendererProfile, 'envelope.ui.rendererProfile').errors,
|
|
360
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(routerBindings, Object.keys(routerBindings), 'envelope.ui.routerBindings').errors
|
|
361
|
+
];
|
|
362
|
+
if (errors.length > 0) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors));
|
|
363
|
+
const rendererIdentity = ui.rendererIdentity;
|
|
364
|
+
const rendererProfile = ui.rendererProfile;
|
|
365
|
+
if (!Object.hasOwn(routerBindings, rendererIdentity.entryName)) throw new Error('envelope.ui.routerBindings must include the primary rendererIdentity.entryName.');
|
|
366
|
+
if (rendererIdentity.buildId !== identity.buildMarker) throw new Error('envelope.ui.rendererIdentity.buildId must match identity.buildMarker.');
|
|
367
|
+
for (const field of [
|
|
368
|
+
'renderer',
|
|
369
|
+
'protocolVersion'
|
|
370
|
+
])if (rendererIdentity[field] !== rendererProfile[field]) throw new Error(`envelope.ui.rendererProfile.${field} must match rendererIdentity.${field}.`);
|
|
371
|
+
return {
|
|
372
|
+
rendererIdentity: {
|
|
373
|
+
...rendererIdentity
|
|
374
|
+
},
|
|
375
|
+
rendererProfile: {
|
|
376
|
+
...rendererProfile,
|
|
377
|
+
compiler: {
|
|
378
|
+
...rendererProfile.compiler
|
|
379
|
+
},
|
|
380
|
+
hydration: {
|
|
381
|
+
...rendererProfile.hydration
|
|
382
|
+
},
|
|
383
|
+
router: {
|
|
384
|
+
...rendererProfile.router
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
routerBindings: (0, backend_federation_contracts_namespaceObject.immutableRendererRouterBindings)(routerBindings)
|
|
388
|
+
};
|
|
389
|
+
};
|
|
310
390
|
const assertEnvelope = (value)=>{
|
|
311
391
|
const envelope = assertRecord(value, 'envelope');
|
|
312
392
|
assertExactKeys(envelope, [
|
|
@@ -314,26 +394,35 @@ const assertEnvelope = (value)=>{
|
|
|
314
394
|
'kind',
|
|
315
395
|
'target',
|
|
316
396
|
'identity',
|
|
397
|
+
...Object.hasOwn(envelope, 'ui') ? [
|
|
398
|
+
'ui'
|
|
399
|
+
] : [],
|
|
317
400
|
'artifacts',
|
|
318
401
|
'surfaces',
|
|
319
402
|
'envelopeDigest'
|
|
320
403
|
], 'envelope');
|
|
321
404
|
if (envelope.schemaVersion !== external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION) throw new Error(`envelope.schemaVersion must be ${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION}.`);
|
|
322
|
-
|
|
405
|
+
const kind = assertEnvelopeKind(envelope.kind);
|
|
323
406
|
if (!Array.isArray(envelope.artifacts) || 0 === envelope.artifacts.length) throw new Error('envelope.artifacts must contain at least one artifact.');
|
|
324
407
|
const artifacts = envelope.artifacts.map((artifact, index)=>assertReleaseArtifact(artifact, `envelope.artifacts[${index}]`));
|
|
325
408
|
assertUniqueSortedArtifacts(artifacts, 'envelope.artifacts');
|
|
326
409
|
const target = assertTarget(envelope.target, 'envelope.target');
|
|
327
|
-
const
|
|
410
|
+
const releaseSurfaces = assertSurfaces(envelope.surfaces, kind);
|
|
411
|
+
const { surfaces } = releaseSurfaces;
|
|
412
|
+
if (0 === surfaces.uiClient.length && Object.hasOwn(envelope, 'ui')) throw new Error('envelope.ui is forbidden for an API-only release.');
|
|
328
413
|
assertSurfaceReferences(artifacts, surfaces);
|
|
329
414
|
assertTargetSurfaceContract(target, artifacts, surfaces);
|
|
415
|
+
const identity = assertReleaseIdentity(envelope.identity, 'envelope.identity');
|
|
416
|
+
const ui = assertReleaseUi(envelope.ui, identity, surfaces);
|
|
330
417
|
const parsed = {
|
|
418
|
+
...releaseSurfaces,
|
|
331
419
|
schemaVersion: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
|
|
332
|
-
kind: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
|
|
333
420
|
target,
|
|
334
|
-
identity
|
|
421
|
+
identity,
|
|
422
|
+
...ui ? {
|
|
423
|
+
ui
|
|
424
|
+
} : {},
|
|
335
425
|
artifacts,
|
|
336
|
-
surfaces,
|
|
337
426
|
envelopeDigest: assertNonEmptyString(envelope.envelopeDigest, 'envelope.envelopeDigest')
|
|
338
427
|
};
|
|
339
428
|
if (!SHA256_PATTERN.test(parsed.envelopeDigest)) throw new Error('envelope.envelopeDigest must be a lowercase SHA-256 digest.');
|
|
@@ -341,36 +430,59 @@ const assertEnvelope = (value)=>{
|
|
|
341
430
|
if (parsed.envelopeDigest !== expectedDigest) throw new Error('envelope.envelopeDigest does not match canonical payload.');
|
|
342
431
|
return parsed;
|
|
343
432
|
};
|
|
344
|
-
|
|
433
|
+
async function createMicroVerticalReleaseEnvelope(input) {
|
|
345
434
|
const artifactRoot = await promises_default().realpath(external_node_path_default().resolve(input.artifactRoot));
|
|
346
435
|
const target = assertTarget(input.target);
|
|
347
436
|
const identity = assertReleaseIdentity(input.identity);
|
|
437
|
+
const kind = assertEnvelopeKind(void 0 === input.kind ? external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND : input.kind);
|
|
348
438
|
if (!Array.isArray(input.artifacts) || 0 === input.artifacts.length) throw new Error('artifacts must contain at least one artifact.');
|
|
349
439
|
const inputs = input.artifacts.map((artifact, index)=>assertArtifactInput(artifact, `artifacts[${index}]`));
|
|
350
440
|
const sortedInputs = [
|
|
351
441
|
...inputs
|
|
352
442
|
].sort((left, right)=>left.logicalPath.localeCompare(right.logicalPath));
|
|
353
443
|
assertUniqueSortedArtifacts(sortedInputs, 'artifacts');
|
|
354
|
-
const
|
|
444
|
+
const releaseSurfaces = assertSurfaces(input.surfaces, kind);
|
|
445
|
+
const { surfaces } = releaseSurfaces;
|
|
446
|
+
if (0 === surfaces.uiClient.length && Object.hasOwn(input, 'ui')) throw new Error('envelope.ui is forbidden for an API-only release.');
|
|
355
447
|
assertSurfaceReferences(sortedInputs, surfaces);
|
|
356
448
|
assertTargetSurfaceContract(target, sortedInputs, surfaces);
|
|
449
|
+
const ui = assertReleaseUi(input.ui, identity, surfaces);
|
|
357
450
|
const artifacts = await Promise.all(sortedInputs.map((artifact)=>readFinalArtifact(artifactRoot, artifact)));
|
|
358
451
|
assertTargetSurfaceContract(target, artifacts, surfaces);
|
|
359
452
|
const payload = {
|
|
453
|
+
...releaseSurfaces,
|
|
360
454
|
schemaVersion: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
|
|
361
|
-
kind: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
|
|
362
455
|
target,
|
|
363
456
|
identity,
|
|
364
|
-
|
|
365
|
-
|
|
457
|
+
...ui ? {
|
|
458
|
+
ui
|
|
459
|
+
} : {},
|
|
460
|
+
artifacts
|
|
366
461
|
};
|
|
367
462
|
return deepFreeze({
|
|
368
463
|
...payload,
|
|
369
464
|
envelopeDigest: (0, external_canonical_js_namespaceObject.digestMicroVerticalReleaseEnvelopePayload)(payload)
|
|
370
465
|
});
|
|
371
|
-
}
|
|
372
|
-
|
|
466
|
+
}
|
|
467
|
+
async function verifyMicroVerticalReleaseEnvelope(value, options) {
|
|
373
468
|
const envelope = assertEnvelope(value);
|
|
469
|
+
if (void 0 !== options.expectedRendererProfile) {
|
|
470
|
+
const result = (0, backend_federation_contracts_namespaceObject.validateRendererProfileCompatibility)(options.expectedRendererProfile, envelope.ui?.rendererProfile, 'envelope.ui.rendererProfile');
|
|
471
|
+
if (!result.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
|
|
472
|
+
}
|
|
473
|
+
if (void 0 !== options.expectedRendererIdentity) {
|
|
474
|
+
const expected = options.expectedRendererIdentity;
|
|
475
|
+
const result = (0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(expected, 'expectedRendererIdentity');
|
|
476
|
+
if (!result.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
|
|
477
|
+
for (const field of [
|
|
478
|
+
'renderer',
|
|
479
|
+
'protocolVersion',
|
|
480
|
+
'appId',
|
|
481
|
+
'entryName',
|
|
482
|
+
'buildId'
|
|
483
|
+
])if (envelope.ui?.rendererIdentity[field] !== expected[field]) throw new Error(`envelope.ui.rendererIdentity.${field} must match the consuming renderer identity.`);
|
|
484
|
+
}
|
|
485
|
+
if (void 0 !== options.expectedKind && envelope.kind !== options.expectedKind) throw new Error(`envelope.kind must be "${options.expectedKind}" for this release owner; received "${envelope.kind}".`);
|
|
374
486
|
if (void 0 !== options.expectedTarget && envelope.target !== options.expectedTarget) throw new Error(`envelope.target must be "${options.expectedTarget}" for this staging target; received "${envelope.target}".`);
|
|
375
487
|
const artifactRoot = await promises_default().realpath(external_node_path_default().resolve(options.artifactRoot));
|
|
376
488
|
for (const artifact of envelope.artifacts){
|
|
@@ -379,10 +491,11 @@ const verifyMicroVerticalReleaseEnvelope = async (value, options)=>{
|
|
|
379
491
|
if (!matches) throw new Error('file' === artifact.kind && 'file' === finalArtifact.kind ? `Artifact "${artifact.logicalPath}" digest does not match final artifact bytes.` : `Artifact "${artifact.logicalPath}" does not match its final filesystem binding.`);
|
|
380
492
|
}
|
|
381
493
|
return deepFreeze(envelope);
|
|
382
|
-
}
|
|
494
|
+
}
|
|
383
495
|
exports.MICROVERTICAL_RELEASE_ENVELOPE_KIND = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_KIND;
|
|
384
496
|
exports.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION;
|
|
385
497
|
exports.MICROVERTICAL_RELEASE_TARGETS = __webpack_exports__.MICROVERTICAL_RELEASE_TARGETS;
|
|
498
|
+
exports.SHELL_RELEASE_ENVELOPE_KIND = __webpack_exports__.SHELL_RELEASE_ENVELOPE_KIND;
|
|
386
499
|
exports.canonicalSerializeMicroVerticalReleaseEnvelope = __webpack_exports__.canonicalSerializeMicroVerticalReleaseEnvelope;
|
|
387
500
|
exports.createMicroVerticalReleaseEnvelope = __webpack_exports__.createMicroVerticalReleaseEnvelope;
|
|
388
501
|
exports.verifyMicroVerticalReleaseEnvelope = __webpack_exports__.verifyMicroVerticalReleaseEnvelope;
|
|
@@ -390,6 +503,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
390
503
|
"MICROVERTICAL_RELEASE_ENVELOPE_KIND",
|
|
391
504
|
"MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION",
|
|
392
505
|
"MICROVERTICAL_RELEASE_TARGETS",
|
|
506
|
+
"SHELL_RELEASE_ENVELOPE_KIND",
|
|
393
507
|
"canonicalSerializeMicroVerticalReleaseEnvelope",
|
|
394
508
|
"createMicroVerticalReleaseEnvelope",
|
|
395
509
|
"verifyMicroVerticalReleaseEnvelope"
|
|
@@ -41,50 +41,59 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
41
41
|
});
|
|
42
42
|
const external_node_path_namespaceObject = require("node:path");
|
|
43
43
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
44
|
+
const public_assets_js_namespaceObject = require("../deploy-output/public-assets.js");
|
|
45
|
+
const target_js_namespaceObject = require("../deploy-output/target.js");
|
|
44
46
|
const external_framework_output_js_namespaceObject = require("./framework-output.js");
|
|
45
|
-
const
|
|
46
|
-
const { metaName } = api.getAppContext();
|
|
47
|
-
const config = api.getNormalizedConfig();
|
|
48
|
-
if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
|
|
49
|
-
return resolveDeployTarget(config);
|
|
50
|
-
};
|
|
51
|
-
const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
|
|
47
|
+
const createUltramodernReleaseEnvelopePlugin = ({ resolveRendererProfile } = {})=>({
|
|
52
48
|
name: '@modern-js/ultramodern-release-envelope',
|
|
53
49
|
pre: [
|
|
54
50
|
'@modern-js/backend-federation-build',
|
|
55
51
|
'@modern-js/plugin-bff',
|
|
56
|
-
'@modern-js/deploy-output-aliases'
|
|
52
|
+
'@modern-js/deploy-output-aliases',
|
|
53
|
+
'@modern-js/deploy-output-public-assets'
|
|
57
54
|
],
|
|
58
55
|
post: [
|
|
59
56
|
'@modern-js/plugin-deploy'
|
|
60
57
|
],
|
|
61
58
|
setup (api) {
|
|
62
|
-
const emitBuildEnvelope = async (target)=>{
|
|
63
|
-
const { apiOnly, distDirectory } = api.getAppContext();
|
|
59
|
+
const emitBuildEnvelope = async (target, requirePromotable = true)=>{
|
|
60
|
+
const { apiOnly, appDirectory, distDirectory } = api.getAppContext();
|
|
64
61
|
await (0, external_framework_output_js_namespaceObject.emitFrameworkMicroVerticalReleaseEnvelope)({
|
|
65
62
|
apiOnly,
|
|
63
|
+
appDirectory,
|
|
66
64
|
distDirectory,
|
|
67
|
-
|
|
65
|
+
role: api.getNormalizedConfig().deploy?.releaseEnvelopeRole,
|
|
66
|
+
requirePromotable,
|
|
67
|
+
target,
|
|
68
|
+
...!apiOnly && resolveRendererProfile ? {
|
|
69
|
+
expectedRendererProfile: resolveRendererProfile(api.getNormalizedConfig())
|
|
70
|
+
} : {}
|
|
68
71
|
});
|
|
69
72
|
};
|
|
70
73
|
api.onAfterBuild(async ()=>{
|
|
71
|
-
const configuredTarget =
|
|
74
|
+
const configuredTarget = api.getAppContext().deployTarget?.target;
|
|
72
75
|
if ('node' !== configuredTarget && 'cloudflare' !== configuredTarget) return;
|
|
73
|
-
await emitBuildEnvelope(configuredTarget);
|
|
76
|
+
await emitBuildEnvelope(configuredTarget, false);
|
|
74
77
|
});
|
|
75
78
|
api.onBeforeDeploy(async ()=>{
|
|
76
|
-
const configuredTarget =
|
|
79
|
+
const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
|
|
77
80
|
if ('node' !== configuredTarget) return;
|
|
78
81
|
await emitBuildEnvelope(configuredTarget);
|
|
79
82
|
const { distDirectory } = api.getAppContext();
|
|
80
83
|
await (0, external_framework_output_js_namespaceObject.verifyBuildOutputReleaseEnvelope)(distDirectory, configuredTarget);
|
|
81
84
|
});
|
|
82
85
|
api.onAfterDeploy(async ()=>{
|
|
83
|
-
const configuredTarget =
|
|
86
|
+
const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
|
|
84
87
|
if ('node' !== configuredTarget) return;
|
|
85
88
|
const { appDirectory, distDirectory } = api.getAppContext();
|
|
86
89
|
const outputDirectory = external_node_path_default().join(appDirectory, '.output');
|
|
87
90
|
const releaseEnvelope = await (0, external_framework_output_js_namespaceObject.emitNodeStagedReleaseEnvelope)({
|
|
91
|
+
declaredPublicAssets: await (0, public_assets_js_namespaceObject.resolveAddedDeclaredPublicAssetPaths)({
|
|
92
|
+
appDirectory,
|
|
93
|
+
assets: (0, public_assets_js_namespaceObject.normalizeDeclaredPublicAssets)(api.getNormalizedConfig().deploy?.node?.publicAssets, public_assets_js_namespaceObject.NODE_PUBLIC_ASSET_SCOPE),
|
|
94
|
+
generatedRoot: distDirectory,
|
|
95
|
+
scope: public_assets_js_namespaceObject.NODE_PUBLIC_ASSET_SCOPE
|
|
96
|
+
}),
|
|
88
97
|
distDirectory,
|
|
89
98
|
outputDirectory
|
|
90
99
|
});
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
14
|
+
var define = (defs, kind)=>{
|
|
15
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
[kind]: defs[key]
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
define(getters, "get");
|
|
21
|
+
define(values, "value");
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
(()=>{
|
|
25
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
26
|
+
})();
|
|
27
|
+
(()=>{
|
|
28
|
+
__webpack_require__.r = (exports1)=>{
|
|
29
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
30
|
+
value: 'Module'
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
33
|
+
value: true
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
var __webpack_exports__ = {};
|
|
38
|
+
__webpack_require__.r(__webpack_exports__);
|
|
39
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
40
|
+
emitRendererBuildArtifact: ()=>emitRendererBuildArtifact,
|
|
41
|
+
rendererBuildArtifactStampPlugin: ()=>rendererBuildArtifactStampPlugin,
|
|
42
|
+
stampFinalizedRendererBuildArtifact: ()=>stampFinalizedRendererBuildArtifact,
|
|
43
|
+
validateFinalizedRendererBuild: ()=>validateFinalizedRendererBuild
|
|
44
|
+
});
|
|
45
|
+
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
46
|
+
const promises_namespaceObject = require("node:fs/promises");
|
|
47
|
+
var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
|
|
48
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
49
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
50
|
+
const external_node_util_namespaceObject = require("node:util");
|
|
51
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
52
|
+
const validateFinalizedRendererBuild = (output, context, appId)=>{
|
|
53
|
+
const entryNames = context.entrypoints.map((entry)=>entry.entryName);
|
|
54
|
+
const primary = context.entrypoints.find((entry)=>entry.isMainEntry) ?? context.entrypoints[0];
|
|
55
|
+
const errors = [
|
|
56
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(output.ui.rendererIdentity).errors,
|
|
57
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(output.ui.rendererProfile).errors,
|
|
58
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(output.ui.routerBindings, entryNames, 'routerBindings').errors
|
|
59
|
+
];
|
|
60
|
+
if (errors.length) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors));
|
|
61
|
+
if (!primary || new Set(entryNames).size !== entryNames.length || context.entrypoints.filter((entry)=>entry.isMainEntry).length > 1 || output.ui.rendererIdentity.entryName !== primary.entryName || output.ui.rendererIdentity.appId !== appId || output.ui.rendererIdentity.buildId !== output.buildMarker || output.ui.rendererIdentity.renderer !== output.ui.rendererProfile.renderer) throw new Error('Finalized renderer output conflicts with the actual application entries and release identity.');
|
|
62
|
+
};
|
|
63
|
+
const stampFinalizedRendererBuildArtifact = (artifact, output, context)=>{
|
|
64
|
+
(0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
|
|
65
|
+
const ui = artifact.surfaces.ui;
|
|
66
|
+
if (!ui) throw new Error('Finalized renderer output requires a declared UI artifact');
|
|
67
|
+
validateFinalizedRendererBuild(output, context, artifact.deliveryUnit.appId);
|
|
68
|
+
const drifted = [
|
|
69
|
+
!(0, external_node_util_namespaceObject.isDeepStrictEqual)({
|
|
70
|
+
...ui.rendererIdentity,
|
|
71
|
+
buildId: output.ui.rendererIdentity.buildId
|
|
72
|
+
}, output.ui.rendererIdentity) && `rendererIdentity (captured entry ${ui.rendererIdentity.entryName}, built entry ${output.ui.rendererIdentity.entryName})`,
|
|
73
|
+
!(0, external_node_util_namespaceObject.isDeepStrictEqual)(ui.rendererProfile, output.ui.rendererProfile) && 'rendererProfile',
|
|
74
|
+
!(0, external_node_util_namespaceObject.isDeepStrictEqual)(ui.routerBindings, output.ui.routerBindings) && `routerBindings (captured entries ${Object.keys(ui.routerBindings).join(', ')}, built entries ${Object.keys(output.ui.routerBindings).join(', ')})`
|
|
75
|
+
].filter(Boolean);
|
|
76
|
+
if (drifted.length) throw new Error(`Finalized renderer output conflicts with the captured application profile or router bindings: ${drifted.join('; ')} differ from ${backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH}. After changing modern.config entries, renderer or router, recapture it with \`ultramodern-create ultramodern sync-delivery-unit\`.`);
|
|
77
|
+
const identity = {
|
|
78
|
+
buildMarker: output.buildMarker,
|
|
79
|
+
sourceRevision: output.sourceRevision
|
|
80
|
+
};
|
|
81
|
+
const stamped = (0, backend_federation_contracts_namespaceObject.stampUltramodernBuildArtifactIdentity)(artifact, identity);
|
|
82
|
+
return (0, backend_federation_contracts_namespaceObject.stampUltramodernBuildArtifactIdentity)({
|
|
83
|
+
...stamped,
|
|
84
|
+
surfaces: {
|
|
85
|
+
...stamped.surfaces,
|
|
86
|
+
ui: {
|
|
87
|
+
...stamped.surfaces.ui,
|
|
88
|
+
...output.ui
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}, identity);
|
|
92
|
+
};
|
|
93
|
+
async function writeOwnedArtifact(file, bytes) {
|
|
94
|
+
await promises_default().mkdir(external_node_path_default().dirname(file), {
|
|
95
|
+
recursive: true
|
|
96
|
+
});
|
|
97
|
+
const temporary = `${file}.${(0, external_node_crypto_namespaceObject.randomUUID)()}.tmp`;
|
|
98
|
+
let created = false;
|
|
99
|
+
try {
|
|
100
|
+
const handle = await promises_default().open(temporary, 'wx');
|
|
101
|
+
created = true;
|
|
102
|
+
try {
|
|
103
|
+
await handle.writeFile(bytes);
|
|
104
|
+
} finally{
|
|
105
|
+
await handle.close();
|
|
106
|
+
}
|
|
107
|
+
await promises_default().rename(temporary, file);
|
|
108
|
+
} finally{
|
|
109
|
+
if (created) await promises_default().rm(temporary, {
|
|
110
|
+
force: true
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function emitRendererBuildArtifact(context, options) {
|
|
115
|
+
const source = external_node_path_default().join(context.appDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH);
|
|
116
|
+
const bytes = await promises_default().readFile(source).catch((error)=>{
|
|
117
|
+
if ('ENOENT' === error.code) return;
|
|
118
|
+
throw error;
|
|
119
|
+
});
|
|
120
|
+
if (!bytes) {
|
|
121
|
+
const declaration = await promises_default().stat(source.replace(/\.json$/u, '.ts')).catch((error)=>{
|
|
122
|
+
if ('ENOENT' === error.code) return;
|
|
123
|
+
throw error;
|
|
124
|
+
});
|
|
125
|
+
if (declaration) throw new Error('Generated UI artifact declaration is missing its build carrier');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const artifact = JSON.parse(bytes.toString('utf8'));
|
|
129
|
+
(0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
|
|
130
|
+
const finalized = await options.resolveRendererBuild(context);
|
|
131
|
+
const stamped = stampFinalizedRendererBuildArtifact(artifact, finalized, context);
|
|
132
|
+
const serialized = `${JSON.stringify(stamped, null, 2)}\n`;
|
|
133
|
+
for (const directory of [
|
|
134
|
+
context.distDirectory,
|
|
135
|
+
external_node_path_default().join(context.distDirectory, 'public')
|
|
136
|
+
])await writeOwnedArtifact(external_node_path_default().join(directory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE), serialized);
|
|
137
|
+
return stamped;
|
|
138
|
+
}
|
|
139
|
+
function rendererBuildArtifactStampPlugin(options) {
|
|
140
|
+
if ('string' != typeof options.rendererBuildPlugin || !options.rendererBuildPlugin || options.rendererBuildPlugin.trim() !== options.rendererBuildPlugin || 'function' != typeof options.resolveRendererBuild) throw new Error('Renderer artifact stamping requires its owning metadata producer');
|
|
141
|
+
return {
|
|
142
|
+
name: '@modern-js/renderer-build-artifact-stamp',
|
|
143
|
+
pre: [
|
|
144
|
+
options.rendererBuildPlugin
|
|
145
|
+
],
|
|
146
|
+
required: [
|
|
147
|
+
options.rendererBuildPlugin
|
|
148
|
+
],
|
|
149
|
+
setup (api) {
|
|
150
|
+
api.onAfterBuild(async ()=>{
|
|
151
|
+
const context = api.getAppContext();
|
|
152
|
+
if (context.apiOnly) return;
|
|
153
|
+
await emitRendererBuildArtifact(context, options);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
exports.emitRendererBuildArtifact = __webpack_exports__.emitRendererBuildArtifact;
|
|
159
|
+
exports.rendererBuildArtifactStampPlugin = __webpack_exports__.rendererBuildArtifactStampPlugin;
|
|
160
|
+
exports.stampFinalizedRendererBuildArtifact = __webpack_exports__.stampFinalizedRendererBuildArtifact;
|
|
161
|
+
exports.validateFinalizedRendererBuild = __webpack_exports__.validateFinalizedRendererBuild;
|
|
162
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
163
|
+
"emitRendererBuildArtifact",
|
|
164
|
+
"rendererBuildArtifactStampPlugin",
|
|
165
|
+
"stampFinalizedRendererBuildArtifact",
|
|
166
|
+
"validateFinalizedRendererBuild"
|
|
167
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
168
|
+
Object.defineProperty(exports, '__esModule', {
|
|
169
|
+
value: true
|
|
170
|
+
});
|
|
@@ -27,24 +27,26 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
MICROVERTICAL_RELEASE_ENVELOPE_KIND: ()=>external_contract_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
|
|
32
|
+
MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: ()=>external_contract_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
|
|
33
|
+
MICROVERTICAL_RELEASE_TARGETS: ()=>MICROVERTICAL_RELEASE_TARGETS,
|
|
34
|
+
SHELL_RELEASE_ENVELOPE_KIND: ()=>external_contract_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND
|
|
35
|
+
});
|
|
36
|
+
const external_contract_js_namespaceObject = require("./contract.js");
|
|
32
37
|
const MICROVERTICAL_RELEASE_TARGETS = [
|
|
33
38
|
'node',
|
|
34
39
|
'cloudflare'
|
|
35
40
|
];
|
|
36
|
-
__webpack_require__.d(__webpack_exports__, {}, {
|
|
37
|
-
MICROVERTICAL_RELEASE_ENVELOPE_KIND: MICROVERTICAL_RELEASE_ENVELOPE_KIND,
|
|
38
|
-
MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
|
|
39
|
-
MICROVERTICAL_RELEASE_TARGETS: MICROVERTICAL_RELEASE_TARGETS
|
|
40
|
-
});
|
|
41
41
|
exports.MICROVERTICAL_RELEASE_ENVELOPE_KIND = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_KIND;
|
|
42
42
|
exports.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION;
|
|
43
43
|
exports.MICROVERTICAL_RELEASE_TARGETS = __webpack_exports__.MICROVERTICAL_RELEASE_TARGETS;
|
|
44
|
+
exports.SHELL_RELEASE_ENVELOPE_KIND = __webpack_exports__.SHELL_RELEASE_ENVELOPE_KIND;
|
|
44
45
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
45
46
|
"MICROVERTICAL_RELEASE_ENVELOPE_KIND",
|
|
46
47
|
"MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION",
|
|
47
|
-
"MICROVERTICAL_RELEASE_TARGETS"
|
|
48
|
+
"MICROVERTICAL_RELEASE_TARGETS",
|
|
49
|
+
"SHELL_RELEASE_ENVELOPE_KIND"
|
|
48
50
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
49
51
|
Object.defineProperty(exports, '__esModule', {
|
|
50
52
|
value: true
|
|
@@ -34,13 +34,16 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
34
34
|
});
|
|
35
35
|
const external_node_child_process_namespaceObject = require("node:child_process");
|
|
36
36
|
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
37
|
+
const invokeGit = external_node_child_process_namespaceObject.execFileSync;
|
|
37
38
|
const BUILD_MARKER_NAMESPACE = 'ultramodern-delivery-unit-release-build-marker:v1';
|
|
38
39
|
const PROMOTABLE_SOURCE_REVISION_PATTERN = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u;
|
|
40
|
+
const workspaceGitEnv = ()=>Object.fromEntries(Object.entries(process.env).filter(([name])=>!name.toUpperCase().startsWith('GIT_')));
|
|
39
41
|
const gitOutput = (workspaceRoot, args)=>{
|
|
40
42
|
try {
|
|
41
|
-
return (
|
|
43
|
+
return invokeGit('git', args, {
|
|
42
44
|
cwd: workspaceRoot,
|
|
43
45
|
encoding: 'utf8',
|
|
46
|
+
env: workspaceGitEnv(),
|
|
44
47
|
stdio: [
|
|
45
48
|
'ignore',
|
|
46
49
|
'pipe',
|
|
@@ -52,9 +55,9 @@ const gitOutput = (workspaceRoot, args)=>{
|
|
|
52
55
|
}
|
|
53
56
|
};
|
|
54
57
|
const createUltramodernReleaseBuildMarker = ({ generationBuildMarker, sourceRevision, unitId })=>(0, external_node_crypto_namespaceObject.createHash)('sha256').update(`${BUILD_MARKER_NAMESPACE}:${unitId}:${generationBuildMarker}:${sourceRevision}`).digest('hex').slice(0, 16);
|
|
55
|
-
const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configuredSourceRevision)=>{
|
|
58
|
+
const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configuredSourceRevision, environment = process.env)=>{
|
|
56
59
|
const configuredArgumentValue = configuredSourceRevision?.trim();
|
|
57
|
-
const configuredEnvironmentValue =
|
|
60
|
+
const configuredEnvironmentValue = environment.ULTRAMODERN_SOURCE_REVISION?.trim();
|
|
58
61
|
const configuredArgument = configuredArgumentValue && 'workspace' !== configuredArgumentValue ? configuredArgumentValue : void 0;
|
|
59
62
|
const configuredEnvironment = configuredEnvironmentValue && 'workspace' !== configuredEnvironmentValue ? configuredEnvironmentValue : void 0;
|
|
60
63
|
if (configuredArgument && configuredEnvironment && configuredArgument !== configuredEnvironment) throw new Error(`Configured source revision ${configuredArgument} does not match environment source revision ${configuredEnvironment}.`);
|
|
@@ -82,9 +85,9 @@ const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configu
|
|
|
82
85
|
if (configured && configured !== revision) throw new Error(`Configured source revision ${configured} does not match clean Git HEAD ${revision}.`);
|
|
83
86
|
return revision;
|
|
84
87
|
};
|
|
85
|
-
const resolveUltramodernReleaseIdentity = ({ generationBuildMarker, sourceRevision: configuredSourceRevision, unitId, workspaceRoot })=>{
|
|
88
|
+
const resolveUltramodernReleaseIdentity = ({ generationBuildMarker, sourceRevision: configuredSourceRevision, unitId, workspaceRoot, environment })=>{
|
|
86
89
|
const explicitSourceRevision = configuredSourceRevision?.trim();
|
|
87
|
-
const sourceRevision = resolveUltramodernSourceRevision(workspaceRoot, explicitSourceRevision);
|
|
90
|
+
const sourceRevision = resolveUltramodernSourceRevision(workspaceRoot, explicitSourceRevision, environment);
|
|
88
91
|
return {
|
|
89
92
|
buildMarker: 'workspace' === sourceRevision ? generationBuildMarker : createUltramodernReleaseBuildMarker({
|
|
90
93
|
generationBuildMarker,
|