wrangler 0.0.0-e88a54e → 0.0.0-e89ee2a5

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 (174) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +47 -16
  3. package/bin/wrangler.js +123 -32
  4. package/kv-asset-handler.js +1 -0
  5. package/package.json +168 -86
  6. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  7. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  8. package/templates/__tests__/tsconfig.json +8 -0
  9. package/templates/checked-fetch.js +30 -0
  10. package/templates/facade.d.ts +17 -0
  11. package/templates/gitignore +167 -0
  12. package/templates/init-tests/test-jest-new-worker.js +23 -0
  13. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  14. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  15. package/templates/middleware/common.ts +67 -0
  16. package/templates/middleware/loader-modules.ts +136 -0
  17. package/templates/middleware/loader-sw.ts +229 -0
  18. package/templates/middleware/middleware-d1-beta.d.ts +3 -0
  19. package/templates/middleware/middleware-ensure-req-body-drained.ts +19 -0
  20. package/templates/middleware/middleware-miniflare3-json-error.ts +33 -0
  21. package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
  22. package/templates/middleware/middleware-multiworker-dev.ts +68 -0
  23. package/templates/middleware/middleware-pretty-error.ts +40 -0
  24. package/templates/middleware/middleware-scheduled.ts +15 -0
  25. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  26. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  27. package/templates/modules-watch-stub.js +4 -0
  28. package/templates/new-worker-scheduled.js +17 -0
  29. package/templates/new-worker-scheduled.ts +32 -0
  30. package/templates/new-worker.js +3 -3
  31. package/templates/new-worker.ts +22 -4
  32. package/templates/no-op-worker.js +10 -0
  33. package/templates/pages-dev-pipeline.ts +32 -0
  34. package/templates/pages-dev-util.ts +55 -0
  35. package/templates/pages-shim.ts +9 -0
  36. package/templates/pages-template-plugin.ts +190 -0
  37. package/templates/pages-template-worker.ts +198 -0
  38. package/templates/startDevWorker/InspectorProxyWorker.ts +661 -0
  39. package/templates/startDevWorker/ProxyWorker.ts +326 -0
  40. package/templates/tsconfig-sanity.ts +11 -0
  41. package/templates/tsconfig.init.json +105 -0
  42. package/templates/tsconfig.json +6 -103
  43. package/wrangler-dist/InspectorProxyWorker.js +464 -0
  44. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  45. package/wrangler-dist/ProxyWorker.js +237 -0
  46. package/wrangler-dist/ProxyWorker.js.map +6 -0
  47. package/wrangler-dist/cli.d.ts +23948 -0
  48. package/wrangler-dist/cli.js +164439 -134006
  49. package/wrangler-dist/wasm-sync.wasm +0 -0
  50. package/import_meta_url.js +0 -3
  51. package/miniflare-config-stubs/.env.empty +0 -0
  52. package/miniflare-config-stubs/package.empty.json +0 -1
  53. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  54. package/miniflare-dist/index.mjs +0 -79
  55. package/miniflare-dist/index.mjs.map +0 -7
  56. package/pages/functions/buildWorker.ts +0 -62
  57. package/pages/functions/filepath-routing.test.ts +0 -223
  58. package/pages/functions/filepath-routing.ts +0 -181
  59. package/pages/functions/identifiers.ts +0 -78
  60. package/pages/functions/routes.ts +0 -151
  61. package/pages/functions/template-worker.ts +0 -130
  62. package/src/__tests__/configuration.test.ts +0 -2796
  63. package/src/__tests__/dev.test.tsx +0 -496
  64. package/src/__tests__/dev2.test.tsx +0 -154
  65. package/src/__tests__/guess-worker-format.test.ts +0 -58
  66. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  67. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  68. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  69. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  70. package/src/__tests__/helpers/mock-bin.ts +0 -36
  71. package/src/__tests__/helpers/mock-cfetch.ts +0 -207
  72. package/src/__tests__/helpers/mock-console.ts +0 -70
  73. package/src/__tests__/helpers/mock-dialogs.ts +0 -65
  74. package/src/__tests__/helpers/mock-kv.ts +0 -33
  75. package/src/__tests__/helpers/mock-stdin.ts +0 -103
  76. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  77. package/src/__tests__/helpers/run-in-tmp.ts +0 -32
  78. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  79. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  80. package/src/__tests__/https-options.test.ts +0 -127
  81. package/src/__tests__/index.test.ts +0 -991
  82. package/src/__tests__/jest.setup.ts +0 -69
  83. package/src/__tests__/kv.test.ts +0 -1382
  84. package/src/__tests__/logout.test.ts +0 -52
  85. package/src/__tests__/package-manager.test.ts +0 -206
  86. package/src/__tests__/pages.test.ts +0 -44
  87. package/src/__tests__/parse.test.ts +0 -322
  88. package/src/__tests__/publish.test.ts +0 -2704
  89. package/src/__tests__/r2.test.ts +0 -198
  90. package/src/__tests__/route.test.ts +0 -45
  91. package/src/__tests__/secret.test.ts +0 -425
  92. package/src/__tests__/sentry.test.ts +0 -146
  93. package/src/__tests__/tail.test.ts +0 -564
  94. package/src/__tests__/whoami.test.tsx +0 -100
  95. package/src/bundle.ts +0 -142
  96. package/src/cfetch/index.ts +0 -104
  97. package/src/cfetch/internal.ts +0 -139
  98. package/src/cli.ts +0 -19
  99. package/src/config/README.md +0 -107
  100. package/src/config/config.ts +0 -218
  101. package/src/config/diagnostics.ts +0 -80
  102. package/src/config/environment.ts +0 -366
  103. package/src/config/index.ts +0 -62
  104. package/src/config/validation-helpers.ts +0 -486
  105. package/src/config/validation.ts +0 -1090
  106. package/src/create-worker-preview.ts +0 -166
  107. package/src/create-worker-upload-form.ts +0 -217
  108. package/src/dev/dev.tsx +0 -364
  109. package/src/dev/local.tsx +0 -232
  110. package/src/dev/remote.tsx +0 -203
  111. package/src/dev/use-esbuild.ts +0 -100
  112. package/src/dialogs.tsx +0 -77
  113. package/src/entry.ts +0 -208
  114. package/src/environment-variables.ts +0 -33
  115. package/src/https-options.ts +0 -122
  116. package/src/index.tsx +0 -2373
  117. package/src/inspect.ts +0 -617
  118. package/src/kv.ts +0 -319
  119. package/src/miniflare-cli/README.md +0 -30
  120. package/src/miniflare-cli/enum-keys.ts +0 -17
  121. package/src/miniflare-cli/index.ts +0 -37
  122. package/src/module-collection.ts +0 -258
  123. package/src/open-in-browser.ts +0 -25
  124. package/src/package-manager.ts +0 -126
  125. package/src/pages.tsx +0 -1047
  126. package/src/parse.ts +0 -183
  127. package/src/paths.ts +0 -26
  128. package/src/proxy.ts +0 -440
  129. package/src/publish.ts +0 -347
  130. package/src/r2.ts +0 -50
  131. package/src/reporting.ts +0 -131
  132. package/src/selfsigned.d.ts +0 -29
  133. package/src/sites.tsx +0 -280
  134. package/src/tail/filters.ts +0 -279
  135. package/src/tail/index.ts +0 -299
  136. package/src/tail/printing.ts +0 -62
  137. package/src/user.tsx +0 -1118
  138. package/src/whoami.tsx +0 -69
  139. package/src/worker.ts +0 -163
  140. package/templates/static-asset-facade.js +0 -47
  141. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  142. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  143. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  144. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  145. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  146. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  147. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  148. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  149. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  150. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  151. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  152. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  153. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  154. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  155. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  156. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  157. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  158. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  159. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  160. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  161. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  162. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  163. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  164. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  165. package/vendor/wrangler-mime/LICENSE +0 -21
  166. package/vendor/wrangler-mime/Mime.js +0 -97
  167. package/vendor/wrangler-mime/README.md +0 -187
  168. package/vendor/wrangler-mime/cli.js +0 -46
  169. package/vendor/wrangler-mime/index.js +0 -4
  170. package/vendor/wrangler-mime/lite.js +0 -4
  171. package/vendor/wrangler-mime/package.json +0 -52
  172. package/vendor/wrangler-mime/types/other.js +0 -1
  173. package/vendor/wrangler-mime/types/standard.js +0 -1
  174. package/wrangler-dist/cli.js.map +0 -7
