wrangler 0.0.0-e30d1013 → 0.0.0-e311bbbf

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 (236) hide show
  1. package/README.md +3 -3
  2. package/bin/wrangler.js +30 -10
  3. package/miniflare-dist/index.mjs +126 -74
  4. package/package.json +26 -19
  5. package/src/__tests__/api-dev.test.ts +65 -36
  6. package/src/__tests__/api-devregistry.test.ts +121 -0
  7. package/src/__tests__/api.test.ts +27 -5
  8. package/src/__tests__/configuration.test.ts +567 -39
  9. package/src/__tests__/d1/d1.test.ts +82 -0
  10. package/src/__tests__/d1/execute.test.ts +66 -0
  11. package/src/__tests__/d1/migrate.test.ts +157 -0
  12. package/src/__tests__/d1/splitter.test.ts +255 -0
  13. package/src/__tests__/delete.test.ts +91 -49
  14. package/src/__tests__/deployments.test.ts +330 -52
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +8 -5
  17. package/src/__tests__/guess-worker-format.test.ts +35 -0
  18. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  19. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  20. package/src/__tests__/helpers/mock-console.ts +6 -0
  21. package/src/__tests__/helpers/mock-dialogs.ts +71 -85
  22. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -5
  24. package/src/__tests__/helpers/mock-known-routes.ts +7 -2
  25. package/src/__tests__/helpers/mock-kv.ts +29 -16
  26. package/src/__tests__/helpers/mock-oauth-flow.ts +103 -92
  27. package/src/__tests__/helpers/mock-process.ts +8 -13
  28. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  29. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  30. package/src/__tests__/helpers/msw/handlers/deployments.ts +127 -26
  31. package/src/__tests__/helpers/msw/handlers/namespaces.ts +18 -41
  32. package/src/__tests__/helpers/msw/handlers/oauth.ts +13 -18
  33. package/src/__tests__/helpers/msw/handlers/r2.ts +14 -34
  34. package/src/__tests__/helpers/msw/handlers/script.ts +9 -28
  35. package/src/__tests__/helpers/msw/handlers/user.ts +13 -24
  36. package/src/__tests__/helpers/msw/handlers/zones.ts +6 -8
  37. package/src/__tests__/helpers/msw/index.ts +32 -1
  38. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  39. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  40. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  41. package/src/__tests__/index.test.ts +90 -72
  42. package/src/__tests__/init.test.ts +927 -631
  43. package/src/__tests__/jest.setup.ts +19 -42
  44. package/src/__tests__/kv.test.ts +355 -231
  45. package/src/__tests__/logger.test.ts +68 -2
  46. package/src/__tests__/logout.test.ts +47 -0
  47. package/src/__tests__/metrics.test.ts +94 -51
  48. package/src/__tests__/middleware.scheduled.test.ts +42 -32
  49. package/src/__tests__/middleware.test.ts +212 -122
  50. package/src/__tests__/mtls-certificates.test.ts +588 -0
  51. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  52. package/src/__tests__/pages/functions-build.test.ts +452 -0
  53. package/src/__tests__/pages/pages.test.ts +81 -0
  54. package/src/__tests__/pages/project-create.test.ts +63 -0
  55. package/src/__tests__/pages/project-list.test.ts +110 -0
  56. package/src/__tests__/pages/project-upload.test.ts +500 -0
  57. package/src/__tests__/pages/publish.test.ts +2864 -0
  58. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  59. package/src/__tests__/parse.test.ts +106 -0
  60. package/src/__tests__/publish.test.ts +1620 -830
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +237 -76
  63. package/src/__tests__/r2.test.ts +37 -56
  64. package/src/__tests__/secret.test.ts +179 -130
  65. package/src/__tests__/tail.test.ts +267 -109
  66. package/src/__tests__/test-old-node-version.js +3 -3
  67. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  68. package/src/__tests__/tsconfig-sanity.ts +12 -0
  69. package/src/__tests__/tsconfig.json +8 -0
  70. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  71. package/src/__tests__/type-generation.test.ts +11 -2
  72. package/src/__tests__/user.test.ts +35 -72
  73. package/src/__tests__/whoami.test.tsx +8 -114
  74. package/src/__tests__/worker-namespace.test.ts +83 -69
  75. package/src/api/dev.ts +168 -60
  76. package/src/api/index.ts +10 -1
  77. package/src/api/mtls-certificate.ts +148 -0
  78. package/src/api/pages/create-worker-bundle-contents.ts +76 -0
  79. package/src/api/pages/index.ts +5 -0
  80. package/src/api/pages/publish.tsx +355 -0
  81. package/src/bundle.ts +221 -128
  82. package/src/cfetch/index.ts +0 -2
  83. package/src/cfetch/internal.ts +16 -21
  84. package/src/cli.ts +4 -4
  85. package/src/config/config.ts +14 -7
  86. package/src/config/environment.ts +73 -16
  87. package/src/config/index.ts +99 -30
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -9
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +48 -5
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/create.tsx +26 -21
  94. package/src/d1/{delete.tsx → delete.ts} +11 -14
  95. package/src/d1/execute.tsx +183 -170
  96. package/src/d1/index.ts +7 -6
  97. package/src/d1/list.tsx +22 -10
  98. package/src/d1/migrations/apply.tsx +212 -0
  99. package/src/d1/migrations/create.tsx +79 -0
  100. package/src/d1/migrations/helpers.ts +172 -0
  101. package/src/d1/migrations/index.ts +3 -0
  102. package/src/d1/migrations/list.tsx +95 -0
  103. package/src/d1/migrations/options.ts +23 -0
  104. package/src/d1/options.ts +3 -3
  105. package/src/d1/splitter.ts +161 -0
  106. package/src/d1/{types.tsx → types.ts} +1 -0
  107. package/src/d1/utils.ts +2 -1
  108. package/src/delete.ts +8 -16
  109. package/src/deployments.ts +333 -42
  110. package/src/deprecated/index.ts +8 -302
  111. package/src/dev/dev.tsx +57 -44
  112. package/src/dev/local.tsx +248 -74
  113. package/src/dev/remote.tsx +32 -3
  114. package/src/dev/start-server.ts +81 -66
  115. package/src/dev/use-esbuild.ts +17 -18
  116. package/src/dev/validate-dev-props.ts +9 -0
  117. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  118. package/src/dev.tsx +178 -117
  119. package/src/dialogs.ts +136 -0
  120. package/src/dispatch-namespace.ts +21 -17
  121. package/src/docs/index.ts +97 -0
  122. package/src/entry.ts +19 -11
  123. package/src/environment-variables/factory.ts +88 -0
  124. package/src/environment-variables/misc-variables.ts +30 -0
  125. package/src/generate/index.ts +298 -0
  126. package/src/git-client.ts +15 -4
  127. package/src/{index.tsx → index.ts} +134 -59
  128. package/src/init.ts +249 -187
  129. package/src/inspect.ts +16 -1
  130. package/src/jest.d.ts +4 -0
  131. package/src/kv/index.ts +15 -17
  132. package/src/logger.ts +32 -5
  133. package/src/metrics/metrics-config.ts +3 -3
  134. package/src/metrics/send-event.ts +6 -1
  135. package/src/miniflare-cli/assets.ts +64 -28
  136. package/src/miniflare-cli/index.ts +4 -7
  137. package/src/miniflare-cli/tsconfig.json +9 -0
  138. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  139. package/src/miniflare-cli/types.ts +11 -0
  140. package/src/module-collection.ts +91 -25
  141. package/src/mtls-certificate/cli.ts +155 -0
  142. package/src/pages/build.ts +410 -0
  143. package/src/pages/buildFunctions.ts +140 -0
  144. package/src/pages/deployment-tails.ts +281 -0
  145. package/src/pages/deployments.tsx +11 -33
  146. package/src/pages/{dev.tsx → dev.ts} +147 -139
  147. package/src/pages/errors.ts +1 -0
  148. package/src/pages/functions/buildPlugin.ts +61 -54
  149. package/src/pages/functions/buildWorker.ts +159 -33
  150. package/src/pages/functions/tsconfig.json +8 -0
  151. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  152. package/src/pages/{functions.tsx → functions.ts} +8 -4
  153. package/src/pages/{index.tsx → index.ts} +11 -3
  154. package/src/pages/projects.tsx +12 -22
  155. package/src/pages/prompt-select-project.tsx +31 -0
  156. package/src/pages/publish.tsx +46 -225
  157. package/src/pages/types.ts +6 -9
  158. package/src/pages/upload.tsx +58 -14
  159. package/src/pages/utils.ts +12 -1
  160. package/src/parse.ts +23 -1
  161. package/src/paths.ts +1 -1
  162. package/src/proxy.ts +5 -0
  163. package/src/publish/index.ts +20 -16
  164. package/src/publish/publish.ts +71 -46
  165. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  166. package/src/queues/cli/commands/consumer/add.ts +24 -24
  167. package/src/queues/cli/commands/consumer/index.ts +3 -6
  168. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  169. package/src/queues/cli/commands/create.ts +8 -8
  170. package/src/queues/cli/commands/delete.ts +8 -8
  171. package/src/queues/cli/commands/index.ts +6 -4
  172. package/src/queues/cli/commands/list.ts +8 -8
  173. package/src/queues/client.ts +1 -0
  174. package/src/queues/utils.ts +18 -0
  175. package/src/r2/helpers.ts +1 -0
  176. package/src/r2/index.ts +28 -28
  177. package/src/secret/index.ts +14 -16
  178. package/src/{sites.tsx → sites.ts} +1 -1
  179. package/src/tail/createTail.ts +94 -3
  180. package/src/tail/filters.ts +1 -1
  181. package/src/tail/index.ts +8 -11
  182. package/src/tail/printing.ts +15 -0
  183. package/src/traverse-module-graph.ts +53 -0
  184. package/src/tsconfig-sanity.ts +16 -0
  185. package/src/type-generation.ts +28 -20
  186. package/src/user/access.ts +0 -1
  187. package/src/user/auth-variables.ts +113 -0
  188. package/src/user/choose-account.tsx +1 -31
  189. package/src/user/index.ts +0 -1
  190. package/src/user/{user.tsx → user.ts} +123 -82
  191. package/src/utils/render.ts +93 -0
  192. package/src/{whoami.tsx → whoami.ts} +37 -71
  193. package/src/worker.ts +30 -1
  194. package/src/yargs-types.ts +22 -5
  195. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  196. package/templates/__tests__/tsconfig.json +8 -0
  197. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  198. package/templates/checked-fetch.js +9 -3
  199. package/templates/d1-beta-facade.js +51 -3
  200. package/templates/facade.d.ts +14 -0
  201. package/templates/first-party-worker-module-facade.ts +4 -3
  202. package/templates/format-dev-errors.ts +8 -6
  203. package/templates/gitignore +1 -0
  204. package/templates/init-tests/test-jest-new-worker.js +3 -5
  205. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  206. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  207. package/templates/middleware/loader-modules.ts +2 -2
  208. package/templates/middleware/loader-sw.ts +51 -31
  209. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  210. package/templates/new-worker.ts +3 -0
  211. package/templates/pages-dev-pipeline.ts +4 -1
  212. package/templates/pages-shim.ts +4 -1
  213. package/templates/pages-template-plugin.ts +19 -10
  214. package/templates/serve-static-assets.ts +17 -14
  215. package/templates/service-bindings-module-facade.js +1 -0
  216. package/templates/tsconfig-sanity.ts +11 -0
  217. package/templates/tsconfig.init.json +105 -0
  218. package/templates/tsconfig.json +5 -103
  219. package/templates/tsconfig.tsbuildinfo +1 -0
  220. package/wrangler-dist/cli.d.ts +820 -70
  221. package/wrangler-dist/cli.js +68161 -78780
  222. package/wrangler-dist/wasm-sync.wasm +0 -0
  223. package/src/__tests__/api-devregistry.test.js +0 -56
  224. package/src/__tests__/d1.test.ts +0 -74
  225. package/src/__tests__/dialogs.test.tsx +0 -40
  226. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  227. package/src/__tests__/pages.test.ts +0 -2387
  228. package/src/d1/migrations.tsx +0 -446
  229. package/src/dialogs.tsx +0 -169
  230. package/src/environment-variables.ts +0 -50
  231. package/src/pages/build.tsx +0 -270
  232. package/src/user/env-vars.ts +0 -46
  233. package/templates/experimental-local-cache-stubs.js +0 -27
  234. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  235. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  236. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import type { Environment, RawEnvironment } from "./environment";
