From 05707b398b1fce463d0ce4ff2b22ac6789ad5c40 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 14 Oct 2024 15:02:18 -0400 Subject: [PATCH 1/3] handle absolute global imports (#1758) * fix #1755; handle absolute global imports * test * fix module hashes --- src/build.ts | 2 +- test/input/build/imports/foo/foo.js | 1 + test/javascript/module-test.ts | 8 ++++---- test/mocks/jsdelivr.ts | 5 +++-- test/output/build/imports/_import/bar/bar.13bb8056.js | 1 - test/output/build/imports/_import/bar/bar.4460ccc2.js | 1 + .../_import/bar/{baz.cdbfb28b.js => baz.2add1dd0.js} | 2 +- .../_import/foo/{foo.5963bf78.js => foo.bcd720b2.js} | 3 ++- .../imports/_npm/@example/url-import@1.0.0/1dd108c5.js | 1 + test/output/build/imports/foo/foo.html | 9 +++++---- 10 files changed, 19 insertions(+), 14 deletions(-) delete mode 100644 test/output/build/imports/_import/bar/bar.13bb8056.js create mode 100644 test/output/build/imports/_import/bar/bar.4460ccc2.js rename test/output/build/imports/_import/bar/{baz.cdbfb28b.js => baz.2add1dd0.js} (58%) rename test/output/build/imports/_import/foo/{foo.5963bf78.js => foo.bcd720b2.js} (58%) create mode 100644 test/output/build/imports/_npm/@example/url-import@1.0.0/1dd108c5.js diff --git a/src/build.ts b/src/build.ts index b34d8796c..ccf9df04d 100644 --- a/src/build.ts +++ b/src/build.ts @@ -237,7 +237,7 @@ export async function build( if (!path.endsWith(".js")) continue; const sourcePath = join(cacheRoot, path); effects.output.write(`${faint("build")} ${path} ${faint("→")} `); - const resolveImport = (i: string) => relativePath(path, aliases.get((i = resolvePath(path, i))) ?? i); + const resolveImport = (i: string) => isPathImport(i) ? relativePath(path, aliases.get((i = resolvePath(path, i))) ?? i) : i; // prettier-ignore await effects.writeFile(aliases.get(path)!, rewriteNpmImports(await readFile(sourcePath, "utf-8"), resolveImport)); } diff --git a/test/input/build/imports/foo/foo.js b/test/input/build/imports/foo/foo.js index 41f582b58..7a1409aef 100644 --- a/test/input/build/imports/foo/foo.js +++ b/test/input/build/imports/foo/foo.js @@ -1,4 +1,5 @@ import "npm:d3"; +import "npm:@example/url-import"; import {bar} from "../bar/bar.js"; export {top} from "/top.js"; diff --git a/test/javascript/module-test.ts b/test/javascript/module-test.ts index 31ed9b172..aad6773a8 100644 --- a/test/javascript/module-test.ts +++ b/test/javascript/module-test.ts @@ -8,8 +8,8 @@ const emptyHash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b // through the code and verifying that they consider all the relevant files. describe("getModuleHash(root, path)", () => { it("returns the transitive content hash for the specified module", () => { - assert.strictEqual(getModuleHash("test/input/build/imports", "foo/foo.js"), "32f934a52fa34ba1b06aa6089fe5922dc442c9bf2dcddef864bc649a39d9eace"); // prettier-ignore - assert.strictEqual(getModuleHash("test/input/build/imports", "bar/bar.js"), "7fe009c8bb0049d9b84d53a00b29fb172bbf07d8232d2ace5f7c6f220b23eb16"); // prettier-ignore + assert.strictEqual(getModuleHash("test/input/build/imports", "foo/foo.js"), "e743cc5455594df5a3bd78622594dfb7a8ddb9277957be9b9732f33a88955d82"); // prettier-ignore + assert.strictEqual(getModuleHash("test/input/build/imports", "bar/bar.js"), "34442bce5f38762986a81229c551723cdc3d4c1509ac14dde193555e65013d76"); // prettier-ignore assert.strictEqual(getModuleHash("test/input/build/imports", "top.js"), "160847a6b4890d59f8e8862911bfbe3b8066955d31f2708cafbe51945c3c57b6"); // prettier-ignore assert.strictEqual(getModuleHash("test/input/build/fetches", "foo/foo.js"), "3bb4a170d2f3539934168741572d4aa3cd11da649d4ca88b408edefb5c287360"); // prettier-ignore assert.strictEqual(getModuleHash("test/input/build/fetches", "top.js"), "6c858de52de6ff26b19508e95448288da02fac62251b7ca2710a308a0ebfd7ba"); // prettier-ignore @@ -27,8 +27,8 @@ describe("getModuleInfo(root, path)", () => { assert.deepStrictEqual(redactModuleInfo("test/input/build/imports", "foo/foo.js"), { fileMethods: new Set(), files: new Set(), - hash: "c77c2490ea7b9a89dce7bad39973995e5158921bf8576955ae4a596c47a5a2a4", - globalStaticImports: new Set(["npm:d3"]), + hash: "17e03fbc08c28530c84ab1163901890915302d3f1d5af2c9256e3e8cab1324a9", + globalStaticImports: new Set(["npm:@example/url-import", "npm:d3"]), globalDynamicImports: new Set(), localDynamicImports: new Set(), localStaticImports: new Set(["../bar/bar.js", "../top.js"]) diff --git a/test/mocks/jsdelivr.ts b/test/mocks/jsdelivr.ts index 1dfbd4eee..70119be4b 100644 --- a/test/mocks/jsdelivr.ts +++ b/test/mocks/jsdelivr.ts @@ -1,7 +1,8 @@ import {getCurrentAgent, mockAgent} from "./undici.js"; -const packages: [name: string, {version: string; dependencies?: Record}][] = [ +const packages: [name: string, {version: string; contents?: string; dependencies?: Record}][] = [ ["@duckdb/duckdb-wasm", {version: "1.28.0"}], + ["@example/url-import", {version: "1.0.0", contents: "import('https://example.com');"}], ["@observablehq/inputs", {version: "0.10.6"}], ["@observablehq/plot", {version: "0.6.11"}], ["@observablehq/sample-datasets", {version: "1.0.1"}], @@ -50,7 +51,7 @@ export function mockJsDelivr() { .persist(); // prettier-ignore cdnClient .intercept({path: new RegExp(`^/npm/${name}@${pkg.version}/`), method: "GET"}) - .reply(200, "", {headers: {"cache-control": "public, immutable", "content-type": "text/javascript; charset=utf-8"}}) + .reply(200, pkg.contents ?? "", {headers: {"cache-control": "public, immutable", "content-type": "text/javascript; charset=utf-8"}}) .persist(); // prettier-ignore } }); diff --git a/test/output/build/imports/_import/bar/bar.13bb8056.js b/test/output/build/imports/_import/bar/bar.13bb8056.js deleted file mode 100644 index 43b124da9..000000000 --- a/test/output/build/imports/_import/bar/bar.13bb8056.js +++ /dev/null @@ -1 +0,0 @@ -export {bar} from "./baz.cdbfb28b.js"; diff --git a/test/output/build/imports/_import/bar/bar.4460ccc2.js b/test/output/build/imports/_import/bar/bar.4460ccc2.js new file mode 100644 index 000000000..e1fd9bbee --- /dev/null +++ b/test/output/build/imports/_import/bar/bar.4460ccc2.js @@ -0,0 +1 @@ +export {bar} from "./baz.2add1dd0.js"; diff --git a/test/output/build/imports/_import/bar/baz.cdbfb28b.js b/test/output/build/imports/_import/bar/baz.2add1dd0.js similarity index 58% rename from test/output/build/imports/_import/bar/baz.cdbfb28b.js rename to test/output/build/imports/_import/bar/baz.2add1dd0.js index 47e85439e..1e2c35f80 100644 --- a/test/output/build/imports/_import/bar/baz.cdbfb28b.js +++ b/test/output/build/imports/_import/bar/baz.2add1dd0.js @@ -1,4 +1,4 @@ -import {foo} from "../foo/foo.5963bf78.js"; +import {foo} from "../foo/foo.bcd720b2.js"; export const bar = "bar"; export const foobar = foo + "bar"; diff --git a/test/output/build/imports/_import/foo/foo.5963bf78.js b/test/output/build/imports/_import/foo/foo.bcd720b2.js similarity index 58% rename from test/output/build/imports/_import/foo/foo.5963bf78.js rename to test/output/build/imports/_import/foo/foo.bcd720b2.js index ccf22fb68..1eb0af22a 100644 --- a/test/output/build/imports/_import/foo/foo.5963bf78.js +++ b/test/output/build/imports/_import/foo/foo.bcd720b2.js @@ -1,5 +1,6 @@ import "../../_npm/d3@7.8.5/cd372fb8.js"; -import {bar} from "../bar/bar.13bb8056.js"; +import "../../_npm/@example/url-import@1.0.0/1dd108c5.js"; +import {bar} from "../bar/bar.4460ccc2.js"; export {top} from "../top.160847a6.js"; export const foo = "foo"; diff --git a/test/output/build/imports/_npm/@example/url-import@1.0.0/1dd108c5.js b/test/output/build/imports/_npm/@example/url-import@1.0.0/1dd108c5.js new file mode 100644 index 000000000..cc3538b9e --- /dev/null +++ b/test/output/build/imports/_npm/@example/url-import@1.0.0/1dd108c5.js @@ -0,0 +1 @@ +import('https://example.com'); \ No newline at end of file diff --git a/test/output/build/imports/foo/foo.html b/test/output/build/imports/foo/foo.html index cc2500f63..2cae2575d 100644 --- a/test/output/build/imports/foo/foo.html +++ b/test/output/build/imports/foo/foo.html @@ -14,11 +14,12 @@ - + - - + + +