@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.2
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
|
@@ -38,19 +38,28 @@ var __webpack_exports__ = {};
|
|
|
38
38
|
__webpack_require__.r(__webpack_exports__);
|
|
39
39
|
__webpack_require__.d(__webpack_exports__, {
|
|
40
40
|
resolveTopologyDeliveryUnit: ()=>resolveTopologyDeliveryUnit,
|
|
41
|
+
resolveTopologyReleaseRole: ()=>resolveTopologyReleaseRole,
|
|
41
42
|
resolveWorkerDeliveryUnitStamp: ()=>resolveWorkerDeliveryUnitStamp
|
|
42
43
|
});
|
|
43
44
|
const external_node_path_namespaceObject = require("node:path");
|
|
44
45
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
46
|
+
const external_node_util_namespaceObject = require("node:util");
|
|
45
47
|
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
46
48
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
47
49
|
const external_release_identity_js_namespaceObject = require("../release-identity.js");
|
|
48
50
|
const external_utils_js_namespaceObject = require("./utils.js");
|
|
49
|
-
const
|
|
51
|
+
const TOPOLOGY_PATH = 'topology/reference-topology.json';
|
|
52
|
+
const RENDERER_PROJECTION_FIELDS = [
|
|
53
|
+
'renderer',
|
|
54
|
+
'rendererIdentity',
|
|
55
|
+
'rendererIdentities',
|
|
56
|
+
'rendererProfile',
|
|
57
|
+
'routerBindings'
|
|
58
|
+
];
|
|
50
59
|
const findWorkspaceRoot = async (appDirectory)=>{
|
|
51
60
|
let current = external_node_path_default().resolve(appDirectory);
|
|
52
61
|
for(;;){
|
|
53
|
-
if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(current,
|
|
62
|
+
if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(current, TOPOLOGY_PATH))) return current;
|
|
54
63
|
const parent = external_node_path_default().dirname(current);
|
|
55
64
|
if (parent === current) return;
|
|
56
65
|
current = parent;
|
|
@@ -67,51 +76,83 @@ const stampReleaseIdentity = (identity, workspaceRoot)=>{
|
|
|
67
76
|
})
|
|
68
77
|
};
|
|
69
78
|
};
|
|
70
|
-
const
|
|
79
|
+
const resolveTopologyApp = async (appDirectory)=>{
|
|
71
80
|
const workspaceRoot = await findWorkspaceRoot(appDirectory);
|
|
72
81
|
if (!workspaceRoot) return;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
if (!(0, external_utils_js_namespaceObject.isRecord)(compactConfig)) return {
|
|
82
|
-
workspaceRoot
|
|
83
|
-
};
|
|
84
|
-
const topology = (0, external_utils_js_namespaceObject.isRecord)(compactConfig.topology) ? compactConfig.topology : void 0;
|
|
85
|
-
const apps = Array.isArray(topology?.apps) ? topology.apps : void 0;
|
|
86
|
-
if (!apps) return {
|
|
87
|
-
app: compactConfig,
|
|
88
|
-
workspaceRoot
|
|
89
|
-
};
|
|
82
|
+
const topology = await utils_namespaceObject.fs.readJSON(external_node_path_default().join(workspaceRoot, TOPOLOGY_PATH));
|
|
83
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(topology) || !(0, external_utils_js_namespaceObject.isRecord)(topology.shell) || !Array.isArray(topology.verticals) || void 0 !== topology.shells && !Array.isArray(topology.shells)) throw new Error('[cloudflare-delivery-unit] Invalid declared reference topology.');
|
|
84
|
+
const apps = [
|
|
85
|
+
topology.shell,
|
|
86
|
+
...topology.verticals,
|
|
87
|
+
...Array.isArray(topology.shells) ? topology.shells : []
|
|
88
|
+
];
|
|
90
89
|
const resolvedAppDirectory = external_node_path_default().resolve(appDirectory);
|
|
91
90
|
const app = apps.find((candidate)=>{
|
|
92
91
|
if (!(0, external_utils_js_namespaceObject.isRecord)(candidate)) return false;
|
|
93
92
|
const appPath = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(candidate.path);
|
|
94
93
|
return void 0 !== appPath && external_node_path_default().resolve(workspaceRoot, appPath.replace(/^\.\/+/u, '')) === resolvedAppDirectory;
|
|
95
94
|
});
|
|
95
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(app)) throw new Error(`[cloudflare-delivery-unit] ${appDirectory} is missing from the declared reference topology.`);
|
|
96
96
|
return {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
} : {},
|
|
97
|
+
app,
|
|
98
|
+
role: app === topology.shell || Array.isArray(topology.shells) && topology.shells.includes(app) ? 'shell' : 'microvertical',
|
|
100
99
|
workspaceRoot
|
|
101
100
|
};
|
|
102
101
|
};
|
|
103
|
-
const
|
|
104
|
-
const
|
|
102
|
+
const resolveTopologyReleaseRole = async (appDirectory)=>{
|
|
103
|
+
const resolved = await resolveTopologyApp(appDirectory);
|
|
104
|
+
if (!resolved?.app) return;
|
|
105
|
+
const kind = 'shell' === resolved.role ? 'shell' : 'vertical';
|
|
106
|
+
if (resolved.app.kind !== kind) throw new Error('[cloudflare-delivery-unit] Declared app kind disagrees with its topology membership.');
|
|
107
|
+
return resolved.role;
|
|
108
|
+
};
|
|
109
|
+
const createTopologyDeliveryUnitStamp = (identity, app)=>{
|
|
110
|
+
const surfaceProfile = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(app.surfaceProfile);
|
|
111
|
+
if (void 0 !== surfaceProfile && ![
|
|
112
|
+
'api-only',
|
|
113
|
+
'ui-only',
|
|
114
|
+
'full-stack'
|
|
115
|
+
].includes(surfaceProfile)) throw new Error('[cloudflare-delivery-unit] Declared app has an invalid surface profile.');
|
|
105
116
|
const emitsUi = 'api-only' !== surfaceProfile;
|
|
106
117
|
const emitsApi = 'ui-only' !== surfaceProfile;
|
|
118
|
+
const appId = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(app.id);
|
|
119
|
+
if (!appId) throw new Error('[cloudflare-delivery-unit] Declared app requires an id.');
|
|
120
|
+
let ui;
|
|
121
|
+
if (emitsUi) if (RENDERER_PROJECTION_FIELDS.every((field)=>!Object.hasOwn(app, field))) ui = {
|
|
122
|
+
...identity,
|
|
123
|
+
surface: 'ui'
|
|
124
|
+
};
|
|
125
|
+
else {
|
|
126
|
+
const routerBindings = (0, external_utils_js_namespaceObject.isRecord)(app.routerBindings) ? app.routerBindings : {};
|
|
127
|
+
const errors = [
|
|
128
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(app.rendererIdentity).errors,
|
|
129
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(app.rendererProfile).errors,
|
|
130
|
+
...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(app.routerBindings, Object.keys(routerBindings), 'routerBindings').errors
|
|
131
|
+
];
|
|
132
|
+
if (errors.length) throw new Error(`[cloudflare-delivery-unit] ${(0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors)}`);
|
|
133
|
+
const rendererIdentity = app.rendererIdentity;
|
|
134
|
+
const rendererProfile = app.rendererProfile;
|
|
135
|
+
if (!Object.hasOwn(routerBindings, rendererIdentity.entryName)) throw new Error('[cloudflare-delivery-unit] Topology routerBindings must include the primary renderer identity entry.');
|
|
136
|
+
const declaredIdentity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(app.deliveryUnit);
|
|
137
|
+
if (rendererIdentity.renderer !== app.renderer || rendererIdentity.renderer !== rendererProfile.renderer || rendererIdentity.appId !== app.id || rendererIdentity.buildId !== declaredIdentity?.buildMarker) throw new Error('[cloudflare-delivery-unit] Topology UI renderer metadata must match its app and delivery-unit identity.');
|
|
138
|
+
ui = {
|
|
139
|
+
...identity,
|
|
140
|
+
surface: 'ui',
|
|
141
|
+
rendererIdentity: {
|
|
142
|
+
...rendererIdentity,
|
|
143
|
+
buildId: identity.buildMarker
|
|
144
|
+
},
|
|
145
|
+
rendererProfile,
|
|
146
|
+
routerBindings: (0, backend_federation_contracts_namespaceObject.immutableRendererRouterBindings)(routerBindings)
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
else if (void 0 !== app.rendererIdentity || void 0 !== app.rendererProfile || void 0 !== app.routerBindings) throw new Error('[cloudflare-delivery-unit] API-only topology must not declare a UI renderer identity or profile.');
|
|
107
150
|
return {
|
|
108
151
|
...identity,
|
|
152
|
+
appId,
|
|
109
153
|
surfaces: {
|
|
110
|
-
...
|
|
111
|
-
ui
|
|
112
|
-
...identity,
|
|
113
|
-
surface: 'ui'
|
|
114
|
-
}
|
|
154
|
+
...ui ? {
|
|
155
|
+
ui
|
|
115
156
|
} : {},
|
|
116
157
|
...emitsApi ? {
|
|
117
158
|
api: {
|
|
@@ -123,28 +164,69 @@ const createDeliveryUnitStamp = (identity, app)=>{
|
|
|
123
164
|
};
|
|
124
165
|
};
|
|
125
166
|
const resolveTopologyDeliveryUnit = async (appDirectory)=>{
|
|
126
|
-
const resolved = await
|
|
167
|
+
const resolved = await resolveTopologyApp(appDirectory);
|
|
127
168
|
if (!resolved?.app) return;
|
|
128
169
|
const identity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(resolved.app.deliveryUnit);
|
|
129
|
-
|
|
170
|
+
if (!identity) throw new Error('[cloudflare-delivery-unit] Declared app is missing a valid delivery-unit identity.');
|
|
171
|
+
return createTopologyDeliveryUnitStamp(stampReleaseIdentity(identity, resolved.workspaceRoot), resolved.app);
|
|
130
172
|
};
|
|
131
|
-
const resolveWorkerDeliveryUnitStamp = async (appDirectory)=>{
|
|
132
|
-
const buildArtifactPath = external_node_path_default().join(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
173
|
+
const resolveWorkerDeliveryUnitStamp = async (appDirectory, distDirectory)=>{
|
|
174
|
+
const buildArtifactPath = external_node_path_default().join(distDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE);
|
|
175
|
+
if (!await utils_namespaceObject.fs.pathExists(buildArtifactPath)) {
|
|
176
|
+
if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(appDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH))) throw new Error('[cloudflare-delivery-unit] Finalized build artifact is required before worker output stamping.');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const artifact = await utils_namespaceObject.fs.readJSON(buildArtifactPath);
|
|
180
|
+
(0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
|
|
181
|
+
const identity = {
|
|
182
|
+
unitId: artifact.deliveryUnit.unitId,
|
|
183
|
+
buildMarker: artifact.deliveryUnit.buildMarker,
|
|
184
|
+
sourceRevision: artifact.deliveryUnit.sourceRevision
|
|
185
|
+
};
|
|
186
|
+
const resolved = await resolveTopologyApp(appDirectory);
|
|
187
|
+
const stampedArtifact = artifact;
|
|
188
|
+
let emitsApi = true;
|
|
189
|
+
if (resolved?.app) {
|
|
190
|
+
if (stampedArtifact.deliveryUnit.appId !== resolved.app.id) throw new Error('[cloudflare-delivery-unit] Build artifact appId must match the declared topology app.');
|
|
191
|
+
const declaredIdentity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(resolved.app.deliveryUnit);
|
|
192
|
+
if (!declaredIdentity) throw new Error('[cloudflare-delivery-unit] Declared app is missing a valid delivery-unit identity.');
|
|
193
|
+
const expected = createTopologyDeliveryUnitStamp(identity, resolved.app);
|
|
194
|
+
for (const field of [
|
|
195
|
+
'unitId'
|
|
196
|
+
])if (declaredIdentity[field] !== identity[field]) throw new Error(`[cloudflare-delivery-unit] Build artifact ${field} must match the declared topology delivery-unit identity.`);
|
|
197
|
+
const ui = stampedArtifact.surfaces.ui;
|
|
198
|
+
if (Boolean(expected.surfaces.ui) !== Boolean(ui)) throw new Error('[cloudflare-delivery-unit] Build artifact UI surface must match the declared topology surface profile.');
|
|
199
|
+
if (expected.surfaces.ui?.rendererIdentity && ui) {
|
|
200
|
+
if (!(0, external_node_util_namespaceObject.isDeepStrictEqual)(expected.surfaces.ui.routerBindings, ui.routerBindings)) throw new Error('[cloudflare-delivery-unit] Finalized build routerBindings must match the declared topology router bindings.');
|
|
201
|
+
for (const field of [
|
|
202
|
+
'renderer',
|
|
203
|
+
'appId',
|
|
204
|
+
'entryName',
|
|
205
|
+
'protocolVersion',
|
|
206
|
+
'buildId'
|
|
207
|
+
])if (expected.surfaces.ui.rendererIdentity[field] !== ui.rendererIdentity[field]) throw new Error(`[cloudflare-delivery-unit] Build artifact UI rendererIdentity.${field} must match the declared topology renderer identity.`);
|
|
208
|
+
(0, backend_federation_contracts_namespaceObject.assertRendererProfileCompatibility)(expected.surfaces.ui.rendererProfile, ui.rendererProfile);
|
|
209
|
+
}
|
|
210
|
+
emitsApi = void 0 !== expected.surfaces.api;
|
|
138
211
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
212
|
+
return {
|
|
213
|
+
...stampedArtifact.deliveryUnit,
|
|
214
|
+
surfaces: {
|
|
215
|
+
...emitsApi ? {
|
|
216
|
+
api: stampedArtifact.surfaces.api
|
|
217
|
+
} : {},
|
|
218
|
+
...stampedArtifact.surfaces.ui ? {
|
|
219
|
+
ui: stampedArtifact.surfaces.ui
|
|
220
|
+
} : {}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
143
223
|
};
|
|
144
224
|
exports.resolveTopologyDeliveryUnit = __webpack_exports__.resolveTopologyDeliveryUnit;
|
|
225
|
+
exports.resolveTopologyReleaseRole = __webpack_exports__.resolveTopologyReleaseRole;
|
|
145
226
|
exports.resolveWorkerDeliveryUnitStamp = __webpack_exports__.resolveWorkerDeliveryUnitStamp;
|
|
146
227
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
147
228
|
"resolveTopologyDeliveryUnit",
|
|
229
|
+
"resolveTopologyReleaseRole",
|
|
148
230
|
"resolveWorkerDeliveryUnitStamp"
|
|
149
231
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
150
232
|
Object.defineProperty(exports, '__esModule', {
|
|
@@ -41,6 +41,7 @@ __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 backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
44
45
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
45
46
|
const external_cloudflare_output_plan_js_namespaceObject = require("../cloudflare-output-plan.js");
|
|
46
47
|
const index_js_namespaceObject = require("../cloudflare-output-verifier/index.js");
|
|
@@ -73,20 +74,28 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
|
|
|
73
74
|
const publicAssetExcludes = (0, external_worker_manifest_js_namespaceObject.getPublicAssetExcludes)(appDirectory, modernConfig);
|
|
74
75
|
const releaseEnvelopeEnabled = api.isPluginExists('@modern-js/ultramodern-release-envelope');
|
|
75
76
|
let hasReleaseEnvelope = false;
|
|
77
|
+
let declaredPublicAssets = [];
|
|
76
78
|
return {
|
|
77
79
|
async prepare () {
|
|
78
80
|
await utils_namespaceObject.fs.remove(outputDirectory);
|
|
79
81
|
},
|
|
80
82
|
async writeOutput () {
|
|
81
|
-
if (releaseEnvelopeEnabled
|
|
83
|
+
if (releaseEnvelopeEnabled) await (0, framework_output_js_namespaceObject.emitFrameworkMicroVerticalReleaseEnvelope)({
|
|
82
84
|
apiOnly,
|
|
85
|
+
appDirectory,
|
|
83
86
|
distDirectory,
|
|
87
|
+
role: modernConfig.deploy?.releaseEnvelopeRole,
|
|
84
88
|
target: 'cloudflare'
|
|
85
89
|
});
|
|
86
90
|
if (releaseEnvelopeEnabled) await (0, framework_output_js_namespaceObject.verifyBuildOutputReleaseEnvelope)(distDirectory, 'cloudflare');
|
|
87
91
|
await utils_namespaceObject.fs.copy(distDirectory, publicDirectory, {
|
|
88
92
|
filter: (src)=>{
|
|
89
93
|
const relativePath = external_node_path_default().relative(distDirectory, src).replace(/\\/gu, '/');
|
|
94
|
+
if (apiOnly && '' !== relativePath && ![
|
|
95
|
+
backend_federation_contracts_namespaceObject.BACKEND_FEDERATION_MANIFEST_FILE,
|
|
96
|
+
backend_federation_contracts_namespaceObject.BACKEND_FEDERATION_REMOTE_ENTRY_FILE,
|
|
97
|
+
backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE
|
|
98
|
+
].includes(relativePath)) return false;
|
|
90
99
|
return 'release' !== relativePath && !relativePath.startsWith('release/') && 'public' !== relativePath && !relativePath.startsWith('public/') && (0, external_worker_manifest_js_namespaceObject.shouldCopyToPublicAssets)(src, distDirectory, publicAssetExcludes);
|
|
91
100
|
}
|
|
92
101
|
});
|
|
@@ -110,12 +119,12 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
|
|
|
110
119
|
await utils_namespaceObject.fs.writeJSON(outputPlan.paths.workerPackage, outputPlan.packages.worker);
|
|
111
120
|
}
|
|
112
121
|
await (0, external_artifacts_js_namespaceObject.copyCloudflareArtifacts)(appDirectory, outputDirectory, cloudflareArtifacts);
|
|
113
|
-
await (0, external_artifacts_js_namespaceObject.copyCloudflarePublicAssets)(appDirectory,
|
|
122
|
+
declaredPublicAssets = await (0, external_artifacts_js_namespaceObject.copyCloudflarePublicAssets)(appDirectory, outputDirectory, (0, external_artifacts_js_namespaceObject.getCloudflarePublicAssets)(modernConfig));
|
|
114
123
|
await (0, external_artifacts_js_namespaceObject.copyCloudflareD1Migrations)(appDirectory, outputDirectory, modernConfig);
|
|
115
124
|
await utils_namespaceObject.fs.writeJSON(wranglerConfigPath, (0, external_wrangler_config_js_namespaceObject.createWranglerConfig)(appDirectory, modernConfig), {
|
|
116
125
|
spaces: 2
|
|
117
126
|
});
|
|
118
|
-
const deliveryUnitStamp = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory);
|
|
127
|
+
const deliveryUnitStamp = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory, distDirectory);
|
|
119
128
|
await utils_namespaceObject.fs.writeJSON(workerManifestPath, await (0, external_worker_manifest_js_namespaceObject.createWorkerManifest)(outputDirectory, modernConfig, appContext, deliveryUnitStamp), {
|
|
120
129
|
spaces: 2
|
|
121
130
|
});
|
|
@@ -129,7 +138,7 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
|
|
|
129
138
|
const template = await readCloudflareEntryTemplate();
|
|
130
139
|
const manifest = await utils_namespaceObject.fs.readJSON(workerManifestPath);
|
|
131
140
|
await utils_namespaceObject.fs.writeFile(workerEntryPath, template.replace('p_workerManifest', JSON.stringify(manifest, null, 2)).replace('p_workerModuleLoaders', (0, external_worker_manifest_js_namespaceObject.createWorkerModuleLoaders)(manifest)));
|
|
132
|
-
const topologyDeliveryUnit = await (0, external_delivery_unit_js_namespaceObject.
|
|
141
|
+
const topologyDeliveryUnit = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory, distDirectory);
|
|
133
142
|
await (0, index_js_namespaceObject.assertCloudflareOutput)({
|
|
134
143
|
outputDirectory,
|
|
135
144
|
importWorker: false,
|
|
@@ -139,6 +148,7 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
|
|
|
139
148
|
});
|
|
140
149
|
if (hasReleaseEnvelope) {
|
|
141
150
|
await (0, framework_output_js_namespaceObject.emitCloudflareStagedReleaseEnvelope)({
|
|
151
|
+
declaredPublicAssets,
|
|
142
152
|
distDirectory,
|
|
143
153
|
outputDirectory
|
|
144
154
|
});
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
NATIVE_RENDERER_WORKER_RESOURCES_FILE: ()=>NATIVE_RENDERER_WORKER_RESOURCES_FILE,
|
|
41
|
+
readNativeRendererWorkerResources: ()=>readNativeRendererWorkerResources
|
|
42
|
+
});
|
|
43
|
+
const promises_namespaceObject = require("node:fs/promises");
|
|
44
|
+
var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
|
|
45
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
46
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
47
|
+
const external_constants_js_namespaceObject = require("./constants.js");
|
|
48
|
+
const external_utils_js_namespaceObject = require("./utils.js");
|
|
49
|
+
const NATIVE_RENDERER_WORKER_RESOURCES_FILE = `${external_constants_js_namespaceObject.WORKER_BUNDLE_DIRECTORY}/native-renderer.json`;
|
|
50
|
+
const invalid = (detail)=>new Error(`Invalid native renderer worker resources (${NATIVE_RENDERER_WORKER_RESOURCES_FILE}): ${detail}. Rebuild the application with deploy.worker.ssr before deploying.`);
|
|
51
|
+
function validateEntry(entryName, value) {
|
|
52
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(value)) throw invalid(`entry ${entryName} is not an object`);
|
|
53
|
+
const { assets, hydrationBuildId, serverConfig, csrFallbackHeader, nonce } = value;
|
|
54
|
+
if (!Array.isArray(assets) || !assets.length) throw invalid(`entry ${entryName} has no document assets`);
|
|
55
|
+
if (void 0 !== hydrationBuildId && ('string' != typeof hydrationBuildId || !hydrationBuildId.trim())) throw invalid(`entry ${entryName} has an empty hydration build ID`);
|
|
56
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(serverConfig) || ![
|
|
57
|
+
true,
|
|
58
|
+
false,
|
|
59
|
+
'stream'
|
|
60
|
+
].includes(serverConfig.ssr) || void 0 !== serverConfig.ssrByRouteIds && (!Array.isArray(serverConfig.ssrByRouteIds) || serverConfig.ssrByRouteIds.some((id)=>'string' != typeof id))) throw invalid(`entry ${entryName} has an invalid server config`);
|
|
61
|
+
for (const [field, text] of [
|
|
62
|
+
[
|
|
63
|
+
'csrFallbackHeader',
|
|
64
|
+
csrFallbackHeader
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
'nonce',
|
|
68
|
+
nonce
|
|
69
|
+
]
|
|
70
|
+
])if (void 0 !== text && ('string' != typeof text || !text)) throw invalid(`entry ${entryName} has an invalid ${field}`);
|
|
71
|
+
}
|
|
72
|
+
async function readNativeRendererWorkerResources(distDirectory, build) {
|
|
73
|
+
let bytes;
|
|
74
|
+
try {
|
|
75
|
+
bytes = await promises_default().readFile(external_node_path_default().join(distDirectory, NATIVE_RENDERER_WORKER_RESOURCES_FILE), 'utf8');
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (error instanceof Error && 'code' in error && 'ENOENT' === error.code) return;
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
const value = JSON.parse(bytes);
|
|
81
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(value) || 'ultramodern-native-worker-resources' !== value.schema || 1 !== value.version || 'string' != typeof value.renderer || !value.renderer || !(0, external_utils_js_namespaceObject.isRecord)(value.entries)) throw invalid('unknown schema');
|
|
82
|
+
if (value.renderer !== build?.renderer.name || !build.renderer.nativeDocuments) throw invalid(`renderer ${value.renderer} is not the built native-document renderer`);
|
|
83
|
+
const entries = value.entries;
|
|
84
|
+
const nativeEntries = Object.entries(build.identities).filter(([, identity])=>identity.renderer === value.renderer);
|
|
85
|
+
for (const [entryName] of nativeEntries)if (!Object.hasOwn(entries, entryName)) throw invalid(`entry ${entryName} is missing`);
|
|
86
|
+
for (const [entryName, entry] of Object.entries(entries)){
|
|
87
|
+
if (!nativeEntries.some(([name])=>name === entryName)) throw invalid(`entry ${entryName} has no built ${value.renderer} renderer identity`);
|
|
88
|
+
validateEntry(entryName, entry);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
exports.NATIVE_RENDERER_WORKER_RESOURCES_FILE = __webpack_exports__.NATIVE_RENDERER_WORKER_RESOURCES_FILE;
|
|
93
|
+
exports.readNativeRendererWorkerResources = __webpack_exports__.readNativeRendererWorkerResources;
|
|
94
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
95
|
+
"NATIVE_RENDERER_WORKER_RESOURCES_FILE",
|
|
96
|
+
"readNativeRendererWorkerResources"
|
|
97
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
98
|
+
Object.defineProperty(exports, '__esModule', {
|
|
99
|
+
value: true
|
|
100
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
readWorkerRendererBuild: ()=>readWorkerRendererBuild
|
|
41
|
+
});
|
|
42
|
+
const promises_namespaceObject = require("node:fs/promises");
|
|
43
|
+
var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
|
|
44
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
45
|
+
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
46
|
+
const external_node_util_namespaceObject = require("node:util");
|
|
47
|
+
const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
|
|
48
|
+
const external_utils_js_namespaceObject = require("./utils.js");
|
|
49
|
+
async function readWorkerRendererBuild(distDirectory, routes, deliveryUnit) {
|
|
50
|
+
let bytes;
|
|
51
|
+
try {
|
|
52
|
+
bytes = await promises_default().readFile(external_node_path_default().join(distDirectory, 'renderer-build.json'), 'utf8');
|
|
53
|
+
} catch (error) {
|
|
54
|
+
if (error instanceof Error && 'code' in error && 'ENOENT' === error.code) return;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
const build = JSON.parse(bytes);
|
|
58
|
+
if (!(0, external_utils_js_namespaceObject.isRecord)(build) || 'ultramodern-renderer-build' !== build.schema || 2 !== build.version || 'string' != typeof build.buildId || !/^[a-f0-9]{64}$/u.test(build.buildId) || !(0, external_utils_js_namespaceObject.isRecord)(build.profile) || build.renderer !== build.profile.renderer || !(0, external_utils_js_namespaceObject.isRecord)(build.worker) || 'boolean' != typeof build.worker.nativeDocuments || 'boolean' != typeof build.worker.rsc || !(0, external_utils_js_namespaceObject.isRecord)(build.entries) || !Object.keys(build.entries).length) throw new Error('Invalid or outdated renderer-build.json for the Cloudflare worker; rebuild the application.');
|
|
59
|
+
const { renderer, protocolVersion, compiler, hydration, router } = build.profile;
|
|
60
|
+
const validation = (0, backend_federation_contracts_namespaceObject.validateRendererProfile)({
|
|
61
|
+
renderer,
|
|
62
|
+
protocolVersion,
|
|
63
|
+
compiler,
|
|
64
|
+
hydration,
|
|
65
|
+
router
|
|
66
|
+
});
|
|
67
|
+
if (!validation.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(validation.errors));
|
|
68
|
+
const identities = {};
|
|
69
|
+
let appId;
|
|
70
|
+
for (const [entryName, value] of Object.entries(build.entries)){
|
|
71
|
+
const validation = (0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(value);
|
|
72
|
+
if (!validation.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(validation.errors));
|
|
73
|
+
const identity = value;
|
|
74
|
+
if ('__proto__' === entryName || identity.entryName !== entryName || identity.renderer !== renderer || identity.protocolVersion !== protocolVersion || identity.buildId !== build.buildId || void 0 !== appId && identity.appId !== appId) throw new Error('Cloudflare renderer entry identity conflicts with its built manifest');
|
|
75
|
+
appId = identity.appId;
|
|
76
|
+
identities[entryName] = Object.freeze({
|
|
77
|
+
...identity
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
for (const route of routes){
|
|
81
|
+
if (false === route.isSSR && void 0 === route.entryName && void 0 === route.worker && void 0 === route.bundle && (void 0 === route.isRSC || false === route.isRSC) && (void 0 === route.isStream || false === route.isStream) && 'string' == typeof route.entryPath && route.entryPath.startsWith('public/') && !route.entryPath.includes('\\') && external_node_path_default().posix.normalize(route.entryPath) === route.entryPath) {
|
|
82
|
+
const asset = await promises_default().stat(external_node_path_default().join(distDirectory, route.entryPath));
|
|
83
|
+
if (asset.isFile()) continue;
|
|
84
|
+
}
|
|
85
|
+
if (true !== route.isApi || false !== route.isSSR || void 0 !== route.entryName || '' !== route.entryPath || void 0 !== route.worker || void 0 !== route.bundle || void 0 !== route.isRSC && false !== route.isRSC || void 0 !== route.isStream && false !== route.isStream) {
|
|
86
|
+
if ('string' != typeof route.entryName || !Object.hasOwn(identities, route.entryName)) throw new Error(`Cloudflare generated route has no built renderer identity for ${String(route.entryName)}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const ui = deliveryUnit?.surfaces.ui;
|
|
90
|
+
if (ui && !(0, external_node_util_namespaceObject.isDeepStrictEqual)(identities[ui.rendererIdentity.entryName], ui.rendererIdentity)) throw new Error('Cloudflare built renderer identity conflicts with its finalized delivery unit');
|
|
91
|
+
return Object.freeze({
|
|
92
|
+
renderer: Object.freeze({
|
|
93
|
+
name: renderer,
|
|
94
|
+
nativeDocuments: build.worker.nativeDocuments,
|
|
95
|
+
rsc: build.worker.rsc
|
|
96
|
+
}),
|
|
97
|
+
identities: Object.freeze(identities)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
exports.readWorkerRendererBuild = __webpack_exports__.readWorkerRendererBuild;
|
|
101
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
102
|
+
"readWorkerRendererBuild"
|
|
103
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
104
|
+
Object.defineProperty(exports, '__esModule', {
|
|
105
|
+
value: true
|
|
106
|
+
});
|
|
@@ -46,9 +46,12 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
46
46
|
const external_node_path_namespaceObject = require("node:path");
|
|
47
47
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
48
48
|
const utils_namespaceObject = require("@modern-js/utils");
|
|
49
|
+
const external_cloudflare_output_contract_js_namespaceObject = require("../cloudflare-output-contract.js");
|
|
49
50
|
const external_artifacts_js_namespaceObject = require("./artifacts.js");
|
|
50
51
|
const external_constants_js_namespaceObject = require("./constants.js");
|
|
51
52
|
const external_i18n_worker_js_namespaceObject = require("./i18n-worker.js");
|
|
53
|
+
const external_native_renderer_js_namespaceObject = require("./native-renderer.js");
|
|
54
|
+
const external_renderer_identity_js_namespaceObject = require("./renderer-identity.js");
|
|
52
55
|
const external_security_policies_js_namespaceObject = require("./security-policies.js");
|
|
53
56
|
const external_utils_js_namespaceObject = require("./utils.js");
|
|
54
57
|
const external_wrangler_config_js_namespaceObject = require("./wrangler-config.js");
|
|
@@ -102,31 +105,59 @@ const createModuleFederationWorkerManifest = async (outputDirectory)=>{
|
|
|
102
105
|
}
|
|
103
106
|
];
|
|
104
107
|
});
|
|
105
|
-
|
|
108
|
+
if (!name || 0 === exposes.length) return;
|
|
109
|
+
const routeManifestPath = external_node_path_default().join(outputDirectory, external_constants_js_namespaceObject.PUBLIC_ASSETS_DIRECTORY, external_constants_js_namespaceObject.ROUTE_MANIFEST_FILE);
|
|
110
|
+
const routeManifest = await utils_namespaceObject.fs.pathExists(routeManifestPath) ? await utils_namespaceObject.fs.readJson(routeManifestPath) : void 0;
|
|
111
|
+
const routeAssets = (0, external_utils_js_namespaceObject.isRecord)(routeManifest) && (0, external_utils_js_namespaceObject.isRecord)(routeManifest.routeAssets) ? Object.values(routeManifest.routeAssets).filter(external_utils_js_namespaceObject.isRecord) : [];
|
|
112
|
+
const routeCss = [
|
|
113
|
+
...new Set(routeAssets.flatMap((routeAsset)=>[
|
|
114
|
+
routeAsset.referenceCssAssets,
|
|
115
|
+
routeAsset.assets
|
|
116
|
+
].flatMap((value)=>Array.isArray(value) ? value : []).filter((asset)=>'string' == typeof asset && asset.endsWith('.css'))))
|
|
117
|
+
];
|
|
118
|
+
return {
|
|
106
119
|
name,
|
|
107
|
-
exposes
|
|
108
|
-
|
|
120
|
+
exposes,
|
|
121
|
+
routeCss
|
|
122
|
+
};
|
|
109
123
|
};
|
|
110
124
|
const createWorkerManifest = async (outputDirectory, modernConfig, appContext, deliveryUnitStamp)=>{
|
|
111
125
|
const routeSpec = await (0, external_artifacts_js_namespaceObject.readRouteSpec)(outputDirectory);
|
|
112
126
|
const routes = await Promise.all(routeSpec.routes.map(async (route)=>{
|
|
113
127
|
const worker = 'string' == typeof route.worker ? route.worker : void 0;
|
|
128
|
+
const routeDataWorker = route.isSSR && 'string' == typeof route.entryName ? `${external_constants_js_namespaceObject.WORKER_BUNDLE_DIRECTORY}/${(0, external_cloudflare_output_contract_js_namespaceObject.getCloudflareWorkerRouteDataEntryName)(route.entryName)}.js` : void 0;
|
|
129
|
+
const hasRouteDataWorker = routeDataWorker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, routeDataWorker)) : false;
|
|
114
130
|
return {
|
|
115
131
|
urlPath: route.urlPath,
|
|
116
132
|
entryName: route.entryName,
|
|
117
133
|
entryPath: route.entryPath,
|
|
118
134
|
isSSR: Boolean(route.isSSR),
|
|
119
135
|
worker,
|
|
120
|
-
workerExists: worker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, worker)) : false
|
|
136
|
+
workerExists: worker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, worker)) : false,
|
|
137
|
+
...hasRouteDataWorker ? {
|
|
138
|
+
routeDataWorker
|
|
139
|
+
} : {},
|
|
140
|
+
...route.responseHeaders && 'object' == typeof route.responseHeaders ? {
|
|
141
|
+
responseHeaders: route.responseHeaders
|
|
142
|
+
} : {}
|
|
121
143
|
};
|
|
122
144
|
}));
|
|
123
|
-
const
|
|
124
|
-
const
|
|
145
|
+
const rendererBuild = await (0, external_renderer_identity_js_namespaceObject.readWorkerRendererBuild)(appContext.distDirectory, routeSpec.routes, deliveryUnitStamp);
|
|
146
|
+
const rendererIdentities = rendererBuild?.identities;
|
|
147
|
+
const nativeRenderer = await (0, external_native_renderer_js_namespaceObject.readNativeRendererWorkerResources)(appContext.distDirectory, rendererBuild);
|
|
148
|
+
for (const route of routes){
|
|
149
|
+
const renderer = 'string' == typeof route.entryName && rendererIdentities && Object.hasOwn(rendererIdentities, route.entryName) ? rendererIdentities[route.entryName].renderer : void 0;
|
|
150
|
+
if (void 0 !== renderer && rendererBuild?.renderer.nativeDocuments && (nativeRenderer?.renderer !== renderer || !route.workerExists)) throw new Error(`Cloudflare worker deploy of the ${renderer} renderer requires its native worker build for entry ${route.entryName}. Set deploy.worker.ssr: true and rebuild with the Cloudflare deploy target.`);
|
|
151
|
+
}
|
|
125
152
|
const isEffectApi = Boolean(modernConfig.bff) && modernConfig.bff?.runtimeFramework !== 'hono';
|
|
153
|
+
const effectBffPrefix = (0, external_wrangler_config_js_namespaceObject.getWorkerEffectBffPrefix)(modernConfig);
|
|
126
154
|
const effectApiWorkerExists = await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY));
|
|
127
|
-
const
|
|
155
|
+
const typedServiceBindings = (0, external_wrangler_config_js_namespaceObject.createWorkerServiceBindings)(modernConfig, void 0);
|
|
156
|
+
const serviceBindings = (0, external_wrangler_config_js_namespaceObject.createWorkerManifestServiceBindings)(typedServiceBindings, (0, external_wrangler_config_js_namespaceObject.createWorkerVpcServiceBindings)(modernConfig, void 0, typedServiceBindings, new Set([
|
|
157
|
+
external_constants_js_namespaceObject.ASSETS_BINDING
|
|
158
|
+
])));
|
|
128
159
|
const moduleFederation = await createModuleFederationWorkerManifest(outputDirectory);
|
|
129
|
-
if (
|
|
160
|
+
if (void 0 !== effectBffPrefix && !effectApiWorkerExists) throw createMissingEffectBffWorkerError(outputDirectory, external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY);
|
|
130
161
|
const effectBffManifest = isEffectApi ? createEffectBffWorkerManifest(modernConfig) : void 0;
|
|
131
162
|
return {
|
|
132
163
|
version: 1,
|
|
@@ -162,11 +193,18 @@ const createWorkerManifest = async (outputDirectory, modernConfig, appContext, d
|
|
|
162
193
|
...deliveryUnitStamp ? {
|
|
163
194
|
deliveryUnit: deliveryUnitStamp
|
|
164
195
|
} : {},
|
|
196
|
+
...rendererBuild ? {
|
|
197
|
+
renderer: rendererBuild.renderer,
|
|
198
|
+
rendererIdentities
|
|
199
|
+
} : {},
|
|
200
|
+
...nativeRenderer ? {
|
|
201
|
+
nativeRenderer
|
|
202
|
+
} : {},
|
|
165
203
|
i18n: (0, external_i18n_worker_js_namespaceObject.createI18nWorkerManifest)(routeSpec, appContext),
|
|
166
|
-
bff:
|
|
204
|
+
bff: void 0 !== effectBffPrefix && effectApiWorkerExists ? {
|
|
167
205
|
dispatcherExport: external_constants_js_namespaceObject.BFF_EFFECT_WORKER_DISPATCHER_EXPORT,
|
|
168
206
|
runtimeFramework: 'effect',
|
|
169
|
-
prefix:
|
|
207
|
+
prefix: effectBffPrefix,
|
|
170
208
|
worker: external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY,
|
|
171
209
|
effect: effectBffManifest
|
|
172
210
|
} : void 0,
|
|
@@ -177,9 +215,12 @@ const createWorkerManifest = async (outputDirectory, modernConfig, appContext, d
|
|
|
177
215
|
};
|
|
178
216
|
const createWorkerModuleLoaders = (manifest)=>{
|
|
179
217
|
const imports = new Map();
|
|
180
|
-
for (const route of manifest.routeSpec.routes)
|
|
181
|
-
|
|
182
|
-
|
|
218
|
+
for (const route of manifest.routeSpec.routes)for (const worker of [
|
|
219
|
+
route.workerExists ? route.worker : void 0,
|
|
220
|
+
route.routeDataWorker
|
|
221
|
+
])if (worker) {
|
|
222
|
+
const importPath = `../${String(worker).replace(/^\/+/u, '')}`;
|
|
223
|
+
imports.set(worker, `() => import(${JSON.stringify(importPath)})`);
|
|
183
224
|
}
|
|
184
225
|
if (manifest.bff?.worker) {
|
|
185
226
|
const importPath = `../${String(manifest.bff.worker).replace(/^\/+/u, '')}`;
|