wrangler 0.0.0-e7a0cd5b → 0.0.0-e7cf0caa

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 (237) 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 +27 -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 -86
  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 -56
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +12 -10
  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 +128 -27
  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 +1615 -852
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +238 -77
  63. package/src/__tests__/r2.test.ts +55 -57
  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 +43 -26
  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 +263 -140
  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 +79 -24
  87. package/src/config/index.ts +99 -38
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -19
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +60 -22
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/constants.ts +2 -0
  94. package/src/d1/create.tsx +44 -30
  95. package/src/d1/{delete.tsx → delete.ts} +11 -14
  96. package/src/d1/execute.tsx +209 -151
  97. package/src/d1/index.ts +31 -7
  98. package/src/d1/list.tsx +22 -10
  99. package/src/d1/migrations/apply.tsx +212 -0
  100. package/src/d1/migrations/create.tsx +79 -0
  101. package/src/d1/migrations/helpers.ts +172 -0
  102. package/src/d1/migrations/index.ts +3 -0
  103. package/src/d1/migrations/list.tsx +95 -0
  104. package/src/d1/migrations/options.ts +23 -0
  105. package/src/d1/options.ts +12 -2
  106. package/src/d1/splitter.ts +161 -0
  107. package/src/d1/{types.tsx → types.ts} +11 -0
  108. package/src/d1/utils.ts +12 -2
  109. package/src/delete.ts +8 -16
  110. package/src/deployments.ts +340 -46
  111. package/src/deprecated/index.ts +8 -302
  112. package/src/dev/dev.tsx +57 -44
  113. package/src/dev/local.tsx +294 -91
  114. package/src/dev/remote.tsx +32 -3
  115. package/src/dev/start-server.ts +89 -68
  116. package/src/dev/use-esbuild.ts +17 -18
  117. package/src/dev/validate-dev-props.ts +9 -0
  118. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  119. package/src/dev.tsx +178 -118
  120. package/src/dialogs.ts +136 -0
  121. package/src/dispatch-namespace.ts +21 -17
  122. package/src/docs/index.ts +97 -0
  123. package/src/entry.ts +19 -11
  124. package/src/environment-variables/factory.ts +88 -0
  125. package/src/environment-variables/misc-variables.ts +30 -0
  126. package/src/generate/index.ts +298 -0
  127. package/src/git-client.ts +15 -4
  128. package/src/{index.tsx → index.ts} +137 -63
  129. package/src/init.ts +249 -187
  130. package/src/inspect.ts +16 -1
  131. package/src/jest.d.ts +4 -0
  132. package/src/kv/index.ts +15 -17
  133. package/src/logger.ts +32 -5
  134. package/src/metrics/metrics-config.ts +3 -3
  135. package/src/metrics/send-event.ts +6 -1
  136. package/src/miniflare-cli/assets.ts +64 -28
  137. package/src/miniflare-cli/index.ts +4 -7
  138. package/src/miniflare-cli/tsconfig.json +9 -0
  139. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  140. package/src/miniflare-cli/types.ts +11 -0
  141. package/src/module-collection.ts +91 -25
  142. package/src/mtls-certificate/cli.ts +155 -0
  143. package/src/pages/build.ts +410 -0
  144. package/src/pages/buildFunctions.ts +140 -0
  145. package/src/pages/deployment-tails.ts +281 -0
  146. package/src/pages/deployments.tsx +11 -33
  147. package/src/pages/{dev.tsx → dev.ts} +147 -124
  148. package/src/pages/errors.ts +1 -0
  149. package/src/pages/functions/buildPlugin.ts +72 -69
  150. package/src/pages/functions/buildWorker.ts +249 -114
  151. package/src/pages/functions/tsconfig.json +8 -0
  152. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  153. package/src/pages/{functions.tsx → functions.ts} +8 -4
  154. package/src/pages/{index.tsx → index.ts} +11 -3
  155. package/src/pages/projects.tsx +12 -22
  156. package/src/pages/prompt-select-project.tsx +31 -0
  157. package/src/pages/publish.tsx +45 -214
  158. package/src/pages/types.ts +6 -9
  159. package/src/pages/upload.tsx +58 -14
  160. package/src/pages/utils.ts +14 -3
  161. package/src/parse.ts +23 -1
  162. package/src/paths.ts +1 -1
  163. package/src/proxy.ts +5 -0
  164. package/src/publish/index.ts +20 -16
  165. package/src/publish/publish.ts +72 -47
  166. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  167. package/src/queues/cli/commands/consumer/add.ts +24 -24
  168. package/src/queues/cli/commands/consumer/index.ts +3 -6
  169. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  170. package/src/queues/cli/commands/create.ts +8 -8
  171. package/src/queues/cli/commands/delete.ts +8 -8
  172. package/src/queues/cli/commands/index.ts +6 -4
  173. package/src/queues/cli/commands/list.ts +8 -8
  174. package/src/queues/client.ts +1 -0
  175. package/src/queues/utils.ts +18 -0
  176. package/src/r2/constants.ts +4 -0
  177. package/src/r2/helpers.ts +1 -0
  178. package/src/r2/index.ts +40 -28
  179. package/src/secret/index.ts +14 -17
  180. package/src/{sites.tsx → sites.ts} +1 -1
  181. package/src/tail/createTail.ts +94 -3
  182. package/src/tail/filters.ts +1 -1
  183. package/src/tail/index.ts +8 -11
  184. package/src/tail/printing.ts +15 -0
  185. package/src/traverse-module-graph.ts +53 -0
  186. package/src/tsconfig-sanity.ts +16 -0
  187. package/src/type-generation.ts +79 -57
  188. package/src/user/access.ts +0 -1
  189. package/src/user/auth-variables.ts +113 -0
  190. package/src/user/choose-account.tsx +1 -31
  191. package/src/user/index.ts +0 -1
  192. package/src/user/{user.tsx → user.ts} +123 -82
  193. package/src/utils/render.ts +93 -0
  194. package/src/{whoami.tsx → whoami.ts} +37 -71
  195. package/src/worker.ts +35 -3
  196. package/src/yargs-types.ts +22 -5
  197. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  198. package/templates/__tests__/tsconfig.json +8 -0
  199. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  200. package/templates/checked-fetch.js +9 -3
  201. package/templates/d1-beta-facade.js +95 -25
  202. package/templates/facade.d.ts +14 -0
  203. package/templates/first-party-worker-module-facade.ts +4 -3
  204. package/templates/format-dev-errors.ts +8 -6
  205. package/templates/gitignore +1 -0
  206. package/templates/init-tests/test-jest-new-worker.js +3 -5
  207. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  208. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  209. package/templates/middleware/loader-modules.ts +2 -2
  210. package/templates/middleware/loader-sw.ts +51 -31
  211. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  212. package/templates/new-worker.ts +3 -0
  213. package/templates/pages-dev-pipeline.ts +4 -1
  214. package/templates/pages-shim.ts +4 -1
  215. package/templates/pages-template-plugin.ts +19 -10
  216. package/templates/serve-static-assets.ts +17 -14
  217. package/templates/service-bindings-module-facade.js +1 -0
  218. package/templates/tsconfig-sanity.ts +11 -0
  219. package/templates/tsconfig.init.json +105 -0
  220. package/templates/tsconfig.json +5 -103
  221. package/templates/tsconfig.tsbuildinfo +1 -0
  222. package/wrangler-dist/cli.d.ts +826 -77
  223. package/wrangler-dist/cli.js +130734 -140838
  224. package/wrangler-dist/wasm-sync.wasm +0 -0
  225. package/src/__tests__/api-devregistry.test.js +0 -57
  226. package/src/__tests__/d1.test.ts +0 -72
  227. package/src/__tests__/dialogs.test.tsx +0 -40
  228. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  229. package/src/__tests__/pages.test.ts +0 -2223
  230. package/src/dialogs.tsx +0 -163
  231. package/src/environment-variables.ts +0 -50
  232. package/src/pages/build.tsx +0 -238
  233. package/src/user/env-vars.ts +0 -46
  234. package/templates/experimental-local-cache-stubs.js +0 -27
  235. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  236. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  237. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert";
