Skip to content

Commit 8a775c1

Browse files
authored
ignore node built-ins (#1183)
1 parent 7c90241 commit 8a775c1

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

src/node.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ async function bundle(input: string, cacheRoot: string, packageRoot: string): Pr
100100
function importResolve(input: string, cacheRoot: string, packageRoot: string): Plugin {
101101
async function resolve(specifier: string | AstNode): Promise<ResolveIdResult> {
102102
return typeof specifier !== "string" || // AST node?
103+
isNodeBuiltin(specifier) || // node built-in, e.g., "node:fs" or "fs"
103104
isPathImport(specifier) || // relative path, e.g., ./foo.js
104105
/^\w+:/.test(specifier) || // windows file path, https: URL, etc.
105106
specifier === input // entry point
@@ -112,3 +113,67 @@ function importResolve(input: string, cacheRoot: string, packageRoot: string): P
112113
resolveDynamicImport: resolve
113114
};
114115
}
116+
117+
export function isNodeBuiltin(specifier: string): boolean {
118+
return specifier.startsWith("node:") || nodeBuiltins.has(specifier.replace(/\/.*/, ""));
119+
}
120+
121+
// https://github.com/evanw/esbuild/blob/9d1777f23d9b64c186345223d92f319e59388d8b/internal/resolver/resolver.go#L2802-L2874
122+
const nodeBuiltins = new Set([
123+
"_http_agent",
124+
"_http_client",
125+
"_http_common",
126+
"_http_incoming",
127+
"_http_outgoing",
128+
"_http_server",
129+
"_stream_duplex",
130+
"_stream_passthrough",
131+
"_stream_readable",
132+
"_stream_transform",
133+
"_stream_wrap",
134+
"_stream_writable",
135+
"_tls_common",
136+
"_tls_wrap",
137+
"assert",
138+
"async_hooks",
139+
"buffer",
140+
"child_process",
141+
"cluster",
142+
"console",
143+
"constants",
144+
"crypto",
145+
"dgram",
146+
"diagnostics_channel",
147+
"dns",
148+
"domain",
149+
"events",
150+
"fs",
151+
"http",
152+
"http2",
153+
"https",
154+
"inspector",
155+
"module",
156+
"net",
157+
"os",
158+
"path",
159+
"perf_hooks",
160+
"process",
161+
"punycode",
162+
"querystring",
163+
"readline",
164+
"repl",
165+
"stream",
166+
"string_decoder",
167+
"sys",
168+
"timers",
169+
"tls",
170+
"trace_events",
171+
"tty",
172+
"url",
173+
"util",
174+
"v8",
175+
"vm",
176+
"wasi",
177+
"worker_threads",
178+
"zlib"
179+
]);

test/node-test.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
11
import assert from "node:assert";
22
import {existsSync} from "node:fs";
33
import {rm} from "node:fs/promises";
4-
import {extractNodeSpecifier, resolveNodeImport, resolveNodeImports} from "../src/node.js";
4+
import {extractNodeSpecifier, isNodeBuiltin, resolveNodeImport, resolveNodeImports} from "../src/node.js";
5+
6+
describe("isNodeBuiltin(specifier)", () => {
7+
it("returns true for node: specifiers", () => {
8+
assert.strictEqual(isNodeBuiltin("node:fs"), true);
9+
assert.strictEqual(isNodeBuiltin("node:path"), true);
10+
assert.strictEqual(isNodeBuiltin("node:path/posix"), true);
11+
});
12+
it("returns false for what are probably not node built-ins", () => {
13+
assert.strictEqual(isNodeBuiltin(""), false);
14+
assert.strictEqual(isNodeBuiltin("/fs"), false);
15+
assert.strictEqual(isNodeBuiltin("./fs"), false);
16+
assert.strictEqual(isNodeBuiltin("/node:fs"), false);
17+
assert.strictEqual(isNodeBuiltin("./node:fs"), false);
18+
assert.strictEqual(isNodeBuiltin("foo"), false);
19+
assert.strictEqual(isNodeBuiltin("notnode:fs"), false);
20+
});
21+
it("returns true for certain know built-in modules:", () => {
22+
assert.strictEqual(isNodeBuiltin("fs"), true);
23+
assert.strictEqual(isNodeBuiltin("path"), true);
24+
assert.strictEqual(isNodeBuiltin("path/posix"), true);
25+
});
26+
it("considers submodules such as fs/promises", () => {
27+
assert.strictEqual(isNodeBuiltin("fs/promises"), true);
28+
assert.strictEqual(isNodeBuiltin("fs/whatever"), true);
29+
});
30+
});
531

632
describe("resolveNodeImport(root, spec)", () => {
733
const importRoot = "../../input/packages/.observablehq/cache";

0 commit comments

Comments
 (0)