wrangler 2.1.4 → 2.1.5
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.
- package/miniflare-dist/index.mjs +4 -1
- package/package.json +1 -1
- package/src/__tests__/api-dev.test.ts +3 -3
- package/src/__tests__/api-devregistry.test.js +56 -0
- package/src/__tests__/dev.test.tsx +39 -1
- package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
- package/src/__tests__/helpers/{hello-world-worker.js → worker-scripts/hello-world-worker.js} +0 -0
- package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
- package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
- package/src/__tests__/middleware.scheduled.test.ts +135 -0
- package/src/__tests__/middleware.test.ts +703 -745
- package/src/__tests__/pages.test.ts +35 -40
- package/src/api/dev.ts +1 -0
- package/src/bundle.ts +14 -16
- package/src/dev/dev.tsx +12 -21
- package/src/dev/local.tsx +1 -0
- package/src/dev/remote.tsx +37 -49
- package/src/dev/start-server.ts +43 -8
- package/src/dev/use-esbuild.ts +4 -0
- package/src/dev-registry.tsx +30 -0
- package/src/dev.tsx +17 -2
- package/src/inspect.ts +26 -26
- package/src/miniflare-cli/assets.ts +8 -1
- package/src/pages/constants.ts +2 -1
- package/src/pages/dev.tsx +133 -10
- package/src/pages/errors.ts +48 -4
- package/src/pages/functions/routes-transformation.ts +1 -14
- package/src/pages/functions/routes-validation.test.ts +403 -0
- package/src/pages/functions/routes-validation.ts +202 -0
- package/src/pages/functions.tsx +4 -18
- package/src/pages/publish.tsx +6 -22
- package/templates/middleware/middleware-scheduled.ts +2 -1
- package/templates/pages-dev-pipeline.ts +35 -0
- package/wrangler-dist/cli.d.ts +1 -0
- package/wrangler-dist/cli.js +585 -345
package/miniflare-dist/index.mjs
CHANGED
|
@@ -6099,7 +6099,10 @@ async function generateAssetsFetch(directory, log) {
|
|
|
6099
6099
|
);
|
|
6100
6100
|
}
|
|
6101
6101
|
const body = readFileSync5(filepath);
|
|
6102
|
-
|
|
6102
|
+
let contentType = (0, import_mime.getType)(filepath) || "application/octet-stream";
|
|
6103
|
+
if (contentType.startsWith("text/") && !contentType.includes("charset")) {
|
|
6104
|
+
contentType = `${contentType}; charset=utf-8`;
|
|
6105
|
+
}
|
|
6103
6106
|
return { body, contentType };
|
|
6104
6107
|
}
|
|
6105
6108
|
});
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ jest.unmock("undici");
|
|
|
8
8
|
describe("unstable_dev", () => {
|
|
9
9
|
it("should return Hello World", async () => {
|
|
10
10
|
const worker = await unstable_dev(
|
|
11
|
-
"src/__tests__/helpers/hello-world-worker.js",
|
|
11
|
+
"src/__tests__/helpers/worker-scripts/hello-world-worker.js",
|
|
12
12
|
{},
|
|
13
13
|
{ disableExperimentalWarning: true }
|
|
14
14
|
);
|
|
@@ -24,7 +24,7 @@ describe("unstable_dev", () => {
|
|
|
24
24
|
describe("unstable dev fetch input protocol", () => {
|
|
25
25
|
it("should use http localProtocol", async () => {
|
|
26
26
|
const worker = await unstable_dev(
|
|
27
|
-
"src/__tests__/helpers/hello-world-worker.js",
|
|
27
|
+
"src/__tests__/helpers/worker-scripts/hello-world-worker.js",
|
|
28
28
|
{ localProtocol: "http" },
|
|
29
29
|
{ disableExperimentalWarning: true }
|
|
30
30
|
);
|
|
@@ -38,7 +38,7 @@ describe("unstable dev fetch input protocol", () => {
|
|
|
38
38
|
|
|
39
39
|
it("should use undefined localProtocol", async () => {
|
|
40
40
|
const worker = await unstable_dev(
|
|
41
|
-
"src/__tests__/helpers/hello-world-worker.js",
|
|
41
|
+
"src/__tests__/helpers/worker-scripts/hello-world-worker.js",
|
|
42
42
|
{ localProtocol: undefined },
|
|
43
43
|
{ disableExperimentalWarning: true }
|
|
44
44
|
);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { unstable_dev } from "../api";
|
|
2
|
+
import { fetch } from "undici";
|
|
3
|
+
|
|
4
|
+
jest.unmock("undici");
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* a huge caveat to how testing multi-worker scripts works:
|
|
8
|
+
* you can't shutdown the first worker you spun up, or it'll kill the devRegistry
|
|
9
|
+
*/
|
|
10
|
+
describe("multi-worker testing", () => {
|
|
11
|
+
let childWorker;
|
|
12
|
+
let parentWorker;
|
|
13
|
+
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
childWorker = await unstable_dev(
|
|
16
|
+
"src/__tests__/helpers/worker-scripts/hello-world-worker.js",
|
|
17
|
+
{ config: "src/__tests__/helpers/worker-scripts/child-wrangler.toml" },
|
|
18
|
+
{ disableExperimentalWarning: true }
|
|
19
|
+
);
|
|
20
|
+
parentWorker = await unstable_dev(
|
|
21
|
+
"src/__tests__/helpers/worker-scripts/parent-worker.js",
|
|
22
|
+
{ config: "src/__tests__/helpers/worker-scripts/parent-wrangler.toml" },
|
|
23
|
+
{ disableExperimentalWarning: true }
|
|
24
|
+
);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterAll(async () => {
|
|
28
|
+
await childWorker.stop();
|
|
29
|
+
await parentWorker.stop();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("parentWorker and childWorker should be added devRegistry", async () => {
|
|
33
|
+
const resp = await fetch("http://localhost:6284/workers");
|
|
34
|
+
if (resp) {
|
|
35
|
+
const parsedResp = await resp.json();
|
|
36
|
+
expect(parsedResp.parent).toBeTruthy();
|
|
37
|
+
expect(parsedResp.child).toBeTruthy();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("childWorker should return Hello World itself", async () => {
|
|
42
|
+
const resp = await childWorker.fetch();
|
|
43
|
+
if (resp) {
|
|
44
|
+
const text = await resp.text();
|
|
45
|
+
expect(text).toMatchInlineSnapshot(`"Hello World!"`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("parentWorker should return Hello World by invoking the child worker", async () => {
|
|
50
|
+
const resp = await parentWorker.fetch();
|
|
51
|
+
if (resp) {
|
|
52
|
+
const parsedResp = await resp.text();
|
|
53
|
+
expect(parsedResp).toEqual("Parent worker sees: Hello World!");
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -1027,7 +1027,9 @@ describe("wrangler dev", () => {
|
|
|
1027
1027
|
--node-compat Enable node.js compatibility [boolean]
|
|
1028
1028
|
--persist Enable persistence for local mode, using default path: .wrangler/state [boolean]
|
|
1029
1029
|
--persist-to Specify directory to use for local persistence (implies --persist) [string]
|
|
1030
|
-
--inspect Enable dev tools [deprecated] [boolean]
|
|
1030
|
+
--inspect Enable dev tools [deprecated] [boolean]
|
|
1031
|
+
--test-scheduled Test scheduled events by visiting /__scheduled in browser [boolean] [default: false]
|
|
1032
|
+
--log-level Specify logging level [choices: \\"debug\\", \\"info\\", \\"log\\", \\"warn\\", \\"error\\", \\"none\\"] [default: \\"log\\"]",
|
|
1031
1033
|
"warn": "",
|
|
1032
1034
|
}
|
|
1033
1035
|
`);
|
|
@@ -1211,6 +1213,42 @@ describe("wrangler dev", () => {
|
|
|
1211
1213
|
});
|
|
1212
1214
|
});
|
|
1213
1215
|
|
|
1216
|
+
describe("--log-level", () => {
|
|
1217
|
+
it("should not output warnings with log-level 'none'", async () => {
|
|
1218
|
+
fs.writeFileSync("index.js", `export default {};`);
|
|
1219
|
+
await runWrangler("dev index.js --inspect --log-level none");
|
|
1220
|
+
expect(std).toMatchInlineSnapshot(`
|
|
1221
|
+
Object {
|
|
1222
|
+
"debug": "",
|
|
1223
|
+
"err": "",
|
|
1224
|
+
"out": "",
|
|
1225
|
+
"warn": "",
|
|
1226
|
+
}
|
|
1227
|
+
`);
|
|
1228
|
+
});
|
|
1229
|
+
|
|
1230
|
+
it("should output warnings with log-level 'warn'", async () => {
|
|
1231
|
+
fs.writeFileSync("index.js", `export default {};`);
|
|
1232
|
+
await runWrangler("dev index.js --inspect --log-level warn");
|
|
1233
|
+
expect(std).toMatchInlineSnapshot(`
|
|
1234
|
+
Object {
|
|
1235
|
+
"debug": "",
|
|
1236
|
+
"err": "",
|
|
1237
|
+
"out": "",
|
|
1238
|
+
"warn": "[33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mPassing --inspect is unnecessary, now you can always connect to devtools.[0m
|
|
1239
|
+
|
|
1240
|
+
",
|
|
1241
|
+
}
|
|
1242
|
+
`);
|
|
1243
|
+
});
|
|
1244
|
+
|
|
1245
|
+
it("should not output Errors with log-level error", async () => {
|
|
1246
|
+
fs.writeFileSync("index.js", `export default {};`);
|
|
1247
|
+
await runWrangler("dev index.js --inspect --log-level debug");
|
|
1248
|
+
expect(std.debug.length > 1).toBe(true);
|
|
1249
|
+
});
|
|
1250
|
+
});
|
|
1251
|
+
|
|
1214
1252
|
describe("service bindings", () => {
|
|
1215
1253
|
it("should warn when using service bindings", async () => {
|
|
1216
1254
|
writeWranglerToml({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
name = 'child'
|
package/src/__tests__/helpers/{hello-world-worker.js → worker-scripts/hello-world-worker.js}
RENAMED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
name = 'hello-world'
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { unstable_dev } from "../api";
|
|
3
|
+
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
4
|
+
|
|
5
|
+
jest.unmock("undici");
|
|
6
|
+
|
|
7
|
+
describe("run scheduled events with middleware", () => {
|
|
8
|
+
describe("module workers", () => {
|
|
9
|
+
runInTempDir();
|
|
10
|
+
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
const scriptContent = `
|
|
13
|
+
export default {
|
|
14
|
+
fetch(request, env, ctx) {
|
|
15
|
+
const url = new URL(request.url);
|
|
16
|
+
if (url.pathname === "/__scheduled") {
|
|
17
|
+
return new Response("Fetch triggered at /__scheduled");
|
|
18
|
+
}
|
|
19
|
+
return new Response("Hello world!");
|
|
20
|
+
},
|
|
21
|
+
scheduled(controller, env, ctx) {
|
|
22
|
+
console.log("Doing something scheduled in modules...");
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
`;
|
|
26
|
+
fs.writeFileSync("index.js", scriptContent);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should not intercept when middleware is not enabled", async () => {
|
|
30
|
+
const worker = await unstable_dev(
|
|
31
|
+
"index.js",
|
|
32
|
+
{},
|
|
33
|
+
{ disableExperimentalWarning: true }
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const resp = await worker.fetch("/__scheduled");
|
|
37
|
+
let text;
|
|
38
|
+
if (resp) text = await resp.text();
|
|
39
|
+
expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
|
|
40
|
+
await worker.stop();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should intercept when middleware is enabled", async () => {
|
|
44
|
+
const worker = await unstable_dev(
|
|
45
|
+
"index.js",
|
|
46
|
+
{ testScheduled: true },
|
|
47
|
+
{ disableExperimentalWarning: true }
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const resp = await worker.fetch("/__scheduled");
|
|
51
|
+
let text;
|
|
52
|
+
if (resp) text = await resp.text();
|
|
53
|
+
expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
|
|
54
|
+
await worker.stop();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should not trigger scheduled event on wrong route", async () => {
|
|
58
|
+
const worker = await unstable_dev(
|
|
59
|
+
"index.js",
|
|
60
|
+
{ testScheduled: true },
|
|
61
|
+
{ disableExperimentalWarning: true }
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const resp = await worker.fetch("/test");
|
|
65
|
+
let text;
|
|
66
|
+
if (resp) text = await resp.text();
|
|
67
|
+
expect(text).toMatchInlineSnapshot(`"Hello world!"`);
|
|
68
|
+
await worker.stop();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe("service workers", () => {
|
|
73
|
+
runInTempDir();
|
|
74
|
+
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
const scriptContent = `
|
|
77
|
+
addEventListener("scheduled", (event) => {
|
|
78
|
+
console.log("Doing something scheduled in service worker...");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
addEventListener("fetch", (event) => {
|
|
82
|
+
const url = new URL(event.request.url);
|
|
83
|
+
if (url.pathname === "/__scheduled") {
|
|
84
|
+
event.respondWith(new Response("Fetch triggered at /__scheduled"));
|
|
85
|
+
} else {
|
|
86
|
+
event.respondWith(new Response("Hello world!"));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
`;
|
|
90
|
+
fs.writeFileSync("index.js", scriptContent);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should not intercept when middleware is not enabled", async () => {
|
|
94
|
+
const worker = await unstable_dev(
|
|
95
|
+
"index.js",
|
|
96
|
+
{},
|
|
97
|
+
{ disableExperimentalWarning: true }
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const resp = await worker.fetch("/__scheduled");
|
|
101
|
+
let text;
|
|
102
|
+
if (resp) text = await resp.text();
|
|
103
|
+
expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
|
|
104
|
+
await worker.stop();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("should intercept when middleware is enabled", async () => {
|
|
108
|
+
const worker = await unstable_dev(
|
|
109
|
+
"index.js",
|
|
110
|
+
{ testScheduled: true },
|
|
111
|
+
{ disableExperimentalWarning: true }
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const resp = await worker.fetch("/__scheduled");
|
|
115
|
+
let text;
|
|
116
|
+
if (resp) text = await resp.text();
|
|
117
|
+
expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
|
|
118
|
+
await worker.stop();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("should not trigger scheduled event on wrong route", async () => {
|
|
122
|
+
const worker = await unstable_dev(
|
|
123
|
+
"index.js",
|
|
124
|
+
{ testScheduled: true },
|
|
125
|
+
{ disableExperimentalWarning: true }
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const resp = await worker.fetch("/test");
|
|
129
|
+
let text;
|
|
130
|
+
if (resp) text = await resp.text();
|
|
131
|
+
expect(text).toMatchInlineSnapshot(`"Hello world!"`);
|
|
132
|
+
await worker.stop();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|