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
@@ -10,23 +10,24 @@ import { FatalError } from "../errors";
10
10
  import { logger } from "../logger";
11
11
  import * as metrics from "../metrics";
12
12
  import { getBasePath } from "../paths";
13
- import { buildFunctions } from "./build";
13
+ import { buildFunctions } from "./buildFunctions";
14
14
  import { ROUTES_SPEC_VERSION, SECONDS_TO_WAIT_FOR_PROXY } from "./constants";
15
15
  import { FunctionsNoRoutesError, getFunctionsNoRoutesWarning } from "./errors";
16
+ import { buildRawWorker, checkRawWorker } from "./functions/buildWorker";
16
17
  import { validateRoutes } from "./functions/routes-validation";
17
18
  import { CLEANUP, CLEANUP_CALLBACKS, pagesBetaWarning } from "./utils";
18
19
  import type { AdditionalDevProps } from "../dev";
20
+ import type {
21
+ CommonYargsArgv,
22
+ StrictYargsOptionsToInterface,
23
+ } from "../yargs-types";
19
24
  import type { RoutesJSONSpec } from "./functions/routes-transformation";
20
- import type { YargsOptionsToInterface } from "./types";
21
- import type { Argv } from "yargs";
22
25
 
23
26
  const DURABLE_OBJECTS_BINDING_REGEXP = new RegExp(
24
27
  /^(?<binding>[^=]+)=(?<className>[^@\s]+)(@(?<scriptName>.*)$)?$/
25
28
  );
26
29
 
