Skip to content

Commit 9d7cd32

Browse files
committed
fix: refine config type
1 parent fc74533 commit 9d7cd32

2 files changed

Lines changed: 206 additions & 4 deletions

File tree

packages/wrangler/e2e/create-server.test.ts

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import path from "node:path";
22
import { setTimeout } from "node:timers/promises";
3+
import { http, HttpResponse } from "msw";
4+
import { setupServer } from "msw/node";
35
import dedent from "ts-dedent";
46
import { beforeEach, describe, it, onTestFinished, vi } from "vitest";
57
import {
@@ -172,6 +174,207 @@ describe("createServer", { sequential: true }, () => {
172174
);
173175
});
174176

177+
it("uses the current Node process fetch for outbound requests by default", async ({
178+
expect,
179+
}) => {
180+
const mockServer = setupServer(
181+
http.get("http://example.com/", () => {
182+
return HttpResponse.text("Mocked by MSW");
183+
})
184+
);
185+
mockServer.listen({ onUnhandledRequest: "error" });
186+
onTestFinished(() => mockServer.close());
187+
188+
await helper.seed({
189+
"wrangler.jsonc": dedent`
190+
{
191+
"name": "default-outbound-worker",
192+
"main": "src/index.ts",
193+
"compatibility_date": "2026-05-20"
194+
}
195+
`,
196+
"src/index.ts": dedent`
197+
export default {
198+
fetch() {
199+
return fetch("http://example.com");
200+
}
201+
};
202+
`,
203+
});
204+
205+
const server = createServer({
206+
root: helper.tmpPath,
207+
workers: [{ configPath: "./wrangler.jsonc" }],
208+
});
209+
onTestFinished(server.close);
210+
211+
await server.listen();
212+
213+
const response = await server.fetch("/");
214+
await expect(response.text()).resolves.toBe("Mocked by MSW");
215+
});
216+
217+
it("starts workers from inline config", async ({ expect }) => {
218+
await helper.seed({
219+
"src/index.ts": dedent`
220+
export default {
221+
fetch() {
222+
return new Response("Hello from inline config");
223+
}
224+
};
225+
`,
226+
});
227+
228+
const server = createServer({
229+
workers: [
230+
{
231+
root: helper.tmpPath,
232+
config: {
233+
main: "src/index.ts",
234+
compatibility_date: "2026-05-20",
235+
},
236+
},
237+
],
238+
});
239+
onTestFinished(server.close);
240+
241+
await server.listen();
242+
243+
const response = await server.fetch("/");
244+
await expect(response.text()).resolves.toBe("Hello from inline config");
245+
});
246+
247+
it("uses ephemeral storage by default", async ({ expect }) => {
248+
await helper.seed({
249+
"wrangler.jsonc": dedent`
250+
{
251+
"name": "ephemeral-storage-worker",
252+
"main": "src/index.ts",
253+
"compatibility_date": "2026-05-20",
254+
"kv_namespaces": [
255+
{ "binding": "STORE", "id": "test-store" }
256+
]
257+
}
258+
`,
259+
"src/index.ts": dedent`
260+
export default {
261+
async fetch(request, env) {
262+
const url = new URL(request.url);
263+
if (url.pathname === "/set") {
264+
await env.STORE.put("key", "value");
265+
return new Response("stored");
266+
}
267+
return new Response((await env.STORE.get("key")) ?? "missing");
268+
}
269+
};
270+
`,
271+
});
272+
273+
const firstServer = createServer({
274+
root: helper.tmpPath,
275+
workers: [{ configPath: "./wrangler.jsonc" }],
276+
});
277+
onTestFinished(firstServer.close);
278+
279+
await firstServer.listen();
280+
281+
const setResponse = await firstServer.fetch("/set");
282+
await expect(setResponse.text()).resolves.toBe("stored");
283+
284+
const storedResponse = await firstServer.fetch("/");
285+
await expect(storedResponse.text()).resolves.toBe("value");
286+
287+
await firstServer.close();
288+
289+
const secondServer = createServer({
290+
root: helper.tmpPath,
291+
workers: [{ configPath: "./wrangler.jsonc" }],
292+
});
293+
onTestFinished(secondServer.close);
294+
295+
await secondServer.listen();
296+
297+
const resetResponse = await secondServer.fetch("/");
298+
await expect(resetResponse.text()).resolves.toBe("missing");
299+
});
300+
301+
it("exposes the inspector URL when enabled", async ({ expect }) => {
302+
await helper.seed({
303+
"wrangler.jsonc": dedent`
304+
{
305+
"name": "inspector-worker",
306+
"main": "src/index.ts",
307+
"compatibility_date": "2026-05-20"
308+
}
309+
`,
310+
"src/index.ts": dedent`
311+
export default {
312+
fetch() {
313+
return new Response("Hello World");
314+
}
315+
};
316+
`,
317+
});
318+
319+
const server = createServer({
320+
root: helper.tmpPath,
321+
workers: [{ configPath: "./wrangler.jsonc" }],
322+
inspector: { port: 0 },
323+
});
324+
onTestFinished(server.close);
325+
326+
const { inspectorUrl } = await server.listen();
327+
328+
expect(inspectorUrl).toBeDefined();
329+
const inspectorResponse = await fetch(`http://${inspectorUrl?.host}/json`);
330+
expect(inspectorResponse.ok).toBe(true);
331+
});
332+
333+
it("triggers scheduled handlers", async ({ expect }) => {
334+
await helper.seed({
335+
"wrangler.jsonc": dedent`
336+
{
337+
"name": "scheduled-worker",
338+
"main": "src/index.ts",
339+
"compatibility_date": "2026-05-20"
340+
}
341+
`,
342+
"src/index.ts": dedent`
343+
let lastCron = "missing";
344+
345+
export default {
346+
fetch() {
347+
return new Response(lastCron);
348+
},
349+
scheduled(event) {
350+
lastCron = event.cron;
351+
}
352+
};
353+
`,
354+
});
355+
356+
const server = createServer({
357+
root: helper.tmpPath,
358+
workers: [{ configPath: "./wrangler.jsonc" }],
359+
});
360+
onTestFinished(server.close);
361+
362+
await server.listen();
363+
364+
const beforeScheduled = await server.fetch("/");
365+
await expect(beforeScheduled.text()).resolves.toBe("missing");
366+
367+
await expect(
368+
server.getWorker().scheduled({
369+
cron: "* * * * *",
370+
scheduledTime: new Date(1_700_000_100_000),
371+
})
372+
).resolves.toEqual({ outcome: "ok", noRetry: false });
373+
374+
const afterScheduled = await server.fetch("/");
375+
await expect(afterScheduled.text()).resolves.toBe("* * * * *");
376+
});
377+
175378
it("does not reload on source changes by default", async ({ expect }) => {
176379
await helper.seed({
177380
"wrangler.jsonc": dedent`

packages/wrangler/src/api/server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import type {
1818
FetcherScheduledOptions,
1919
FetcherScheduledResult,
2020
} from "@cloudflare/workers-types/experimental";
21-
import type { Config } from "@cloudflare/workers-utils";
21+
import type { RawEnvironment } from "@cloudflare/workers-utils";
2222
import type { DispatchFetch, RequestInfo } from "miniflare";
2323

2424
export type WorkerInput =
@@ -29,7 +29,7 @@ export type WorkerInput =
2929
}
3030
| {
3131
root?: string;
32-
config: Config;
32+
config: RawEnvironment;
3333
};
3434

3535
type DevServerOptions = Exclude<
@@ -158,13 +158,12 @@ function resolveWorkerInputs(
158158
bindings: convertConfigToBindings(config, { usePreviewIds: true }),
159159
migrations: config.migrations,
160160
containers: config.containers,
161-
triggers: config.triggers.crons?.map((cron) => ({
161+
triggers: config.triggers?.crons?.map((cron) => ({
162162
type: "cron",
163163
cron,
164164
})),
165165
tailConsumers: config.tail_consumers,
166166
streamingTailConsumers: config.streaming_tail_consumers,
167-
sendMetrics: config.send_metrics,
168167
assets: config.assets?.directory,
169168
dev,
170169
};

0 commit comments

Comments
 (0)