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
@@ -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,24 +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
- plugins: [blockWorkerJsImports],
260
- });
261
- } catch {}
269
+ let runBuild = async () => {
270
+ await checkRawWorker(workerScriptPath, () => scriptReadyResolve());
262
271
  };
263
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
+
264
299
  await runBuild();
265
- watch([scriptPath], {
300
+ watch([workerScriptPath], {
266
301
  persistent: true,
267
302
  ignoreInitial: true,
268
303
  }).on("all", async () => {
@@ -270,45 +305,47 @@ export const Handler = async ({
270
305
  });
271
306
  } else if (usingFunctions) {
272
307
  // Try to use Functions
273
- const outfile = join(tmpdir(), `./functionsWorker-${Math.random()}.js`);
274
- scriptPath = outfile;
308
+ scriptPath = join(tmpdir(), `./functionsWorker-${Math.random()}.mjs`);
275
309
 
276
- if (nodeCompat) {
310
+ if (legacyNodeCompat) {
277
311
  console.warn(
278
- "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
279
320
  );
280
321
  }
281
322
 
282
- logger.log(`Compiling worker to "${outfile}"...`);
323
+ logger.log(`Compiling worker to "${scriptPath}"...`);
283
324
  const onEnd = () => scriptReadyResolve();
284
325
  try {
285
- await buildFunctions({
286
- outfile,
287
- functionsDirectory,
288
- sourcemap: true,
289
- watch: true,
290
- onEnd,
291
- buildOutputDirectory: directory,
292
- nodeCompat,
293
- });
294
- 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
+ };
295
340
 
341
+ await buildFn();
296
342
  // If Functions found routes, continue using Functions
297
343
  watch([functionsDirectory], {
298
344
  persistent: true,
299
345
  ignoreInitial: true,
300
346
  }).on("all", async () => {
301
347
  try {
302
- await buildFunctions({
303
- outfile,
304
- functionsDirectory,
305
- sourcemap: true,
306
- watch: true,
307
- onEnd,
308
- buildOutputDirectory: directory,
309
- nodeCompat,
310
- });
311
- await metrics.sendMetricsEvent("build pages functions");
348
+ await buildFn();
312
349
  } catch (e) {
313
350
  if (e instanceof FunctionsNoRoutesError) {
314
351
  logger.warn(
@@ -349,7 +386,7 @@ export const Handler = async ({
349
386
 
350
387
  if (scriptPath === "") {
351
388
  // Failed to get a script with or without Functions,
352
- // something really bad must have happend.
389
+ // something really bad must have happened.
353
390
  throw new FatalError(
354
391
  "Failed to start wrangler pages dev due to an unknown error",
355
392
  1
@@ -431,7 +468,7 @@ export const Handler = async ({
431
468
  * If _routes.json is invalid, don't exit but instead fallback to a sensible default
432
469
  * and continue to serve the assets. At the same time make sure we warn users that we
433
470
  * we detected an invalid file and that we'll be using a default.
434
- * 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,
435
472
  * without applying any additional routing rules on top.
436
473
  */
437
474
  const error =
@@ -460,77 +497,75 @@ export const Handler = async ({
460
497
  }
461
498
  }
462
499
 
463
- const { stop, waitUntilExit } = await unstable_dev(
464
- entrypoint,
465
- {
466
- ip,
467
- port,
468
- inspectorPort,
469
- watch: true,
470
- localProtocol,
471
- liveReload,
472
- compatibilityDate,
473
- compatibilityFlags,
474
- nodeCompat,
475
- vars: Object.fromEntries(
476
- bindings
477
- .map((binding) => binding.toString().split("="))
478
- .map(([key, ...values]) => [key, values.join("=")])
479
- ),
480
- kv: kvs.map((val) => ({
481
- binding: val.toString(),
482
- id: "",
483
- })),
484
- durableObjects: durableObjects
485
- .map((durableObject) => {
486
- const { binding, className, scriptName } =
487
- DURABLE_OBJECTS_BINDING_REGEXP.exec(durableObject.toString())
488
- ?.groups || {};
489
-
490
- if (!binding || !className) {
491
- logger.warn(
492
- "Could not parse Durable Object binding:",
493
- durableObject.toString()
494
- );
495
- return;
496
- }
497
-
498
- return {
499
- name: binding,
500
- class_name: className,
501
- script_name: scriptName,
502
- };
503
- })
504
- .filter(Boolean) as AdditionalDevProps["durableObjects"],
505
- r2: r2s.map((binding) => {
506
- return { binding: binding.toString(), bucket_name: "" };
507
- }),
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
+ }
508
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: {
509
546
  d1Databases: d1s.map((binding) => ({
510
547
  binding: binding.toString(),
511
548
  database_id: "", // Required for types, but unused by dev
512
549
  database_name: `local-${binding}`,
513
550
  })),
514
-
551
+ disableExperimentalWarning: true,
515
552
  enablePagesAssetsServiceBinding: {
516
553
  proxyPort,
517
554
  directory,
518
555
  },
556
+ experimentalLocal,
557
+ liveReload,
519
558
  forceLocal: true,
520
- persist,
521
- persistTo,
522
559
  showInteractiveDevSession: undefined,
523
- inspect: true,
524
- logPrefix: "pages",
525
- logLevel: logLevel ?? "warn",
560
+ testMode: false,
561
+ watch: true,
526
562
  },
527
- { testMode: false, disableExperimentalWarning: true }
528
- );
563
+ });
529
564
  await metrics.sendMetricsEvent("run pages dev");
530
565
 
531
566
  CLEANUP_CALLBACKS.push(stop);
532
567
 
533
- waitUntilExit().then(() => {
568
+ void waitUntilExit().then(() => {
534
569
  CLEANUP();
535
570
  process.exit(0);
536
571
  });
@@ -679,15 +714,3 @@ async function spawnProxyProcess({
679
714
 
680
715
  return port;
681
716
  }
682
-
683
- const blockWorkerJsImports: esbuild.Plugin = {
684
- name: "block-worker-js-imports",
685
- setup(build: esbuild.PluginBuild) {
686
- build.onResolve({ filter: /.*/g }, (_args) => {
687
- logger.error(
688
- `_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.`
689
- );
690
- return null;
691
- });
692
- },
693
- };
@@ -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,72 +1,57 @@
1
1
  import { access, lstat } from "node:fs/promises";
2
- import { dirname, relative, resolve } from "node:path";
3
- import NodeGlobalsPolyfills from "@esbuild-plugins/node-globals-polyfill";
4
- import NodeModulesPolyfills from "@esbuild-plugins/node-modules-polyfill";
5
- import { build } from "esbuild";
2
+ import { relative, resolve } from "node:path";
3
+ import { bundleWorker } from "../../bundle";
6
4
  import { getBasePath } from "../../paths";
5
+ import { D1_BETA_PREFIX } from "../../worker";
6
+ import { buildNotifierPlugin } from "./buildWorker";
7
+ import type { Options as WorkerOptions } from "./buildWorker";
7
8
 
8
- type Options = {
9
- routesModule: string;
10
- outfile: string;
11
- minify?: boolean;
12
- sourcemap?: boolean;
13
- watch?: boolean;
14
- nodeCompat?: boolean;
15
- onEnd?: () => void;
16
- };
9
+ type Options = Omit<
10
+ WorkerOptions,
11
+ "outfile" | "fallbackService" | "buildOutputDirectory" | "nodejsCompat"
12
+ > & { outdir: string };
17
13
 
18
14
  export function buildPlugin({
19
15
  routesModule,
20
- outfile = "bundle.js",
16
+ outdir,
21
17
  minify = false,
22
18
  sourcemap = false,
23
19
  watch = false,
24
- nodeCompat,
25
20
  onEnd = () => {},
21
+ legacyNodeCompat,
22
+ functionsDirectory,
23
+ local,
24
+ betaD1Shims,
26
25
  }: Options) {
27
- return build({
28
- entryPoints: [resolve(getBasePath(), "templates/pages-template-plugin.ts")],
29
- inject: [routesModule],
30
- bundle: true,
31
- format: "esm",
32
- target: "esnext",
33
- loader: {
34
- ".html": "text",
35
- ".txt": "text",
26
+ return bundleWorker(
27
+ {
28
+ file: resolve(getBasePath(), "templates/pages-template-plugin.ts"),
29
+ directory: functionsDirectory,
30
+ format: "modules",
31
+ moduleRoot: functionsDirectory,
36
32
  },
37
- outfile,
38
- minify,
39
- sourcemap,
40
- watch,
41
- allowOverwrite: true,
42
- define: { ...(nodeCompat ? { global: "globalThis" } : {}) },
43
- plugins: [
44
- {
45
- name: "wrangler notifier and monitor",
46
- setup(pluginBuild) {
47
- pluginBuild.onEnd((result) => {
48
- if (result.errors.length > 0) {
49
- console.error(
50
- `${result.errors.length} error(s) and ${result.warnings.length} warning(s) when compiling Worker.`
51
- );
52
- } else if (result.warnings.length > 0) {
53
- console.warn(
54
- `${result.warnings.length} warning(s) when compiling Worker.`
55
- );
56
- onEnd();
57
- } else {
58
- console.log("Compiled Worker successfully.");
59
- onEnd();
60
- }
61
- });
62
- },
63
- },
64
- {
65
- name: "Assets",
66
- setup(pluginBuild) {
67
- if (pluginBuild.initialOptions.outfile) {
68
- const outdir = dirname(pluginBuild.initialOptions.outfile);
69
-
33
+ resolve(outdir),
34
+ {
35
+ inject: [routesModule],
36
+ entryName: "index",
37
+ minify,
38
+ sourcemap,
39
+ watch,
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,
45
+ define: {},
46
+ betaD1Shims: (betaD1Shims || []).map(
47
+ (binding) => `${D1_BETA_PREFIX}${binding}`
48
+ ),
49
+ doBindings: [], // Pages functions don't support internal Durable Objects
50
+ plugins: [
51
+ buildNotifierPlugin(onEnd),
52
+ {
53
+ name: "Assets",
54
+ setup(pluginBuild) {
70
55
  pluginBuild.onResolve({ filter: /^assets:/ }, async (args) => {
71
56
  const directory = resolve(
72
57
  args.resolveDir,
@@ -94,17 +79,35 @@ export function buildPlugin({
94
79
 
95
80
  return { path, external: true, namespace: "assets" };
96
81
  });
97
- }
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
+ );
101
+ },
98
102
  },
99
- },
100
- ...(nodeCompat
101
- ? [
102
- NodeGlobalsPolyfills({
103
- buffer: true,
104
- }),
105
- NodeModulesPolyfills(),
106
- ]
107
- : []),
108
- ],
109
- });
103
+ ],
104
+ serveAssetsFromWorker: false,
105
+ disableModuleCollection: false,
106
+ rules: [],
107
+ checkFetch: local,
108
+ targetConsumer: local ? "dev" : "publish",
109
+ local,
110
+ experimentalLocal: false,
111
+ }
112
+ );
110
113
  }