@@ -0,0 +1,229 @@
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`
15
+ // class that rethrows errors from event listeners in `dispatchEvent`.
16
+ // We'd like errors to be propagated to the top-level `addEventListener`, so
17
+ // we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
18
+ // isn't exposed on the global scope, but `WorkerGlobalScope` (which extends
19
+ // `ThrowingEventTarget`) is. Therefore, we get at it in this nasty way.
20
+ let __FACADE_EVENT_TARGET__: EventTarget;
21
+ if ((globalThis as any).MINIFLARE) {
22
+ __FACADE_EVENT_TARGET__ = new (Object.getPrototypeOf(WorkerGlobalScope))();
23
+ } else {
24
+ __FACADE_EVENT_TARGET__ = new EventTarget();
25
+ }
26
+
27
+ function __facade_isSpecialEvent__(
28
+ type: string
29
+ ): type is "fetch" | "scheduled" {
30
+ return type === "fetch" || type === "scheduled";
31
+ }
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) {
37
+ if (__facade_isSpecialEvent__(type)) {
38
+ __FACADE_EVENT_TARGET__.addEventListener(
39
+ type,
40
+ listener as EventListenerOrEventListenerObject,
41
+ options
42
+ );
43
+ } else {
44
+ __facade__originalAddEventListener__(type, listener, options);
45
+ }
46
+ };
47
+ globalThis.removeEventListener = function (type, listener, options) {
48
+ if (__facade_isSpecialEvent__(type)) {
49
+ __FACADE_EVENT_TARGET__.removeEventListener(
50
+ type,
51
+ listener as EventListenerOrEventListenerObject,
52
+ options
53
+ );
54
+ } else {
55
+ __facade__originalRemoveEventListener__(type, listener, options);
56
+ }
57
+ };
58
+ globalThis.dispatchEvent = function (event) {
59
+ if (__facade_isSpecialEvent__(event.type)) {
60
+ return __FACADE_EVENT_TARGET__.dispatchEvent(event);
61
+ } else {
62
+ return __facade__originalDispatchEvent__(event);
63
+ }
64
+ };
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
+
73
+ const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
74
+ const __facade_response__ = Symbol("__facade_response__");
75
+ const __facade_dispatched__ = Symbol("__facade_dispatched__");
76
+
77
+ class __Facade_ExtendableEvent__ extends Event {
78
+ [__facade_waitUntil__]: Awaitable<unknown>[] = [];
79
+
80
+ waitUntil(promise: Awaitable<any>) {
81
+ if (!(this instanceof __Facade_ExtendableEvent__)) {
82
+ throw new TypeError("Illegal invocation");
83
+ }
84
+ this[__facade_waitUntil__].push(promise);
85
+ }
86
+ }
87
+
88
+ interface FetchEventInit extends EventInit {
89
+ request: Request;
90
+ passThroughOnException: FetchEvent["passThroughOnException"];
91
+ }
92
+
93
+ class __Facade_FetchEvent__ extends __Facade_ExtendableEvent__ {
94
+ #request: Request;
95
+ #passThroughOnException: FetchEvent["passThroughOnException"];
96
+ [__facade_response__]?: Awaitable<Response>;
97
+ [__facade_dispatched__] = false;
98
+
99
+ constructor(type: "fetch", init: FetchEventInit) {
100
+ super(type);
101
+ this.#request = init.request;
102
+ this.#passThroughOnException = init.passThroughOnException;
103
+ }
104
+
105
+ get request() {
106
+ return this.#request;
107
+ }
108
+
109
+ respondWith(response: Awaitable<Response>) {
110
+ if (!(this instanceof __Facade_FetchEvent__)) {
111
+ throw new TypeError("Illegal invocation");
112
+ }
113
+ if (this[__facade_response__] !== undefined) {
114
+ throw new DOMException(
115
+ "FetchEvent.respondWith() has already been called; it can only be called once.",
116
+ "InvalidStateError"
117
+ );
118
+ }
119
+ if (this[__facade_dispatched__]) {
120
+ throw new DOMException(
121
+ "Too late to call FetchEvent.respondWith(). It must be called synchronously in the event handler.",
122
+ "InvalidStateError"
123
+ );
124
+ }
125
+ this.stopImmediatePropagation();
126
+ this[__facade_response__] = response;
127
+ }
128
+
129
+ passThroughOnException() {
130
+ if (!(this instanceof __Facade_FetchEvent__)) {
131
+ throw new TypeError("Illegal invocation");
132
+ }
133
+ // Need to call native method immediately in case uncaught error thrown
134
+ this.#passThroughOnException();
135
+ }
136
+ }
137
+
138
+ interface ScheduledEventInit extends EventInit {
139
+ scheduledTime: number;
140
+ cron: string;
141
+ noRetry: ScheduledEvent["noRetry"];
142
+ }
143
+
144
+ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
145
+ #scheduledTime: number;
146
+ #cron: string;
147
+ #noRetry: ScheduledEvent["noRetry"];
148
+
149
+ constructor(type: "scheduled", init: ScheduledEventInit) {
150
+ super(type);
151
+ this.#scheduledTime = init.scheduledTime;
152
+ this.#cron = init.cron;
153
+ this.#noRetry = init.noRetry;
154
+ }
155
+
156
+ get scheduledTime() {
157
+ return this.#scheduledTime;
158
+ }
159
+
160
+ get cron() {
161
+ return this.#cron;
162
+ }
163
+
164
+ noRetry() {
165
+ if (!(this instanceof __Facade_ScheduledEvent__)) {
166
+ throw new TypeError("Illegal invocation");
167
+ }
168
+ // Need to call native method immediately in case uncaught error thrown
169
+ this.#noRetry();
170
+ }
171
+ }
172
+
173
+ __facade__originalAddEventListener__("fetch", (event) => {
174
+ const ctx: ExecutionContext = {
175
+ waitUntil: event.waitUntil.bind(event),
176
+ passThroughOnException: event.passThroughOnException.bind(event),
177
+ };
178
+
179
+ const __facade_sw_dispatch__: Dispatcher = function (type, init) {
180
+ if (type === "scheduled") {
181
+ const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
182
+ scheduledTime: Date.now(),
183
+ cron: init.cron ?? "",
184
+ noRetry() {},
185
+ });
186
+
187
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
188
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
189
+ }
190
+ };
191
+
192
+ const __facade_sw_fetch__: Middleware = function (request, _env, ctx) {
193
+ const facadeEvent = new __Facade_FetchEvent__("fetch", {
194
+ request,
195
+ passThroughOnException: ctx.passThroughOnException,
196
+ });
197
+
198
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
199
+ facadeEvent[__facade_dispatched__] = true;
200
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
201
+
202
+ const response = facadeEvent[__facade_response__];
203
+ if (response === undefined) {
204
+ throw new Error("No response!"); // TODO: proper error message
205
+ }
206
+ return response;
207
+ };
208
+
209
+ event.respondWith(
210
+ __facade_invoke__(
211
+ event.request as IncomingRequest,
212
+ globalThis,
213
+ ctx,
214
+ __facade_sw_dispatch__,
215
+ __facade_sw_fetch__
216
+ )
217
+ );
218
+ });
219
+
220
+ __facade__originalAddEventListener__("scheduled", (event) => {
221
+ const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
222
+ scheduledTime: event.scheduledTime,
223
+ cron: event.cron,
224
+ noRetry: event.noRetry.bind(event),
225
+ });
226
+
227
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
228
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
229
+ });
@@ -0,0 +1,3 @@
1
+ declare module "config:middleware/d1-beta" {
2
+ export const D1_IMPORTS: string[];
3
+ }
@@ -0,0 +1,19 @@
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;
19
+ export const wrap = undefined;
@@ -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,40 @@
1
+ import type { Middleware } from "./common";
2
+
3
+ // A middleware has to be a function of type Middleware
4
+ const prettyError: Middleware = async (request, env, _ctx, middlewareCtx) => {
5
+ try {
6
+ const response = await middlewareCtx.next(request, env);
7
+ return response;
8
+ } catch (e: any) {
9
+ const html = `
10
+ <!DOCTYPE html>
11
+ <html lang="en">
12
+ <head>
13
+ <meta charset="UTF-8">
14
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
15
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
+ <title>Error 🚨</title>
17
+ <style>
18
+ pre {
19
+ margin: 16px auto;
20
+ max-width: 600px;
21
+ background-color: #eeeeee;
22
+ border-radius: 4px;
23
+ padding: 16px;
24
+ }
25
+ </style>
26
+ </head>
27
+ <body>
28
+ <pre>${e.stack}</pre>
29
+ </body>
30
+ </html>
31
+ `;
32
+
33
+ return new Response(html, {
34
+ status: 500,
35
+ headers: { "Content-Type": "text/html;charset=utf-8" },
36
+ });
37
+ }
38
+ };
39
+
40
+ export default prettyError;
@@ -0,0 +1,15 @@
1
+ import type { Middleware } from "./common";
2
+
3
+ // A middleware has to be a function of type Middleware
4
+ const scheduled: Middleware = async (request, env, _ctx, middlewareCtx) => {
5
+ const url = new URL(request.url);
6
+ if (url.pathname === "/__scheduled") {
7
+ const cron = url.searchParams.get("cron") ?? "";
8
+ await middlewareCtx.dispatch("scheduled", { cron });
9
+
10
+ return new Response("Ran scheduled event");
11
+ }
12
+ return middlewareCtx.next(request, env);
13
+ };
14
+
15
+ export default scheduled;
@@ -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";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Welcome to Cloudflare Workers! This is your first scheduled worker.
3
+ *
4
+ * - Run `wrangler dev --local` in your terminal to start a development server
5
+ * - Run `curl "http://localhost:8787/cdn-cgi/mf/scheduled"` to trigger the scheduled event
6
+ * - Go back to the console to see what your worker has logged
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
9
+ *
10
+ * Learn more at https://developers.cloudflare.com/workers/runtime-apis/scheduled-event/
11
+ */
12
+
13
+ export default {
14
+ async scheduled(controller, env, ctx) {
15
+ console.log(`Hello World!`);
16
+ },
17
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Welcome to Cloudflare Workers! This is your first scheduled worker.
3
+ *
4
+ * - Run `wrangler dev --local` in your terminal to start a development server
5
+ * - Run `curl "http://localhost:8787/cdn-cgi/mf/scheduled"` to trigger the scheduled event
6
+ * - Go back to the console to see what your worker has logged
7
+ * - Update the Cron trigger in wrangler.toml (see https://developers.cloudflare.com/workers/wrangler/configuration/#triggers)
8
+ * - Run `wrangler deploy --name my-worker` to deploy your worker
9
+ *
10
+ * Learn more at https://developers.cloudflare.com/workers/runtime-apis/scheduled-event/
11
+ */
12
+
13
+ export interface Env {
14
+ // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/
15
+ // MY_KV_NAMESPACE: KVNamespace;
16
+ //
17
+ // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
18
+ // MY_DURABLE_OBJECT: DurableObjectNamespace;
19
+ //
20
+ // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
21
+ // MY_BUCKET: R2Bucket;
22
+ }
23
+
24
+ export default {
25
+ async scheduled(
26
+ controller: ScheduledController,
27
+ env: Env,
28
+ ctx: ExecutionContext
29
+ ): Promise<void> {
30
+ console.log(`Hello World!`);
31
+ },
32
+ };
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  export default {
12
- async fetch(request) {
13
- return new Response("Hello World!");
14
- },
12
+ async fetch(request, env, ctx) {
13
+ return new Response("Hello World!");
14
+ },
15
15
  };
@@ -3,13 +3,31 @@
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
  */
10
10
 
11
+ export interface Env {
12
+ // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/
13
+ // MY_KV_NAMESPACE: KVNamespace;
14
+ //
15
+ // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
16
+ // MY_DURABLE_OBJECT: DurableObjectNamespace;
17
+ //
18
+ // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
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;
23
+ }
24
+
11
25
  export default {
12
- async fetch(request: Request): Promise<Response> {
13
- return new Response("Hello World!");
14
- },
26
+ async fetch(
27
+ request: Request,
28
+ env: Env,
29
+ ctx: ExecutionContext
30
+ ): Promise<Response> {
31
+ return new Response("Hello World!");
32
+ },
15
33
  };
@@ -0,0 +1,10 @@
1
+ export default {
2
+ fetch() {
3
+ return new Response("Not found", {
4
+ status: 404,
5
+ headers: {
6
+ "Content-Type": "text/html",
7
+ },
8
+ });
9
+ },
10
+ };
@@ -0,0 +1,32 @@
1
+ // @ts-ignore entry point will get replaced
2
+ import worker from "__ENTRY_POINT__";
3
+ import { isRoutingRuleMatch } from "./pages-dev-util";
4
+
5
+ // @ts-ignore entry point will get replaced
6
+ export * from "__ENTRY_POINT__";
7
+
8
+ // @ts-ignore routes are injected
9
+ const routes = __ROUTES__;
10
+
11
+ export default <ExportedHandler<{ ASSETS: Fetcher }>>{
12
+ fetch(request, env, context) {
13
+ const { pathname } = new URL(request.url);
14
+
15
+ for (const exclude of routes.exclude) {
16
+ if (isRoutingRuleMatch(pathname, exclude)) {
17
+ return env.ASSETS.fetch(request);
18
+ }
19
+ }
20
+
21
+ for (const include of routes.include) {
22
+ if (isRoutingRuleMatch(pathname, include)) {
23
+ if (worker.fetch === undefined) {
24
+ throw new TypeError("Entry point missing `fetch` handler");
25
+ }
26
+ return worker.fetch(request, env, context);
27
+ }
28
+ }
29
+
30
+ return env.ASSETS.fetch(request);
31
+ },
32
+ };