27
- type PagesDevArgs = YargsOptionsToInterface<typeof Options>;
28
-
29
- export function Options(yargs: Argv) {
30
+ export function Options(yargs: CommonYargsArgv) {
30
31
  return yargs
31
32
  .positional("directory", {
32
33
  type: "string",
@@ -78,6 +79,16 @@ export function Options(yargs: Argv) {
78
79
  description:
79
80
  "The location of the single Worker script if not using functions",
80
81
  },
82
+ bundle: {
83
+ type: "boolean",
84
+ default: undefined,
85
+ hidden: true,
86
+ },
87
+ "no-bundle": {
88
+ type: "boolean",
89
+ default: false,
90
+ description: "Whether to run bundling on `_worker.js`",
91
+ },
81
92
  binding: {
82
93
  type: "array",
83
94
  description: "Bind variable/secret (KEY=VALUE)",
@@ -129,11 +140,16 @@ export function Options(yargs: Argv) {
129
140
  requiresArg: true,
130
141
  },
131
142
  "node-compat": {
132
- describe: "Enable node.js compatibility",
143
+ describe: "Enable Node.js compatibility",
133
144
  default: false,
134
145
  type: "boolean",
135
146
  hidden: true,
136
147
  },
148
+ "experimental-local": {
149
+ describe: "Run on my machine using the Cloudflare Workers runtime",
150
+ type: "boolean",
151
+ default: false,
152
+ },
137
153
  config: {
138
154
  describe: "Pages does not support wrangler.toml",
139
155
  type: "string",
@@ -150,35 +166,36 @@ export function Options(yargs: Argv) {
150
166
  export const Handler = async ({
151
167
  local,
152
168
  directory,
153
- "compatibility-date": compatibilityDate,
154
- "compatibility-flags": compatibilityFlags,
169
+ compatibilityDate,
170
+ compatibilityFlags,
155
171
  ip,
156
172
  port,
157
- "inspector-port": inspectorPort,
173
+ inspectorPort,
158
174
  proxy: requestedProxyPort,
159
- "script-path": singleWorkerScriptPath,
175
+ bundle,
176
+ noBundle,
177
+ scriptPath: singleWorkerScriptPath,
160
178
  binding: bindings = [],
161
179
  kv: kvs = [],
162
180
  do: durableObjects = [],
163
181
  d1: d1s = [],
164
182
  r2: r2s = [],
165
- "live-reload": liveReload,
166
- "local-protocol": localProtocol,
183
+ liveReload,
184
+ localProtocol,
167
185
  experimentalEnableLocalPersistence,
168
186
  persist,
169
187
  persistTo,
170
- "node-compat": nodeCompat,
188
+ nodeCompat: legacyNodeCompat,
189
+ experimentalLocal,
171
190
  config: config,
172
191
  _: [_pages, _dev, ...remaining],
173
192
  logLevel,
174
- }: PagesDevArgs) => {
193
+ }: StrictYargsOptionsToInterface<typeof Options>) => {
175
194
  // Beta message for `wrangler pages <commands>` usage
176
195
  logger.log(pagesBetaWarning);
177
196
 
178
- type LogLevelArg = "debug" | "info" | "log" | "warn" | "error" | "none";
179
197
  if (logLevel) {
180
- // The YargsOptionsToInterface doesn't handle the passing in of Unions from choices in Yargs
181
- logger.loggerLevel = logLevel as LogLevelArg;
198
+ logger.loggerLevel = logLevel;
182
199
  }
183
200
 
184
201
  if (!local) {
@@ -245,26 +262,42 @@ export const Handler = async ({
245
262
 
246
263
  let scriptPath = "";
247
264
 
248
- if (usingWorkerScript) {
249
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
250
- scriptReadyResolve!();
265
+ const nodejsCompat = compatibilityFlags?.includes("nodejs_compat");
251
266
 
267
+ if (usingWorkerScript) {
252
268
  scriptPath = workerScriptPath;
253
-
254
- const runBuild = async () => {
255
- try {
256
- await esbuild.build({
257
- entryPoints: [scriptPath],
258
- write: false,
259
- // we need it to be bundled so that any imports that are used are affected by the blocker plugin
260
- bundle: true,
261
- plugins: [blockWorkerJsImports],
262
- });
263
- } catch {}
269
+ let runBuild = async () => {
270
+ await checkRawWorker(workerScriptPath, () => scriptReadyResolve());
264
271
  };
265
272
 
273
+ // TODO: Here lies a known bug. If you specify both `--bundle` and `--no-bundle`, this behavior is undefined and you will get unexpected results.
274
+ // There is no sane way to get the true value out of yargs, so here we are.
275
+ const enableBundling = bundle ?? !noBundle;
276
+ if (enableBundling) {
277
+ // We want to actually run the `_worker.js` script through the bundler
278
+ // So update the final path to the script that will be uploaded and
279
+ // change the `runBuild()` function to bundle the `_worker.js`.
280
+ scriptPath = join(tmpdir(), `./bundledWorker-${Math.random()}.mjs`);
281
+ runBuild = async () => {
282
+ try {
283
+ await buildRawWorker({
284
+ workerScriptPath,
285
+ outfile: scriptPath,
286
+ directory: directory ?? ".",
287
+ nodejsCompat,
288
+ local: true,
289
+ sourcemap: true,
290
+ watch: true,
291
+ onEnd: () => scriptReadyResolve(),
292
+ });
293
+ } catch (e: unknown) {
294
+ logger.warn("Failed to bundle _worker.js.", e);
295
+ }
296
+ };
297
+ }
298
+
266
299
  await runBuild();
267
- watch([scriptPath], {
300
+ watch([workerScriptPath], {
268
301
  persistent: true,
269
302
  ignoreInitial: true,
270
303
  }).on("all", async () => {
@@ -272,49 +305,47 @@ export const Handler = async ({
272
305
  });
273
306
  } else if (usingFunctions) {
274
307
  // Try to use Functions
275
- const outfile = join(tmpdir(), `./functionsWorker-${Math.random()}.mjs`);
276
- scriptPath = outfile;
308
+ scriptPath = join(tmpdir(), `./functionsWorker-${Math.random()}.mjs`);
277
309
 
278
- if (nodeCompat) {
310
+ if (legacyNodeCompat) {
279
311
  console.warn(
280
- "Enabling node.js compatibility mode for builtins and globals. This is experimental and has serious tradeoffs. Please see https://github.com/ionic-team/rollup-plugin-node-polyfills/ for more details."
312
+ "Enabling Node.js compatibility mode for builtins and globals. This is experimental and has serious tradeoffs. Please see https://github.com/ionic-team/rollup-plugin-node-polyfills/ for more details."
313
+ );
314
+ }
315
+
316
+ if (legacyNodeCompat && nodejsCompat) {
317
+ throw new FatalError(
318
+ "The `nodejs_compat` compatibility flag cannot be used in conjunction with the legacy `--node-compat` flag. If you want to use the Workers runtime Node.js compatibility features, please remove the `--node-compat` argument from your CLI command or `node_compat = true` from your config file.",
319
+ 1
281
320
  );
282
321
  }
283
322
 
284
- logger.log(`Compiling worker to "${outfile}"...`);
323
+ logger.log(`Compiling worker to "${scriptPath}"...`);
285
324
  const onEnd = () => scriptReadyResolve();
286
325
  try {
287
- await buildFunctions({
288
- outfile,
289
- functionsDirectory,
290
- sourcemap: true,
291
- watch: true,
292
- onEnd,
293
- buildOutputDirectory: directory,
294
- nodeCompat,
295
- local: true,
296
- d1Databases: d1s.map((binding) => binding.toString()),
297
- });
298
- await metrics.sendMetricsEvent("build pages functions");
326
+ const buildFn = async () => {
327
+ await buildFunctions({
328
+ outfile: scriptPath,
329
+ functionsDirectory,
330
+ sourcemap: true,
331
+ watch: true,
332
+ onEnd,
333
+ buildOutputDirectory: directory,
334
+ legacyNodeCompat,
335
+ nodejsCompat,
336
+ local: true,
337
+ });
338
+ await metrics.sendMetricsEvent("build pages functions");
339
+ };
299
340
 
341
+ await buildFn();
300
342
  // If Functions found routes, continue using Functions
301
343
  watch([functionsDirectory], {
302
344
  persistent: true,
303
345
  ignoreInitial: true,
304
346
  }).on("all", async () => {
305
347
  try {
306
- await buildFunctions({
307
- outfile,
308
- functionsDirectory,
309
- sourcemap: true,
310
- watch: true,
311
- onEnd,
312
- buildOutputDirectory: directory,
313
- nodeCompat,
314
- local: true,
315
- d1Databases: d1s.map((binding) => binding.toString()),
316
- });
317
- await metrics.sendMetricsEvent("build pages functions");
348
+ await buildFn();
318
349
  } catch (e) {
319
350
  if (e instanceof FunctionsNoRoutesError) {
320
351
  logger.warn(
@@ -355,7 +386,7 @@ export const Handler = async ({
355
386
 
356
387
  if (scriptPath === "") {
357
388
  // Failed to get a script with or without Functions,
358
- // something really bad must have happend.
389
+ // something really bad must have happened.
359
390
  throw new FatalError(
360
391
  "Failed to start wrangler pages dev due to an unknown error",
361
392
  1
@@ -437,7 +468,7 @@ export const Handler = async ({
437
468
  * If _routes.json is invalid, don't exit but instead fallback to a sensible default
438
469
  * and continue to serve the assets. At the same time make sure we warn users that we
439
470
  * we detected an invalid file and that we'll be using a default.
440
- * This basically equivalates to serving a Functions or _worker.js project as is,
471
+ * This basically equates to serving a Functions or _worker.js project as is,
441
472
  * without applying any additional routing rules on top.
442
473
  */
443
474
  const error =
@@ -466,77 +497,75 @@ export const Handler = async ({
466
497
  }
467
498
  }
468
499
 
469
- const { stop, waitUntilExit } = await unstable_dev(
470
- entrypoint,
471
- {
472
- ip,
473
- port,
474
- inspectorPort,
475
- watch: true,
476
- localProtocol,
477
- liveReload,
478
- compatibilityDate,
479
- compatibilityFlags,
480
- nodeCompat,
481
- vars: Object.fromEntries(
482
- bindings
483
- .map((binding) => binding.toString().split("="))
484
- .map(([key, ...values]) => [key, values.join("=")])
485
- ),
486
- kv: kvs.map((binding) => ({
487
- binding: binding.toString(),
488
- id: "",
489
- })),
490
- durableObjects: durableObjects
491
- .map((durableObject) => {
492
- const { binding, className, scriptName } =
493
- DURABLE_OBJECTS_BINDING_REGEXP.exec(durableObject.toString())
494
- ?.groups || {};
495
-
496
- if (!binding || !className) {
497
- logger.warn(
498
- "Could not parse Durable Object binding:",
499
- durableObject.toString()
500
- );
501
- return;
502
- }
503
-
504
- return {
505
- name: binding,
506
- class_name: className,
507
- script_name: scriptName,
508
- };
509
- })
510
- .filter(Boolean) as AdditionalDevProps["durableObjects"],
511
- r2: r2s.map((binding) => {
512
- return { binding: binding.toString(), bucket_name: "" };
513
- }),
500
+ const { stop, waitUntilExit } = await unstable_dev(entrypoint, {
501
+ ip,
502
+ port,
503
+ inspectorPort,
504
+ localProtocol,
505
+ compatibilityDate,
506
+ compatibilityFlags,
507
+ nodeCompat: legacyNodeCompat,
508
+ vars: Object.fromEntries(
509
+ bindings
510
+ .map((binding) => binding.toString().split("="))
511
+ .map(([key, ...values]) => [key, values.join("=")])
512
+ ),
513
+ kv: kvs.map((binding) => ({
514
+ binding: binding.toString(),
515
+ id: "",
516
+ })),
517
+ durableObjects: durableObjects
518
+ .map((durableObject) => {
519
+ const { binding, className, scriptName } =
520
+ DURABLE_OBJECTS_BINDING_REGEXP.exec(durableObject.toString())
521
+ ?.groups || {};
522
+
523
+ if (!binding || !className) {
524
+ logger.warn(
525
+ "Could not parse Durable Object binding:",
526
+ durableObject.toString()
527
+ );
528
+ return;
529
+ }
514
530
 
531
+ return {
532
+ name: binding,
533
+ class_name: className,
534
+ script_name: scriptName,
535
+ };
536
+ })
537
+ .filter(Boolean) as AdditionalDevProps["durableObjects"],
538
+ r2: r2s.map((binding) => {
539
+ return { binding: binding.toString(), bucket_name: "" };
540
+ }),
541
+ persist,
542
+ persistTo,
543
+ inspect: undefined,
544
+ logLevel,
545
+ experimental: {
515
546
  d1Databases: d1s.map((binding) => ({
516
547
  binding: binding.toString(),
517
548
  database_id: "", // Required for types, but unused by dev
518
549
  database_name: `local-${binding}`,
519
550
  })),
520
-
551
+ disableExperimentalWarning: true,
521
552
  enablePagesAssetsServiceBinding: {
522
553
  proxyPort,
523
554
  directory,
524
555
  },
556
+ experimentalLocal,
557
+ liveReload,
525
558
  forceLocal: true,
526
- persist,
527
- persistTo,
528
559
  showInteractiveDevSession: undefined,
529
- inspect: undefined,
530
- logPrefix: "pages",
531
- logLevel: logLevel ?? "warn",
560
+ testMode: false,
561
+ watch: true,
532
562
  },
533
- { testMode: false, disableExperimentalWarning: true }
534
- );
563
+ });
535
564
  await metrics.sendMetricsEvent("run pages dev");
536
565
 
537
566
  CLEANUP_CALLBACKS.push(stop);
538
567
 
539
- waitUntilExit().then(() => {
568
+ void waitUntilExit().then(() => {
540
569
  CLEANUP();
541
570
  process.exit(0);
542
571
  });
@@ -685,24 +714,3 @@ async function spawnProxyProcess({
685
714
 
686
715
  return port;
687
716
  }
688
-
689
- // TODO: Kill this once we have https://github.com/cloudflare/wrangler2/issues/2153
690
- const blockWorkerJsImports: esbuild.Plugin = {
691
- name: "block-worker-js-imports",
692
- setup(build) {
693
- build.onResolve({ filter: /.*/g }, (args) => {
694
- // If it's the entrypoint, let it be as is
695
- if (args.kind === "entry-point") {
696
- return {
697
- path: args.path,
698
- };
699
- }
700
- // Otherwise, block any imports that the file is requesting
701
- logger.error(
702
- `_worker.js is importing from another file. This will throw an error if deployed.\nYou should bundle your Worker or remove the import if it is unused.`
703
- );
704
- // Miniflare will error with this briefly down the line -- there's no point in continuing.
705
- process.exit(1);
706
- });
707
- },
708
- };
@@ -9,6 +9,7 @@ import { RoutesValidationError } from "./functions/routes-validation";
9
9
  * Exit code for `pages functions build` when no routes are found.
10
10
  */
11
11
  export const EXIT_CODE_FUNCTIONS_NO_ROUTES_ERROR = 156;
12
+ export const EXIT_CODE_FUNCTIONS_NOTHING_TO_BUILD_ERROR = 157;
12
13
 
13
14
  /**
14
15
  * Pages error when no routes are found in the functions directory
@@ -1,20 +1,24 @@
1
1
  import { access, lstat } from "node:fs/promises";
2
- import { dirname, relative, resolve } from "node:path";
2
+ import { relative, resolve } from "node:path";
3
3
  import { bundleWorker } from "../../bundle";
4
4
  import { getBasePath } from "../../paths";
5
5
  import { D1_BETA_PREFIX } from "../../worker";
6
+ import { buildNotifierPlugin } from "./buildWorker";
6
7
  import type { Options as WorkerOptions } from "./buildWorker";
7
8
 
8
- type Options = Omit<WorkerOptions, "fallbackService" | "buildOutputDirectory">;
9
+ type Options = Omit<
10
+ WorkerOptions,
11
+ "outfile" | "fallbackService" | "buildOutputDirectory" | "nodejsCompat"
12
+ > & { outdir: string };
9
13
 
10
14
  export function buildPlugin({
11
15
  routesModule,
12
- outfile = "bundle.js",
16
+ outdir,
13
17
  minify = false,
14
18
  sourcemap = false,
15
19
  watch = false,
16
20
  onEnd = () => {},
17
- nodeCompat,
21
+ legacyNodeCompat,
18
22
  functionsDirectory,
19
23
  local,
20
24
  betaD1Shims,
@@ -24,83 +28,86 @@ export function buildPlugin({
24
28
  file: resolve(getBasePath(), "templates/pages-template-plugin.ts"),
25
29
  directory: functionsDirectory,
26
30
  format: "modules",
31
+ moduleRoot: functionsDirectory,
27
32
  },
28
- resolve(outfile),
33
+ resolve(outdir),
29
34
  {
30
35
  inject: [routesModule],
36
+ entryName: "index",
31
37
  minify,
32
38
  sourcemap,
33
39
  watch,
34
- nodeCompat,
40
+ legacyNodeCompat,
41
+ // We don't currently have a mechanism for Plugins 'requiring' a specific compat date/flag,
42
+ // but if someone wants to publish a Plugin which does require this new `nodejs_compat` flag
43
+ // and they document that on their README.md, we should let them.
44
+ nodejsCompat: true,
35
45
  define: {},
36
46
  betaD1Shims: (betaD1Shims || []).map(
37
47
  (binding) => `${D1_BETA_PREFIX}${binding}`
38
48
  ),
49
+ doBindings: [], // Pages functions don't support internal Durable Objects
39
50
  plugins: [
40
- {
41
- name: "wrangler notifier and monitor",
42
- setup(pluginBuild) {
43
- pluginBuild.onEnd((result) => {
44
- if (result.errors.length > 0) {
45
- console.error(
46
- `${result.errors.length} error(s) and ${result.warnings.length} warning(s) when compiling Worker.`
47
- );
48
- } else if (result.warnings.length > 0) {
49
- console.warn(
50
- `${result.warnings.length} warning(s) when compiling Worker.`
51
- );
52
- onEnd();
53
- } else {
54
- console.log("Compiled Worker successfully.");
55
- onEnd();
56
- }
57
- });
58
- },
59
- },
51
+ buildNotifierPlugin(onEnd),
60
52
  {
61
53
  name: "Assets",
62
54
  setup(pluginBuild) {
63
- if (pluginBuild.initialOptions.outfile) {
64
- const outdir = dirname(pluginBuild.initialOptions.outfile);
65
-
66
- pluginBuild.onResolve({ filter: /^assets:/ }, async (args) => {
67
- const directory = resolve(
68
- args.resolveDir,
69
- args.path.slice("assets:".length)
70
- );
55
+ pluginBuild.onResolve({ filter: /^assets:/ }, async (args) => {
56
+ const directory = resolve(
57
+ args.resolveDir,
58
+ args.path.slice("assets:".length)
59
+ );
71
60
 
72
- const exists = await access(directory)
73
- .then(() => true)
74
- .catch(() => false);
61
+ const exists = await access(directory)
62
+ .then(() => true)
63
+ .catch(() => false);
75
64
 
76
- const isDirectory =
77
- exists && (await lstat(directory)).isDirectory();
65
+ const isDirectory =
66
+ exists && (await lstat(directory)).isDirectory();
78
67
 
79
- if (!isDirectory) {
80
- return {
81
- errors: [
82
- {
83
- text: `'${directory}' does not exist or is not a directory.`,
84
- },
85
- ],
86
- };
87
- }
68
+ if (!isDirectory) {
69
+ return {
70
+ errors: [
71
+ {
72
+ text: `'${directory}' does not exist or is not a directory.`,
73
+ },
74
+ ],
75
+ };
76
+ }
88
77
 
89
- const path = `assets:./${relative(outdir, directory)}`;
78
+ const path = `assets:./${relative(outdir, directory)}`;
90
79
 
91
- return { path, external: true, namespace: "assets" };
92
- });
93
- }
80
+ return { path, external: true, namespace: "assets" };
81
+ });
82
+ },
83
+ },
84
+ // TODO: Replace this with a proper outdir solution for Plugins
85
+ // But for now, let's just mark all wasm/bin files as external
86
+ {
87
+ name: "Mark externals",
88
+ setup(pluginBuild) {
89
+ pluginBuild.onResolve(
90
+ { filter: /.*\.(wasm|bin)$/ },
91
+ async (args) => {
92
+ return {
93
+ external: true,
94
+ path: `./${relative(
95
+ outdir,
96
+ resolve(args.resolveDir, args.path)
97
+ )}`,
98
+ };
99
+ }
100
+ );
94
101
  },
95
102
  },
96
103
  ],
97
- isOutfile: true,
98
104
  serveAssetsFromWorker: false,
99
- disableModuleCollection: true,
105
+ disableModuleCollection: false,
100
106
  rules: [],
101
107
  checkFetch: local,
102
108
  targetConsumer: local ? "dev" : "publish",
103
109
  local,
110
+ experimentalLocal: false,
104
111
  }
105
112
  );
106
113
  }