wrangler 0.0.0-e2b7352 → 0.0.0-e305903a

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 (264) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +51 -14
  3. package/bin/wrangler.js +154 -31
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +6244 -21
  6. package/package.json +185 -141
  7. package/src/__tests__/api-dev.test.ts +209 -0
  8. package/src/__tests__/api-devregistry.test.js +56 -0
  9. package/src/__tests__/api.test.ts +80 -0
  10. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  11. package/src/__tests__/config-cache.test.ts +42 -0
  12. package/src/__tests__/configuration.test.ts +4122 -2810
  13. package/src/__tests__/dev.test.tsx +1341 -527
  14. package/src/__tests__/dialogs.test.tsx +40 -0
  15. package/src/__tests__/generate.test.ts +91 -0
  16. package/src/__tests__/guess-worker-format.test.ts +74 -57
  17. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  18. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  19. package/src/__tests__/helpers/mock-bin.ts +20 -20
  20. package/src/__tests__/helpers/mock-cfetch.ts +202 -93
  21. package/src/__tests__/helpers/mock-console.ts +68 -32
  22. package/src/__tests__/helpers/mock-dialogs.ts +121 -33
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  24. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  25. package/src/__tests__/helpers/mock-istty.ts +74 -0
  26. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  27. package/src/__tests__/helpers/mock-kv.ts +26 -26
  28. package/src/__tests__/helpers/mock-oauth-flow.ts +252 -0
  29. package/src/__tests__/helpers/mock-process.ts +39 -0
  30. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  31. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  32. package/src/__tests__/helpers/msw/handlers/index.ts +13 -0
  33. package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
  34. package/src/__tests__/helpers/msw/handlers/oauth.ts +36 -0
  35. package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
  36. package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
  37. package/src/__tests__/helpers/msw/index.ts +4 -0
  38. package/src/__tests__/helpers/run-in-tmp.ts +28 -22
  39. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  40. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  41. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  42. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  43. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  44. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  45. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  46. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  47. package/src/__tests__/https-options.test.ts +144 -108
  48. package/src/__tests__/index.test.ts +233 -967
  49. package/src/__tests__/init.test.ts +2717 -0
  50. package/src/__tests__/jest.setup.ts +151 -34
  51. package/src/__tests__/kv.test.ts +1376 -1085
  52. package/src/__tests__/logger.test.ts +141 -0
  53. package/src/__tests__/metrics.test.ts +450 -0
  54. package/src/__tests__/middleware.scheduled.test.ts +135 -0
  55. package/src/__tests__/middleware.test.ts +726 -0
  56. package/src/__tests__/package-manager.test.ts +312 -165
  57. package/src/__tests__/pages.test.ts +1990 -77
  58. package/src/__tests__/parse.test.ts +253 -245
  59. package/src/__tests__/paths.test.ts +39 -0
  60. package/src/__tests__/publish.test.ts +6989 -3411
  61. package/src/__tests__/pubsub.test.ts +367 -0
  62. package/src/__tests__/r2.test.ts +363 -190
  63. package/src/__tests__/route.test.ts +22 -22
  64. package/src/__tests__/secret.test.ts +626 -407
  65. package/src/__tests__/tail.test.ts +653 -516
  66. package/src/__tests__/test-old-node-version.js +31 -0
  67. package/src/__tests__/user.test.ts +155 -0
  68. package/src/__tests__/validate-dev-props.test.ts +56 -0
  69. package/src/__tests__/version.test.ts +35 -0
  70. package/src/__tests__/whoami.test.tsx +261 -88
  71. package/src/__tests__/worker-namespace.test.ts +319 -0
  72. package/src/abort.d.ts +3 -0
  73. package/src/api/dev.ts +206 -0
  74. package/src/api/index.ts +2 -0
  75. package/src/bundle-reporter.tsx +29 -0
  76. package/src/bundle.ts +723 -122
  77. package/src/cfetch/index.ts +83 -66
  78. package/src/cfetch/internal.ts +267 -92
  79. package/src/cli.ts +24 -14
  80. package/src/config/README.md +1 -1
  81. package/src/config/config.ts +236 -179
  82. package/src/config/diagnostics.ts +61 -61
  83. package/src/config/environment.ts +450 -316
  84. package/src/config/index.ts +259 -38
  85. package/src/config/validation-helpers.ts +385 -342
  86. package/src/config/validation.ts +1797 -1099
  87. package/src/config-cache.ts +85 -0
  88. package/src/create-worker-preview.ts +233 -124
  89. package/src/create-worker-upload-form.ts +285 -201
  90. package/src/d1/backups.tsx +212 -0
  91. package/src/d1/create.tsx +54 -0
  92. package/src/d1/delete.tsx +56 -0
  93. package/src/d1/execute.tsx +294 -0
  94. package/src/d1/formatTimeAgo.ts +14 -0
  95. package/src/d1/index.ts +75 -0
  96. package/src/d1/list.tsx +48 -0
  97. package/src/d1/options.ts +12 -0
  98. package/src/d1/types.tsx +14 -0
  99. package/src/d1/utils.ts +39 -0
  100. package/src/dev/dev-vars.ts +36 -0
  101. package/src/dev/dev.tsx +501 -328
  102. package/src/dev/get-local-persistence-path.tsx +31 -0
  103. package/src/dev/local.tsx +629 -211
  104. package/src/dev/remote.tsx +398 -188
  105. package/src/dev/start-server.ts +443 -0
  106. package/src/dev/use-esbuild.ts +175 -82
  107. package/src/dev/validate-dev-props.ts +31 -0
  108. package/src/dev-registry.tsx +190 -0
  109. package/src/dev.tsx +869 -0
  110. package/src/dialogs.tsx +138 -57
  111. package/src/dispatch-namespace.ts +206 -0
  112. package/src/durable.ts +102 -0
  113. package/src/entry.ts +260 -171
  114. package/src/environment-variables.ts +40 -23
  115. package/src/errors.ts +11 -0
  116. package/src/faye-websocket.d.ts +6 -0
  117. package/src/generate.ts +131 -0
  118. package/src/git-client.ts +42 -0
  119. package/src/global-wrangler-config-path.ts +26 -0
  120. package/src/https-options.ts +85 -80
  121. package/src/index.tsx +2295 -2315
  122. package/src/init.ts +967 -0
  123. package/src/inspect.ts +687 -557
  124. package/src/intl-polyfill.d.ts +123 -123
  125. package/src/is-ci.ts +14 -0
  126. package/src/is-interactive.ts +12 -0
  127. package/src/kv.ts +353 -242
  128. package/src/logger.ts +80 -0
  129. package/src/metrics/index.ts +5 -0
  130. package/src/metrics/metrics-config.ts +239 -0
  131. package/src/metrics/metrics-dispatcher.ts +96 -0
  132. package/src/metrics/metrics-usage-headers.ts +24 -0
  133. package/src/metrics/send-event.ts +93 -0
  134. package/src/miniflare-cli/assets.ts +215 -0
  135. package/src/miniflare-cli/index.ts +201 -30
  136. package/src/miniflare-cli/request-context.ts +40 -0
  137. package/src/module-collection.ts +213 -213
  138. package/src/open-in-browser.ts +8 -16
  139. package/src/package-manager.ts +183 -90
  140. package/src/pages/build.tsx +238 -0
  141. package/src/pages/constants.ts +16 -0
  142. package/src/pages/deployments.tsx +106 -0
  143. package/src/pages/dev.tsx +684 -0
  144. package/src/pages/errors.ts +66 -0
  145. package/src/pages/functions/buildPlugin.ts +110 -0
  146. package/src/pages/functions/buildWorker.ts +156 -0
  147. package/src/pages/functions/filepath-routing.test.ts +234 -0
  148. package/src/pages/functions/filepath-routing.ts +189 -0
  149. package/src/pages/functions/identifiers.ts +78 -0
  150. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  151. package/src/pages/functions/routes-consolidation.ts +73 -0
  152. package/src/pages/functions/routes-transformation.test.ts +282 -0
  153. package/src/pages/functions/routes-transformation.ts +115 -0
  154. package/src/pages/functions/routes-validation.test.ts +403 -0
  155. package/src/pages/functions/routes-validation.ts +202 -0
  156. package/src/pages/functions/routes.ts +151 -0
  157. package/src/pages/functions.tsx +82 -0
  158. package/src/pages/hash.tsx +13 -0
  159. package/src/pages/index.tsx +94 -0
  160. package/src/pages/projects.tsx +169 -0
  161. package/src/pages/publish.tsx +419 -0
  162. package/src/pages/types.ts +49 -0
  163. package/src/pages/upload.tsx +398 -0
  164. package/src/pages/utils.ts +12 -0
  165. package/src/parse.ts +224 -121
  166. package/src/paths.ts +53 -8
  167. package/src/preview.ts +31 -0
  168. package/src/proxy.ts +436 -370
  169. package/src/publish.ts +839 -324
  170. package/src/pubsub/index.ts +286 -0
  171. package/src/pubsub/pubsub-commands.tsx +623 -0
  172. package/src/r2.ts +100 -19
  173. package/src/selfsigned.d.ts +23 -23
  174. package/src/sites.tsx +281 -189
  175. package/src/tail/filters.ts +108 -110
  176. package/src/tail/index.ts +234 -218
  177. package/src/tail/printing.ts +92 -47
  178. package/src/update-check.ts +19 -0
  179. package/src/user/choose-account.tsx +69 -0
  180. package/src/user/env-vars.ts +46 -0
  181. package/src/user/generate-auth-url.ts +33 -0
  182. package/src/user/generate-random-state.ts +16 -0
  183. package/src/user/index.ts +3 -0
  184. package/src/user/user.tsx +1192 -0
  185. package/src/whoami.tsx +142 -42
  186. package/src/worker.ts +171 -100
  187. package/src/zones.ts +167 -0
  188. package/templates/checked-fetch.js +17 -0
  189. package/templates/d1-beta-facade.js +174 -0
  190. package/templates/experimental-local-cache-stubs.js +27 -0
  191. package/templates/first-party-worker-module-facade.ts +18 -0
  192. package/templates/format-dev-errors.ts +32 -0
  193. package/templates/gitignore +171 -0
  194. package/templates/init-tests/test-jest-new-worker.js +25 -0
  195. package/templates/init-tests/test-vitest-new-worker.js +26 -0
  196. package/templates/middleware/common.ts +62 -0
  197. package/templates/middleware/loader-modules.ts +84 -0
  198. package/templates/middleware/loader-sw.ts +213 -0
  199. package/templates/middleware/middleware-pretty-error.ts +40 -0
  200. package/templates/middleware/middleware-scheduled.ts +15 -0
  201. package/templates/new-worker-scheduled.js +17 -0
  202. package/templates/new-worker-scheduled.ts +32 -0
  203. package/templates/new-worker.js +3 -3
  204. package/templates/new-worker.ts +18 -3
  205. package/templates/no-op-worker.js +10 -0
  206. package/templates/pages-dev-pipeline.ts +35 -0
  207. package/templates/pages-shim.ts +9 -0
  208. package/templates/pages-template-plugin.ts +167 -0
  209. package/templates/pages-template-worker.ts +172 -0
  210. package/templates/serve-static-assets.ts +63 -0
  211. package/templates/service-bindings-module-facade.js +54 -0
  212. package/templates/service-bindings-sw-facade.js +42 -0
  213. package/templates/tsconfig.json +95 -95
  214. package/wrangler-dist/cli.d.ts +841 -0
  215. package/wrangler-dist/cli.js +129492 -108210
  216. package/miniflare-dist/index.mjs.map +0 -7
  217. package/pages/functions/buildWorker.ts +0 -62
  218. package/pages/functions/filepath-routing.test.ts +0 -223
  219. package/pages/functions/filepath-routing.ts +0 -181
  220. package/pages/functions/identifiers.ts +0 -78
  221. package/pages/functions/routes.ts +0 -151
  222. package/pages/functions/template-worker.ts +0 -130
  223. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  224. package/src/__tests__/logout.test.ts +0 -52
  225. package/src/__tests__/sentry.test.ts +0 -146
  226. package/src/miniflare-cli/enum-keys.ts +0 -17
  227. package/src/pages.tsx +0 -1061
  228. package/src/reporting.ts +0 -131
  229. package/src/user.tsx +0 -1127
  230. package/templates/static-asset-facade.js +0 -47
  231. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  232. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  233. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  234. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  235. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  236. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  237. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  238. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  239. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  240. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  241. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  242. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  243. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  244. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  245. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  246. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  247. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  248. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  249. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  250. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  251. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  252. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  253. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  254. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  255. package/vendor/wrangler-mime/LICENSE +0 -21
  256. package/vendor/wrangler-mime/Mime.js +0 -97
  257. package/vendor/wrangler-mime/README.md +0 -187
  258. package/vendor/wrangler-mime/cli.js +0 -46
  259. package/vendor/wrangler-mime/index.js +0 -4
  260. package/vendor/wrangler-mime/lite.js +0 -4
  261. package/vendor/wrangler-mime/package.json +0 -52
  262. package/vendor/wrangler-mime/types/other.js +0 -1
  263. package/vendor/wrangler-mime/types/standard.js +0 -1
  264. package/wrangler-dist/cli.js.map +0 -7
