Skip to content

Commit ac66ff4

Browse files
authored
implicit /+esm for JavaScript extensions (#1174)
* implicit /+esm for JavaScript extensions * default deck.gl entry
1 parent 3cdf6b6 commit ac66ff4

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

src/npm.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {simple} from "acorn-walk";
66
import {rsort, satisfies} from "semver";
77
import {isEnoent} from "./error.js";
88
import type {ExportNode, ImportNode, ImportReference} from "./javascript/imports.js";
9-
import {isImportMetaResolve, parseImports} from "./javascript/imports.js";
9+
import {isImportMetaResolve, isJavaScript, parseImports} from "./javascript/imports.js";
1010
import {parseProgram} from "./javascript/parse.js";
1111
import type {StringLiteral} from "./javascript/source.js";
1212
import {getStringLiteralValue, isStringLiteral} from "./javascript/source.js";
@@ -251,12 +251,14 @@ export async function resolveNpmImport(root: string, specifier: string): Promise
251251
path = name === "mermaid"
252252
? "dist/mermaid.esm.min.mjs/+esm"
253253
: name === "echarts"
254-
? "dist/echarts.esm.min.js"
254+
? "dist/echarts.esm.min.js/+esm"
255+
: name === "deck.gl"
256+
? "dist.min.js/+esm"
255257
: "+esm"
256258
} = parseNpmSpecifier(specifier);
257259
const version = await resolveNpmVersion(root, {name, range});
258260
return `/_npm/${name}@${version}/${
259-
extname(path) || // npm:foo/bar.js
261+
(extname(path) && !isJavaScript(path)) || // npm:foo/bar.css
260262
path === "" || // npm:foo/
261263
path.endsWith("/") // npm:foo/bar/
262264
? path

test/npm-test.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ describe("getDependencyResolver(root, path, input)", () => {
1010
const root = "test/input/build/simple-public";
1111
const specifier = "/npm/[email protected]/dist/d3-array.js";
1212
const resolver = await getDependencyResolver(root, "/_npm/[email protected]/_esm.js", `import '${specifier}';\n`); // prettier-ignore
13-
assert.strictEqual(resolver(specifier), "../[email protected]/dist/d3-array.js");
13+
assert.strictEqual(resolver(specifier), "../[email protected]/dist/d3-array.js._esm.js");
1414
});
1515
it("finds /npm/ import resolutions and re-resolves their versions", async () => {
1616
const root = "test/input/build/simple-public";
1717
const specifier = "/npm/[email protected]/dist/d3-array.js";
1818
const resolver = await getDependencyResolver(root, "/_npm/[email protected]/_esm.js", `import.meta.resolve('${specifier}');\n`); // prettier-ignore
19-
assert.strictEqual(resolver(specifier), "../[email protected]/dist/d3-array.js");
19+
assert.strictEqual(resolver(specifier), "../[email protected]/dist/d3-array.js._esm.js");
2020
});
2121
});
2222

@@ -49,21 +49,24 @@ describe("parseNpmSpecifier(specifier)", () => {
4949
describe("resolveNpmImport(root, specifier)", () => {
5050
mockJsDelivr();
5151
const root = "test/input/build/simple";
52-
it("implicitly adds /_esm.js for specifiers without an extension", async () => {
52+
it("implicitly adds ._esm.js for specifiers without an extension", async () => {
5353
assert.strictEqual(await resolveNpmImport(root, "d3-array"), "/_npm/[email protected]/_esm.js");
5454
assert.strictEqual(await resolveNpmImport(root, "d3-array/src"), "/_npm/[email protected]/src._esm.js");
5555
assert.strictEqual(await resolveNpmImport(root, "d3-array/foo+bar"), "/_npm/[email protected]/foo+bar._esm.js");
5656
assert.strictEqual(await resolveNpmImport(root, "d3-array/foo+esm"), "/_npm/[email protected]/foo+esm._esm.js");
5757
});
58+
it("implicitly adds ._esm.js for specifiers with a JavaScript extension", async () => {
59+
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/index.js"), "/_npm/[email protected]/src/index.js._esm.js"); // prettier-ignore
60+
});
5861
it("replaces /+esm with /_esm.js or ._esm.js", async () => {
5962
assert.strictEqual(await resolveNpmImport(root, "d3-array/+esm"), "/_npm/[email protected]/_esm.js");
6063
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/+esm"), "/_npm/[email protected]/src._esm.js");
6164
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/index.js/+esm"), "/_npm/[email protected]/src/index.js._esm.js"); // prettier-ignore
6265
});
63-
it("does not add /_esm.js if given a path with a file extension", async () => {
64-
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/index.js"), "/_npm/[email protected]/src/index.js");
66+
it("does not add ._esm.js for specifiers with a non-JavaScript extension", async () => {
67+
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/index.css"), "/_npm/[email protected]/src/index.css");
6568
});
66-
it("does not add /_esm.js if given a path with a trailing slash", async () => {
69+
it("does not add /_esm.js for specifiers with a trailing slash", async () => {
6770
assert.strictEqual(await resolveNpmImport(root, "d3-array/"), "/_npm/[email protected]/");
6871
assert.strictEqual(await resolveNpmImport(root, "d3-array/src/"), "/_npm/[email protected]/src/");
6972
});

0 commit comments

Comments
 (0)