wrangler 0.0.0-e7a0cd5b → 0.0.0-e81b1611

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 (258) hide show
  1. package/README.md +12 -14
  2. package/bin/wrangler.js +19 -65
  3. package/package.json +209 -191
  4. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  5. package/templates/__tests__/tsconfig.json +8 -0
  6. package/templates/checked-fetch.js +19 -6
  7. package/templates/facade.d.ts +17 -0
  8. package/templates/gitignore +1 -0
  9. package/templates/init-tests/test-jest-new-worker.js +3 -5
  10. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  11. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  12. package/templates/middleware/common.ts +9 -4
  13. package/templates/middleware/loader-modules.ts +64 -11
  14. package/templates/middleware/loader-sw.ts +47 -32
  15. package/templates/middleware/middleware-d1-beta.d.ts +3 -0
  16. package/templates/middleware/middleware-miniflare3-json-error.ts +33 -0
  17. package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
  18. package/templates/middleware/middleware-multiworker-dev.ts +68 -0
  19. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  20. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  21. package/templates/modules-watch-stub.js +4 -0
  22. package/templates/new-worker-scheduled.ts +1 -1
  23. package/templates/new-worker.ts +4 -1
  24. package/templates/pages-dev-pipeline.ts +4 -1
  25. package/templates/pages-dev-util.ts +4 -1
  26. package/templates/pages-shim.ts +1 -1
  27. package/templates/pages-template-plugin.ts +31 -12
  28. package/templates/pages-template-worker.ts +11 -2
  29. package/templates/tsconfig-sanity.ts +11 -0
  30. package/templates/tsconfig.init.json +105 -0
  31. package/templates/tsconfig.json +5 -103
  32. package/wrangler-dist/cli.d.ts +951 -121
  33. package/wrangler-dist/cli.js +133766 -143686
  34. package/wrangler-dist/wasm-sync.wasm +0 -0
  35. package/import_meta_url.js +0 -3
  36. package/miniflare-config-stubs/.env.empty +0 -0
  37. package/miniflare-config-stubs/package.empty.json +0 -1
  38. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  39. package/miniflare-dist/index.mjs +0 -6316
  40. package/src/__tests__/access.test.ts +0 -25
  41. package/src/__tests__/api-dev.test.ts +0 -209
  42. package/src/__tests__/api-devregistry.test.js +0 -57
  43. package/src/__tests__/api.test.ts +0 -80
  44. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  45. package/src/__tests__/config-cache.test.ts +0 -42
  46. package/src/__tests__/configuration.test.ts +0 -4028
  47. package/src/__tests__/d1.test.ts +0 -72
  48. package/src/__tests__/delete.test.ts +0 -230
  49. package/src/__tests__/deployments.test.ts +0 -95
  50. package/src/__tests__/dev.test.tsx +0 -1509
  51. package/src/__tests__/dialogs.test.tsx +0 -40
  52. package/src/__tests__/generate.test.ts +0 -235
  53. package/src/__tests__/get-host-from-url.test.ts +0 -16
  54. package/src/__tests__/guess-worker-format.test.ts +0 -85
  55. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  56. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  57. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  58. package/src/__tests__/helpers/mock-bin.ts +0 -36
  59. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  60. package/src/__tests__/helpers/mock-console.ts +0 -106
  61. package/src/__tests__/helpers/mock-dialogs.ts +0 -153
  62. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
  63. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  64. package/src/__tests__/helpers/mock-istty.ts +0 -74
  65. package/src/__tests__/helpers/mock-known-routes.ts +0 -7
  66. package/src/__tests__/helpers/mock-kv.ts +0 -33
  67. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
  68. package/src/__tests__/helpers/mock-process.ts +0 -39
  69. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  70. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  71. package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
  72. package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
  73. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
  74. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
  75. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
  76. package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
  77. package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
  78. package/src/__tests__/helpers/msw/handlers/zones.ts +0 -22
  79. package/src/__tests__/helpers/msw/index.ts +0 -21
  80. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  81. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  82. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  83. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  84. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  85. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
  86. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  87. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  88. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  89. package/src/__tests__/https-options.test.ts +0 -163
  90. package/src/__tests__/index.test.ts +0 -262
  91. package/src/__tests__/init.test.ts +0 -2900
  92. package/src/__tests__/jest.setup.ts +0 -202
  93. package/src/__tests__/kv.test.ts +0 -1675
  94. package/src/__tests__/logger.test.ts +0 -141
  95. package/src/__tests__/metrics.test.ts +0 -450
  96. package/src/__tests__/middleware.scheduled.test.ts +0 -135
  97. package/src/__tests__/middleware.test.ts +0 -726
  98. package/src/__tests__/package-manager.test.ts +0 -353
  99. package/src/__tests__/pages.test.ts +0 -2223
  100. package/src/__tests__/parse.test.ts +0 -330
  101. package/src/__tests__/paths.test.ts +0 -39
  102. package/src/__tests__/publish.test.ts +0 -7660
  103. package/src/__tests__/pubsub.test.ts +0 -370
  104. package/src/__tests__/queues.test.ts +0 -371
  105. package/src/__tests__/r2.test.ts +0 -376
  106. package/src/__tests__/route.test.ts +0 -45
  107. package/src/__tests__/secret.test.ts +0 -644
  108. package/src/__tests__/tail.test.ts +0 -800
  109. package/src/__tests__/test-old-node-version.js +0 -31
  110. package/src/__tests__/type-generation.test.ts +0 -217
  111. package/src/__tests__/user.test.ts +0 -155
  112. package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
  113. package/src/__tests__/validate-dev-props.test.ts +0 -56
  114. package/src/__tests__/version.test.ts +0 -35
  115. package/src/__tests__/whoami.test.tsx +0 -278
  116. package/src/__tests__/worker-namespace.test.ts +0 -326
  117. package/src/abort.d.ts +0 -3
  118. package/src/api/dev.ts +0 -208
  119. package/src/api/index.ts +0 -2
  120. package/src/bundle-reporter.tsx +0 -68
  121. package/src/bundle.ts +0 -785
  122. package/src/cfetch/index.ts +0 -160
  123. package/src/cfetch/internal.ts +0 -263
  124. package/src/cli.ts +0 -28
  125. package/src/config/README.md +0 -107
  126. package/src/config/config.ts +0 -275
  127. package/src/config/diagnostics.ts +0 -80
  128. package/src/config/environment.ts +0 -563
  129. package/src/config/index.ts +0 -342
  130. package/src/config/validation-helpers.ts +0 -597
  131. package/src/config/validation.ts +0 -2113
  132. package/src/config-cache.ts +0 -85
  133. package/src/create-worker-preview.ts +0 -282
  134. package/src/create-worker-upload-form.ts +0 -321
  135. package/src/d1/backups.tsx +0 -218
  136. package/src/d1/create.tsx +0 -54
  137. package/src/d1/delete.tsx +0 -56
  138. package/src/d1/execute.tsx +0 -299
  139. package/src/d1/formatTimeAgo.ts +0 -14
  140. package/src/d1/index.ts +0 -76
  141. package/src/d1/list.tsx +0 -48
  142. package/src/d1/options.ts +0 -12
  143. package/src/d1/types.tsx +0 -14
  144. package/src/d1/utils.ts +0 -39
  145. package/src/delete.ts +0 -108
  146. package/src/deployments.ts +0 -74
  147. package/src/deprecated/index.ts +0 -438
  148. package/src/dev/dev-vars.ts +0 -39
  149. package/src/dev/dev.tsx +0 -587
  150. package/src/dev/get-local-persistence-path.tsx +0 -31
  151. package/src/dev/local.tsx +0 -717
  152. package/src/dev/remote.tsx +0 -603
  153. package/src/dev/start-server.ts +0 -513
  154. package/src/dev/use-esbuild.ts +0 -204
  155. package/src/dev/validate-dev-props.ts +0 -31
  156. package/src/dev-registry.tsx +0 -201
  157. package/src/dev.tsx +0 -869
  158. package/src/dialogs.tsx +0 -163
  159. package/src/dispatch-namespace.ts +0 -207
  160. package/src/durable.ts +0 -102
  161. package/src/entry.ts +0 -329
  162. package/src/environment-variables.ts +0 -50
  163. package/src/errors.ts +0 -11
  164. package/src/git-client.ts +0 -124
  165. package/src/global-wrangler-config-path.ts +0 -26
  166. package/src/https-options.ts +0 -127
  167. package/src/index.tsx +0 -684
  168. package/src/init.ts +0 -970
  169. package/src/inspect.ts +0 -767
  170. package/src/intl-polyfill.d.ts +0 -139
  171. package/src/is-ci.ts +0 -14
  172. package/src/is-interactive.ts +0 -16
  173. package/src/kv/helpers.ts +0 -430
  174. package/src/kv/index.ts +0 -596
  175. package/src/logger.ts +0 -92
  176. package/src/metrics/index.ts +0 -5
  177. package/src/metrics/metrics-config.ts +0 -239
  178. package/src/metrics/metrics-dispatcher.ts +0 -96
  179. package/src/metrics/metrics-usage-headers.ts +0 -24
  180. package/src/metrics/send-event.ts +0 -94
  181. package/src/miniflare-cli/README.md +0 -30
  182. package/src/miniflare-cli/assets.ts +0 -215
  183. package/src/miniflare-cli/index.ts +0 -213
  184. package/src/miniflare-cli/request-context.ts +0 -40
  185. package/src/module-collection.ts +0 -267
  186. package/src/open-in-browser.ts +0 -17
  187. package/src/package-manager.ts +0 -219
  188. package/src/pages/build.tsx +0 -238
  189. package/src/pages/constants.ts +0 -18
  190. package/src/pages/deployments.tsx +0 -106
  191. package/src/pages/dev.tsx +0 -693
  192. package/src/pages/errors.ts +0 -66
  193. package/src/pages/functions/buildPlugin.ts +0 -110
  194. package/src/pages/functions/buildWorker.ts +0 -156
  195. package/src/pages/functions/filepath-routing.test.ts +0 -234
  196. package/src/pages/functions/filepath-routing.ts +0 -189
  197. package/src/pages/functions/identifiers.ts +0 -78
  198. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  199. package/src/pages/functions/routes-consolidation.ts +0 -73
  200. package/src/pages/functions/routes-transformation.test.ts +0 -282
  201. package/src/pages/functions/routes-transformation.ts +0 -115
  202. package/src/pages/functions/routes-validation.test.ts +0 -403
  203. package/src/pages/functions/routes-validation.ts +0 -202
  204. package/src/pages/functions/routes.ts +0 -151
  205. package/src/pages/functions.tsx +0 -82
  206. package/src/pages/hash.tsx +0 -13
  207. package/src/pages/index.tsx +0 -94
  208. package/src/pages/projects.tsx +0 -169
  209. package/src/pages/publish.tsx +0 -436
  210. package/src/pages/types.ts +0 -49
  211. package/src/pages/upload.tsx +0 -425
  212. package/src/pages/utils.ts +0 -12
  213. package/src/parse.ts +0 -286
  214. package/src/paths.ts +0 -71
  215. package/src/proxy.ts +0 -689
  216. package/src/publish/index.ts +0 -270
  217. package/src/publish/publish.ts +0 -1035
  218. package/src/pubsub/index.ts +0 -286
  219. package/src/pubsub/pubsub-commands.tsx +0 -624
  220. package/src/queues/cli/commands/consumer/add.ts +0 -71
  221. package/src/queues/cli/commands/consumer/index.ts +0 -22
  222. package/src/queues/cli/commands/consumer/remove.ts +0 -38
  223. package/src/queues/cli/commands/create.ts +0 -25
  224. package/src/queues/cli/commands/delete.ts +0 -26
  225. package/src/queues/cli/commands/index.ts +0 -33
  226. package/src/queues/cli/commands/list.ts +0 -25
  227. package/src/queues/client.ts +0 -135
  228. package/src/r2/helpers.ts +0 -131
  229. package/src/r2/index.ts +0 -277
  230. package/src/routes.ts +0 -140
  231. package/src/secret/index.ts +0 -379
  232. package/src/selfsigned.d.ts +0 -29
  233. package/src/sites.tsx +0 -372
  234. package/src/tail/createTail.ts +0 -315
  235. package/src/tail/filters.ts +0 -277
  236. package/src/tail/index.ts +0 -214
  237. package/src/tail/printing.ts +0 -107
  238. package/src/type-generation.ts +0 -159
  239. package/src/update-check.ts +0 -19
  240. package/src/user/access.ts +0 -69
  241. package/src/user/choose-account.tsx +0 -69
  242. package/src/user/env-vars.ts +0 -46
  243. package/src/user/generate-auth-url.ts +0 -33
  244. package/src/user/generate-random-state.ts +0 -16
  245. package/src/user/index.ts +0 -3
  246. package/src/user/user.tsx +0 -1192
  247. package/src/utils/collectKeyValues.ts +0 -14
  248. package/src/whoami.tsx +0 -169
  249. package/src/worker.ts +0 -242
  250. package/src/yargs-types.ts +0 -20
  251. package/src/zones.ts +0 -191
  252. package/templates/d1-beta-facade.js +0 -174
  253. package/templates/experimental-local-cache-stubs.js +0 -27
  254. package/templates/first-party-worker-module-facade.ts +0 -18
  255. package/templates/format-dev-errors.ts +0 -32
  256. package/templates/serve-static-assets.ts +0 -63
  257. package/templates/service-bindings-module-facade.js +0 -54
  258. package/templates/service-bindings-sw-facade.js +0 -42