@@ -1,217 +1,301 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { FormData, File } from "undici";
3
3
  import type {
4
- CfWorkerInit,
5
- CfModuleType,
6
- CfDurableObjectMigrations,
4
+ CfWorkerInit,
5
+ CfModuleType,
6
+ CfDurableObjectMigrations,
7
7
  } from "./worker.js";
8
8
 
9
9
  export function toMimeType(type: CfModuleType): string {
10
- switch (type) {
11
- case "esm":
12
- return "application/javascript+module";
13
- case "commonjs":
14
- return "application/javascript";
15
- case "compiled-wasm":
16
- return "application/wasm";
17
- case "buffer":
18
- return "application/octet-stream";
19
- case "text":
20
- return "text/plain";
21
- default:
22
- throw new TypeError("Unsupported module: " + type);
23
- }
10
+ switch (type) {
11
+ case "esm":
12
+ return "application/javascript+module";
13
+ case "commonjs":
14
+ return "application/javascript";
15
+ case "compiled-wasm":
16
+ return "application/wasm";
17
+ case "buffer":
18
+ return "application/octet-stream";
19
+ case "text":
20
+ return "text/plain";
21
+ default:
22
+ throw new TypeError("Unsupported module: " + type);
23
+ }
24
24
  }
25
25
 
