Skip to content

Commit 906e9be

Browse files
vicbpenalosa
authored andcommitted
Update unenv preset (#7581)
1 parent 40b1f81 commit 906e9be

File tree

7 files changed

+159
-153
lines changed

7 files changed

+159
-153
lines changed

.changeset/chilled-mugs-fail.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"wrangler": patch
3+
---
4+
5+
chore(wrangler): update unenv dependency version
6+
7+
unenv now uses the workerd implementation on node:dns
8+
See the [unjs/unenv#376](https://github.com/unjs/unenv/pull/376)

fixtures/nodejs-hybrid-app/src/index.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Stream } from "node:stream";
66
import { Context } from "vm";
77
import { Client } from "pg";
88
import { s } from "./dep.cjs";
9+
import { testUnenvPreset } from "./unenv-preset";
910

1011
testBasicNodejsProperties();
1112

@@ -28,14 +29,18 @@ export default {
2829
return testX509Certificate();
2930
case "/test-require-alias":
3031
return testRequireUenvAliasedPackages();
32+
case "/test-unenv-preset":
33+
return await testUnenvPreset();
3134
}
3235

3336
return new Response(
34-
'<a href="query">Postgres query</a> | ' +
35-
'<a href="test-process">Test process global</a> | ' +
36-
'<a href="test-random">Test getRandomValues()</a> | ' +
37-
'<a href="test-x509-certificate">Test X509Certificate</a>' +
38-
'<a href="test-require-alias">Test require unenv aliased packages</a>',
37+
`<a href="query">Postgres query</a>
38+
<a href="test-process">Test process global</a>
39+
<a href="test-random">Test getRandomValues()</a>
40+
<a href="test-x509-certificate">Test X509Certificate</a>
41+
<a href="test-require-alias">Test require unenv aliased packages</a>
42+
<a href="test-unenv-preset">Test unenv preset</a>
43+
`,
3944
{ headers: { "Content-Type": "text/html; charset=utf-8" } }
4045
);
4146
},
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import assert from "node:assert";
2+
3+
// TODO: move to `@cloudflare/unenv-preset`
4+
// See: https://github.com/cloudflare/workers-sdk/issues/7579
5+
export async function testUnenvPreset() {
6+
try {
7+
await testCryptoGetRandomValues();
8+
await testWorkerdImplementsBuffer();
9+
await testWorkerdModules();
10+
await testUtilImplements();
11+
await testWorkerdPath();
12+
await testWorkerdDns();
13+
} catch (e) {
14+
return new Response(String(e));
15+
}
16+
17+
return new Response("OK!");
18+
}
19+
20+
async function testCryptoGetRandomValues() {
21+
const crypto = await import("node:crypto");
22+
23+
const array = new Uint32Array(10);
24+
crypto.getRandomValues(array);
25+
assert.strictEqual(array.length, 10);
26+
assert(array.every((v) => v >= 0 && v <= 0xff_ff_ff_ff));
27+
}
28+
29+
async function testWorkerdImplementsBuffer() {
30+
const encoder = new TextEncoder();
31+
const buffer = await import("node:buffer");
32+
const Buffer = buffer.Buffer;
33+
assert.strictEqual(buffer.isAscii(encoder.encode("hello world")), true);
34+
assert.strictEqual(buffer.isUtf8(encoder.encode("Yağız")), true);
35+
assert.strictEqual(buffer.btoa("hello"), "aGVsbG8=");
36+
assert.strictEqual(buffer.atob("aGVsbG8="), "hello");
37+
{
38+
const dest = buffer.transcode(
39+
Buffer.from([
40+
0x74, 0x00, 0x1b, 0x01, 0x73, 0x00, 0x74, 0x00, 0x20, 0x00, 0x15, 0x26,
41+
]),
42+
"ucs2",
43+
"utf8"
44+
);
45+
assert.strictEqual(
46+
dest.toString(),
47+
Buffer.from("těst ☕", "utf8").toString()
48+
);
49+
}
50+
assert.ok(new buffer.File([], "file"));
51+
assert.ok(new buffer.Blob([]));
52+
assert.strictEqual(typeof buffer.INSPECT_MAX_BYTES, "number");
53+
assert.strictEqual(typeof buffer.resolveObjectURL, "function");
54+
}
55+
56+
async function testWorkerdModules() {
57+
const module = await import("node:module");
58+
// @ts-expect-error exposed by workerd
59+
const require = module.createRequire("/");
60+
const modules = [
61+
"assert",
62+
"assert/strict",
63+
"buffer",
64+
"diagnostics_channel",
65+
"dns",
66+
"dns/promises",
67+
"events",
68+
"path",
69+
"path/posix",
70+
"path/win32",
71+
"querystring",
72+
"stream",
73+
"stream/consumers",
74+
"stream/promises",
75+
"stream/web",
76+
"string_decoder",
77+
"url",
78+
"util/types",
79+
"zlib",
80+
];
81+
for (const m of modules) {
82+
assert.strictEqual(await import(m), require(m));
83+
}
84+
}
85+
86+
async function testUtilImplements() {
87+
const { types } = await import("node:util");
88+
assert.strictEqual(types.isExternal("hello world"), false);
89+
assert.strictEqual(types.isAnyArrayBuffer(new ArrayBuffer(0)), true);
90+
}
91+
92+
async function testWorkerdPath() {
93+
const pathWin32 = await import("node:path/win32");
94+
assert.strictEqual(pathWin32.sep, "\\");
95+
assert.strictEqual(pathWin32.delimiter, ";");
96+
const pathPosix = await import("node:path/posix");
97+
assert.strictEqual(pathPosix.sep, "/");
98+
assert.strictEqual(pathPosix.delimiter, ":");
99+
}
100+
101+
async function testWorkerdDns() {
102+
const dns = await import("node:dns");
103+
await new Promise((resolve, reject) => {
104+
dns.resolveTxt("nodejs.org", (error, results) => {
105+
if (error) {
106+
reject(error);
107+
return;
108+
}
109+
assert.ok(Array.isArray(results[0]));
110+
assert.strictEqual(results.length, 1);
111+
assert.ok(results[0][0].startsWith("v=spf1"));
112+
resolve(null);
113+
});
114+
});
115+
116+
const dnsPromises = await import("node:dns/promises");
117+
const results = await dnsPromises.resolveCaa("google.com");
118+
assert.ok(Array.isArray(results));
119+
assert.strictEqual(results.length, 1);
120+
assert.strictEqual(typeof results[0].critical, "number");
121+
assert.strictEqual(results[0].critical, 0);
122+
assert.strictEqual(results[0].issue, "pki.goog");
123+
}

