wrangler 0.0.0-e88a54e → 0.0.0-e8df68ee

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 (167) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +46 -15
  3. package/bin/wrangler.js +118 -32
  4. package/kv-asset-handler.js +1 -0
  5. package/package.json +194 -143
  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 +23 -0
  10. package/templates/facade.d.ts +17 -0
  11. package/templates/gitignore +172 -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 +127 -0
  17. package/templates/middleware/loader-sw.ts +228 -0
  18. package/templates/middleware/middleware-d1-beta.d.ts +3 -0
  19. package/templates/middleware/middleware-d1-beta.ts +244 -0
  20. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  21. package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
  22. package/templates/middleware/middleware-multiworker-dev.ts +59 -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/new-worker-scheduled.js +17 -0
  28. package/templates/new-worker-scheduled.ts +32 -0
  29. package/templates/new-worker.js +3 -3
  30. package/templates/new-worker.ts +22 -4
  31. package/templates/no-op-worker.js +10 -0
  32. package/templates/pages-dev-pipeline.ts +31 -0
  33. package/templates/pages-dev-util.ts +55 -0
  34. package/templates/pages-shim.ts +9 -0
  35. package/templates/pages-template-plugin.ts +190 -0
  36. package/templates/pages-template-worker.ts +198 -0
  37. package/templates/tsconfig-sanity.ts +11 -0
  38. package/templates/tsconfig.init.json +105 -0
  39. package/templates/tsconfig.json +6 -103
  40. package/wrangler-dist/cli.d.ts +1726 -0
  41. package/wrangler-dist/cli.js +134048 -126481
  42. package/wrangler-dist/wasm-sync.wasm +0 -0
  43. package/import_meta_url.js +0 -3
  44. package/miniflare-config-stubs/.env.empty +0 -0
  45. package/miniflare-config-stubs/package.empty.json +0 -1
  46. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  47. package/miniflare-dist/index.mjs +0 -79
  48. package/miniflare-dist/index.mjs.map +0 -7
  49. package/pages/functions/buildWorker.ts +0 -62
  50. package/pages/functions/filepath-routing.test.ts +0 -223
  51. package/pages/functions/filepath-routing.ts +0 -181
  52. package/pages/functions/identifiers.ts +0 -78
  53. package/pages/functions/routes.ts +0 -151
  54. package/pages/functions/template-worker.ts +0 -130
  55. package/src/__tests__/configuration.test.ts +0 -2796
  56. package/src/__tests__/dev.test.tsx +0 -496
  57. package/src/__tests__/dev2.test.tsx +0 -154
  58. package/src/__tests__/guess-worker-format.test.ts +0 -58
  59. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  60. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  61. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  62. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  63. package/src/__tests__/helpers/mock-bin.ts +0 -36
  64. package/src/__tests__/helpers/mock-cfetch.ts +0 -207
  65. package/src/__tests__/helpers/mock-console.ts +0 -70
  66. package/src/__tests__/helpers/mock-dialogs.ts +0 -65
  67. package/src/__tests__/helpers/mock-kv.ts +0 -33
  68. package/src/__tests__/helpers/mock-stdin.ts +0 -103
  69. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  70. package/src/__tests__/helpers/run-in-tmp.ts +0 -32
  71. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  72. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  73. package/src/__tests__/https-options.test.ts +0 -127
  74. package/src/__tests__/index.test.ts +0 -991
  75. package/src/__tests__/jest.setup.ts +0 -69
  76. package/src/__tests__/kv.test.ts +0 -1382
  77. package/src/__tests__/logout.test.ts +0 -52
  78. package/src/__tests__/package-manager.test.ts +0 -206
  79. package/src/__tests__/pages.test.ts +0 -44
  80. package/src/__tests__/parse.test.ts +0 -322
  81. package/src/__tests__/publish.test.ts +0 -2704
  82. package/src/__tests__/r2.test.ts +0 -198
  83. package/src/__tests__/route.test.ts +0 -45
  84. package/src/__tests__/secret.test.ts +0 -425
  85. package/src/__tests__/sentry.test.ts +0 -146
  86. package/src/__tests__/tail.test.ts +0 -564
  87. package/src/__tests__/whoami.test.tsx +0 -100
  88. package/src/bundle.ts +0 -142
  89. package/src/cfetch/index.ts +0 -104
  90. package/src/cfetch/internal.ts +0 -139
  91. package/src/cli.ts +0 -19
  92. package/src/config/README.md +0 -107
  93. package/src/config/config.ts +0 -218
  94. package/src/config/diagnostics.ts +0 -80
  95. package/src/config/environment.ts +0 -366
  96. package/src/config/index.ts +0 -62
  97. package/src/config/validation-helpers.ts +0 -486
  98. package/src/config/validation.ts +0 -1090
  99. package/src/create-worker-preview.ts +0 -166
  100. package/src/create-worker-upload-form.ts +0 -217
  101. package/src/dev/dev.tsx +0 -364
  102. package/src/dev/local.tsx +0 -232
  103. package/src/dev/remote.tsx +0 -203
  104. package/src/dev/use-esbuild.ts +0 -100
  105. package/src/dialogs.tsx +0 -77
  106. package/src/entry.ts +0 -208
  107. package/src/environment-variables.ts +0 -33
  108. package/src/https-options.ts +0 -122
  109. package/src/index.tsx +0 -2373
  110. package/src/inspect.ts +0 -617
  111. package/src/kv.ts +0 -319
  112. package/src/miniflare-cli/README.md +0 -30
  113. package/src/miniflare-cli/enum-keys.ts +0 -17
  114. package/src/miniflare-cli/index.ts +0 -37
  115. package/src/module-collection.ts +0 -258
  116. package/src/open-in-browser.ts +0 -25
  117. package/src/package-manager.ts +0 -126
  118. package/src/pages.tsx +0 -1047
  119. package/src/parse.ts +0 -183
  120. package/src/paths.ts +0 -26
  121. package/src/proxy.ts +0 -440
  122. package/src/publish.ts +0 -347
  123. package/src/r2.ts +0 -50
  124. package/src/reporting.ts +0 -131
  125. package/src/selfsigned.d.ts +0 -29
  126. package/src/sites.tsx +0 -280
  127. package/src/tail/filters.ts +0 -279
  128. package/src/tail/index.ts +0 -299
  129. package/src/tail/printing.ts +0 -62
  130. package/src/user.tsx +0 -1118
  131. package/src/whoami.tsx +0 -69
  132. package/src/worker.ts +0 -163
  133. package/templates/static-asset-facade.js +0 -47
  134. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  135. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  136. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  137. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  138. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  139. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  140. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  141. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  142. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  143. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  144. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  145. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  146. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  147. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  148. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  149. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  150. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  151. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  152. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  153. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  154. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  155. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  156. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  157. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  158. package/vendor/wrangler-mime/LICENSE +0 -21
  159. package/vendor/wrangler-mime/Mime.js +0 -97
  160. package/vendor/wrangler-mime/README.md +0 -187
  161. package/vendor/wrangler-mime/cli.js +0 -46
  162. package/vendor/wrangler-mime/index.js +0 -4
  163. package/vendor/wrangler-mime/lite.js +0 -4
  164. package/vendor/wrangler-mime/package.json +0 -52
  165. package/vendor/wrangler-mime/types/other.js +0 -1
  166. package/vendor/wrangler-mime/types/standard.js +0 -1
  167. package/wrangler-dist/cli.js.map +0 -7
