wrangler 0.0.0-e7a0cd5b → 0.0.0-e7c06d78

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 (264) hide show
  1. package/README.md +13 -15
  2. package/bin/wrangler.js +24 -93
  3. package/config-schema.json +3059 -0
  4. package/package.json +196 -191
  5. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  6. package/templates/__tests__/tsconfig.json +8 -0
  7. package/templates/checked-fetch.js +19 -6
  8. package/templates/facade.d.ts +19 -0
  9. package/templates/gitignore +2 -3
  10. package/templates/init-tests/test-jest-new-worker.js +3 -5
  11. package/templates/init-tests/test-vitest-new-worker.js +4 -6
  12. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  13. package/templates/middleware/common.ts +9 -4
  14. package/templates/middleware/loader-modules.ts +94 -44
  15. package/templates/middleware/loader-sw.ts +48 -32
  16. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  17. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  18. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  19. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  20. package/templates/modules-watch-stub.js +4 -0
  21. package/templates/new-worker-scheduled.ts +1 -1
  22. package/templates/new-worker.ts +4 -1
  23. package/templates/pages-dev-pipeline.ts +6 -2
  24. package/templates/pages-dev-util.ts +4 -1
  25. package/templates/pages-shim.ts +1 -1
  26. package/templates/pages-template-plugin.ts +33 -14
  27. package/templates/pages-template-worker.ts +12 -3
  28. package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
  29. package/templates/startDevWorker/ProxyWorker.ts +334 -0
  30. package/templates/tsconfig-sanity.ts +11 -0
  31. package/templates/tsconfig.init.json +22 -0
  32. package/templates/tsconfig.json +5 -103
  33. package/wrangler-dist/InspectorProxyWorker.js +464 -0
  34. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  35. package/wrangler-dist/ProxyWorker.js +240 -0
  36. package/wrangler-dist/ProxyWorker.js.map +6 -0
  37. package/wrangler-dist/cli.d.ts +26010 -512
  38. package/wrangler-dist/cli.js +164971 -116798
  39. package/wrangler-dist/wasm-sync.wasm +0 -0
  40. package/Cloudflare_CA.pem +0 -18
  41. package/import_meta_url.js +0 -3
  42. package/miniflare-config-stubs/.env.empty +0 -0
  43. package/miniflare-config-stubs/package.empty.json +0 -1
  44. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  45. package/miniflare-dist/index.mjs +0 -6316
  46. package/src/__tests__/access.test.ts +0 -25
  47. package/src/__tests__/api-dev.test.ts +0 -209
  48. package/src/__tests__/api-devregistry.test.js +0 -57
  49. package/src/__tests__/api.test.ts +0 -80
  50. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  51. package/src/__tests__/config-cache.test.ts +0 -42
  52. package/src/__tests__/configuration.test.ts +0 -4028
  53. package/src/__tests__/d1.test.ts +0 -72
  54. package/src/__tests__/delete.test.ts +0 -230
  55. package/src/__tests__/deployments.test.ts +0 -95
  56. package/src/__tests__/dev.test.tsx +0 -1509
  57. package/src/__tests__/dialogs.test.tsx +0 -40
  58. package/src/__tests__/generate.test.ts +0 -235
  59. package/src/__tests__/get-host-from-url.test.ts +0 -16
  60. package/src/__tests__/guess-worker-format.test.ts +0 -85
  61. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  62. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  63. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  64. package/src/__tests__/helpers/mock-bin.ts +0 -36
  65. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  66. package/src/__tests__/helpers/mock-console.ts +0 -106
  67. package/src/__tests__/helpers/mock-dialogs.ts +0 -153
  68. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
  69. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  70. package/src/__tests__/helpers/mock-istty.ts +0 -74
  71. package/src/__tests__/helpers/mock-known-routes.ts +0 -7
  72. package/src/__tests__/helpers/mock-kv.ts +0 -33
  73. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
  74. package/src/__tests__/helpers/mock-process.ts +0 -39
  75. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  76. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  77. package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
  78. package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
  79. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
  80. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
  81. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
  82. package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
  83. package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
  84. package/src/__tests__/helpers/msw/handlers/zones.ts +0 -22
  85. package/src/__tests__/helpers/msw/index.ts +0 -21
  86. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  87. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  88. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  89. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  90. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  91. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
  92. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  93. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  94. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  95. package/src/__tests__/https-options.test.ts +0 -163
  96. package/src/__tests__/index.test.ts +0 -262
  97. package/src/__tests__/init.test.ts +0 -2900
  98. package/src/__tests__/jest.setup.ts +0 -202
  99. package/src/__tests__/kv.test.ts +0 -1675
  100. package/src/__tests__/logger.test.ts +0 -141
  101. package/src/__tests__/metrics.test.ts +0 -450
  102. package/src/__tests__/middleware.scheduled.test.ts +0 -135
  103. package/src/__tests__/middleware.test.ts +0 -726
  104. package/src/__tests__/package-manager.test.ts +0 -353
  105. package/src/__tests__/pages.test.ts +0 -2223
  106. package/src/__tests__/parse.test.ts +0 -330
  107. package/src/__tests__/paths.test.ts +0 -39
  108. package/src/__tests__/publish.test.ts +0 -7660
  109. package/src/__tests__/pubsub.test.ts +0 -370
  110. package/src/__tests__/queues.test.ts +0 -371
  111. package/src/__tests__/r2.test.ts +0 -376
  112. package/src/__tests__/route.test.ts +0 -45
  113. package/src/__tests__/secret.test.ts +0 -644
  114. package/src/__tests__/tail.test.ts +0 -800
  115. package/src/__tests__/test-old-node-version.js +0 -31
  116. package/src/__tests__/type-generation.test.ts +0 -217
  117. package/src/__tests__/user.test.ts +0 -155
  118. package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
  119. package/src/__tests__/validate-dev-props.test.ts +0 -56
  120. package/src/__tests__/version.test.ts +0 -35
  121. package/src/__tests__/whoami.test.tsx +0 -278
  122. package/src/__tests__/worker-namespace.test.ts +0 -326
  123. package/src/abort.d.ts +0 -3
  124. package/src/api/dev.ts +0 -208
  125. package/src/api/index.ts +0 -2
  126. package/src/bundle-reporter.tsx +0 -68
  127. package/src/bundle.ts +0 -785
  128. package/src/cfetch/index.ts +0 -160
  129. package/src/cfetch/internal.ts +0 -263
  130. package/src/cli.ts +0 -28
  131. package/src/config/README.md +0 -107
  132. package/src/config/config.ts +0 -275
  133. package/src/config/diagnostics.ts +0 -80
  134. package/src/config/environment.ts +0 -563
  135. package/src/config/index.ts +0 -342
  136. package/src/config/validation-helpers.ts +0 -597
  137. package/src/config/validation.ts +0 -2113
  138. package/src/config-cache.ts +0 -85
  139. package/src/create-worker-preview.ts +0 -282
  140. package/src/create-worker-upload-form.ts +0 -321
  141. package/src/d1/backups.tsx +0 -218
  142. package/src/d1/create.tsx +0 -54
  143. package/src/d1/delete.tsx +0 -56
  144. package/src/d1/execute.tsx +0 -299
  145. package/src/d1/formatTimeAgo.ts +0 -14
  146. package/src/d1/index.ts +0 -76
  147. package/src/d1/list.tsx +0 -48
  148. package/src/d1/options.ts +0 -12
  149. package/src/d1/types.tsx +0 -14
  150. package/src/d1/utils.ts +0 -39
  151. package/src/delete.ts +0 -108
  152. package/src/deployments.ts +0 -74
  153. package/src/deprecated/index.ts +0 -438
  154. package/src/dev/dev-vars.ts +0 -39
  155. package/src/dev/dev.tsx +0 -587
  156. package/src/dev/get-local-persistence-path.tsx +0 -31
  157. package/src/dev/local.tsx +0 -717
  158. package/src/dev/remote.tsx +0 -603
  159. package/src/dev/start-server.ts +0 -513
  160. package/src/dev/use-esbuild.ts +0 -204
  161. package/src/dev/validate-dev-props.ts +0 -31
  162. package/src/dev-registry.tsx +0 -201
  163. package/src/dev.tsx +0 -869
  164. package/src/dialogs.tsx +0 -163
  165. package/src/dispatch-namespace.ts +0 -207
  166. package/src/durable.ts +0 -102
  167. package/src/entry.ts +0 -329
  168. package/src/environment-variables.ts +0 -50
  169. package/src/errors.ts +0 -11
  170. package/src/git-client.ts +0 -124
  171. package/src/global-wrangler-config-path.ts +0 -26
  172. package/src/https-options.ts +0 -127
  173. package/src/index.tsx +0 -684
  174. package/src/init.ts +0 -970
  175. package/src/inspect.ts +0 -767
  176. package/src/intl-polyfill.d.ts +0 -139
  177. package/src/is-ci.ts +0 -14
  178. package/src/is-interactive.ts +0 -16
  179. package/src/kv/helpers.ts +0 -430
  180. package/src/kv/index.ts +0 -596
  181. package/src/logger.ts +0 -92
  182. package/src/metrics/index.ts +0 -5
  183. package/src/metrics/metrics-config.ts +0 -239
  184. package/src/metrics/metrics-dispatcher.ts +0 -96
  185. package/src/metrics/metrics-usage-headers.ts +0 -24
  186. package/src/metrics/send-event.ts +0 -94
  187. package/src/miniflare-cli/README.md +0 -30
  188. package/src/miniflare-cli/assets.ts +0 -215
  189. package/src/miniflare-cli/index.ts +0 -213
  190. package/src/miniflare-cli/request-context.ts +0 -40
  191. package/src/module-collection.ts +0 -267
  192. package/src/open-in-browser.ts +0 -17
  193. package/src/package-manager.ts +0 -219
  194. package/src/pages/build.tsx +0 -238
  195. package/src/pages/constants.ts +0 -18
  196. package/src/pages/deployments.tsx +0 -106
  197. package/src/pages/dev.tsx +0 -693
  198. package/src/pages/errors.ts +0 -66
  199. package/src/pages/functions/buildPlugin.ts +0 -110
  200. package/src/pages/functions/buildWorker.ts +0 -156
  201. package/src/pages/functions/filepath-routing.test.ts +0 -234
  202. package/src/pages/functions/filepath-routing.ts +0 -189
  203. package/src/pages/functions/identifiers.ts +0 -78
  204. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  205. package/src/pages/functions/routes-consolidation.ts +0 -73
  206. package/src/pages/functions/routes-transformation.test.ts +0 -282
  207. package/src/pages/functions/routes-transformation.ts +0 -115
  208. package/src/pages/functions/routes-validation.test.ts +0 -403
  209. package/src/pages/functions/routes-validation.ts +0 -202
  210. package/src/pages/functions/routes.ts +0 -151
  211. package/src/pages/functions.tsx +0 -82
  212. package/src/pages/hash.tsx +0 -13
  213. package/src/pages/index.tsx +0 -94
  214. package/src/pages/projects.tsx +0 -169
  215. package/src/pages/publish.tsx +0 -436
  216. package/src/pages/types.ts +0 -49
  217. package/src/pages/upload.tsx +0 -425
  218. package/src/pages/utils.ts +0 -12
  219. package/src/parse.ts +0 -286
  220. package/src/paths.ts +0 -71
  221. package/src/proxy.ts +0 -689
  222. package/src/publish/index.ts +0 -270
  223. package/src/publish/publish.ts +0 -1035
  224. package/src/pubsub/index.ts +0 -286
  225. package/src/pubsub/pubsub-commands.tsx +0 -624
  226. package/src/queues/cli/commands/consumer/add.ts +0 -71
  227. package/src/queues/cli/commands/consumer/index.ts +0 -22
  228. package/src/queues/cli/commands/consumer/remove.ts +0 -38
  229. package/src/queues/cli/commands/create.ts +0 -25
  230. package/src/queues/cli/commands/delete.ts +0 -26
  231. package/src/queues/cli/commands/index.ts +0 -33
  232. package/src/queues/cli/commands/list.ts +0 -25
  233. package/src/queues/client.ts +0 -135
  234. package/src/r2/helpers.ts +0 -131
  235. package/src/r2/index.ts +0 -277
  236. package/src/routes.ts +0 -140
  237. package/src/secret/index.ts +0 -379
  238. package/src/selfsigned.d.ts +0 -29
  239. package/src/sites.tsx +0 -372
  240. package/src/tail/createTail.ts +0 -315
  241. package/src/tail/filters.ts +0 -277
  242. package/src/tail/index.ts +0 -214
  243. package/src/tail/printing.ts +0 -107
  244. package/src/type-generation.ts +0 -159
  245. package/src/update-check.ts +0 -19
  246. package/src/user/access.ts +0 -69
  247. package/src/user/choose-account.tsx +0 -69
  248. package/src/user/env-vars.ts +0 -46
  249. package/src/user/generate-auth-url.ts +0 -33
  250. package/src/user/generate-random-state.ts +0 -16
  251. package/src/user/index.ts +0 -3
  252. package/src/user/user.tsx +0 -1192
  253. package/src/utils/collectKeyValues.ts +0 -14
  254. package/src/whoami.tsx +0 -169
  255. package/src/worker.ts +0 -242
  256. package/src/yargs-types.ts +0 -20
  257. package/src/zones.ts +0 -191
  258. package/templates/d1-beta-facade.js +0 -174
  259. package/templates/experimental-local-cache-stubs.js +0 -27
  260. package/templates/first-party-worker-module-facade.ts +0 -18
  261. package/templates/format-dev-errors.ts +0 -32
  262. package/templates/serve-static-assets.ts +0 -63
  263. package/templates/service-bindings-module-facade.js +0 -54
  264. package/templates/service-bindings-sw-facade.js +0 -42