26
+ type WorkerMetadataBinding =
27
+ // If you add any new binding types here, also add it to safeBindings
28
+ // under validateUnsafeBinding in config/validation.ts
29
+ | { type: "plain_text"; name: string; text: string }
30
+ | { type: "json"; name: string; json: unknown }
31
+ | { type: "wasm_module"; name: string; part: string }
32
+ | { type: "text_blob"; name: string; part: string }
33
+ | { type: "data_blob"; name: string; part: string }
34
+ | { type: "kv_namespace"; name: string; namespace_id: string }
35
+ | {
36
+ type: "durable_object_namespace";
37
+ name: string;
38
+ class_name: string;
39
+ script_name?: string;
40
+ environment?: string;
41
+ }
42
+ | { type: "r2_bucket"; name: string; bucket_name: string }
43
+ | { type: "d1"; name: string; id: string }
44
+ | { type: "service"; name: string; service: string; environment?: string }
45
+ | { type: "namespace"; name: string; namespace: string }
46
+ | {
47
+ type: "logfwdr";
48
+ name: string;
49
+ destination: string;
50
+ };
51
+
26
52
  export interface WorkerMetadata {
27
- /** The name of the entry point module. Only exists when the worker is in the ES module format */
28
- main_module?: string;
29
- /** The name of the entry point module. Only exists when the worker is in the Service Worker format */
30
- body_part?: string;
31
- compatibility_date?: string;
32
- compatibility_flags?: string[];
33
- usage_model?: "bundled" | "unbound";
34
- migrations?: CfDurableObjectMigrations;
35
- bindings: (
36
- | { type: "kv_namespace"; name: string; namespace_id: string }
37
- | { type: "plain_text"; name: string; text: string }
38
- | { type: "json"; name: string; json: unknown }
39
- | { type: "wasm_module"; name: string; part: string }
40
- | { type: "text_blob"; name: string; part: string }
41
- | {
42
- type: "durable_object_namespace";
43
- name: string;
44
- class_name: string;
45
- script_name?: string;
46
- }
47
- | { type: "r2_bucket"; name: string; bucket_name: string }
48
- )[];
53
+ /** The name of the entry point module. Only exists when the worker is in the ES module format */
54
+ main_module?: string;
55
+ /** The name of the entry point module. Only exists when the worker is in the service-worker format */
56
+ body_part?: string;
57
+ compatibility_date?: string;
58
+ compatibility_flags?: string[];
59
+ usage_model?: "bundled" | "unbound";
60
+ migrations?: CfDurableObjectMigrations;
61
+ capnp_schema?: string;
62
+ bindings: WorkerMetadataBinding[];
63
+ keep_bindings?: WorkerMetadataBinding["type"][];
49
64
  }