2
2
  import { fetch, File, Headers } from "undici";
3
3
  import { version as wranglerVersion } from "../../package.json";
4
- import { getEnvironmentVariableFactory } from "../environment-variables";
4
+ import { getCloudflareApiBaseUrl } from "../environment-variables/misc-variables";
5
5
  import { logger } from "../logger";
6
6
  import { ParseError, parseJSON } from "../parse";
7
7
  import { loginOrRefreshIfRequired, requireApiToken } from "../user";
@@ -9,15 +9,6 @@ import type { ApiCredentials } from "../user";
9
9
  import type { URLSearchParams } from "node:url";
10
10
  import type { RequestInit, HeadersInit, Response } from "undici";
11
11
 
12
- /**
13
- * Get the URL to use to access the Cloudflare API.
14
- */
15
- export const getCloudflareAPIBaseURL = getEnvironmentVariableFactory({
16
- variableName: "CLOUDFLARE_API_BASE_URL",
17
- deprecatedName: "CF_API_BASE_URL",
18
- defaultValue: "https://api.cloudflare.com/client/v4",
19
- });
20
-
21
12
  /*
22
13
  * performApiFetch does everything required to make a CF API request,
23
14
  * but doesn't parse the response as JSON. For normal V4 API responses,
@@ -42,12 +33,17 @@ export async function performApiFetch(
42
33
 
43
34
  const queryString = queryParams ? `?${queryParams.toString()}` : "";
44
35
  logger.debug(
45
- `-- START CF API REQUEST: ${method} ${getCloudflareAPIBaseURL()}${resource}${queryString}`
36
+ `-- START CF API REQUEST: ${method} ${getCloudflareApiBaseUrl()}${resource}${queryString}`
37
+ );
38
+ const logHeaders = cloneHeaders(headers);
39
+ delete logHeaders["Authorization"];
40
+ logger.debug("HEADERS:", JSON.stringify(logHeaders, null, 2));
41
+ logger.debug(
42
+ "INIT:",
43
+ JSON.stringify({ ...init, headers: logHeaders }, null, 2)
46
44
  );
47
- logger.debug("HEADERS:", JSON.stringify(headers, null, 2));
48
- logger.debug("INIT:", JSON.stringify(init, null, 2));
49
45
  logger.debug("-- END CF API REQUEST");
50
- return await fetch(`${getCloudflareAPIBaseURL()}${resource}${queryString}`, {
46
+ return await fetch(`${getCloudflareApiBaseUrl()}${resource}${queryString}`, {
51
47
  method,
52
48
  ...init,
53
49
  headers,
@@ -83,7 +79,9 @@ export async function fetchInternal<ResponseType>(
83
79
  response.statusText,
84
80
  response.status
85
81
  );
86
- logger.debug("HEADERS:", JSON.stringify(response.headers, null, 2));
82
+ const logHeaders = cloneHeaders(response.headers);
83
+ delete logHeaders["Authorization"];
84
+ logger.debug("HEADERS:", JSON.stringify(logHeaders, null, 2));
87
85
  logger.debug("RESPONSE:", jsonText);
88
86
  logger.debug("-- END CF API RESPONSE");
89
87
 
@@ -166,7 +164,7 @@ export async function fetchKVGetValue(
166
164
  const auth = requireApiToken();
167
165
  const headers: Record<string, string> = {};
168
166
  addAuthorizationHeaderIfUnspecified(headers, auth);
169
- const resource = `${getCloudflareAPIBaseURL()}/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${key}`;
167
+ const resource = `${getCloudflareApiBaseUrl()}/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/values/${key}`;
170
168
  const response = await fetch(resource, {
171
169
  method: "GET",
172
170
  headers,
@@ -199,7 +197,7 @@ export async function fetchR2Objects(
199
197
  addAuthorizationHeaderIfUnspecified(headers, auth);
200
198
  addUserAgent(headers);
201
199
 
202
- const response = await fetch(`${getCloudflareAPIBaseURL()}${resource}`, {
200
+ const response = await fetch(`${getCloudflareApiBaseUrl()}${resource}`, {
203
201
  ...bodyInit,
204
202
  headers,
205
203
  });
@@ -226,7 +224,7 @@ export async function fetchDashboardScript(
226
224
  addAuthorizationHeaderIfUnspecified(headers, auth);
227
225
  addUserAgent(headers);
228
226
 
229
- const response = await fetch(`${getCloudflareAPIBaseURL()}${resource}`, {
227
+ const response = await fetch(`${getCloudflareApiBaseUrl()}${resource}`, {
230
228
  ...bodyInit,
231
229
  headers,
232
230
  });
@@ -254,9 +252,6 @@ export async function fetchDashboardScript(
254
252
  }
255
253
 
256
254
  return file ?? "";
257
-
258
- // Follow up on issue in Undici about multipart/form-data support & replace the workaround: https://github.com/nodejs/undici/issues/974
259
- // This should be using a builtin formData() parser pattern.
260
255
  } else {
261
256
  return response.text();
262
257
  }
package/src/cli.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import process from "process";
2
2
  import { hideBin } from "yargs/helpers";
3
- import { unstable_dev } from "./api";
3
+ import { unstable_dev, unstable_pages } from "./api";
4
4
  import { FatalError } from "./errors";
5
5
  import { main } from ".";
6
6
 
7
- import type { UnstableDevWorker } from "./api";
7
+ import type { UnstableDevWorker, UnstableDevOptions } from "./api";
8
8
  /**
9
9
  * The main entrypoint for the CLI.
10
10
  * main only gets called when the script is run directly, not when it's imported as a module.
@@ -24,5 +24,5 @@ if (typeof jest === "undefined" && require.main === module) {
24
24
  * It makes it possible to import wrangler from 'wrangler',
25
25
  * and call wrangler.unstable_dev().
26
26
  */