@@ -1,25 +1,17 @@
1
- // // This loads all middlewares exposed on the middleware object
2
- // // and then starts the invocation chain.
3
- // // The big idea is that we can add these to the middleware export dynamically
4
- // // through wrangler, or we can potentially let users directly add them as a sort
5
- // // of "plugin" system.
1
+ // This loads all middlewares exposed on the middleware object and then starts
2
+ // the invocation chain. The big idea is that we can add these to the middleware
3
+ // export dynamically through wrangler, or we can potentially let users directly
4
+ // add them as a sort of "plugin" system.
6
5
 
7
- import {
8
- Dispatcher,
9
- Middleware,
10
- __facade_invoke__,
11
- __facade_register__,
12
- } from "./common";
6
+ import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "__ENTRY_POINT__";
7
+ import { __facade_invoke__, __facade_register__, Dispatcher } from "./common";
8
+ import type { WorkerEntrypointConstructor } from "__ENTRY_POINT__";
13
9
 
14
- // @ts-expect-error We'll swap in the entry point during build
15
- import worker from "__ENTRY_POINT__";
16
-
17
- // We need to preserve all of the exports from the worker
18
- // @ts-expect-error We'll swap in the entry point during build
10
+ // Preserve all the exports from the worker
19
11
  export * from "__ENTRY_POINT__";
