Skip to content

Commit 644fab1

Browse files
committed
fix: skip null export targets in entrypoint discovery
1 parent 960414d commit 644fab1

3 files changed

Lines changed: 58 additions & 3 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@arethetypeswrong/core": patch
3+
---
4+
5+
Skip package export subpaths with no real target when discovering entrypoints.

packages/core/src/internal/getEntrypointInfo.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function getEntrypoints(fs: Package, exportsObject: unknown, options: CheckPacka
3434
return proxies;
3535
}
3636
const detectedSubpaths = getSubpaths(exportsObject);
37-
if (detectedSubpaths.length === 0) {
37+
if (detectedSubpaths.length === 0 && hasExportTarget(exportsObject)) {
3838
detectedSubpaths.push(".");
3939
}
4040
const included = unique([
@@ -71,12 +71,25 @@ function getSubpaths(exportsObject: any): string[] {
7171
return [];
7272
}
7373
const keys = Object.keys(exportsObject);
74-
if (keys[0].startsWith(".")) {
75-
return keys;
74+
if (keys[0]?.startsWith(".")) {
75+
return keys.filter((key) => hasExportTarget(exportsObject[key]));
7676
}
7777
return keys.flatMap((key) => getSubpaths(exportsObject[key]));
7878
}
7979

80+
function hasExportTarget(exportsObject: any): boolean {
81+
if (exportsObject === null || exportsObject === undefined) {
82+
return false;
83+
}
84+
if (typeof exportsObject !== "object") {
85+
return true;
86+
}
87+
if (Array.isArray(exportsObject)) {
88+
return exportsObject.some(hasExportTarget);
89+
}
90+
return Object.keys(exportsObject).some((key) => hasExportTarget(exportsObject[key]));
91+
}
92+
8093
function getProxyDirectories(rootDir: string, fs: Package) {
8194
const vendorDirectories = new Set<string>();
8295
const proxyDirectories: string[] = [];
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { checkPackage } from "@arethetypeswrong/core";
2+
import assert from "node:assert";
3+
import { describe, test } from "node:test";
4+
import { createTestPackage } from "./utils.js";
5+
6+
describe("getEntrypointInfo", () => {
7+
test("skips exports subpaths with null targets", async () => {
8+
const result = await checkPackage(
9+
createTestPackage({
10+
"dist/browser.d.ts": "export {};",
11+
"dist/browser.js": "export {};",
12+
"index.d.ts": "export {};",
13+
"package.json": JSON.stringify({
14+
name: "test",
15+
version: "1.0.0",
16+
exports: {
17+
"./features/*.js": "./src/features/*.js",
18+
"./features/private-internal/*": null,
19+
"./browser": {
20+
node: null,
21+
default: "./dist/browser.js",
22+
},
23+
"./blocked": {
24+
node: null,
25+
default: null,
26+
},
27+
},
28+
}),
29+
"src/features/public.js": "export {};",
30+
"src/features/private-internal/hidden.js": "export {};",
31+
}),
32+
);
33+
34+
assert("entrypoints" in result);
35+
assert.deepStrictEqual(Object.keys(result.entrypoints), ["./features/*.js", "./browser"]);
36+
});
37+
});

0 commit comments

Comments
 (0)