27
- export { unstable_dev };
28
- export type { UnstableDevWorker };
27
+ export { unstable_dev, unstable_pages };
28
+ export type { UnstableDevWorker, UnstableDevOptions };
@@ -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.
@@ -290,14 +307,6 @@ interface EnvironmentNonInheritable {
290
307
  */
291
308
  vars: { [key: string]: unknown };
292
309
 
293
- /**
294
- * Specifies namespace binding that is bound to this Worker environment.
295
- * It allows for access at runtime to the Workers metadata.
296
- * @default `undefined`
297
- * @nonInheritable
298
- **/
299
- metadata_binding: string | undefined;
300
-
301
310
  /**
302
311
  * A list of durable objects that your worker should be bound to.
303
312
  *
@@ -311,16 +320,7 @@ interface EnvironmentNonInheritable {
311
320
  * @nonInheritable
312
321
  */
313
322
  durable_objects: {
314
- bindings: {
315
- /** The name of the binding used to refer to the Durable Object */
316
- name: string;
317
- /** The exported class name of the Durable Object */
318
- class_name: string;
319
- /** The script where the Durable Object is defined (if it's external to this worker) */
320
- script_name?: string;
321
- /** The service environment of the script_name to bind to */
322
- environment?: string;
323
- }[];
323
+ bindings: DurableObjectBindings;
324
324
  };
325
325
 
326
326
  /**
@@ -345,6 +345,24 @@ interface EnvironmentNonInheritable {
345
345
  preview_id?: string;
346
346
  }[];
347
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
+
348
366
  /**
349
367
  * Specifies Queues that are bound to this Worker environment.
350
368
  *
@@ -380,6 +398,9 @@ interface EnvironmentNonInheritable {
380
398
 
381
399
  /** The queue to send messages that failed to be consumed. */
382
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;
383
404
  }[];
