@bleedingdev/modern-js-app-tools-extensions 3.8.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.
Files changed (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/cloudflare/artifacts.js +127 -0
  4. package/dist/cjs/cloudflare/constants.js +141 -0
  5. package/dist/cjs/cloudflare/delivery-unit.js +161 -0
  6. package/dist/cjs/cloudflare/i18n-worker.js +135 -0
  7. package/dist/cjs/cloudflare/index.js +156 -0
  8. package/dist/cjs/cloudflare/security-policies.js +205 -0
  9. package/dist/cjs/cloudflare/types.js +18 -0
  10. package/dist/cjs/cloudflare/utils.js +66 -0
  11. package/dist/cjs/cloudflare/worker-manifest.js +239 -0
  12. package/dist/cjs/cloudflare/wrangler-config.js +205 -0
  13. package/dist/cjs/cloudflare-builder.js +394 -0
  14. package/dist/cjs/cloudflare-output-contract.js +108 -0
  15. package/dist/cjs/cloudflare-output-plan.js +93 -0
  16. package/dist/cjs/cloudflare-output-verifier/identity.js +92 -0
  17. package/dist/cjs/cloudflare-output-verifier/index.js +188 -0
  18. package/dist/cjs/cloudflare-output-verifier/issues.js +54 -0
  19. package/dist/cjs/cloudflare-output-verifier/manifest.js +89 -0
  20. package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +151 -0
  21. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +378 -0
  22. package/dist/cjs/config.js +18 -0
  23. package/dist/cjs/css-extract-runtime-plugin.js +74 -0
  24. package/dist/cjs/index.js +125 -0
  25. package/dist/cjs/read-template.js +56 -0
  26. package/dist/cjs/release-envelope/canonical.js +68 -0
  27. package/dist/cjs/release-envelope/framework-output.js +649 -0
  28. package/dist/cjs/release-envelope/index.js +399 -0
  29. package/dist/cjs/release-envelope/plugin.js +102 -0
  30. package/dist/cjs/release-envelope/types.js +51 -0
  31. package/dist/cjs/release-identity.js +110 -0
  32. package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  33. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  34. package/dist/cjs/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  35. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  36. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  37. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  38. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +11 -0
  39. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +281 -0
  40. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  41. package/dist/cjs/templates/cloudflare-worker-path.mjs +98 -0
  42. package/dist/esm/cloudflare/artifacts.mjs +64 -0
  43. package/dist/esm/cloudflare/constants.mjs +34 -0
  44. package/dist/esm/cloudflare/delivery-unit.mjs +110 -0
  45. package/dist/esm/cloudflare/i18n-worker.mjs +97 -0
  46. package/dist/esm/cloudflare/index.mjs +108 -0
  47. package/dist/esm/cloudflare/security-policies.mjs +167 -0
  48. package/dist/esm/cloudflare/types.mjs +0 -0
  49. package/dist/esm/cloudflare/utils.mjs +12 -0
  50. package/dist/esm/cloudflare/worker-manifest.mjs +179 -0
  51. package/dist/esm/cloudflare/wrangler-config.mjs +151 -0
  52. package/dist/esm/cloudflare-builder.mjs +327 -0
  53. package/dist/esm/cloudflare-output-contract.mjs +31 -0
  54. package/dist/esm/cloudflare-output-plan.mjs +45 -0
  55. package/dist/esm/cloudflare-output-verifier/identity.mjs +54 -0
  56. package/dist/esm/cloudflare-output-verifier/index.mjs +133 -0
  57. package/dist/esm/cloudflare-output-verifier/issues.mjs +10 -0
  58. package/dist/esm/cloudflare-output-verifier/manifest.mjs +51 -0
  59. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +99 -0
  60. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +313 -0
  61. package/dist/esm/config.mjs +0 -0
  62. package/dist/esm/css-extract-runtime-plugin.mjs +32 -0
  63. package/dist/esm/index.mjs +10 -0
  64. package/dist/esm/read-template.mjs +5 -0
  65. package/dist/esm/release-envelope/canonical.mjs +21 -0
  66. package/dist/esm/release-envelope/framework-output.mjs +573 -0
  67. package/dist/esm/release-envelope/index.mjs +335 -0
  68. package/dist/esm/release-envelope/plugin.mjs +54 -0
  69. package/dist/esm/release-envelope/types.mjs +7 -0
  70. package/dist/esm/release-identity.mjs +66 -0
  71. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  72. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  73. package/dist/esm/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  74. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  75. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  76. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  77. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +11 -0
  78. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +281 -0
  79. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  80. package/dist/esm/templates/cloudflare-worker-path.mjs +98 -0
  81. package/dist/esm-node/cloudflare/artifacts.mjs +65 -0
  82. package/dist/esm-node/cloudflare/constants.mjs +35 -0
  83. package/dist/esm-node/cloudflare/delivery-unit.mjs +111 -0
  84. package/dist/esm-node/cloudflare/i18n-worker.mjs +98 -0
  85. package/dist/esm-node/cloudflare/index.mjs +109 -0
  86. package/dist/esm-node/cloudflare/security-policies.mjs +168 -0
  87. package/dist/esm-node/cloudflare/types.mjs +1 -0
  88. package/dist/esm-node/cloudflare/utils.mjs +13 -0
  89. package/dist/esm-node/cloudflare/worker-manifest.mjs +180 -0
  90. package/dist/esm-node/cloudflare/wrangler-config.mjs +152 -0
  91. package/dist/esm-node/cloudflare-builder.mjs +328 -0
  92. package/dist/esm-node/cloudflare-output-contract.mjs +32 -0
  93. package/dist/esm-node/cloudflare-output-plan.mjs +46 -0
  94. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +55 -0
  95. package/dist/esm-node/cloudflare-output-verifier/index.mjs +134 -0
  96. package/dist/esm-node/cloudflare-output-verifier/issues.mjs +11 -0
  97. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +52 -0
  98. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +100 -0
  99. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +314 -0
  100. package/dist/esm-node/config.mjs +1 -0
  101. package/dist/esm-node/css-extract-runtime-plugin.mjs +33 -0
  102. package/dist/esm-node/index.mjs +11 -0
  103. package/dist/esm-node/read-template.mjs +9 -0
  104. package/dist/esm-node/release-envelope/canonical.mjs +22 -0
  105. package/dist/esm-node/release-envelope/framework-output.mjs +574 -0
  106. package/dist/esm-node/release-envelope/index.mjs +336 -0
  107. package/dist/esm-node/release-envelope/plugin.mjs +55 -0
  108. package/dist/esm-node/release-envelope/types.mjs +8 -0
  109. package/dist/esm-node/release-identity.mjs +67 -0
  110. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  111. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  112. package/dist/esm-node/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  113. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  114. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  115. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  116. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +11 -0
  117. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +281 -0
  118. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  119. package/dist/esm-node/templates/cloudflare-worker-path.mjs +98 -0
  120. package/dist/types/cloudflare/artifacts.d.ts +15 -0
  121. package/dist/types/cloudflare/constants.d.ts +24 -0
  122. package/dist/types/cloudflare/delivery-unit.d.ts +23 -0
  123. package/dist/types/cloudflare/i18n-worker.d.ts +22 -0
  124. package/dist/types/cloudflare/index.d.ts +2 -0
  125. package/dist/types/cloudflare/security-policies.d.ts +52 -0
  126. package/dist/types/cloudflare/types.d.ts +28 -0
  127. package/dist/types/cloudflare/utils.d.ts +6 -0
  128. package/dist/types/cloudflare/worker-manifest.d.ts +149 -0
  129. package/dist/types/cloudflare/wrangler-config.d.ts +51 -0
  130. package/dist/types/cloudflare-builder.d.ts +59 -0
  131. package/dist/types/cloudflare-output-contract.d.ts +14 -0
  132. package/dist/types/cloudflare-output-plan.d.ts +34 -0
  133. package/dist/types/cloudflare-output-verifier/identity.d.ts +8 -0
  134. package/dist/types/cloudflare-output-verifier/index.d.ts +18 -0
  135. package/dist/types/cloudflare-output-verifier/issues.d.ts +14 -0
  136. package/dist/types/cloudflare-output-verifier/manifest.d.ts +2 -0
  137. package/dist/types/cloudflare-output-verifier/mutation-policy.d.ts +14 -0
  138. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +20 -0
  139. package/dist/types/config.d.ts +175 -0
  140. package/dist/types/css-extract-runtime-plugin.d.ts +6 -0
  141. package/dist/types/index.d.ts +10 -0
  142. package/dist/types/read-template.d.ts +2 -0
  143. package/dist/types/release-envelope/canonical.d.ts +5 -0
  144. package/dist/types/release-envelope/framework-output.d.ts +32 -0
  145. package/dist/types/release-envelope/index.d.ts +6 -0
  146. package/dist/types/release-envelope/plugin.d.ts +30 -0
  147. package/dist/types/release-envelope/types.d.ts +62 -0
  148. package/dist/types/release-identity.d.ts +16 -0
  149. package/dist/types/templates/cloudflare-entry.001-bootstrap-security.d.mts +1 -0
  150. package/dist/types/templates/cloudflare-entry.002-assets-routes.d.mts +1 -0
  151. package/dist/types/templates/cloudflare-entry.003-i18n-locales.d.mts +1 -0
  152. package/dist/types/templates/cloudflare-entry.004-rendering-css.d.mts +1 -0
  153. package/dist/types/templates/cloudflare-entry.005-worker-dispatch.d.mts +1 -0
  154. package/dist/types/templates/cloudflare-entry.006-fetch-handler.d.mts +4 -0
  155. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +5 -0
  156. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +48 -0
  157. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +13 -0
  158. package/dist/types/templates/cloudflare-worker-path.d.mts +21 -0
  159. package/package.json +131 -0
  160. package/src/cloudflare/artifacts.ts +165 -0
  161. package/src/cloudflare/constants.ts +50 -0
  162. package/src/cloudflare/delivery-unit.ts +195 -0
  163. package/src/cloudflare/i18n-worker.ts +197 -0
  164. package/src/cloudflare/index.ts +259 -0
  165. package/src/cloudflare/security-policies.ts +194 -0
  166. package/src/cloudflare/types.ts +33 -0
  167. package/src/cloudflare/utils.ts +40 -0
  168. package/src/cloudflare/worker-manifest.ts +313 -0
  169. package/src/cloudflare/wrangler-config.ts +338 -0
  170. package/src/cloudflare-builder.ts +653 -0
  171. package/src/cloudflare-output-contract.ts +30 -0
  172. package/src/cloudflare-output-plan.ts +108 -0
  173. package/src/cloudflare-output-verifier/identity.ts +87 -0
  174. package/src/cloudflare-output-verifier/index.ts +277 -0
  175. package/src/cloudflare-output-verifier/issues.ts +54 -0
  176. package/src/cloudflare-output-verifier/manifest.ts +76 -0
  177. package/src/cloudflare-output-verifier/mutation-policy.ts +159 -0
  178. package/src/cloudflare-output-verifier/worker-bundles.ts +664 -0
  179. package/src/config.ts +196 -0
  180. package/src/css-extract-runtime-plugin.ts +70 -0
  181. package/src/index.ts +10 -0
  182. package/src/read-template.ts +8 -0
  183. package/src/release-envelope/canonical.ts +58 -0
  184. package/src/release-envelope/framework-output.ts +1121 -0
  185. package/src/release-envelope/index.ts +656 -0
  186. package/src/release-envelope/plugin.ts +125 -0
  187. package/src/release-envelope/types.ts +83 -0
  188. package/src/release-identity.ts +134 -0
  189. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +251 -0
  190. package/src/templates/cloudflare-entry.002-assets-routes.mjs +191 -0
  191. package/src/templates/cloudflare-entry.003-i18n-locales.mjs +514 -0
  192. package/src/templates/cloudflare-entry.004-rendering-css.mjs +1194 -0
  193. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +421 -0
  194. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +93 -0
  195. package/src/templates/cloudflare-worker-fs-promises.mjs +11 -0
  196. package/src/templates/cloudflare-worker-loadable-server.mjs +281 -0
  197. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  198. package/src/templates/cloudflare-worker-path.mjs +98 -0
@@ -0,0 +1,152 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ import { ASSETS_BINDING, COMPATIBILITY_DATE_PATTERN, DEFAULT_COMPATIBILITY_DATE, PUBLIC_ASSETS_DIRECTORY, REQUIRED_COMPATIBILITY_FLAGS, WORKER_ENTRY } from "./constants.mjs";
4
+ import { isJsonRecord, normalizeRelativePath } from "./utils.mjs";
5
+ const getCompatibilityDate = (modernConfig)=>{
6
+ const configuredDate = modernConfig.deploy?.worker?.compatibilityDate?.trim();
7
+ const compatibilityDate = configuredDate || DEFAULT_COMPATIBILITY_DATE;
8
+ if (!COMPATIBILITY_DATE_PATTERN.test(compatibilityDate)) throw new Error(`deploy.worker.compatibilityDate must use YYYY-MM-DD, received ${JSON.stringify(compatibilityDate)}.`);
9
+ return compatibilityDate;
10
+ };
11
+ const getWorkerName = (appDirectory)=>{
12
+ const basename = node_path.basename(appDirectory);
13
+ return basename.replace(/[^a-zA-Z0-9-_]/g, '-') || 'modern-cloudflare-worker';
14
+ };
15
+ const getConfiguredWorkerName = (appDirectory, modernConfig)=>{
16
+ const configuredName = modernConfig.deploy?.worker?.name?.trim();
17
+ return configuredName || getWorkerName(appDirectory);
18
+ };
19
+ const getConfiguredWrangler = (modernConfig)=>{
20
+ const wrangler = modernConfig.deploy?.worker?.wrangler;
21
+ if (void 0 === wrangler) return {};
22
+ if (!isJsonRecord(wrangler)) throw new Error('deploy.worker.wrangler must be a JSON object.');
23
+ return wrangler;
24
+ };
25
+ const createWranglerCompatibilityFlags = (configuredFlags)=>{
26
+ if (void 0 === configuredFlags) return [
27
+ ...REQUIRED_COMPATIBILITY_FLAGS
28
+ ];
29
+ if (!Array.isArray(configuredFlags) || configuredFlags.some((flag)=>'string' != typeof flag)) throw new Error('deploy.worker.wrangler.compatibility_flags must be an array of strings.');
30
+ return [
31
+ ...new Set([
32
+ ...configuredFlags,
33
+ ...REQUIRED_COMPATIBILITY_FLAGS
34
+ ])
35
+ ];
36
+ };
37
+ const createWranglerAssetsConfig = (configuredAssets)=>{
38
+ if (void 0 !== configuredAssets && !isJsonRecord(configuredAssets)) throw new Error('deploy.worker.wrangler.assets must be an object.');
39
+ return {
40
+ ...isJsonRecord(configuredAssets) ? configuredAssets : {},
41
+ directory: `./${PUBLIC_ASSETS_DIRECTORY}`,
42
+ binding: ASSETS_BINDING,
43
+ run_worker_first: true
44
+ };
45
+ };
46
+ const assertNonEmptyString = (value, label)=>{
47
+ if ('string' != typeof value || 0 === value.trim().length) throw new Error(`${label} must be a non-empty string.`);
48
+ return value.trim();
49
+ };
50
+ const normalizeD1Database = (database, index)=>{
51
+ const binding = assertNonEmptyString(database.binding, `deploy.worker.d1Databases[${index}].binding`);
52
+ const databaseName = assertNonEmptyString(database.databaseName, `deploy.worker.d1Databases[${index}].databaseName`);
53
+ const databaseId = assertNonEmptyString(database.databaseId, `deploy.worker.d1Databases[${index}].databaseId`);
54
+ const migrationsDir = void 0 === database.migrationsDir ? void 0 : normalizeRelativePath(database.migrationsDir, `deploy.worker.d1Databases[${index}].migrationsDir`, 'app root');
55
+ const previewDatabaseId = void 0 === database.previewDatabaseId ? void 0 : assertNonEmptyString(database.previewDatabaseId, `deploy.worker.d1Databases[${index}].previewDatabaseId`);
56
+ return {
57
+ binding,
58
+ database_name: databaseName,
59
+ database_id: databaseId,
60
+ ...void 0 === migrationsDir ? {} : {
61
+ migrations_dir: migrationsDir
62
+ },
63
+ ...void 0 === previewDatabaseId ? {} : {
64
+ preview_database_id: previewDatabaseId
65
+ },
66
+ ...void 0 === database.remote ? {} : {
67
+ remote: database.remote
68
+ }
69
+ };
70
+ };
71
+ const createWranglerD1Databases = (modernConfig, configuredWranglerD1)=>{
72
+ const d1Databases = modernConfig.deploy?.worker?.d1Databases;
73
+ if (void 0 === d1Databases) return configuredWranglerD1;
74
+ if (void 0 !== configuredWranglerD1) throw new Error('Use deploy.worker.d1Databases or deploy.worker.wrangler.d1_databases, not both.');
75
+ if (!Array.isArray(d1Databases)) throw new Error('deploy.worker.d1Databases must be an array.');
76
+ return d1Databases.map(normalizeD1Database);
77
+ };
78
+ const normalizeServiceBinding = (service, index)=>{
79
+ const binding = assertNonEmptyString(service.binding, `deploy.worker.services[${index}].binding`);
80
+ const serviceName = assertNonEmptyString(service.service, `deploy.worker.services[${index}].service`);
81
+ const prefix = void 0 === service.prefix ? void 0 : assertNonEmptyString(service.prefix, `deploy.worker.services[${index}].prefix`);
82
+ if (void 0 !== service.fragments && !Array.isArray(service.fragments)) throw new Error(`deploy.worker.services[${index}].fragments must be an array.`);
83
+ const fragments = void 0 === service.fragments ? void 0 : service.fragments.map((fragment, fragmentIndex)=>({
84
+ remote: assertNonEmptyString(fragment.remote, `deploy.worker.services[${index}].fragments[${fragmentIndex}].remote`),
85
+ expose: assertNonEmptyString(fragment.expose, `deploy.worker.services[${index}].fragments[${fragmentIndex}].expose`),
86
+ boundaryId: assertNonEmptyString(fragment.boundaryId, `deploy.worker.services[${index}].fragments[${fragmentIndex}].boundaryId`),
87
+ path: assertNonEmptyString(fragment.path, `deploy.worker.services[${index}].fragments[${fragmentIndex}].path`)
88
+ }));
89
+ return {
90
+ binding,
91
+ service: serviceName,
92
+ ...void 0 === prefix ? {} : {
93
+ prefix
94
+ },
95
+ ...void 0 === fragments ? {} : {
96
+ fragments
97
+ }
98
+ };
99
+ };
100
+ const createWorkerServiceBindings = (modernConfig, configuredWranglerServices)=>{
101
+ const services = modernConfig.deploy?.worker?.services;
102
+ if (void 0 === services) return configuredWranglerServices;
103
+ if (void 0 !== configuredWranglerServices) throw new Error('Use deploy.worker.services or deploy.worker.wrangler.services, not both.');
104
+ if (!Array.isArray(services)) throw new Error('deploy.worker.services must be an array.');
105
+ return services.map(normalizeServiceBinding);
106
+ };
107
+ const createWranglerServices = (serviceBindings)=>{
108
+ if (!Array.isArray(serviceBindings)) return serviceBindings;
109
+ if (!serviceBindings.every(isJsonRecord)) return serviceBindings;
110
+ return serviceBindings.map((service)=>{
111
+ const { prefix, fragments, ...wranglerService } = service;
112
+ return wranglerService;
113
+ });
114
+ };
115
+ const createWorkerManifestServiceBindings = (serviceBindings)=>{
116
+ if (!Array.isArray(serviceBindings)) return;
117
+ const bindings = serviceBindings;
118
+ const manifestBindings = bindings.filter((service)=>isJsonRecord(service) && 'string' == typeof service.binding && 'string' == typeof service.service && ('string' == typeof service.prefix || Array.isArray(service.fragments) && service.fragments.length > 0)).map((service)=>({
119
+ binding: service.binding,
120
+ service: service.service,
121
+ interface: 'fetch',
122
+ ...void 0 === service.prefix ? {} : {
123
+ prefix: service.prefix
124
+ },
125
+ ...void 0 === service.fragments ? {} : {
126
+ fragments: service.fragments
127
+ }
128
+ }));
129
+ return manifestBindings.length > 0 ? manifestBindings : void 0;
130
+ };
131
+ const createWranglerConfig = (appDirectory, modernConfig)=>{
132
+ const wrangler = getConfiguredWrangler(modernConfig);
133
+ const d1Databases = createWranglerD1Databases(modernConfig, wrangler.d1_databases);
134
+ const serviceBindings = createWorkerServiceBindings(modernConfig, wrangler.services);
135
+ const wranglerServices = createWranglerServices(serviceBindings);
136
+ return {
137
+ $schema: 'node_modules/wrangler/config-schema.json',
138
+ name: getConfiguredWorkerName(appDirectory, modernConfig),
139
+ compatibility_date: getCompatibilityDate(modernConfig),
140
+ ...wrangler,
141
+ main: WORKER_ENTRY,
142
+ compatibility_flags: createWranglerCompatibilityFlags(wrangler.compatibility_flags),
143
+ assets: createWranglerAssetsConfig(wrangler.assets),
144
+ ...void 0 === d1Databases ? {} : {
145
+ d1_databases: d1Databases
146
+ },
147
+ ...void 0 === wranglerServices ? {} : {
148
+ services: wranglerServices
149
+ }
150
+ };
151
+ };
152
+ export { createWorkerManifestServiceBindings, createWorkerServiceBindings, createWranglerConfig };
@@ -0,0 +1,328 @@
1
+ import "node:module";
2
+ import node_fs from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import node_path from "node:path";
5
+ import { SERVICE_WORKER_ENVIRONMENT_NAME } from "@modern-js/builder";
6
+ import { isProd } from "@modern-js/utils";
7
+ import { provider } from "std-env";
8
+ import { CLOUDFLARE_WORKER_NODE_BUILTINS } from "./cloudflare-output-contract.mjs";
9
+ import { getTemplatePath } from "./read-template.mjs";
10
+ const moduleRequire = createRequire(import.meta.url);
11
+ const BFF_EFFECT_WORKER_ENTRY_NAME = '__modern_bff_effect';
12
+ const BFF_EFFECT_WORKER_RUNTIME_QUERY = 'modern-bff-runtime';
13
+ const MF_SSR_DATA_FETCH_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-inject-data-fetch-function-plugin';
14
+ const MF_SSR_DEV_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-dev-plugin';
15
+ const JS_OR_TS_EXTENSIONS = new Set([
16
+ '.js',
17
+ '.jsx',
18
+ '.ts',
19
+ '.tsx',
20
+ '.mjs',
21
+ '.mts',
22
+ '.cjs',
23
+ '.cts'
24
+ ]);
25
+ const findExistingFile = (candidates)=>candidates.find((candidate)=>node_fs.existsSync(candidate));
26
+ const resolveJsOrTsEntry = (entryWithoutOrWithExtension)=>{
27
+ if (JS_OR_TS_EXTENSIONS.has(node_path.extname(entryWithoutOrWithExtension))) return node_fs.existsSync(entryWithoutOrWithExtension) ? entryWithoutOrWithExtension : void 0;
28
+ return findExistingFile([
29
+ ...JS_OR_TS_EXTENSIONS
30
+ ].map((extension)=>`${entryWithoutOrWithExtension}${extension}`));
31
+ };
32
+ const resolvePackageEntry = (packageName, paths)=>{
33
+ try {
34
+ return node_fs.realpathSync(moduleRequire.resolve(packageName, {
35
+ paths
36
+ }));
37
+ } catch {
38
+ return;
39
+ }
40
+ };
41
+ const findPackageRoot = (entryFile, packageName)=>{
42
+ let directory = node_path.dirname(entryFile);
43
+ while(directory !== node_path.dirname(directory)){
44
+ const packageJsonPath = node_path.join(directory, 'package.json');
45
+ try {
46
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
47
+ if ('object' == typeof packageJson && null !== packageJson && 'name' in packageJson && packageJson.name === packageName) return directory;
48
+ } catch {}
49
+ directory = node_path.dirname(directory);
50
+ }
51
+ };
52
+ const resolvePackageFile = (packageName, filePath, paths)=>{
53
+ try {
54
+ return node_fs.realpathSync(moduleRequire.resolve(`${packageName}/${filePath}`, {
55
+ paths
56
+ }));
57
+ } catch {
58
+ try {
59
+ const packageJsonPath = moduleRequire.resolve(`${packageName}/package.json`, {
60
+ paths
61
+ });
62
+ const packageFile = node_path.join(node_path.dirname(packageJsonPath), filePath);
63
+ if (node_fs.existsSync(packageFile)) return node_fs.realpathSync(packageFile);
64
+ } catch {}
65
+ const packageEntry = resolvePackageEntry(packageName, paths);
66
+ const packageRoot = packageEntry ? findPackageRoot(packageEntry, packageName) : void 0;
67
+ const packageFile = packageRoot ? node_path.join(packageRoot, filePath) : void 0;
68
+ return packageFile && node_fs.existsSync(packageFile) ? node_fs.realpathSync(packageFile) : void 0;
69
+ }
70
+ };
71
+ const setAliasIfPresent = (alias, name, value)=>{
72
+ if (value) alias.set(name, value);
73
+ };
74
+ const getCloudflareWorkerNodeExternals = ()=>Object.fromEntries(CLOUDFLARE_WORKER_NODE_BUILTINS.flatMap((builtin)=>{
75
+ const nodeBuiltin = `node:${builtin}`;
76
+ return [
77
+ [
78
+ builtin,
79
+ `module-import ${nodeBuiltin}`
80
+ ],
81
+ [
82
+ nodeBuiltin,
83
+ `module-import ${nodeBuiltin}`
84
+ ]
85
+ ];
86
+ }));
87
+ const normalizeWorkerOutputName = (name)=>node_path.posix.normalize(name.replace(/\\/gu, '/')).toLowerCase();
88
+ const reserveWorkerChunkName = (baseName, reservedOutputNames)=>{
89
+ let name = baseName;
90
+ while(reservedOutputNames.has(normalizeWorkerOutputName(name)))name = `${name}_`;
91
+ return name;
92
+ };
93
+ function getCloudflareWorkerRspackConfig(workerEntryNames) {
94
+ const entryNames = [
95
+ ...workerEntryNames
96
+ ];
97
+ for (const entryName of entryNames){
98
+ const slashName = entryName.replace(/\\/gu, '/');
99
+ const normalizedName = node_path.posix.normalize(slashName);
100
+ if (entryName !== slashName || normalizedName !== slashName || '.' === normalizedName || normalizedName.startsWith('../') || node_path.posix.isAbsolute(normalizedName) || node_path.win32.isAbsolute(slashName) || /^[A-Za-z]:/u.test(slashName)) throw new Error(`Cloudflare worker entry name "${entryName}" must be a canonical relative output path without dot segments or backslashes.`);
101
+ }
102
+ const reservedNames = new Set(entryNames.map(normalizeWorkerOutputName));
103
+ const runtimeName = reserveWorkerChunkName('__modern_worker_runtime', reservedNames);
104
+ reservedNames.add(normalizeWorkerOutputName(runtimeName));
105
+ const sharedName = reserveWorkerChunkName('__modern_worker_shared', reservedNames);
106
+ return {
107
+ externals: getCloudflareWorkerNodeExternals(),
108
+ externalsType: 'module-import',
109
+ module: {
110
+ parser: {
111
+ javascript: {
112
+ dynamicImportMode: 'eager'
113
+ }
114
+ }
115
+ },
116
+ optimization: {
117
+ runtimeChunk: {
118
+ name: runtimeName
119
+ },
120
+ splitChunks: {
121
+ chunks: 'all',
122
+ minSize: 0,
123
+ name: sharedName
124
+ }
125
+ }
126
+ };
127
+ }
128
+ function applyCloudflareWorkerRspackConfig(chain, workerEntryNames) {
129
+ const config = getCloudflareWorkerRspackConfig(workerEntryNames);
130
+ chain.externals(config.externals);
131
+ chain.externalsType(config.externalsType);
132
+ chain.module.parser.merge(config.module.parser);
133
+ chain.optimization.runtimeChunk(config.optimization.runtimeChunk);
134
+ chain.optimization.splitChunks(config.optimization.splitChunks);
135
+ }
136
+ function applyCloudflareWorkerMfRuntimeBoundary(chain) {
137
+ const runtimePlugin = getTemplatePath('cloudflare-worker-mf-ssr-runtime-plugin.mjs');
138
+ chain.plugins.delete('plugin-module-federation');
139
+ chain.resolve.alias.set(`${MF_SSR_DATA_FETCH_RUNTIME_PLUGIN}$`, runtimePlugin);
140
+ chain.resolve.alias.set(`${MF_SSR_DEV_RUNTIME_PLUGIN}$`, runtimePlugin);
141
+ }
142
+ const getEffectBffEntry = (normalizedConfig, appContext)=>{
143
+ if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
144
+ const configuredEntry = normalizedConfig.bff.effect?.entry;
145
+ if (configuredEntry) {
146
+ const entryWithoutOrWithExtension = node_path.isAbsolute(configuredEntry) ? configuredEntry : node_path.resolve(appContext.appDirectory, configuredEntry);
147
+ return resolveJsOrTsEntry(entryWithoutOrWithExtension);
148
+ }
149
+ return resolveJsOrTsEntry(node_path.resolve(appContext.apiDirectory, 'index'));
150
+ };
151
+ const CLOUDFLARE_DEPLOY_PROVIDERS = new Set([
152
+ 'cloudflare',
153
+ 'cloudflare_pages',
154
+ 'cloudflare_workers'
155
+ ]);
156
+ const resolveStdEnvDeployProvider = ()=>provider;
157
+ const isCloudflareWorkerDeploy = (normalizedConfig, resolveDeployProvider)=>{
158
+ const explicitTarget = normalizedConfig.deploy?.target || process.env.MODERNJS_DEPLOY;
159
+ if (explicitTarget) return 'cloudflare' === explicitTarget;
160
+ const detectedProvider = resolveDeployProvider();
161
+ return detectedProvider ? CLOUDFLARE_DEPLOY_PROVIDERS.has(detectedProvider) : false;
162
+ };
163
+ const rewriteWorkerEntryPath = (entry)=>entry.replace('index.jsx', 'index.server.jsx').replace('bootstrap.server.jsx', 'index.server.jsx').replace('bootstrap.jsx', 'index.server.jsx');
164
+ const rewriteWorkerEntryDescription = (description)=>{
165
+ const entryImport = description.import;
166
+ if ('string' == typeof entryImport) return {
167
+ ...description,
168
+ import: rewriteWorkerEntryPath(entryImport)
169
+ };
170
+ if (Array.isArray(entryImport)) return {
171
+ ...description,
172
+ import: entryImport.map(rewriteWorkerEntryPath)
173
+ };
174
+ return description;
175
+ };
176
+ const rewriteWorkerEntries = (entries)=>Object.fromEntries(Object.entries(entries).map(([name, value])=>{
177
+ if ('string' == typeof value) return [
178
+ name,
179
+ rewriteWorkerEntryPath(value)
180
+ ];
181
+ if (Array.isArray(value)) return [
182
+ name,
183
+ value.map(rewriteWorkerEntryPath)
184
+ ];
185
+ return [
186
+ name,
187
+ rewriteWorkerEntryDescription(value)
188
+ ];
189
+ }));
190
+ const prependBundlerChain = (environment, handler)=>{
191
+ const bundlerChain = environment.tools?.bundlerChain;
192
+ return {
193
+ ...environment,
194
+ tools: {
195
+ ...environment.tools,
196
+ htmlPlugin: false,
197
+ bundlerChain: bundlerChain ? Array.isArray(bundlerChain) ? [
198
+ handler,
199
+ ...bundlerChain
200
+ ] : [
201
+ handler,
202
+ bundlerChain
203
+ ] : handler
204
+ }
205
+ };
206
+ };
207
+ const getWorkerEntries = (environment, normalizedConfig, appContext)=>{
208
+ const configuredEntries = environment.source?.entry;
209
+ if (!configuredEntries) return;
210
+ const entries = rewriteWorkerEntries(configuredEntries);
211
+ const effectApiEntry = getEffectBffEntry(normalizedConfig, appContext);
212
+ return effectApiEntry ? {
213
+ ...entries,
214
+ [BFF_EFFECT_WORKER_ENTRY_NAME]: [
215
+ `${effectApiEntry}?${BFF_EFFECT_WORKER_RUNTIME_QUERY}`
216
+ ]
217
+ } : entries;
218
+ };
219
+ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
220
+ const resolvePaths = [
221
+ appContext.appDirectory,
222
+ process.cwd()
223
+ ];
224
+ const tanstackRouterSsrServerFile = resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', resolvePaths);
225
+ const runtimeRscWorkerFile = resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', resolvePaths);
226
+ const renderRscWorkerFile = resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', resolvePaths);
227
+ const reactFile = resolvePackageFile('react', 'index.js', resolvePaths);
228
+ const reactJsxRuntimeFile = resolvePackageFile('react', 'jsx-runtime.js', resolvePaths);
229
+ const reactJsxDevRuntimeFile = resolvePackageFile('react', 'jsx-dev-runtime.js', resolvePaths);
230
+ const reactDomFile = resolvePackageFile('react-dom', 'index.js', resolvePaths);
231
+ const reactDomServerEdgeFile = resolvePackageFile('react-dom', 'server.edge.js', resolvePaths);
232
+ const loadableComponentFile = resolvePackageFile('@loadable/component', 'dist/esm/loadable.esm.mjs', [
233
+ ...resolvePaths,
234
+ getTemplatePath('')
235
+ ]);
236
+ const loadableServerWorkerFile = getTemplatePath('cloudflare-worker-loadable-server.mjs');
237
+ const fsPromisesWorkerFile = getTemplatePath('cloudflare-worker-fs-promises.mjs');
238
+ const pathWorkerFile = getTemplatePath('cloudflare-worker-path.mjs');
239
+ const entryNames = [
240
+ ...workerEntryNames
241
+ ];
242
+ return (chain)=>{
243
+ applyCloudflareWorkerRspackConfig(chain, entryNames);
244
+ chain.output.module(true).library({
245
+ type: 'module'
246
+ }).publicPath('/').chunkFormat('module').chunkLoading('import').workerChunkLoading('import');
247
+ for (const condition of [
248
+ 'workerd',
249
+ 'worker',
250
+ 'webpack',
251
+ isProd() ? 'production' : 'development',
252
+ 'import',
253
+ 'require',
254
+ 'module'
255
+ ])chain.resolve.conditionNames.add(condition);
256
+ applyCloudflareWorkerMfRuntimeBoundary(chain);
257
+ if (tanstackRouterSsrServerFile) {
258
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
259
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
260
+ }
261
+ if (runtimeRscWorkerFile) {
262
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
263
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
264
+ }
265
+ if (renderRscWorkerFile) {
266
+ chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
267
+ chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
268
+ chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
269
+ }
270
+ setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
271
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
272
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
273
+ setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
274
+ setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
275
+ setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
276
+ setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
277
+ setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
278
+ setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
279
+ setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
280
+ setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
281
+ chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
282
+ chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
283
+ chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
284
+ chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
285
+ chain.resolve.fallback.set('fs', false);
286
+ chain.resolve.fallback.set('node:fs', false);
287
+ };
288
+ };
289
+ function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig, resolveDeployProvider = resolveStdEnvDeployProvider }) {
290
+ if (!isCloudflareWorkerDeploy(normalizedConfig, resolveDeployProvider)) return environments;
291
+ const workerEnvironment = environments[SERVICE_WORKER_ENVIRONMENT_NAME];
292
+ if (!workerEnvironment) return environments;
293
+ const workerEntries = getWorkerEntries(workerEnvironment, normalizedConfig, appContext);
294
+ if (!workerEntries) return environments;
295
+ const cloudflareWorkerEnvironment = prependBundlerChain({
296
+ ...workerEnvironment,
297
+ output: {
298
+ ...workerEnvironment.output,
299
+ module: true,
300
+ target: 'web'
301
+ },
302
+ source: {
303
+ ...workerEnvironment.source,
304
+ entry: workerEntries
305
+ }
306
+ }, createCloudflareBundlerChain(appContext, Object.keys(workerEntries)));
307
+ return {
308
+ ...environments,
309
+ [SERVICE_WORKER_ENVIRONMENT_NAME]: cloudflareWorkerEnvironment
310
+ };
311
+ }
312
+ function applyCloudflareBuilderEnvironments(options) {
313
+ return {
314
+ environments: getCloudflareBuilderEnvironments(options)
315
+ };
316
+ }
317
+ const createCloudflareBuilderPlugin = (resolveDeployProvider = resolveStdEnvDeployProvider)=>({
318
+ name: '@modern-js/cloudflare-builder',
319
+ setup (api) {
320
+ api.modifyBuilderEnvironments(({ environments })=>applyCloudflareBuilderEnvironments({
321
+ appContext: api.getAppContext(),
322
+ environments,
323
+ normalizedConfig: api.getNormalizedConfig(),
324
+ resolveDeployProvider
325
+ }));
326
+ }
327
+ });
328
+ export { applyCloudflareBuilderEnvironments, applyCloudflareWorkerMfRuntimeBoundary, applyCloudflareWorkerRspackConfig, createCloudflareBuilderPlugin, getCloudflareBuilderEnvironments, getCloudflareWorkerRspackConfig };
@@ -0,0 +1,32 @@
1
+ import "node:module";
2
+ const CLOUDFLARE_WORKER_ENTRY = 'server/index.mjs';
3
+ const CLOUDFLARE_WORKER_MANIFEST = 'server/modern-worker-manifest.json';
4
+ const CLOUDFLARE_WRANGLER_CONFIG_FILE = 'wrangler.json';
5
+ const CLOUDFLARE_OUTPUT_PACKAGE_FILE = 'package.json';
6
+ const CLOUDFLARE_WORKER_PACKAGE_FILE = 'worker/package.json';
7
+ const CLOUDFLARE_ASSETS_BINDING = 'ASSETS';
8
+ const CLOUDFLARE_PUBLIC_ASSETS_DIRECTORY = 'public';
9
+ const CLOUDFLARE_WORKER_BUNDLE_DIRECTORY = 'worker';
10
+ const CLOUDFLARE_RUNTIME_TYPE = 'cloudflare-module-worker';
11
+ const CLOUDFLARE_OUTPUT_PACKAGE_TYPE = 'module';
12
+ const CLOUDFLARE_WORKER_PACKAGE_TYPE = 'commonjs';
13
+ const CLOUDFLARE_WORKER_BUNDLE_FORMAT = 'commonjs';
14
+ const CLOUDFLARE_WORKER_NODE_BUILTINS = [
15
+ 'async_hooks',
16
+ 'buffer',
17
+ 'crypto',
18
+ 'events',
19
+ 'fs/promises',
20
+ 'module',
21
+ 'path',
22
+ 'process',
23
+ 'stream',
24
+ 'string_decoder',
25
+ 'url',
26
+ 'util'
27
+ ];
28
+ const CLOUDFLARE_REQUIRED_COMPATIBILITY_FLAGS = [
29
+ 'nodejs_compat',
30
+ 'global_fetch_strictly_public'
31
+ ];
32
+ export { CLOUDFLARE_ASSETS_BINDING, CLOUDFLARE_OUTPUT_PACKAGE_FILE, CLOUDFLARE_OUTPUT_PACKAGE_TYPE, CLOUDFLARE_PUBLIC_ASSETS_DIRECTORY, CLOUDFLARE_REQUIRED_COMPATIBILITY_FLAGS, CLOUDFLARE_RUNTIME_TYPE, CLOUDFLARE_WORKER_BUNDLE_DIRECTORY, CLOUDFLARE_WORKER_BUNDLE_FORMAT, CLOUDFLARE_WORKER_ENTRY, CLOUDFLARE_WORKER_MANIFEST, CLOUDFLARE_WORKER_NODE_BUILTINS, CLOUDFLARE_WORKER_PACKAGE_FILE, CLOUDFLARE_WORKER_PACKAGE_TYPE, CLOUDFLARE_WRANGLER_CONFIG_FILE };
@@ -0,0 +1,46 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ import { CLOUDFLARE_ASSETS_BINDING, CLOUDFLARE_OUTPUT_PACKAGE_FILE, CLOUDFLARE_OUTPUT_PACKAGE_TYPE, CLOUDFLARE_PUBLIC_ASSETS_DIRECTORY, CLOUDFLARE_REQUIRED_COMPATIBILITY_FLAGS, CLOUDFLARE_WORKER_BUNDLE_DIRECTORY, CLOUDFLARE_WORKER_ENTRY, CLOUDFLARE_WORKER_MANIFEST, CLOUDFLARE_WORKER_PACKAGE_FILE, CLOUDFLARE_WORKER_PACKAGE_TYPE, CLOUDFLARE_WRANGLER_CONFIG_FILE } from "./cloudflare-output-contract.mjs";
4
+ const resolveOutput = (outputDirectory, relativePath)=>node_path.join(outputDirectory, relativePath);
5
+ function createCloudflareOutputPlan(outputDirectory) {
6
+ return {
7
+ outputDirectory,
8
+ requiredFiles: [
9
+ CLOUDFLARE_WORKER_ENTRY,
10
+ CLOUDFLARE_WORKER_MANIFEST,
11
+ CLOUDFLARE_WRANGLER_CONFIG_FILE,
12
+ CLOUDFLARE_OUTPUT_PACKAGE_FILE
13
+ ],
14
+ publicLeakDirectories: [
15
+ 'server',
16
+ CLOUDFLARE_WORKER_BUNDLE_DIRECTORY
17
+ ],
18
+ paths: {
19
+ workerEntry: resolveOutput(outputDirectory, CLOUDFLARE_WORKER_ENTRY),
20
+ workerManifest: resolveOutput(outputDirectory, CLOUDFLARE_WORKER_MANIFEST),
21
+ wranglerConfig: resolveOutput(outputDirectory, CLOUDFLARE_WRANGLER_CONFIG_FILE),
22
+ outputPackage: resolveOutput(outputDirectory, CLOUDFLARE_OUTPUT_PACKAGE_FILE),
23
+ workerPackage: resolveOutput(outputDirectory, CLOUDFLARE_WORKER_PACKAGE_FILE),
24
+ publicAssets: resolveOutput(outputDirectory, CLOUDFLARE_PUBLIC_ASSETS_DIRECTORY),
25
+ workerBundle: resolveOutput(outputDirectory, CLOUDFLARE_WORKER_BUNDLE_DIRECTORY)
26
+ },
27
+ packages: {
28
+ output: {
29
+ type: CLOUDFLARE_OUTPUT_PACKAGE_TYPE
30
+ },
31
+ worker: {
32
+ type: CLOUDFLARE_WORKER_PACKAGE_TYPE
33
+ }
34
+ },
35
+ wrangler: {
36
+ main: CLOUDFLARE_WORKER_ENTRY,
37
+ assets: {
38
+ binding: CLOUDFLARE_ASSETS_BINDING,
39
+ directory: `./${CLOUDFLARE_PUBLIC_ASSETS_DIRECTORY}`,
40
+ run_worker_first: true
41
+ },
42
+ requiredCompatibilityFlags: CLOUDFLARE_REQUIRED_COMPATIBILITY_FLAGS
43
+ }
44
+ };
45
+ }
46
+ export { createCloudflareOutputPlan };
@@ -0,0 +1,55 @@
1
+ import "node:module";
2
+ import { DELIVERY_UNIT_IDENTITY_FIELDS, deliveryUnitIdentityFieldValue } from "@modern-js/utils/universal";
3
+ import { addIssue, assertEqual } from "./issues.mjs";
4
+ const verifyDeliveryUnitIdentity = (issues, manifest, manifestPath, declared)=>{
5
+ const stamped = manifest?.deliveryUnit;
6
+ const hasStamp = Boolean(stamped) && 'object' == typeof stamped;
7
+ if (declared) {
8
+ if (!hasStamp) return void addIssue(issues, {
9
+ code: 'missing-delivery-unit',
10
+ message: `Cloudflare worker manifest is missing the delivery-unit identity declared by the workspace topology (expected unitId ${declared.unitId}, buildMarker ${declared.buildMarker}).`,
11
+ path: manifestPath
12
+ });
13
+ for (const field of DELIVERY_UNIT_IDENTITY_FIELDS){
14
+ const stampedValue = deliveryUnitIdentityFieldValue(stamped, field);
15
+ assertEqual(issues, stampedValue, declared[field], {
16
+ code: 'delivery-unit-drift',
17
+ message: `Cloudflare worker manifest deliveryUnit.${field} must match the topology delivery-unit record (expected ${declared[field]}, received ${stampedValue ?? 'undefined'}).`,
18
+ path: manifestPath
19
+ });
20
+ }
21
+ }
22
+ if (hasStamp && stamped.surfaces && 'object' == typeof stamped.surfaces) for (const surface of [
23
+ 'ui',
24
+ 'api'
25
+ ]){
26
+ const marker = stamped.surfaces[surface];
27
+ const expected = declared?.surfaces?.[surface];
28
+ if (declared?.surfaces && !expected) {
29
+ if (marker) addIssue(issues, {
30
+ code: 'delivery-unit-drift',
31
+ message: `Cloudflare worker manifest declares an unexpected ${surface} delivery-unit surface for this topology profile.`,
32
+ path: manifestPath
33
+ });
34
+ continue;
35
+ }
36
+ if (!marker || 'object' != typeof marker) {
37
+ addIssue(issues, {
38
+ code: 'missing-delivery-unit',
39
+ message: `Cloudflare worker manifest is missing the ${surface} delivery-unit surface marker.`,
40
+ path: manifestPath
41
+ });
42
+ continue;
43
+ }
44
+ for (const field of DELIVERY_UNIT_IDENTITY_FIELDS){
45
+ const markerValue = deliveryUnitIdentityFieldValue(marker, field);
46
+ const stampedValue = deliveryUnitIdentityFieldValue(stamped, field);
47
+ assertEqual(issues, markerValue, stampedValue, {
48
+ code: 'delivery-unit-drift',
49
+ message: `Cloudflare worker manifest ${surface} surface deliveryUnit.${field} must derive from one delivery-unit record (expected ${stampedValue ?? 'undefined'}, received ${markerValue ?? 'undefined'}).`,
50
+ path: manifestPath
51
+ });
52
+ }
53
+ }
54
+ };
55
+ export { verifyDeliveryUnitIdentity };