fixtures/nodejs-hybrid-app/tests/index.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,17 @@ describe("nodejs compat", () => {
7676
await stop();
7777
}
7878
});
79+
80+
test("unenv preset", async ({ expect }) => {
81+
const { ip, port, stop } = await runWranglerDev(
82+
resolve(__dirname, "../src"),
83+
["--port=0", "--inspector-port=0"]
84+
);
85+
try {
86+
const response = await fetch(`http://${ip}:${port}/test-unenv-preset`);
87+
await expect(response.text()).resolves.toBe("OK!");
88+
} finally {
89+
await stop();
90+
}
91+
});
7992
});

packages/unenv-preset/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@
4747
"devDependencies": {
4848
"@types/node": "*",
4949
"typescript": "catalog:default",
50-
"unbuild": "^2.0.0",
51-
"wrangler": "3.95.0"
50+
"unbuild": "^2.0.0"
5251
},
5352
"peerDependencies": {
5453
"unenv": "npm:unenv-nightly@*",

packages/wrangler/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
"resolve": "^1.22.8",
8484
"selfsigned": "^2.0.1",
8585
"source-map": "^0.6.1",
86-
"unenv": "npm:[email protected]20241204-140205-a5d5190",
86+
"unenv": "npm:[email protected]20241216-144314-7e05819",
8787
"workerd": "1.20241218.0",
8888
"xxhash-wasm": "^1.0.1"
8989
},

0 commit comments

Comments
 (0)