2
+ import type { CamelCaseKey } from "yargs";
2
3
 
3
4
  /**
4
5
  * This is the static type definition for the configuration object.
@@ -17,7 +18,7 @@ import type { Environment, RawEnvironment } from "./environment";
17
18
  *
18
19
  * Legend for the annotations:
19
20
  *
20
- * - `@breaking`: the deprecation/optionality is a breaking change from wrangler 1.
21
+ * - `@breaking`: the deprecation/optionality is a breaking change from Wrangler v1.
21
22
  * - `@todo`: there's more work to be done (with details attached).
22
23
  */
23
24
  export type Config = ConfigFields<DevConfig> & Environment;
@@ -31,7 +32,7 @@ export interface ConfigFields<Dev extends RawDevConfig> {
31
32
  configPath: string | undefined;
32
33
 
33
34
  /**
34
- * A boolean to enable "legacy" style wrangler environments (from wrangler 1).
35
+ * A boolean to enable "legacy" style wrangler environments (from Wrangler v1).
35
36
  * These have been superseded by Services, but there may be projects that won't
36
37
  * (or can't) use them. If you're using a legacy environment, you can set this
37
38
  * to `true` to enable it.
@@ -95,7 +96,7 @@ export interface ConfigFields<Dev extends RawDevConfig> {
95
96
  /**
96
97
  * The location of your Worker script.
97
98
  *
98
- * @deprecated DO NOT use this (it's a holdover from wrangler 1.x). Either use the top level `main` field, or pass the path to your entry file as a command line argument.
99
+ * @deprecated DO NOT use this (it's a holdover from Wrangler v1.x). Either use the top level `main` field, or pass the path to your entry file as a command line argument.
99
100
  * @breaking
100
101
  */
101
102
  "entry-point"?: string;
@@ -215,10 +216,10 @@ export interface DevConfig {
215
216
  * Protocol that wrangler dev forwards requests on
216
217
  *
217
218
  * Setting this to `http` is not currently implemented.
218
- * See https://github.com/cloudflare/wrangler2/issues/583
219
+ * See https://github.com/cloudflare/workers-sdk/issues/583
219
220
  *
220
221
  * @default `https`
221
- * @todo this needs to be implemented https://github.com/cloudflare/wrangler2/issues/583
222
+ * @todo this needs to be implemented https://github.com/cloudflare/workers-sdk/issues/583
222
223
  */
223
224
  upstream_protocol: "https" | "http";
224
225
 
@@ -232,7 +233,7 @@ export type RawDevConfig = Partial<DevConfig>;
232
233
 
233
234
  export interface DeprecatedConfigFields {
234
235
  /**
235
- * The project "type". A holdover from wrangler 1.x.
236
+ * The project "type". A holdover from Wrangler v1.x.
236
237
  * Valid values were "webpack", "javascript", and "rust".
237
238
  *
238
239
  * @deprecated DO NOT USE THIS. Most common features now work out of the box with wrangler, including modules, jsx, typescript, etc. If you need anything more, use a custom build.
@@ -242,7 +243,7 @@ export interface DeprecatedConfigFields {
242
243
 
243
244
  /**
244
245
  * Path to the webpack config to use when building your worker.
245
- * A holdover from wrangler 1.x, used with `type: "webpack"`.
246
+ * A holdover from Wrangler v1.x, used with `type: "webpack"`.
246
247
  *
247
248
  * @deprecated DO NOT USE THIS. Most common features now work out of the box with wrangler, including modules, jsx, typescript, etc. If you need anything more, use a custom build.
248
249
  * @breaking
@@ -273,3 +274,9 @@ interface EnvironmentMap {
273
274
  [envName: string]: RawEnvironment;
274
275
  };
275
276
  }
277
+
278
+ // API dev only passes in camel-cased versions of keys, so ensure
279
+ // only camel-cased keys are used
280
+ export type OnlyCamelCase<T = Record<string, never>> = {
281
+ [key in keyof T as CamelCaseKey<key>]: T[key];
282
+ };
@@ -74,11 +74,17 @@ interface EnvironmentInheritable {
74
74
  */
75
75
  main: string | undefined;
76
76
 
77
+ /**
78
+ * The directory in which module rules should be evaluated in a `--no-bundle` worker
79
+ * This defaults to dirname(main) when left undefined
80
+ */
81
+ base_dir: string | undefined;
82
+
77
83
  /**
78
84
  * Whether we use <name>.<subdomain>.workers.dev to
79
85
  * test and deploy your worker.
80
86
  *
81
- * @default `true` (This is a breaking change from wrangler 1)
87
+ * @default `true` (This is a breaking change from Wrangler v1)
82
88
  * @breaking
83
89
  * @inheritable
84
90
  */
@@ -261,6 +267,17 @@ interface EnvironmentInheritable {
261
267
  logpush: boolean | undefined;
262
268
  }
263
269
 
270
+ export type DurableObjectBindings = {
271
+ /** The name of the binding used to refer to the Durable Object */
272
+ name: string;
273
+ /** The exported class name of the Durable Object */
274
+ class_name: string;
275
+ /** The script where the Durable Object is defined (if it's external to this worker) */
276
+ script_name?: string;
277
+ /** The service environment of the script_name to bind to */
278
+ environment?: string;
279
+ }[];
280
+
264
281
  /**
265
282
  * The `EnvironmentNonInheritable` interface declares all the configuration fields for an environment
266
283
  * that cannot be inherited from the top-level environment, and must be defined specifically.
@@ -303,16 +320,7 @@ interface EnvironmentNonInheritable {
303
320
  * @nonInheritable
304
321
  */
305
322
  durable_objects: {
306
- bindings: {
307
- /** The name of the binding used to refer to the Durable Object */
308
- name: string;
309
- /** The exported class name of the Durable Object */
310
- class_name: string;
311
- /** The script where the Durable Object is defined (if it's external to this worker) */
312
- script_name?: string;
313
- /** The service environment of the script_name to bind to */
314
- environment?: string;
315
- }[];
323
+ bindings: DurableObjectBindings;
316
324
  };
317
325
 
318
326
  /**
@@ -337,6 +345,24 @@ interface EnvironmentNonInheritable {
337
345
  preview_id?: string;
338
346
  }[];
339
347
 
348
+ /**
349
+ * These specify bindings to send email from inside your Worker.
350
+ *
351
+ * NOTE: This field is not automatically inherited from the top level environment,
352
+ * and so must be specified in every named environment.
353
+ *
354
+ * @default `[]`
355
+ * @nonInheritable
356
+ */
357
+ send_email: {
358
+ /** The binding name used to refer to the this binding */
359
+ name: string;
360
+ /** If this binding should be restricted to a specific verified address */
361
+ destination_address?: string;
362
+ /** If this binding should be restricted to a set of verified addresses */
363
+ allowed_destination_addresses?: string[];
364
+ }[];
365
+
340
366
  /**
341
367
  * Specifies Queues that are bound to this Worker environment.
342
368
  *
@@ -372,6 +398,9 @@ interface EnvironmentNonInheritable {
372
398
 
373
399
  /** The queue to send messages that failed to be consumed. */
374
400
  dead_letter_queue?: string;
401
+
402
+ /** The maximum number of concurrent consumer Worker invocations. Leaving this unset will allow your consumer to scale to the maximum concurrency needed to keep up with the message backlog. */
403
+ max_concurrency?: number | null;
375
404
  }[];
376
405
  };
377
406
 
@@ -439,13 +468,28 @@ interface EnvironmentNonInheritable {
439
468
  }[]
440
469
  | undefined;
441
470
 
471
+ /**
472
+ * Specifies analytics engine datasets that are bound to this Worker environment.
473
+ *
474
+ * NOTE: This field is not automatically inherited from the top level environment,
475
+ * and so must be specified in every named environment.
476
+ *
477
+ * @default `[]`
478
+ * @nonInheritable
479
+ */
480
+ analytics_engine_datasets: {
481
+ /** The binding name used to refer to the dataset in the worker. */
482
+ binding: string;
483
+ /** The name of this dataset to write to. */
484
+ dataset?: string;
485
+ }[];
486
+
442
487
  /**
443
488
  * "Unsafe" tables for features that aren't directly supported by wrangler.
444
489
  *
445
490
  * NOTE: This field is not automatically inherited from the top level environment,
446
491
  * and so must be specified in every named environment.
447
492
  *
448
- * @default `{ bindings: [] }`
449
493
  * @nonInheritable
450
494
  */
451
495
  unsafe: {
@@ -453,15 +497,28 @@ interface EnvironmentNonInheritable {
453
497
  * A set of bindings that should be put into a Worker's upload metadata without changes. These
454
498
  * can be used to implement bindings for features that haven't released and aren't supported
455
499
  * directly by wrangler or miniflare.
456
- *
457
- * @default []
458
500
  */
459
- bindings: {
501
+ bindings?: {
460
502
  name: string;
461
503
  type: string;
462
504
  [key: string]: unknown;
463
505
  }[];
506
+
507
+ /**
508
+ * Arbitrary key/value pairs that will be included in the uploaded metadata. Values specified
509
+ * here will always be applied to metadata last, so can add new or override existing fields.
510
+ */
511
+ metadata?: {
512
+ [key: string]: string;
513
+ };
464
514
  };
515
+
516
+ mtls_certificates: {
517
+ /** The binding name used to refer to the certificate in the worker */
518
+ binding: string;
519
+ /** The uuid of the uploaded mTLS certificate */
520
+ certificate_id: string;
521
+ }[];
465
522
  }
466
523
 
467
524
  /**
@@ -479,7 +536,7 @@ interface EnvironmentDeprecated {
479
536
  /**
480
537
  * Legacy way of defining KVNamespaces that is no longer supported.
481
538
  *
482
- * @deprecated DO NOT USE. This was a legacy bug from wrangler 1, that we do not want to support.
539
+ * @deprecated DO NOT USE. This was a legacy bug from Wrangler v1, that we do not want to support.
483
540
  */
484
541
  "kv-namespaces"?: string;
485
542
 
@@ -2,12 +2,12 @@ import fs from "node:fs";
2
2
  import dotenv from "dotenv";
3
3
  import { findUpSync } from "find-up";
4
4
  import { logger } from "../logger";
5
- import { parseTOML, readFileSync } from "../parse";
5
+ import { parseJSONC, parseTOML, readFileSync } from "../parse";
6
6
  import { removeD1BetaPrefix } from "../worker";
7
7
  import { normalizeAndValidateConfig } from "./validation";
8
8
  import type { CfWorkerInit } from "../worker";
9
- import type { Config, RawConfig } from "./config";
10
- import type { CamelCaseKey } from "yargs";
9
+ import type { CommonYargsOptions } from "../yargs-types";
10
+ import type { Config, OnlyCamelCase, RawConfig } from "./config";
11
11
 
12
12
  export type {
13
13
  Config,
@@ -25,18 +25,21 @@ export type {
25
25
  /**
26
26
  * Get the Wrangler configuration; read it from the give `configPath` if available.
27
27
  */
28
- export function readConfig(
28
+
29
+ export function readConfig<CommandArgs>(
29
30
  configPath: string | undefined,
30
- args: unknown
31
+ // Include command specific args as well as the wrangler global flags
32
+ args: CommandArgs & OnlyCamelCase<CommonYargsOptions>
31
33
  ): Config {
32
34
  let rawConfig: RawConfig = {};
33
35
  if (!configPath) {
34
- configPath = findWranglerToml();
36
+ configPath = findWranglerToml(process.cwd(), args.experimentalJsonConfig);
35
37
  }
36
-
37
38
  // Load the configuration from disk if available
38
- if (configPath) {
39
+ if (configPath?.endsWith("toml")) {
39
40
  rawConfig = parseTOML(readFileSync(configPath), configPath);
41
+ } else if (configPath?.endsWith("json")) {
42
+ rawConfig = parseJSONC(readFileSync(configPath), configPath);
40
43
  }
41
44
 
42
45
  // Process the top-level configuration.
@@ -61,10 +64,16 @@ export function readConfig(
61
64
  * from the current working directory.
62
65
  */
63
66
  export function findWranglerToml(
64
- referencePath: string = process.cwd()
67
+ referencePath: string = process.cwd(),
68
+ preferJson = false
65
69
  ): string | undefined {
66
- const configPath = findUpSync("wrangler.toml", { cwd: referencePath });
67
- return configPath;
70
+ if (preferJson) {
71
+ return (
72
+ findUpSync(`wrangler.json`, { cwd: referencePath }) ??
73
+ findUpSync(`wrangler.toml`, { cwd: referencePath })
74
+ );
75
+ }
76
+ return findUpSync(`wrangler.toml`, { cwd: referencePath });
68
77
  }
69
78
 
70
79
  /**
@@ -88,16 +97,19 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
88
97
  data_blobs,
89
98
  durable_objects,
90
99
  kv_namespaces,
100
+ send_email,
91
101
  queues,
92
102
  d1_databases,
93
103
  r2_buckets,
94
104
  logfwdr,
95
105
  services,
106
+ analytics_engine_datasets,
96
107
  text_blobs,
97
108
  unsafe,
98
109
  vars,
99
110
  wasm_modules,
100
111
  dispatch_namespaces,
112
+ mtls_certificates,
101
113
  } = bindings;
102
114
 
103
115
  if (data_blobs !== undefined && Object.keys(data_blobs).length > 0) {
@@ -144,6 +156,23 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
144
156
  });
145
157
  }
146
158
 
159
+ if (send_email !== undefined && send_email.length > 0) {
160
+ output.push({
161
+ type: "Send Email",
162
+ entries: send_email.map(
163
+ ({ name, destination_address, allowed_destination_addresses }) => {
164
+ return {
165
+ key: name,
166
+ value:
167
+ destination_address ||
168
+ allowed_destination_addresses?.join(", ") ||
169
+ "unrestricted",
170
+ };
171
+ }
172
+ ),
173
+ });
174
+ }
175
+
147
176
  if (queues !== undefined && queues.length > 0) {
148
177
  output.push({
149
178
  type: "Queues",
@@ -159,14 +188,22 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
159
188
  if (d1_databases !== undefined && d1_databases.length > 0) {
160
189
  output.push({
161
190
  type: "D1 Databases",
162
- entries: d1_databases.map(({ binding, database_name, database_id }) => {
163
- return {
164
- key: removeD1BetaPrefix(binding),
165
- value: database_name
166
- ? `${database_name} (${database_id})`
167
- : database_id,
168
- };
169
- }),
191
+ entries: d1_databases.map(
192
+ ({ binding, database_name, database_id, preview_database_id }) => {
193
+ let databaseValue = `${database_id}`;
194
+ if (database_name) {
195
+ databaseValue = `${database_name} (${database_id})`;
196
+ }
197
+ //database_id is local when running `wrangler dev --local`
198
+ if (preview_database_id && database_id !== "local") {
199
+ databaseValue += `, Preview: (${preview_database_id})`;
200
+ }
201
+ return {
202
+ key: removeD1BetaPrefix(binding),
203
+ value: databaseValue,
204
+ };
205
+ }
206
+ ),
170
207
  });
171
208
  }
172
209
 
@@ -211,6 +248,21 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
211
248
  });
212
249
  }
213
250
 
251
+ if (
252
+ analytics_engine_datasets !== undefined &&
253
+ analytics_engine_datasets.length > 0
254
+ ) {
255
+ output.push({
256
+ type: "Analytics Engine Datasets",
257
+ entries: analytics_engine_datasets.map(({ binding, dataset }) => {
258
+ return {
259
+ key: binding,
260
+ value: dataset ?? binding,
261
+ };
262
+ }),
263
+ });
264
+ }
265
+
214
266
  if (text_blobs !== undefined && Object.keys(text_blobs).length > 0) {
215
267
  output.push({
216
268
  type: "Text Blobs",
@@ -221,10 +273,10 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
221
273
  });
222
274
  }
223
275
 
224
- if (unsafe !== undefined && unsafe.length > 0) {
276
+ if (unsafe?.bindings !== undefined && unsafe.bindings.length > 0) {
225
277
  output.push({
226
278
  type: "Unsafe",
227
- entries: unsafe.map(({ name, type }) => ({
279
+ entries: unsafe.bindings.map(({ name, type }) => ({
228
280
  key: type,
229
281
  value: name,
230
282
  })),
@@ -273,6 +325,28 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
273
325
  });
274
326
  }
275
327
 
328
+ if (mtls_certificates !== undefined && mtls_certificates.length > 0) {
329
+ output.push({
330
+ type: "mTLS Certificates",
331
+ entries: mtls_certificates.map(({ binding, certificate_id }) => {
332
+ return {
333
+ key: binding,
334
+ value: certificate_id,
335
+ };
336
+ }),
337
+ });
338
+ }
339
+
340
+ if (unsafe?.metadata !== undefined) {
341
+ output.push({
342
+ type: "Unsafe Metadata",
343
+ entries: Object.entries(unsafe.metadata).map(([key, value]) => ({
344
+ key,
345
+ value: `${value}`,
346
+ })),
347
+ });
348
+ }
349
+
276
350
  if (output.length === 0) {
277
351
  return;
278
352
  }
@@ -292,18 +366,13 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
292
366
  logger.log(message);
293
367
  }
294
368
 
295
- type CamelCase<T> = {
296
- [key in keyof T as key | CamelCaseKey<key>]: T[key];
297
- };
298
-
299
- export function withConfig<T extends { config?: string }>(
369
+ export function withConfig<T>(
300
370
  handler: (
301
- t: Omit<CamelCase<T>, "config"> & { config: Config }
371
+ t: OnlyCamelCase<T & CommonYargsOptions> & { config: Config }
302
372
  ) => Promise<void>
303
373
  ) {
304
- return (t: CamelCase<T>) => {
305
- const { config: configPath, ...rest } = t;
306
- return handler({ ...rest, config: readConfig(configPath, rest) });
374
+ return (t: OnlyCamelCase<T & CommonYargsOptions>) => {
375
+ return handler({ ...t, config: readConfig(t.config, t) });
307
376
  };
308
377
  }
309
378
 
@@ -550,7 +550,7 @@ export const getBindingNames = (value: unknown): string[] => {
550
550
  } else if (isNamespaceList(value)) {
551
551
  return value.map(({ binding }) => binding);
552
552
  } else if (isRecord(value)) {
553
- return Object.keys(value);
553
+ return Object.keys(value).filter((k) => value[k] !== undefined);
554
554
  } else {
555
555
  return [];
556
556
  }