20
12
 
21
13
  class __Facade_ScheduledController__ implements ScheduledController {
22
- #noRetry: ScheduledController["noRetry"];
14
+ readonly #noRetry: ScheduledController["noRetry"];
23
15
 
24
16
  constructor(
25
17
  readonly scheduledTime: number,
@@ -38,20 +30,34 @@ class __Facade_ScheduledController__ implements ScheduledController {
38
30
  }
39
31
  }
40
32
 
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
43
- return worker.fetch(request, env, ctx);
44
- };
33
+ function wrapExportedHandler(worker: ExportedHandler): ExportedHandler {
34
+ // If we don't have any middleware defined, just return the handler as is
35
+ if (
36
+ __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
37
+ __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
38
+ ) {
39
+ return worker;
40
+ }
41
+ // Otherwise, register all middleware once
42
+ for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
43
+ __facade_register__(middleware);
44
+ }
45
45
 
46
- const facade: ExportedHandler<unknown> = {
47
- fetch(request, env, ctx) {
48
- // Get the chain of middleware from the worker object
49
- if (worker.middleware && worker.middleware.length > 0) {
50
- for (const middleware of worker.middleware) {
51
- __facade_register__(middleware);
52
- }
46
+ const fetchDispatcher: ExportedHandlerFetchHandler = function (
47
+ request,
48
+ env,
49
+ ctx
50
+ ) {
51
+ if (worker.fetch === undefined) {
52
+ throw new Error("Handler does not export a fetch() function.");
53
+ }
54
+ return worker.fetch(request, env, ctx);
55
+ };
53
56
 
54
- const __facade_modules_dispatch__: Dispatcher = function (type, init) {
57
+ return {
58
+ ...worker,
59
+ fetch(request, env, ctx) {
60
+ const dispatcher: Dispatcher = function (type, init) {
55
61
  if (type === "scheduled" && worker.scheduled !== undefined) {
56
62
  const controller = new __Facade_ScheduledController__(
57
63
  Date.now(),
@@ -61,24 +67,68 @@ const facade: ExportedHandler<unknown> = {
61
67
  return worker.scheduled(controller, env, ctx);
62
68
  }
63
69
  };
70
+ return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
71
+ },
72
+ };
73
+ }
64
74
 
75
+ function wrapWorkerEntrypoint(
76
+ klass: WorkerEntrypointConstructor
77
+ ): WorkerEntrypointConstructor {
78
+ // If we don't have any middleware defined, just return the handler as is
79
+ if (
80
+ __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
81
+ __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
82
+ ) {
83
+ return klass;
84
+ }
85
+ // Otherwise, register all middleware once
86
+ for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
87
+ __facade_register__(middleware);
88
+ }
89
+
90
+ // `extend`ing `klass` here so other RPC methods remain callable
91
+ return class extends klass {
92
+ #fetchDispatcher: ExportedHandlerFetchHandler<Record<string, unknown>> = (
93
+ request,
94
+ env,
95
+ ctx
96
+ ) => {
97
+ this.env = env;
98
+ this.ctx = ctx;
99
+ if (super.fetch === undefined) {
100
+ throw new Error("Entrypoint class does not define a fetch() function.");
101
+ }
102
+ return super.fetch(request);
103
+ };
104
+
105
+ #dispatcher: Dispatcher = (type, init) => {
106
+ if (type === "scheduled" && super.scheduled !== undefined) {
107
+ const controller = new __Facade_ScheduledController__(
108
+ Date.now(),
109
+ init.cron ?? "",
110
+ () => {}
111
+ );
112
+ return super.scheduled(controller);
113
+ }
114
+ };
115
+
116
+ fetch(request: Request<unknown, IncomingRequestCfProperties>) {
65
117
  return __facade_invoke__(
66
118
  request,
67
- env,
68
- ctx,
69
- __facade_modules_dispatch__,
70
- __facade_modules_fetch__
119
+ this.env,
120
+ this.ctx,
121
+ this.#dispatcher,
122
+ this.#fetchDispatcher
71
123
  );
72
- } else {
73
- // We didn't have any middleware so we can skip the invocation chain,
74
- // and just call the fetch handler directly
75
-
76
- // We "don't care" if this is undefined as we want to have the same behaviour
77
- // as if the worker completely bypassed middleware.
78
- return worker.fetch!(request, env, ctx);
79
124
  }
80
- },
81
- scheduled: worker.scheduled,
82
- };
125
+ };
126
+ }
83
127
 