@@ -1,17 +1,30 @@
1
1
  const urls = new Set();
2
2
 
3
- export function checkedFetch(request, init) {
4
- const url = new URL(
5
- (typeof request === "string" ? new Request(request, init) : request).url
6
- );
3
+ function checkURL(request, init) {
4
+ const url =
5
+ request instanceof URL
6
+ ? request
7
+ : new URL(
8
+ (typeof request === "string"
9
+ ? new Request(request, init)
10
+ : request
11
+ ).url
12
+ );
7
13
  if (url.port && url.port !== "443" && url.protocol === "https:") {
8
14
  if (!urls.has(url.toString())) {
9
15
  urls.add(url.toString());
10
16
  console.warn(
11
17
  `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` +
12
- ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler publish\` command.\n`
18
+ ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n`
13
19
  );
14
20
  }
15
21
  }
16
- return globalThis.fetch(request, init);
17
22
  }
23
+
24
+ globalThis.fetch = new Proxy(globalThis.fetch, {
25
+ apply(target, thisArg, argArray) {
26
+ const [request, init] = argArray;
27
+ checkURL(request, init);
28
+ return Reflect.apply(target, thisArg, argArray);
29
+ },
30
+ });
@@ -0,0 +1,17 @@
1
+ declare module "__ENTRY_POINT__" {
2
+ import type { Middleware } from "./middleware/common";
3
+ const worker: ExportedHandler & {
4
+ middleware?: Middleware[];
5
+ envWrappers: ((env: Record<string, unknown>) => Record<string, unknown>)[];
6
+ };
7
+ export default worker;
8
+ }
9
+
10
+ declare module "__KV_ASSET_HANDLER__" {
11
+ export * from "@cloudflare/kv-asset-handler";
12
+ }
13
+
14
+ declare module "__STATIC_CONTENT_MANIFEST" {
15
+ const manifest: string;
16
+ export default manifest;
17
+ }
@@ -169,3 +169,4 @@ dist
169
169
  # wrangler project
170
170
 
171
171
  .dev.vars
172
+ .wrangler/
@@ -4,11 +4,9 @@ describe("Worker", () => {
4
4
  let worker;
5
5
 
6
6
  beforeAll(async () => {
7
- worker = await unstable_dev(
8
- "src/index.js",
9
- {},
10
- { disableExperimentalWarning: true }
11
- );
7
+ worker = await unstable_dev("src/index.js", {
8
+ experimental: { disableExperimentalWarning: true },
9
+ });
12
10
  });
13
11
 
14
12
  afterAll(async () => {
@@ -5,11 +5,9 @@ describe("Worker", () => {
5
5
  let worker;
6
6
 
7
7
  beforeAll(async () => {
8
- worker = await unstable_dev(
9
- "src/index.js",
10
- {},
11
- { disableExperimentalWarning: true }
12
- );
8
+ worker = await unstable_dev("src/index.js", {
9
+ experimental: { disableExperimentalWarning: true },
10
+ });
13
11
  });
14
12
 
15
13
  afterAll(async () => {
@@ -0,0 +1,25 @@
1
+ import { unstable_dev } from "wrangler";
2
+ import type { UnstableDevWorker } from "wrangler";
3
+ import { describe, expect, it, beforeAll, afterAll } from "vitest";
4
+
5
+ describe("Worker", () => {
6
+ let worker: UnstableDevWorker;
7
+
8
+ beforeAll(async () => {
9
+ worker = await unstable_dev("src/index.ts", {
10
+ experimental: { disableExperimentalWarning: true },
11
+ });
12
+ });
13
+
14
+ afterAll(async () => {
15
+ await worker.stop();
16
+ });
17
+
18
+ it("should return Hello World", async () => {
19
+ const resp = await worker.fetch();
20
+ if (resp) {
21
+ const text = await resp.text();
22
+ expect(text).toMatchInlineSnapshot(`"Hello World!"`);
23
+ }
24
+ });
25
+ });
@@ -5,13 +5,18 @@ export type Dispatcher = (
5
5
  init: { cron?: string }
6
6
  ) => Awaitable<void>;
7
7
 
8
+ export type IncomingRequest = Request<
9
+ unknown,
10
+ IncomingRequestCfProperties<unknown>
11
+ >;
12
+
8
13
  export interface MiddlewareContext {
9
14
  dispatch: Dispatcher;
10
- next(request: Request, env: any): Awaitable<Response>;
15
+ next(request: IncomingRequest, env: any): Awaitable<Response>;
11
16
  }
12
17
 
13
18
  export type Middleware = (
14
- request: Request,
19
+ request: IncomingRequest,
15
20
  env: any,
16
21
  ctx: ExecutionContext,
17
22
  middlewareCtx: MiddlewareContext
@@ -32,7 +37,7 @@ export function __facade_registerInternal__(
32
37
  }
33
38
 
34
39
  function __facade_invokeChain__(
35
- request: Request,
40
+ request: IncomingRequest,
36
41
  env: any,
37
42
  ctx: ExecutionContext,
38
43
  dispatch: Dispatcher,
@@ -49,7 +54,7 @@ function __facade_invokeChain__(
49
54
  }
50
55
 
51
56
  export function __facade_invoke__(
52
- request: Request,
57
+ request: IncomingRequest,
53
58
  env: any,
54
59
  ctx: ExecutionContext,
55
60
  dispatch: Dispatcher,
@@ -11,11 +11,9 @@ import {
11
11
  __facade_register__,
12
12
  } from "./common";
13
13
 
14
- // @ts-expect-error We'll swap in the entry point during build
15
14
  import worker from "__ENTRY_POINT__";
16
15
 
17
16
  // We need to preserve all of the exports from the worker
18
- // @ts-expect-error We'll swap in the entry point during build
19
17
  export * from "__ENTRY_POINT__";
20
18
 
21
19
  class __Facade_ScheduledController__ implements ScheduledController {
@@ -38,17 +36,68 @@ class __Facade_ScheduledController__ implements ScheduledController {
38
36
  }
39
37
  }
40
38
 
41
- const __facade_modules_fetch__: Middleware = function (request, env, ctx) {
42
- if (worker.fetch === undefined) throw new Error("No fetch handler!"); // TODO: proper error message
39
+ const __facade_modules_fetch__: ExportedHandlerFetchHandler = function (
40
+ request,
41
+ env,
42
+ ctx
43
+ ) {
44
+ if (worker.fetch === undefined)
45
+ throw new Error("Handler does not export a fetch() function.");
43
46
  return worker.fetch(request, env, ctx);
44
47
  };
45
48
 
46
- const facade: ExportedHandler<unknown> = {
47
- fetch(request, env, ctx) {
49
+ function getMaskedEnv(rawEnv: unknown) {
50
+ let env = rawEnv as Record<string, unknown>;
51
+ if (worker.envWrappers && worker.envWrappers.length > 0) {
52
+ for (const wrapFn of worker.envWrappers) {
53
+ env = wrapFn(env);
54
+ }
55
+ }
56
+ return env;
57
+ }
58
+
59
+ /**
60
+ * This type is here to cause a type error if a new export handler is added to
61
+ * `ExportHandler` without it being included in the `facade` below.
62
+ */
63
+ type MissingExportHandlers = Omit<
64
+ Required<ExportedHandler>,
65
+ "tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch"
66
+ >;
67
+
68
+ let registeredMiddleware = false;
69
+
70
+ const facade: ExportedHandler<unknown> & MissingExportHandlers = {
71
+ ...(worker.tail && {
72
+ tail: maskHandlerEnv(worker.tail),
73
+ }),
74
+ ...(worker.trace && {
75
+ trace: maskHandlerEnv(worker.trace),
76
+ }),
77
+ ...(worker.scheduled && {
78
+ scheduled: maskHandlerEnv(worker.scheduled),
79
+ }),
80
+ ...(worker.queue && {
81
+ queue: maskHandlerEnv(worker.queue),
82
+ }),
83
+ ...(worker.test && {
84
+ test: maskHandlerEnv(worker.test),
85
+ }),
86
+ ...(worker.email && {
87
+ email: maskHandlerEnv(worker.email),
88
+ }),
89
+
90
+ fetch(request, rawEnv, ctx) {
91
+ const env = getMaskedEnv(rawEnv);
48
92
  // Get the chain of middleware from the worker object
49
93
  if (worker.middleware && worker.middleware.length > 0) {
50
- for (const middleware of worker.middleware) {
51
- __facade_register__(middleware);
94
+ // Make sure we only register middleware once:
95
+ // https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911
96
+ if (!registeredMiddleware) {
97
+ registeredMiddleware = true;
98
+ for (const middleware of worker.middleware) {
99
+ __facade_register__(middleware);
100
+ }
52
101
  }
53
102
 
54
103
  const __facade_modules_dispatch__: Dispatcher = function (type, init) {
@@ -73,12 +122,16 @@ const facade: ExportedHandler<unknown> = {
73
122
  // We didn't have any middleware so we can skip the invocation chain,
74
123
  // and just call the fetch handler directly
75
124
 
76
- // We "don't care" if this is undefined as we want to have the same behaviour
125
+ // We "don't care" if this is undefined as we want to have the same behavior
77
126
  // as if the worker completely bypassed middleware.
78
- return worker.fetch!(request, env, ctx);
127
+ return __facade_modules_fetch__(request, env, ctx);
79
128
  }
80
129
  },
81
- scheduled: worker.scheduled,
82
130
  };
83
131
 
132
+ type HandlerFn<D, R> = (data: D, env: unknown, ctx: ExecutionContext) => R;
133
+ function maskHandlerEnv<D, R>(handler: HandlerFn<D, R>): HandlerFn<D, R> {
134
+ return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);
135
+ }
136
+
84
137
  export default facade;
@@ -1,8 +1,16 @@
1
- import { Awaitable, Dispatcher, Middleware, __facade_invoke__ } from "./common";
2
- export { __facade_register__, __facade_registerInternal__ } from "./common";
3
-
4
- // Miniflare's `EventTarget` follows the spec and doesn't allow exceptions to
5
- // be caught by `dispatchEvent`. Instead it has a custom`ThrowingEventTarget`
1
+ import {
2
+ Awaitable,
3
+ Dispatcher,
4
+ IncomingRequest,
5
+ Middleware,
6
+ __facade_invoke__,
7
+ __facade_register__,
8
+ __facade_registerInternal__,
9
+ } from "./common";
10
+ export { __facade_register__, __facade_registerInternal__ };
11
+
12
+ // Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to
13
+ // be caught by `dispatchEvent`. Instead it has a custom `ThrowingEventTarget`
6
14
  // class that rethrows errors from event listeners in `dispatchEvent`.
7
15
  // We'd like errors to be propagated to the top-level `addEventListener`, so
8
16
  // we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
@@ -15,45 +23,52 @@ if ((globalThis as any).MINIFLARE) {
15
23
  __FACADE_EVENT_TARGET__ = new EventTarget();
16
24
  }
17
25
 
18
- declare global {
19
- var __facade_addEventListener__: (
20
- type: string,
21
- listener: EventListenerOrEventListenerObject,
22
- options?: EventTargetAddEventListenerOptions | boolean
23
- ) => void;
24
- var __facade_removeEventListener__: (
25
- type: string,
26
- listener: EventListenerOrEventListenerObject,
27
- options?: EventTargetEventListenerOptions | boolean
28
- ) => void;
29
- var __facade_dispatchEvent__: (event: Event) => void;
30
- }
31
-
32
- function __facade_isSpecialEvent__(type: string) {
26
+ function __facade_isSpecialEvent__(
27
+ type: string
28
+ ): type is "fetch" | "scheduled" {
33
29
  return type === "fetch" || type === "scheduled";
34
30
  }
35
- globalThis.__facade_addEventListener__ = function (type, listener, options) {
31
+ const __facade__originalAddEventListener__ = globalThis.addEventListener;
32
+ const __facade__originalRemoveEventListener__ = globalThis.removeEventListener;
33
+ const __facade__originalDispatchEvent__ = globalThis.dispatchEvent;
34
+
35
+ globalThis.addEventListener = function (type, listener, options) {
36
36
  if (__facade_isSpecialEvent__(type)) {
37
- __FACADE_EVENT_TARGET__.addEventListener(type, listener, options);
37
+ __FACADE_EVENT_TARGET__.addEventListener(
38
+ type,
39
+ listener as EventListenerOrEventListenerObject,
40
+ options
41
+ );
38
42
  } else {
39
- globalThis.addEventListener(type as any, listener, options);
43
+ __facade__originalAddEventListener__(type, listener, options);
40
44
  }
41
45
  };
42
- globalThis.__facade_removeEventListener__ = function (type, listener, options) {
46
+ globalThis.removeEventListener = function (type, listener, options) {
43
47
  if (__facade_isSpecialEvent__(type)) {
44
- __FACADE_EVENT_TARGET__.removeEventListener(type, listener, options);
48
+ __FACADE_EVENT_TARGET__.removeEventListener(
49
+ type,
50
+ listener as EventListenerOrEventListenerObject,
51
+ options
52
+ );
45
53
  } else {
46
- globalThis.removeEventListener(type as any, listener, options);
54
+ __facade__originalRemoveEventListener__(type, listener, options);
47
55
  }
48
56
  };
49
- globalThis.__facade_dispatchEvent__ = function (event) {
57
+ globalThis.dispatchEvent = function (event) {
50
58
  if (__facade_isSpecialEvent__(event.type)) {
51
- __FACADE_EVENT_TARGET__.dispatchEvent(event);
59
+ return __FACADE_EVENT_TARGET__.dispatchEvent(event);
52
60
  } else {
53
- globalThis.dispatchEvent(event as any);
61
+ return __facade__originalDispatchEvent__(event);
54
62
  }
55
63
  };
56
64
 
65
+ declare global {
66
+ var addMiddleware: typeof __facade_register__;
67
+ var addMiddlewareInternal: typeof __facade_registerInternal__;
68
+ }
69
+ globalThis.addMiddleware = __facade_register__;
70
+ globalThis.addMiddlewareInternal = __facade_registerInternal__;
71
+
57
72
  const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
58
73
  const __facade_response__ = Symbol("__facade_response__");
59
74
  const __facade_dispatched__ = Symbol("__facade_dispatched__");
@@ -154,7 +169,7 @@ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
154
169
  }
155
170
  }
156
171
 
157
- globalThis.addEventListener("fetch", (event) => {
172
+ __facade__originalAddEventListener__("fetch", (event) => {
158
173
  const ctx: ExecutionContext = {
159
174
  waitUntil: event.waitUntil.bind(event),
160
175
  passThroughOnException: event.passThroughOnException.bind(event),
@@ -192,7 +207,7 @@ globalThis.addEventListener("fetch", (event) => {
192
207
 
193
208
  event.respondWith(
194
209
  __facade_invoke__(
195
- event.request,
210
+ event.request as IncomingRequest,
196
211
  globalThis,
197
212
  ctx,
198
213
  __facade_sw_dispatch__,
@@ -201,7 +216,7 @@ globalThis.addEventListener("fetch", (event) => {
201
216
  );
202
217
  });
203
218
 
204
- globalThis.addEventListener("scheduled", (event) => {
219
+ __facade__originalAddEventListener__("scheduled", (event) => {
205
220
  const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
206
221
  scheduledTime: event.scheduledTime,
207
222
  cron: event.cron,
@@ -0,0 +1,3 @@
1
+ declare module "config:middleware/d1-beta" {
2
+ export const D1_IMPORTS: string[];
3
+ }
@@ -0,0 +1,33 @@
1
+ import type { Middleware } from "./common";
2
+
3
+ interface JsonError {
4
+ message?: string;
5
+ name?: string;
6
+ stack?: string;
7
+ cause?: JsonError;
8
+ }
9
+
10
+ function reduceError(e: any): JsonError {
11
+ return {
12
+ name: e?.name,
13
+ message: e?.message ?? String(e),
14
+ stack: e?.stack,
15
+ cause: e?.cause === undefined ? undefined : reduceError(e.cause),
16
+ };
17
+ }
18
+
19
+ // See comment in `bundle.ts` for details on why this is needed
20
+ const jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {
21
+ try {
22
+ return await middlewareCtx.next(request, env);
23
+ } catch (e: any) {
24
+ const error = reduceError(e);
25
+ return Response.json(error, {
26
+ status: 500,
27
+ headers: { "MF-Experimental-Error-Stack": "true" },
28
+ });
29
+ }
30
+ };
31
+
32
+ export default jsonError;
33
+ export const wrap = undefined;
@@ -0,0 +1,4 @@
1
+ declare module "config:middleware/multiworker-dev" {
2
+ import type { WorkerRegistry } from "../../src/dev-registry";
3
+ export const workers: WorkerRegistry;
4
+ }
@@ -0,0 +1,68 @@
1
+ // @ts-nocheck
2
+ /// <reference path="middleware-multiworker-dev.d.ts"/>
3
+
4
+ import { workers } from "config:middleware/multiworker-dev";
5
+ import type { WorkerRegistry } from "../../src/dev-registry";
6
+
7
+ class Fetcher {
8
+ #name: string;
9
+ #details: WorkerRegistry[string];
10
+ constructor(name: string, details: WorkerRegistry[string]) {
11
+ this.#name = name;
12
+ this.#details = details;
13
+ }
14
+
15
+ async fetch(...reqArgs: Parameters<Fetcher["fetch"]>) {
16
+ const reqFromArgs = new Request(...reqArgs);
17
+ if (this.#details.headers) {
18
+ for (const [key, value] of Object.entries(this.#details.headers)) {
19
+ // In remote mode, you need to add a couple of headers
20
+ // to make sure it's talking to the 'dev' preview session
21
+ // (much like wrangler dev already does via proxy.ts)
22
+ reqFromArgs.headers.set(key, value);
23
+ }
24
+ return (env[this.#name] as Fetcher).fetch(reqFromArgs);
25
+ }
26
+
27
+ const url = new URL(reqFromArgs.url);
28
+ if (this.#details.protocol !== undefined) {
29
+ url.protocol = this.#details.protocol;
30
+ }
31
+ if (this.#details.host !== undefined) {
32
+ url.host = this.#details.host;
33
+ }
34
+ if (this.#details.port !== undefined) {
35
+ url.port = this.#details.port.toString();
36
+ }
37
+
38
+ const request = new Request(url.toString(), reqFromArgs);
39
+ return fetch(request);
40
+ }
41
+ }
42
+
43
+ export function wrap(env: Record<string, unknown>) {
44
+ const facadeEnv = { ...env };
45
+ // For every Worker definition that's available,
46
+ // create a fetcher for it on the facade env.
47
+ // for const [name, binding] of env
48
+ // if Workers[name]
49
+ // const details = Workers[name];
50
+
51
+ for (const [name, details] of Object.entries(workers as WorkerRegistry)) {
52
+ if (details) {
53
+ facadeEnv[name] = new Fetcher(name, details);
54
+ } else {
55
+ // This means there's no dev binding available.
56
+ // Let's use whatever's available, or put a shim with a message.
57
+ facadeEnv[name] = facadeEnv[name] || {
58
+ async fetch() {
59
+ return new Response(
60
+ `You should start up wrangler dev --local on the ${name} worker`,
61
+ { status: 404 }
62
+ );
63
+ },
64
+ };
65
+ }
66
+ }
67
+ return facadeEnv;
68
+ }
@@ -0,0 +1,6 @@
1
+ declare module "config:middleware/serve-static-assets" {
2
+ import type { CacheControl } from "@cloudflare/kv-asset-handler";
3
+
4
+ export const spaMode: boolean;
5
+ export const cacheControl: Partial<CacheControl>;
6
+ }
@@ -0,0 +1,56 @@
1
+ /// <reference path="middleware-serve-static-assets.d.ts"/>
2
+
3
+ import {
4
+ getAssetFromKV,
5
+ NotFoundError,
6
+ MethodNotAllowedError,
7
+ serveSinglePageApp,
8
+ } from "@cloudflare/kv-asset-handler";
9
+ import type { Options } from "@cloudflare/kv-asset-handler";
10
+ import { spaMode, cacheControl } from "config:middleware/serve-static-assets";
11
+ import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
12
+ import manifest from "__STATIC_CONTENT_MANIFEST";
13
+ const ASSET_MANIFEST = JSON.parse(manifest);
14
+
15
+ import type { Middleware } from "./common";
16
+
17
+ const staticAssets: Middleware = async (request, env, _ctx, middlewareCtx) => {
18
+ let options: Partial<Options> = {
19
+ ASSET_MANIFEST,
20
+ ASSET_NAMESPACE: env.__STATIC_CONTENT,
21
+ cacheControl: cacheControl,
22
+ mapRequestToAsset: spaMode ? serveSinglePageApp : undefined,
23
+ };
24
+
25
+ try {
26
+ const page = await (getAssetFromKV as typeof kvAssetHandler.getAssetFromKV)(
27
+ {
28
+ request,
29
+ waitUntil(promise) {
30
+ return _ctx.waitUntil(promise);
31
+ },
32
+ },
33
+ options
34
+ );
35
+
36
+ // allow headers to be altered
37
+ const response = new Response(page.body, page);
38
+
39
+ response.headers.set("X-XSS-Protection", "1; mode=block");
40
+ response.headers.set("X-Content-Type-Options", "nosniff");
41
+ response.headers.set("X-Frame-Options", "DENY");
42
+ response.headers.set("Referrer-Policy", "unsafe-url");
43
+ response.headers.set("Feature-Policy", "none");
44
+
45
+ return response;
46
+ } catch (e) {
47
+ if (e instanceof NotFoundError || e instanceof MethodNotAllowedError) {
48
+ // if a known error is thrown then serve from actual worker
49
+ return await middlewareCtx.next(request, env);
50
+ }
51
+ // otherwise it's a real error, so throw it
52
+ throw e;
53
+ }
54
+ };
55
+
56
+ export default staticAssets;
@@ -0,0 +1,4 @@
1
+ // `esbuild` doesn't support returning `watch*` options from `onStart()`
2
+ // plugin callbacks. Instead, we define an empty virtual module that is
3
+ // imported by this injected file. Importing the module registers watchers.
4
+ import "wrangler:modules-watch";
@@ -5,7 +5,7 @@
5
5
  * - Run `curl "http://localhost:8787/cdn-cgi/mf/scheduled"` to trigger the scheduled event
6
6
  * - Go back to the console to see what your worker has logged
7
7
  * - Update the Cron trigger in wrangler.toml (see https://developers.cloudflare.com/workers/wrangler/configuration/#triggers)
8
- * - Run `wrangler publish --name my-worker` to publish your worker
8
+ * - Run `wrangler deploy --name my-worker` to deploy your worker
9
9
  *
10
10
  * Learn more at https://developers.cloudflare.com/workers/runtime-apis/scheduled-event/
11
11
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * - Run `wrangler dev src/index.ts` in your terminal to start a development server
5
5
  * - Open a browser tab at http://localhost:8787/ to see your worker in action
6
- * - Run `wrangler publish src/index.ts --name my-worker` to publish your worker
6
+ * - Run `wrangler deploy src/index.ts --name my-worker` to deploy your worker
7
7
  *
8
8
  * Learn more at https://developers.cloudflare.com/workers/
9
9
  */
@@ -17,6 +17,9 @@ export interface Env {
17
17
  //
18
18
  // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
19
19
  // MY_BUCKET: R2Bucket;
20
+ //
21
+ // Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/
22
+ // MY_SERVICE: Fetcher;
20
23
  }
21
24
 
22
25
  export default {
@@ -7,7 +7,7 @@ import { isRoutingRuleMatch } from "./pages-dev-util";
7
7
  // @ts-ignore routes are injected
8
8
  const routes = __ROUTES__;
9
9
 
10
- export default {
10
+ export default <ExportedHandler<{ ASSETS: Fetcher }>>{
11
11
  fetch(request, env, context) {
12
12
  const { pathname } = new URL(request.url);
13
13
 
@@ -19,6 +19,9 @@ export default {
19
19
 
20
20
  for (const include of routes.include) {
21
21
  if (isRoutingRuleMatch(pathname, include)) {
22
+ if (worker.fetch === undefined) {
23
+ throw new TypeError("Entry point missing `fetch` handler");
24
+ }
22
25
  return worker.fetch(request, env, context);
23
26
  }
24
27
  }
@@ -45,7 +45,10 @@ function transformRoutingRuleToRegExp(rule: string): RegExp {
45
45
  }
46
46
 
47
47
  // /foo* => /foo.* => ^/foo.*$
48
- transformedRule = `^${transformedRule.replace("*", ".*")}$`;
48
+ // /*.* => /*\.* => /.*\..* => ^/.*\..*$
49
+ transformedRule = `^${transformedRule
50
+ .replaceAll(/\./g, "\\.")
51
+ .replaceAll(/\*/g, ".*")}$`;
49
52
 
50
53
  // ^/foo.*$ => /^\/foo.*$/
51
54
  return new RegExp(transformedRule);
@@ -1,7 +1,7 @@
1
1
  // This Worker is used as a default when no Pages Functions are present.
2
2
  // It proxies the request directly on to the asset server binding.
3
3
 
4
- export default {
4
+ export default <ExportedHandler<{ ASSETS: Fetcher }>>{
5
5
  async fetch(request, env, context) {
6
6
  const response = await env.ASSETS.fetch(request.url, request);
7
7
  return new Response(response.body, response);