@@ -0,0 +1,228 @@
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`
14
+ // class that rethrows errors from event listeners in `dispatchEvent`.
15
+ // We'd like errors to be propagated to the top-level `addEventListener`, so
16
+ // we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
17
+ // isn't exposed on the global scope, but `WorkerGlobalScope` (which extends
18
+ // `ThrowingEventTarget`) is. Therefore, we get at it in this nasty way.
19
+ let __FACADE_EVENT_TARGET__: EventTarget;
20
+ if ((globalThis as any).MINIFLARE) {
21
+ __FACADE_EVENT_TARGET__ = new (Object.getPrototypeOf(WorkerGlobalScope))();
22
+ } else {
23
+ __FACADE_EVENT_TARGET__ = new EventTarget();
24
+ }
25
+
26
+ function __facade_isSpecialEvent__(
27
+ type: string
28
+ ): type is "fetch" | "scheduled" {
29
+ return type === "fetch" || type === "scheduled";
30
+ }
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
+ if (__facade_isSpecialEvent__(type)) {
37
+ __FACADE_EVENT_TARGET__.addEventListener(
38
+ type,
39
+ listener as EventListenerOrEventListenerObject,
40
+ options
41
+ );
42
+ } else {
43
+ __facade__originalAddEventListener__(type, listener, options);
44
+ }
45
+ };
46
+ globalThis.removeEventListener = function (type, listener, options) {
47
+ if (__facade_isSpecialEvent__(type)) {
48
+ __FACADE_EVENT_TARGET__.removeEventListener(
49
+ type,
50
+ listener as EventListenerOrEventListenerObject,
51
+ options
52
+ );
53
+ } else {
54
+ __facade__originalRemoveEventListener__(type, listener, options);
55
+ }
56
+ };
57
+ globalThis.dispatchEvent = function (event) {
58
+ if (__facade_isSpecialEvent__(event.type)) {
59
+ return __FACADE_EVENT_TARGET__.dispatchEvent(event);
60
+ } else {
61
+ return __facade__originalDispatchEvent__(event);
62
+ }
63
+ };
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
+
72
+ const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
73
+ const __facade_response__ = Symbol("__facade_response__");
74
+ const __facade_dispatched__ = Symbol("__facade_dispatched__");
75
+
76
+ class __Facade_ExtendableEvent__ extends Event {
77
+ [__facade_waitUntil__]: Awaitable<unknown>[] = [];
78
+
79
+ waitUntil(promise: Awaitable<any>) {
80
+ if (!(this instanceof __Facade_ExtendableEvent__)) {
81
+ throw new TypeError("Illegal invocation");
82
+ }
83
+ this[__facade_waitUntil__].push(promise);
84
+ }
85
+ }
86
+
87
+ interface FetchEventInit extends EventInit {
88
+ request: Request;
89
+ passThroughOnException: FetchEvent["passThroughOnException"];
90
+ }
91
+
92
+ class __Facade_FetchEvent__ extends __Facade_ExtendableEvent__ {
93
+ #request: Request;
94
+ #passThroughOnException: FetchEvent["passThroughOnException"];
95
+ [__facade_response__]?: Awaitable<Response>;
96
+ [__facade_dispatched__] = false;
97
+
98
+ constructor(type: "fetch", init: FetchEventInit) {
99
+ super(type);
100
+ this.#request = init.request;
101
+ this.#passThroughOnException = init.passThroughOnException;
102
+ }
103
+
104
+ get request() {
105
+ return this.#request;
106
+ }
107
+
108
+ respondWith(response: Awaitable<Response>) {
109
+ if (!(this instanceof __Facade_FetchEvent__)) {
110
+ throw new TypeError("Illegal invocation");
111
+ }
112
+ if (this[__facade_response__] !== undefined) {
113
+ throw new DOMException(
114
+ "FetchEvent.respondWith() has already been called; it can only be called once.",
115
+ "InvalidStateError"
116
+ );
117
+ }
118
+ if (this[__facade_dispatched__]) {
119
+ throw new DOMException(
120
+ "Too late to call FetchEvent.respondWith(). It must be called synchronously in the event handler.",
121
+ "InvalidStateError"
122
+ );
123
+ }
124
+ this.stopImmediatePropagation();
125
+ this[__facade_response__] = response;
126
+ }
127
+
128
+ passThroughOnException() {
129
+ if (!(this instanceof __Facade_FetchEvent__)) {
130
+ throw new TypeError("Illegal invocation");
131
+ }
132
+ // Need to call native method immediately in case uncaught error thrown
133
+ this.#passThroughOnException();
134
+ }
135
+ }
136
+
137
+ interface ScheduledEventInit extends EventInit {
138
+ scheduledTime: number;
139
+ cron: string;
140
+ noRetry: ScheduledEvent["noRetry"];
141
+ }
142
+
143
+ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
144
+ #scheduledTime: number;
145
+ #cron: string;
146
+ #noRetry: ScheduledEvent["noRetry"];
147
+
148
+ constructor(type: "scheduled", init: ScheduledEventInit) {
149
+ super(type);
150
+ this.#scheduledTime = init.scheduledTime;
151
+ this.#cron = init.cron;
152
+ this.#noRetry = init.noRetry;
153
+ }
154
+
155
+ get scheduledTime() {
156
+ return this.#scheduledTime;
157
+ }
158
+
159
+ get cron() {
160
+ return this.#cron;
161
+ }
162
+
163
+ noRetry() {
164
+ if (!(this instanceof __Facade_ScheduledEvent__)) {
165
+ throw new TypeError("Illegal invocation");
166
+ }
167
+ // Need to call native method immediately in case uncaught error thrown
168
+ this.#noRetry();
169
+ }
170
+ }
171
+
172
+ __facade__originalAddEventListener__("fetch", (event) => {
173
+ const ctx: ExecutionContext = {
174
+ waitUntil: event.waitUntil.bind(event),
175
+ passThroughOnException: event.passThroughOnException.bind(event),
176
+ };
177
+
178
+ const __facade_sw_dispatch__: Dispatcher = function (type, init) {
179
+ if (type === "scheduled") {
180
+ const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
181
+ scheduledTime: Date.now(),
182
+ cron: init.cron ?? "",
183
+ noRetry() {},
184
+ });
185
+
186
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
187
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
188
+ }
189
+ };
190
+
191
+ const __facade_sw_fetch__: Middleware = function (request, _env, ctx) {
192
+ const facadeEvent = new __Facade_FetchEvent__("fetch", {
193
+ request,
194
+ passThroughOnException: ctx.passThroughOnException,
195
+ });
196
+
197
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
198
+ facadeEvent[__facade_dispatched__] = true;
199
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
200
+
201
+ const response = facadeEvent[__facade_response__];
202
+ if (response === undefined) {
203
+ throw new Error("No response!"); // TODO: proper error message
204
+ }
205
+ return response;
206
+ };
207
+
208
+ event.respondWith(
209
+ __facade_invoke__(
210
+ event.request as IncomingRequest,
211
+ globalThis,
212
+ ctx,
213
+ __facade_sw_dispatch__,
214
+ __facade_sw_fetch__
215
+ )
216
+ );
217
+ });
218
+
219
+ __facade__originalAddEventListener__("scheduled", (event) => {
220
+ const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
221
+ scheduledTime: event.scheduledTime,
222
+ cron: event.cron,
223
+ noRetry: event.noRetry.bind(event),
224
+ });
225
+
226
+ __FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);
227
+ event.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));
228
+ });
@@ -0,0 +1,3 @@
1
+ declare module "config:middleware/d1-beta" {
2
+ export const D1_IMPORTS: string[];
3
+ }
@@ -0,0 +1,244 @@
1
+ /// <reference path="middleware-d1-beta.d.ts"/>
2
+
3
+ import { D1_IMPORTS } from "config:middleware/d1-beta";
4
+
5
+ // src/index.ts
6
+ class D1Database {
7
+ constructor(readonly binding: Fetcher) {}
8
+ prepare(query: string) {
9
+ return new D1PreparedStatement(this, query);
10
+ }
11
+ async dump() {
12
+ const response = await this.binding.fetch("http://d1/dump", {
13
+ method: "POST",
14
+ headers: {
15
+ "content-type": "application/json",
16
+ },
17
+ });
18
+ if (response.status !== 200) {
19
+ try {
20
+ const err = (await response.json()) as { error: string };
21
+ throw new Error(`D1_DUMP_ERROR: ${err.error}`, {
22
+ cause: new Error(err.error),
23
+ });
24
+ } catch (e) {
25
+ throw new Error(`D1_DUMP_ERROR: Status + ${response.status}`, {
26
+ cause: new Error("Status " + response.status),
27
+ });
28
+ }
29
+ }
30
+ return await response.arrayBuffer();
31
+ }
32
+ async batch(statements: D1PreparedStatement[]) {
33
+ const exec = await this._send(
34
+ "/query",
35
+ statements.map((s) => s.statement),
36
+ statements.map((s) => s.params)
37
+ );
38
+ return exec;
39
+ }
40
+ async exec(query: string) {
41
+ const lines = query.trim().split("\n");
42
+ const _exec = await this._send("/query", lines, [], false);
43
+ const exec = Array.isArray(_exec) ? _exec : [_exec];
44
+ const error = exec
45
+ .map((r) => {
46
+ return r.error ? 1 : 0;
47
+ })
48
+ .indexOf(1);
49
+ if (error !== -1) {
50
+ throw new Error(
51
+ `D1_EXEC_ERROR: Error in line ${error + 1}: ${lines[error]}: ${
52
+ exec[error].error
53
+ }`,
54
+ {
55
+ cause: new Error(
56
+ "Error in line " +
57
+ (error + 1) +
58
+ ": " +
59
+ lines[error] +
60
+ ": " +
61
+ exec[error].error
62
+ ),
63
+ }
64
+ );
65
+ } else {
66
+ return {
67
+ count: exec.length,
68
+ duration: exec.reduce((p, c) => {
69
+ return p + (c.meta.duration as number);
70
+ }, 0),
71
+ };
72
+ }
73
+ }
74
+ async _send(
75
+ endpoint: string,
76
+ query: string | string[],
77
+ params: unknown[],
78
+ dothrow = true
79
+ ) {
80
+ const body = JSON.stringify(
81
+ typeof query == "object"
82
+ ? query.map((s, index) => {
83
+ return { sql: s, params: params[index] };
84
+ })
85
+ : {
86
+ sql: query,
87
+ params,
88
+ }
89
+ );
90
+ const response = await this.binding.fetch(new URL(endpoint, "http://d1"), {
91
+ method: "POST",
92
+ headers: {
93
+ "content-type": "application/json",
94
+ },
95
+ body,
96
+ });
97
+ try {
98
+ const answer = (await response.json()) as { error?: string };
99
+ if (answer.error && dothrow) {
100
+ const err = answer;
101
+ throw new Error(`D1_ERROR: ${err.error}`, {
102
+ cause: new Error(err.error),
103
+ });
104
+ } else {
105
+ return Array.isArray(answer)
106
+ ? answer.map((r) => mapD1Result(r))
107
+ : mapD1Result(answer);
108
+ }
109
+ } catch (e) {
110
+ const error = e as Error;
111
+ throw new Error(`D1_ERROR: ${error.cause || "Something went wrong"}`, {
112
+ cause: new Error(`${error.cause}` || "Something went wrong"),
113
+ });
114
+ }
115
+ }
116
+ }
117
+
118
+ class D1PreparedStatement {
119
+ constructor(
120
+ readonly database: D1Database,
121
+ readonly statement: string,
122
+ readonly params: unknown[] = []
123
+ ) {}
124
+ bind(...values: unknown[]) {
125
+ for (var r in values) {
126
+ const value = values[r];
127
+ switch (typeof value) {
128
+ case "number":
129
+ case "string":
130
+ break;
131
+ case "object":
132
+ if (value == null) break;
133
+ if (
134
+ Array.isArray(value) &&
135
+ value
136
+ .map((b) => {
137
+ return typeof b == "number" && b >= 0 && b < 256 ? 1 : 0;
138
+ })
139
+ .indexOf(0) == -1
140
+ )
141
+ break;
142
+ if (value instanceof ArrayBuffer) {
143
+ values[r] = Array.from(new Uint8Array(value));
144
+ break;
145
+ }
146
+ if (ArrayBuffer.isView(value)) {
147
+ values[r] = Array.from(new Uint8Array(value.buffer));
148
+ break;
149
+ }
150
+ default:
151
+ throw new Error(
152
+ `D1_TYPE_ERROR: Type '${typeof value}' not supported for value '${value}'`,
153
+ {
154
+ cause: new Error(
155
+ `Type '${typeof value}' not supported for value '${value}'`
156
+ ),
157
+ }
158
+ );
159
+ }
160
+ }
161
+ return new D1PreparedStatement(this.database, this.statement, values);
162
+ }
163
+ async first(colName: string) {
164
+ const info = firstIfArray(
165
+ await this.database._send("/query", this.statement, this.params)
166
+ );
167
+ const results = info.results;
168
+ if (colName !== void 0) {
169
+ if (results.length > 0 && results[0][colName] === void 0) {
170
+ throw new Error(`D1_COLUMN_NOTFOUND: Column not found (${colName})`, {
171
+ cause: new Error("Column not found"),
172
+ });
173
+ }
174
+ return results.length < 1 ? null : results[0][colName];
175
+ } else {
176
+ return results.length < 1 ? null : results[0];
177
+ }
178
+ }
179
+ async run() {
180
+ return firstIfArray(
181
+ await this.database._send("/execute", this.statement, this.params)
182
+ );
183
+ }
184
+ async all() {
185
+ return firstIfArray(
186
+ await this.database._send("/query", this.statement, this.params)
187
+ );
188
+ }
189
+ async raw() {
190
+ const s = firstIfArray(
191
+ await this.database._send("/query", this.statement, this.params)
192
+ );
193
+ const raw = [];
194
+ for (var r in s.results) {
195
+ const entry = Object.keys(s.results[r]).map((k) => {
196
+ return s.results[r][k];
197
+ });
198
+ raw.push(entry);
199
+ }
200
+ return raw;
201
+ }
202
+ }
203
+ function firstIfArray(results: unknown) {
204
+ return Array.isArray(results) ? results[0] : results;
205
+ }
206
+ function mapD1Result(result: Partial<D1Result>): D1Result {
207
+ let map: D1Result = {
208
+ results: result.results || [],
209
+ success: result.success === void 0 ? true : result.success,
210
+ meta: result.meta || {},
211
+ };
212
+ result.error && (map.error = result.error);
213
+ return map;
214
+ }
215
+
216
+ type D1Result = {
217
+ results: unknown[];
218
+ success: boolean;
219
+ meta: Record<string, unknown>;
220
+ error?: string;
221
+ };
222
+
223
+ // src/shim.ts
224
+ var D1_BETA_PREFIX = `__D1_BETA__`;
225
+ var envMap = /* @__PURE__ */ new Map();
226
+ function getMaskedEnv(env: Record<string, Fetcher | D1Database>) {
227
+ if (envMap.has(env)) return envMap.get(env);
228
+ const newEnv = new Map(Object.entries(env));
229
+ D1_IMPORTS.filter((bindingName) =>
230
+ bindingName.startsWith(D1_BETA_PREFIX)
231
+ ).forEach((bindingName) => {
232
+ newEnv.delete(bindingName);
233
+ const newName = bindingName.slice(D1_BETA_PREFIX.length);
234
+ const newBinding = new D1Database(env[bindingName] as Fetcher);
235
+ newEnv.set(newName, newBinding);
236
+ });
237
+ const newEnvObj = Object.fromEntries(newEnv.entries());
238
+ envMap.set(env, newEnvObj);
239
+ return newEnvObj;
240
+ }
241
+
242
+ export function wrap(env: Record<string, D1Database | Fetcher>) {
243
+ return getMaskedEnv(env);
244
+ }
@@ -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,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,59 @@
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
+ export function wrap(env: Record<string, unknown>) {
8
+ const facadeEnv = { ...env };
9
+ // For every Worker definition that's available,
10
+ // create a fetcher for it on the facade env.
11
+ // for const [name, binding] of env
12
+ // if Workers[name]
13
+ // const details = Workers[name];
14
+
15
+ for (const [name, details] of Object.entries(workers as WorkerRegistry)) {
16
+ if (details) {
17
+ facadeEnv[name] = {
18
+ async fetch(...reqArgs: Parameters<Fetcher["fetch"]>) {
19
+ const reqFromArgs = new Request(...reqArgs);
20
+ if (details.headers) {
21
+ for (const [key, value] of Object.entries(details.headers)) {
22
+ // In remote mode, you need to add a couple of headers
23
+ // to make sure it's talking to the 'dev' preview session
24
+ // (much like wrangler dev already does via proxy.ts)
25
+ reqFromArgs.headers.set(key, value);
26
+ }
27
+ return (env[name] as Fetcher).fetch(reqFromArgs);
28
+ }
29
+
30
+ const url = new URL(reqFromArgs.url);
31
+ if (details.protocol !== undefined) {
32
+ url.protocol = details.protocol;
33
+ }
34
+ if (details.host !== undefined) {
35
+ url.host = details.host;
36
+ }
37
+ if (details.port !== undefined) {
38
+ url.port = details.port.toString();
39
+ }
40
+
41
+ const request = new Request(url.toString(), reqFromArgs);
42
+ return fetch(request);
43
+ },
44
+ };
45
+ } else {
46
+ // This means there's no dev binding available.
47
+ // Let's use whatever's available, or put a shim with a message.
48
+ facadeEnv[name] = facadeEnv[name] || {
49
+ async fetch() {
50
+ return new Response(
51
+ `You should start up wrangler dev --local on the ${name} worker`,
52
+ { status: 404 }
53
+ );
54
+ },
55
+ };
56
+ }
57
+ }
58
+ return facadeEnv;
59
+ }
@@ -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 {
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;