50
65
 
51
66
  /**
52
67
  * Creates a `FormData` upload from a `CfWorkerInit`.
53
68
  */
54
69
  export function createWorkerUploadForm(worker: CfWorkerInit): FormData {
55
- const formData = new FormData();
56
- const {
57
- main,
58
- bindings,
59
- migrations,
60
- usage_model,
61
- compatibility_date,
62
- compatibility_flags,
63
- } = worker;
64
-
65
- let { modules } = worker;
66
-
67
- const metadataBindings: WorkerMetadata["bindings"] = [];
68
-
69
- bindings.kv_namespaces?.forEach(({ id, binding }) => {
70
- metadataBindings.push({
71
- name: binding,
72
- type: "kv_namespace",
73
- namespace_id: id,
74
- });
75
- });
76
-
77
- bindings.durable_objects?.bindings.forEach(
78
- ({ name, class_name, script_name }) => {
79
- metadataBindings.push({
80
- name,
81
- type: "durable_object_namespace",
82
- class_name: class_name,
83
- ...(script_name && { script_name }),
84
- });
85
- }
86
- );
87
-
88
- bindings.r2_buckets?.forEach(({ binding, bucket_name }) => {
89
- metadataBindings.push({
90
- name: binding,
91
- type: "r2_bucket",
92
- bucket_name,
93
- });
94
- });
95
-
96
- Object.entries(bindings.vars || {})?.forEach(([key, value]) => {
97
- if (typeof value === "string") {
98
- metadataBindings.push({ name: key, type: "plain_text", text: value });
99
- } else {
100
- metadataBindings.push({ name: key, type: "json", json: value });
101
- }
102
- });
103
-
104
- for (const [name, filePath] of Object.entries(bindings.wasm_modules || {})) {
105
- metadataBindings.push({
106
- name,
107
- type: "wasm_module",
108
- part: name,
109
- });
110
-
111
- formData.set(
112
- name,
113
- new File([readFileSync(filePath)], filePath, {
114
- type: "application/wasm",
115
- })
116
- );
117
- }
118
-
119
- for (const [name, filePath] of Object.entries(bindings.text_blobs || {})) {
120
- metadataBindings.push({
121
- name,
122
- type: "text_blob",
123
- part: name,
124
- });
125
-
126
- if (name !== "__STATIC_CONTENT_MANIFEST") {
127
- formData.set(
128
- name,
129
- new File([readFileSync(filePath)], filePath, {
130
- type: "text/plain",
131
- })
132
- );
133
- }
134
- }
135
-
136
- if (main.type === "commonjs") {
137
- // This is a service-worker format worker.
138
- for (const module of Object.values([...(modules || [])])) {
139
- if (module.name === "__STATIC_CONTENT_MANIFEST") {
140
- // Add the manifest to the form data.
141
- formData.set(
142
- module.name,
143
- new File([module.content], module.name, {
144
- type: "text/plain",
145
- })
146
- );
147
- // And then remove it from the modules collection
148
- modules = modules?.filter((m) => m !== module);
149
- } else if (module.type === "compiled-wasm" || module.type === "text") {
150
- // Convert all wasm/text modules into `wasm_module`/`text_blob` bindings.
151
- // The "name" of the module is a file path. We use it
152
- // to instead be a "part" of the body, and a reference
153
- // that we can use inside our source. This identifier has to be a valid
154
- // JS identifier, so we replace all non alphanumeric characters
155
- // with an underscore.
156
- const name = module.name.replace(/[^a-zA-Z0-9_$]/g, "_");
157
- metadataBindings.push({
158
- name,
159
- type: module.type === "compiled-wasm" ? "wasm_module" : "text_blob",
160
- part: name,
161
- });
162
-
163
- // Add the module to the form data.
164
- formData.set(
165
- name,
166
- new File([module.content], module.name, {
167
- type:
168
- module.type === "compiled-wasm"
169
- ? "application/wasm"
170
- : "text/plain",
171
- })
172
- );
173
- // And then remove it from the modules collection
174
- modules = modules?.filter((m) => m !== module);
175
- } else if (module.type === "buffer") {
176
- throw new Error(
177
- 'The "buffer" module type is not yet supported in service worker format workers'
178
- );
179
- }
180
- }
181
- }
182
-
183
- if (bindings.unsafe) {
184
- // @ts-expect-error unsafe bindings don't need to match a specific type here
185
- metadataBindings.push(...bindings.unsafe);
186
- }
187
-
188
- const metadata: WorkerMetadata = {
189
- ...(main.type !== "commonjs"
190
- ? { main_module: main.name }
191
- : { body_part: main.name }),
192
- bindings: metadataBindings,
193
- ...(compatibility_date && { compatibility_date }),
194
- ...(compatibility_flags && { compatibility_flags }),
195
- ...(usage_model && { usage_model }),
196
- ...(migrations && { migrations }),
197
- };
198
-
199
- formData.set("metadata", JSON.stringify(metadata));
200
-
201
- if (main.type === "commonjs" && modules && modules.length > 0) {
202
- throw new TypeError(
203
- "More than one module can only be specified when type = 'esm'"
204
- );
205
- }
206
-
207
- for (const module of [main].concat(modules || [])) {
208
- formData.set(
209
- module.name,
210
- new File([module.content], module.name, {
211
- type: toMimeType(module.type ?? main.type ?? "esm"),
212
- })
213
- );
214
- }
215
-
216
- return formData;
70
+ const formData = new FormData();
71
+ const {
72
+ main,
73
+ bindings,
74
+ migrations,
75
+ usage_model,
76
+ compatibility_date,
77
+ compatibility_flags,
78
+ keepVars,
79
+ } = worker;
80
+
81
+ let { modules } = worker;
82
+
83
+ const metadataBindings: WorkerMetadata["bindings"] = [];
84
+
85
+ Object.entries(bindings.vars || {})?.forEach(([key, value]) => {
86
+ if (typeof value === "string") {
87
+ metadataBindings.push({ name: key, type: "plain_text", text: value });
88
+ } else {
89
+ metadataBindings.push({ name: key, type: "json", json: value });
90
+ }
91
+ });
92
+
93
+ bindings.kv_namespaces?.forEach(({ id, binding }) => {
94
+ metadataBindings.push({
95
+ name: binding,
96
+ type: "kv_namespace",
97
+ namespace_id: id,
98
+ });
99
+ });
100
+
101
+ bindings.durable_objects?.bindings.forEach(
102
+ ({ name, class_name, script_name, environment }) => {
103
+ metadataBindings.push({
104
+ name,
105
+ type: "durable_object_namespace",
106
+ class_name: class_name,
107
+ ...(script_name && { script_name }),
108
+ ...(environment && { environment }),
109
+ });
110
+ }
111
+ );
112
+
113
+ bindings.r2_buckets?.forEach(({ binding, bucket_name }) => {
114
+ metadataBindings.push({
115
+ name: binding,
116
+ type: "r2_bucket",
117
+ bucket_name,
118
+ });
119
+ });
120
+
121
+ bindings.d1_databases?.forEach(({ binding, database_id }) => {
122
+ metadataBindings.push({
123
+ name: binding,
124
+ type: "d1",
125
+ id: database_id,
126
+ });
127
+ });
128
+
129
+ bindings.services?.forEach(({ binding, service, environment }) => {
130
+ metadataBindings.push({
131
+ name: binding,
132
+ type: "service",
133
+ service,
134
+ ...(environment && { environment }),
135
+ });
136
+ });
137
+
138
+ bindings.dispatch_namespaces?.forEach(({ binding, namespace }) => {
139
+ metadataBindings.push({
140
+ name: binding,
141
+ type: "namespace",
142
+ namespace,
143
+ });
144
+ });
145
+
146
+ bindings.logfwdr?.bindings.forEach(({ name, destination }) => {
147
+ metadataBindings.push({
148
+ name: name,
149
+ type: "logfwdr",
150
+ destination,
151
+ });
152
+ });
153
+
154
+ for (const [name, filePath] of Object.entries(bindings.wasm_modules || {})) {
155
+ metadataBindings.push({
156
+ name,
157
+ type: "wasm_module",
158
+ part: name,
159
+ });
160
+
161
+ formData.set(
162
+ name,
163
+ new File([readFileSync(filePath)], filePath, {
164
+ type: "application/wasm",
165
+ })
166
+ );
167
+ }
168
+
169
+ for (const [name, filePath] of Object.entries(bindings.text_blobs || {})) {
170
+ metadataBindings.push({
171
+ name,
172
+ type: "text_blob",
173
+ part: name,
174
+ });
175
+
176
+ if (name !== "__STATIC_CONTENT_MANIFEST") {
177
+ formData.set(
178
+ name,
179
+ new File([readFileSync(filePath)], filePath, {
180
+ type: "text/plain",
181
+ })
182
+ );
183
+ }
184
+ }
185
+
186
+ for (const [name, filePath] of Object.entries(bindings.data_blobs || {})) {
187
+ metadataBindings.push({
188
+ name,
189
+ type: "data_blob",
190
+ part: name,
191
+ });
192
+
193
+ formData.set(
194
+ name,
195
+ new File([readFileSync(filePath)], filePath, {
196
+ type: "application/octet-stream",
197
+ })
198
+ );
199
+ }
200
+
201
+ if (main.type === "commonjs") {
202
+ // This is a service-worker format worker.
203
+ for (const module of Object.values([...(modules || [])])) {
204
+ if (module.name === "__STATIC_CONTENT_MANIFEST") {
205
+ // Add the manifest to the form data.
206
+ formData.set(
207
+ module.name,
208
+ new File([module.content], module.name, {
209
+ type: "text/plain",
210
+ })
211
+ );
212
+ // And then remove it from the modules collection
213
+ modules = modules?.filter((m) => m !== module);
214
+ } else if (
215
+ module.type === "compiled-wasm" ||
216
+ module.type === "text" ||
217
+ module.type === "buffer"
218
+ ) {
219
+ // Convert all wasm/text/data modules into `wasm_module`/`text_blob`/`data_blob` bindings.
220
+ // The "name" of the module is a file path. We use it
221
+ // to instead be a "part" of the body, and a reference
222
+ // that we can use inside our source. This identifier has to be a valid
223
+ // JS identifier, so we replace all non alphanumeric characters
224
+ // with an underscore.
225
+ const name = module.name.replace(/[^a-zA-Z0-9_$]/g, "_");
226
+ metadataBindings.push({
227
+ name,
228
+ type:
229
+ module.type === "compiled-wasm"
230
+ ? "wasm_module"
231
+ : module.type === "text"
232
+ ? "text_blob"
233
+ : "data_blob",
234
+ part: name,
235
+ });
236
+
237
+ // Add the module to the form data.
238
+ formData.set(
239
+ name,
240
+ new File([module.content], module.name, {
241
+ type:
242
+ module.type === "compiled-wasm"
243
+ ? "application/wasm"
244
+ : module.type === "text"
245
+ ? "text/plain"
246
+ : "application/octet-stream",
247
+ })
248
+ );
249
+ // And then remove it from the modules collection
250
+ modules = modules?.filter((m) => m !== module);
251
+ }
252
+ }
253
+ }
254
+
255
+ if (bindings.unsafe) {
256
+ // @ts-expect-error unsafe bindings don't need to match a specific type here
257
+ metadataBindings.push(...bindings.unsafe);
258
+ }
259
+
260
+ const metadata: WorkerMetadata = {
261
+ ...(main.type !== "commonjs"
262
+ ? { main_module: main.name }
263
+ : { body_part: main.name }),
264
+ bindings: metadataBindings,
265
+ ...(compatibility_date && { compatibility_date }),
266
+ ...(compatibility_flags && { compatibility_flags }),
267
+ ...(usage_model && { usage_model }),
268
+ ...(migrations && { migrations }),
269
+ capnp_schema: bindings.logfwdr?.schema,
270
+ ...(keepVars && { keep_bindings: ["plain_text", "json"] }),
271
+ };
272
+
273
+ formData.set("metadata", JSON.stringify(metadata));
274
+
275
+ if (main.type === "commonjs" && modules && modules.length > 0) {
276
+ throw new TypeError(
277
+ "More than one module can only be specified when type = 'esm'"
278
+ );
279
+ }
280
+
281
+ for (const module of [main].concat(modules || [])) {
282
+ formData.set(
283
+ module.name,
284
+ new File([module.content], module.name, {
285
+ type: toMimeType(module.type ?? main.type ?? "esm"),
286
+ })
287
+ );
288
+ }
289
+
290
+ if (bindings.logfwdr && bindings.logfwdr.schema) {
291
+ const filePath = bindings.logfwdr.schema;
292
+ formData.set(
293
+ filePath,
294
+ new File([readFileSync(filePath)], filePath, {
295
+ type: "application/octet-stream",
296
+ })
297
+ );
298
+ }
299
+
300
+ return formData;
217
301
  }