Skip to content

Commit 8d40464

Browse files
fix: replace builtin-modules package with node's isBuiltin check (#2176)
## PR Checklist - [x] Addresses an existing open issue: fixes #2175 - [x] That issue was marked as [`status: accepting prs`](https://github.com/JoshuaKGoldberg/TypeStat/issues?q=is%3Aopen+is%3Aissue+label%3A%22status%3A+accepting+prs%22) - [x] Steps in [CONTRIBUTING.md](https://github.com/JoshuaKGoldberg/TypeStat/blob/main/.github/CONTRIBUTING.md) were taken ## Overview There is no need to use external package for this check, when we can use node's own `isBuiltin()` check. However, it needed minimum node version to be upgrade to `>=18.6`. 🐙 --------- Co-authored-by: Josh Goldberg ✨ <[email protected]>
1 parent fc7ccfa commit 8d40464

File tree

5 files changed

+72
-26
lines changed

5 files changed

+72
-26
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
"dependencies": {
4343
"@phenomnomnominal/tsquery": "6.1.3",
4444
"automutate": "0.9.0",
45-
"builtin-modules": "4.0.0",
4645
"chalk": "5.4.1",
4746
"commander": "13.1.0",
4847
"enquirer": "2.4.1",
@@ -89,7 +88,7 @@
8988
},
9089
"packageManager": "[email protected]",
9190
"engines": {
92-
"node": ">=18"
91+
"node": ">=18.6"
9392
},
9493
"publishConfig": {
9594
"provenance": true

pnpm-lock.yaml

Lines changed: 0 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/runtime/providers/createInstallMissingTypesProvider.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
import builtinModules from "builtin-modules";
2-
3-
import { setSubtract } from "../../shared/sets.js";
41
import { createFileNamesAndServices } from "../createFileNamesAndServices.js";
52
import { createSingleUseProvider } from "../createSingleUseProvider.js";
63
import { collectExistingTypingPackages } from "./missingTypes/collectExistingTypingPackages.js";
74
import { collectPackageManagerRunner } from "./missingTypes/collectPackageManagerRunner.js";
85
import { collectReferencedPackageNames } from "./missingTypes/collectReferencedPackageNames.js";
96
import { filterTypedPackageNames } from "./missingTypes/filterTypedPackageNames.js";
107

11-
const uniqueBuiltinModules = new Set(builtinModules);
12-
138
/**
149
* Creates a mutations provider that installs missing types modules.
1510
* @returns Provider to install missing types modules, if needed.
@@ -36,14 +31,10 @@ export const createInstallMissingTypesProvider = () => {
3631

3732
// Collect every package name referenced by every file in the project
3833
const { services } = createFileNamesAndServices(options);
39-
const referencedPackageNames =
40-
collectReferencedPackageNames(services);
41-
4234
// Ignore package names already referenced in package.json or that don't exist in DefinitelyTyped
43-
const missingPackageNames = setSubtract(
44-
referencedPackageNames,
35+
const missingPackageNames = collectReferencedPackageNames(
36+
services,
4537
new Set(existingPackageNames),
46-
uniqueBuiltinModules,
4738
);
4839
const missingTypedPackageNames = await filterTypedPackageNames(
4940
Array.from(missingPackageNames),
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { describe, expect, it } from "vitest";
2+
3+
import {
4+
TypeStatCompilerOptions,
5+
TypeStatOptions,
6+
} from "../../../options/types.js";
7+
import { createLanguageServices } from "../../../services/language.js";
8+
import { collectReferencedPackageNames } from "./collectReferencedPackageNames.js";
9+
10+
describe("collectReferencedPackageNames", () => {
11+
it("should return package names", () => {
12+
const options: Partial<TypeStatOptions> = {
13+
compilerOptions: {} as Readonly<TypeStatCompilerOptions>,
14+
package: {
15+
directory: process.cwd(),
16+
file: "package.json",
17+
missingTypes: true,
18+
},
19+
projectPath: "tsconfig.json",
20+
};
21+
const services = createLanguageServices(options as TypeStatOptions);
22+
23+
const packageNames = collectReferencedPackageNames(
24+
services,
25+
new Set<string>(),
26+
);
27+
28+
expect(Array.from(packageNames)).toStrictEqual(["node", "automutate"]);
29+
});
30+
31+
it("should ignore defined package names", () => {
32+
const options: Partial<TypeStatOptions> = {
33+
compilerOptions: {} as Readonly<TypeStatCompilerOptions>,
34+
package: {
35+
directory: process.cwd(),
36+
file: "package.json",
37+
missingTypes: true,
38+
},
39+
projectPath: "tsconfig.json",
40+
};
41+
const services = createLanguageServices(options as TypeStatOptions);
42+
43+
const packageNames = collectReferencedPackageNames(
44+
services,
45+
new Set<string>(["automutate"]),
46+
);
47+
48+
expect(Array.from(packageNames)).toStrictEqual(["node"]);
49+
});
50+
});

src/runtime/providers/missingTypes/collectReferencedPackageNames.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,41 @@
1+
import { isBuiltin } from "node:module";
12
import ts from "typescript";
23

34
import { LanguageServices } from "../../../services/language.js";
45

5-
export const collectReferencedPackageNames = (services: LanguageServices) => {
6+
export const collectReferencedPackageNames = (
7+
services: LanguageServices,
8+
ignoredPackages: ReadonlySet<string>,
9+
) => {
610
const packageNames = new Set<string>();
711

812
for (const sourceFile of services.program.getSourceFiles()) {
9-
for (const packageName of collectFileReferencedPackageNames(sourceFile)) {
13+
const collected = collectFileReferencedPackageNames(
14+
sourceFile,
15+
ignoredPackages,
16+
);
17+
for (const packageName of collected) {
1018
packageNames.add(packageName);
1119
}
1220
}
1321

1422
return packageNames;
1523
};
1624

17-
const collectFileReferencedPackageNames = (sourceFile: ts.SourceFile) => {
25+
const collectFileReferencedPackageNames = (
26+
sourceFile: ts.SourceFile,
27+
ignoredPackages: ReadonlySet<string>,
28+
) => {
1829
const packageNames = new Set<string>();
1930

2031
const visitNode = (node: ts.Node) => {
2132
const packageName = parsePackageNameFromNode(node);
2233

23-
if (packageName !== undefined) {
34+
if (
35+
packageName !== undefined &&
36+
!isBuiltin(packageName) &&
37+
!ignoredPackages.has(packageName)
38+
) {
2439
packageNames.add(packageName);
2540
}
2641

0 commit comments

Comments
 (0)