384
405
  };
385
406
 
@@ -419,6 +440,12 @@ interface EnvironmentNonInheritable {
419
440
  database_id: string;
420
441
  /** The UUID of this D1 database for Wrangler Dev (if specified). */
421
442
  preview_database_id?: string;
443
+ /** The name of the migrations table for this D1 database (defaults to 'd1_migrations'). */
444
+ migrations_table?: string;
445
+ /** The path to the directory of migrations for this D1 database (defaults to './migrations'). */
446
+ migrations_dir?: string;
447
+ /** Internal use only. */
448
+ database_internal_env?: string;
422
449
  }[];
423
450
 
424
451
  /**
@@ -441,13 +468,28 @@ interface EnvironmentNonInheritable {
441
468
  }[]
442
469
  | undefined;
443
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
+
444
487
  /**
445
488
  * "Unsafe" tables for features that aren't directly supported by wrangler.
446
489
  *
447
490
  * NOTE: This field is not automatically inherited from the top level environment,
448
491
  * and so must be specified in every named environment.
449
492
  *
450
- * @default `{ bindings: [] }`
451
493
  * @nonInheritable
452
494
  */
453
495
  unsafe: {
@@ -455,15 +497,28 @@ interface EnvironmentNonInheritable {
455
497
  * A set of bindings that should be put into a Worker's upload metadata without changes. These
456
498
  * can be used to implement bindings for features that haven't released and aren't supported
457
499
  * directly by wrangler or miniflare.
458
- *
459
- * @default []
460
500
  */
461
- bindings: {
501
+ bindings?: {
462
502
  name: string;
463
503
  type: string;
464
504
  [key: string]: unknown;
465
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
+ };
466
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
+ }[];
467
522
  }
468
523
 
469
524
  /**
@@ -481,7 +536,7 @@ interface EnvironmentDeprecated {
481
536
  /**
482
537
  * Legacy way of defining KVNamespaces that is no longer supported.
483
538
  *
484
- * @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.
485
540
  */
486
541
  "kv-namespaces"?: string;
487
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,17 +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
- metadata_binding,
100
110
  wasm_modules,
101
111
  dispatch_namespaces,
112
+ mtls_certificates,
102
113
  } = bindings;