84
- export default facade;
128
+ let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;
129
+ if (typeof ENTRY === "object") {
130
+ WRAPPED_ENTRY = wrapExportedHandler(ENTRY);
131
+ } else if (typeof ENTRY === "function") {
132
+ WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);
133
+ }
134
+ export default WRAPPED_ENTRY;
@@ -1,8 +1,17 @@
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
+ __facade_invoke__,
3
+ __facade_register__,
4
+ __facade_registerInternal__,
5
+ Awaitable,
6
+ Dispatcher,
7
+ IncomingRequest,
8
+ Middleware,
9
+ } from "./common";
10
+
11
+ export { __facade_register__, __facade_registerInternal__ };
12
+
13
+ // Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to
14
+ // be caught by `dispatchEvent`. Instead it has a custom `ThrowingEventTarget`
6
15
  // class that rethrows errors from event listeners in `dispatchEvent`.
7
16
  // We'd like errors to be propagated to the top-level `addEventListener`, so
8
17
  // we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
@@ -15,45 +24,52 @@ if ((globalThis as any).MINIFLARE) {
15
24
  __FACADE_EVENT_TARGET__ = new EventTarget();
16
25
  }
17
26
 
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) {
27
+ function __facade_isSpecialEvent__(
28
+ type: string
29
+ ): type is "fetch" | "scheduled" {
33
30
  return type === "fetch" || type === "scheduled";
34
31
  }
35
- globalThis.__facade_addEventListener__ = function (type, listener, options) {
32
+ const __facade__originalAddEventListener__ = globalThis.addEventListener;
33
+ const __facade__originalRemoveEventListener__ = globalThis.removeEventListener;
34
+ const __facade__originalDispatchEvent__ = globalThis.dispatchEvent;
35
+
36
+ globalThis.addEventListener = function (type, listener, options) {
36
37
  if (__facade_isSpecialEvent__(type)) {
37
- __FACADE_EVENT_TARGET__.addEventListener(type, listener, options);
38
+ __FACADE_EVENT_TARGET__.addEventListener(
39
+ type,
40
+ listener as EventListenerOrEventListenerObject,
41
+ options
42
+ );
38
43
  } else {
39
- globalThis.addEventListener(type as any, listener, options);
44
+ __facade__originalAddEventListener__(type, listener, options);
40
45
  }
41
46
  };
42
- globalThis.__facade_removeEventListener__ = function (type, listener, options) {
47
+ globalThis.removeEventListener = function (type, listener, options) {
43
48
  if (__facade_isSpecialEvent__(type)) {
44
- __FACADE_EVENT_TARGET__.removeEventListener(type, listener, options);
49
+ __FACADE_EVENT_TARGET__.removeEventListener(
50
+ type,
51
+ listener as EventListenerOrEventListenerObject,
52
+ options
53
+ );
45
54
  } else {
46
- globalThis.removeEventListener(type as any, listener, options);
55
+ __facade__originalRemoveEventListener__(type, listener, options);
47
56
  }
48
57
  };
49
- globalThis.__facade_dispatchEvent__ = function (event) {
58
+ globalThis.dispatchEvent = function (event) {
50
59
  if (__facade_isSpecialEvent__(event.type)) {
51
- __FACADE_EVENT_TARGET__.dispatchEvent(event);
60
+ return __FACADE_EVENT_TARGET__.dispatchEvent(event);
52
61
  } else {
53
- globalThis.dispatchEvent(event as any);
62
+ return __facade__originalDispatchEvent__(event);
54
63
  }
55
64
  };
56
65
 
66
+ declare global {
67
+ var addMiddleware: typeof __facade_register__;
68
+ var addMiddlewareInternal: typeof __facade_registerInternal__;
69
+ }
70
+ globalThis.addMiddleware = __facade_register__;
71
+ globalThis.addMiddlewareInternal = __facade_registerInternal__;
72
+
57
73
  const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
58
74
  const __facade_response__ = Symbol("__facade_response__");
59
75
  const __facade_dispatched__ = Symbol("__facade_dispatched__");
@@ -154,7 +170,7 @@ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
154
170
  }
155
171
  }
156
172
 
157
- globalThis.addEventListener("fetch", (event) => {
173
+ __facade__originalAddEventListener__("fetch", (event) => {
158
174
  const ctx: ExecutionContext = {
159
175
  waitUntil: event.waitUntil.bind(event),
160
176
  passThroughOnException: event.passThroughOnException.bind(event),
@@ -192,7 +208,7 @@ globalThis.addEventListener("fetch", (event) => {
192
208
 
193
209
  event.respondWith(
194
210
  __facade_invoke__(
195
- event.request,
211
+ event.request as IncomingRequest,
196
212
  globalThis,
197
213
  ctx,
198
214
  __facade_sw_dispatch__,
@@ -201,7 +217,7 @@ globalThis.addEventListener("fetch", (event) => {
201
217
  );
202
218
  });
203
219
 
204
- globalThis.addEventListener("scheduled", (event) => {
220
+ __facade__originalAddEventListener__("scheduled", (event) => {
205
221
  const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
206
222
  scheduledTime: event.scheduledTime,
207
223
  cron: event.cron,
@@ -0,0 +1,18 @@
1
+ import type { Middleware } from "./common";
2
+
3
+ const drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {
4
+ try {
5
+ return await middlewareCtx.next(request, env);
6
+ } finally {
7
+ try {
8
+ if (request.body !== null && !request.bodyUsed) {
9
+ const reader = request.body.getReader();
10
+ while (!(await reader.read()).done) {}
11
+ }
12
+ } catch (e) {
13
+ console.error("Failed to drain the unused request body.", e);
14
+ }
15
+ }
16
+ };
17
+
18
+ export default drainBody;
@@ -0,0 +1,32 @@
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;
@@ -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 manifest from "__STATIC_CONTENT_MANIFEST";
4
+ import {
5
+ getAssetFromKV,
6
+ MethodNotAllowedError,
7
+ NotFoundError,
8
+ serveSinglePageApp,
9
+ } from "@cloudflare/kv-asset-handler";
10
+ import { cacheControl, spaMode } from "config:middleware/serve-static-assets";
11
+ import type { Middleware } from "./common";
12
+ import type { Options } from "@cloudflare/kv-asset-handler";
13
+ import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
14
+
15
+ const ASSET_MANIFEST = JSON.parse(manifest);
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 {
@@ -1,13 +1,14 @@
1
1
  // @ts-ignore entry point will get replaced
2
2
  import worker from "__ENTRY_POINT__";
3
+ import { isRoutingRuleMatch } from "./pages-dev-util";
4
+
3
5
  // @ts-ignore entry point will get replaced
4
6
  export * from "__ENTRY_POINT__";
5
- import { isRoutingRuleMatch } from "./pages-dev-util";
6
7
 
7
8
  // @ts-ignore routes are injected
8
9
  const routes = __ROUTES__;
9
10
 
10
- export default {
11
+ export default <ExportedHandler<{ ASSETS: Fetcher }>>{
11
12
  fetch(request, env, context) {
12
13
  const { pathname } = new URL(request.url);
13
14
 
@@ -19,6 +20,9 @@ export default {
19
20
 
20
21
  for (const include of routes.include) {
21
22
  if (isRoutingRuleMatch(pathname, include)) {
23
+ if (worker.fetch === undefined) {
24
+ throw new TypeError("Entry point missing `fetch` handler");
25
+ }
22
26
  return worker.fetch(request, env, context);
23
27
  }
24
28
  }
@@ -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);
@@ -41,14 +41,14 @@ type EventPluginContext<Env, P extends string, Data, PluginArgs> = {
41
41
  declare type PagesFunction<
42
42
  Env = unknown,
43
43
  P extends string = string,
44
- Data extends Record<string, unknown> = Record<string, unknown>
44
+ Data extends Record<string, unknown> = Record<string, unknown>,
45
45
  > = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
46
46
 
47
47
  declare type PagesPluginFunction<
48
48
  Env = unknown,
49
49
  P extends string = string,
50
50
  Data extends Record<string, unknown> = Record<string, unknown>,
51
- PluginArgs = unknown
51
+ PluginArgs = unknown,
52
52
  > = (
53
53
  context: EventPluginContext<Env, P, Data, PluginArgs>
54
54
  ) => Response | Promise<Response>;
@@ -119,20 +119,26 @@ function* executeRequest(request: Request, relativePathname: string) {
119
119
  }
120
120
  }
121
121
 
122
- export default function (pluginArgs) {
122
+ export default function (pluginArgs: unknown) {
123
123
  const onRequest: PagesPluginFunction = async (workerContext) => {
124
124
  let { request } = workerContext;
125
- const { env, next, data } = workerContext;
125
+ const { env, next } = workerContext;
126
+ let { data } = workerContext;
126
127
 
127
128
  const url = new URL(request.url);
129
+ // TODO: Replace this with something actually legible.
128
130
  const relativePathname = `/${
129
- url.pathname.split(workerContext.functionPath)[1] || ""
131
+ url.pathname.replace(workerContext.functionPath, "") || ""
130
132
  }`.replace(/^\/\//, "/");
131
133
 
132
134
  const handlerIterator = executeRequest(request, relativePathname);
133
135
  const pluginNext = async (input?: RequestInfo, init?: RequestInit) => {
134
136
  if (input !== undefined) {
135
- request = new Request(input, init);
137
+ let url = input;
138
+ if (typeof input === "string") {
139
+ url = new URL(input, request.url).toString();
140
+ }
141
+ request = new Request(url, init);
136
142
  }
137
143
 
138
144
  const result = handlerIterator.next();
@@ -140,11 +146,20 @@ export default function (pluginArgs) {
140
146
  if (result.done === false) {
141
147
  const { handler, params, path } = result.value;
142
148
  const context = {
143
- request,
149
+ request: new Request(request.clone()),
144
150
  functionPath: workerContext.functionPath + path,
145
151
  next: pluginNext,
146
152
  params,
147
- data,
153
+ get data() {
154
+ return data;
155
+ },
156
+ set data(value) {
157
+ if (typeof value !== "object" || value === null) {
158
+ throw new Error("context.data must be an object");
159
+ }
160
+ // user has overriden context.data, so we need to merge it with the existing data
161
+ data = value;
162
+ },
148
163
  pluginArgs,
149
164
  env,
150
165
  waitUntil: workerContext.waitUntil.bind(workerContext),
@@ -154,13 +169,9 @@ export default function (pluginArgs) {
154
169
 
155
170
  const response = await handler(context);
156
171
 
157
- // https://fetch.spec.whatwg.org/#null-body-status
158
- return new Response(
159
- [101, 204, 205, 304].includes(response.status) ? null : response.body,
160
- { ...response, headers: new Headers(response.headers) }
161
- );
172
+ return cloneResponse(response);
162
173
  } else {
163
- return next();
174
+ return next(request);
164
175
  }
165
176
  };
166
177
 
@@ -169,3 +180,11 @@ export default function (pluginArgs) {
169
180
 
170
181
  return onRequest;
171
182
  }
183
+
184
+ // This makes a Response mutable
185
+ const cloneResponse = (response: Response) =>
186
+ // https://fetch.spec.whatwg.org/#null-body-status
187
+ new Response(
188
+ [101, 204, 205, 304].includes(response.status) ? null : response.body,
189
+ response
190
+ );
@@ -29,7 +29,7 @@ type EventContext<Env, P extends string, Data> = {
29
29
  declare type PagesFunction<
30
30
  Env = unknown,
31
31
  P extends string = string,
32
- Data extends Record<string, unknown> = Record<string, unknown>
32
+ Data extends Record<string, unknown> = Record<string, unknown>,
33
33
  > = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
34
34
  /* end @cloudflare/workers-types */
35
35
 
@@ -120,7 +120,7 @@ export default {
120
120
  ) {
121
121
  let request = originalRequest;
122
122
  const handlerIterator = executeRequest(request);
123
- const data = {}; // arbitrary data the user can set between functions
123
+ let data = {}; // arbitrary data the user can set between functions
124
124
  let isFailOpen = false;
125
125
 
126
126
  const next = async (input?: RequestInfo, init?: RequestInit) => {
@@ -141,7 +141,16 @@ export default {
141
141
  functionPath: path,
142
142
  next,
143
143
  params,
144
- data,
144
+ get data() {
145
+ return data;
146
+ },
147
+ set data(value) {
148
+ if (typeof value !== "object" || value === null) {
149
+ throw new Error("context.data must be an object");
150
+ }
151
+ // user has overriden context.data, so we need to merge it with the existing data
152
+ data = value;
153
+ },
145
154
  env,
146
155
  waitUntil: workerContext.waitUntil.bind(workerContext),
147
156
  passThroughOnException: () => {