103
114
 
104
115
  if (data_blobs !== undefined && Object.keys(data_blobs).length > 0) {
@@ -145,6 +156,23 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
145
156
  });
146
157
  }
147
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
+
148
176
  if (queues !== undefined && queues.length > 0) {
149
177
  output.push({
150
178
  type: "Queues",
@@ -160,14 +188,22 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
160
188
  if (d1_databases !== undefined && d1_databases.length > 0) {
161
189
  output.push({
162
190
  type: "D1 Databases",
163
- entries: d1_databases.map(({ binding, database_name, database_id }) => {
164
- return {
165
- key: removeD1BetaPrefix(binding),
166
- value: database_name
167
- ? `${database_name} (${database_id})`
168
- : database_id,
169
- };
170
- }),
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
+ ),
171
207
  });
172
208
  }
173
209
 
@@ -212,6 +248,21 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
212
248
  });
213
249
  }
214
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
+
215
266
  if (text_blobs !== undefined && Object.keys(text_blobs).length > 0) {
216
267
  output.push({
217
268
  type: "Text Blobs",
@@ -222,10 +273,10 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
222
273
  });
223
274
  }
224
275
 
225
- if (unsafe !== undefined && unsafe.length > 0) {
276
+ if (unsafe?.bindings !== undefined && unsafe.bindings.length > 0) {
226
277
  output.push({
227
278
  type: "Unsafe",
228
- entries: unsafe.map(({ name, type }) => ({
279
+ entries: unsafe.bindings.map(({ name, type }) => ({
229
280
  key: type,
230
281
  value: name,
231
282
  })),
@@ -252,13 +303,6 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
252
303
  });
253
304
  }
254
305
 
255
- if (metadata_binding !== undefined && metadata_binding.length > 0) {
256
- output.push({
257
- type: "Metadata Binding",
258
- entries: [{ key: "metadata", value: metadata_binding }],
259
- });
260
- }
261
-
262
306
  if (wasm_modules !== undefined && Object.keys(wasm_modules).length > 0) {
263
307
  output.push({
264
308
  type: "Wasm Modules",
@@ -281,6 +325,28 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
281
325
  });
282
326
  }
283
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
+
284
350
  if (output.length === 0) {
285
351
  return;
286
352
  }
@@ -300,18 +366,13 @@ export function printBindings(bindings: CfWorkerInit["bindings"]) {
300
366
  logger.log(message);
301
367
  }
302
368
 
303
- type CamelCase<T> = {
304
- [key in keyof T as key | CamelCaseKey<key>]: T[key];
305
- };
306
-
307
- export function withConfig<T extends { config?: string }>(
369
+ export function withConfig<T>(
308
370
  handler: (
309
- t: Omit<CamelCase<T>, "config"> & { config: Config }
371
+ t: OnlyCamelCase<T & CommonYargsOptions> & { config: Config }
310
372
  ) => Promise<void>
311
373
  ) {
312
- return (t: CamelCase<T>) => {
313
- const { config: configPath, ...rest } = t;
314
- return handler({ ...rest, config: readConfig(configPath, rest) });
374
+ return (t: OnlyCamelCase<T & CommonYargsOptions>) => {
375
+ return handler({ ...t, config: readConfig(t.config, t) });
315
376
  };
316
377
  }
317
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
  }