From c6518d56f58cde1a433a05fb9114a13491c22945 Mon Sep 17 00:00:00 2001 From: David Sveningsson Date: Fri, 14 Apr 2023 23:49:48 +0200 Subject: [PATCH] refactor: enable strictNullChecks --- src/index.ts | 8 ++++---- src/package-json.spec.ts | 2 +- src/rules/outdated-engines.spec.ts | 14 ++++++++++---- src/rules/outdated-engines.ts | 2 +- src/rules/types-node-matching-engine.spec.ts | 19 +++++++++++++------ src/rules/verify-engine-constraint.ts | 4 ++++ src/utils/__mocks__/npm-info.ts | 5 +++-- src/utils/npm-info.ts | 5 +++-- tsconfig.json | 3 +-- 9 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/index.ts b/src/index.ts index 5be004e8..e53db2e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,8 +25,8 @@ interface ParsedArgs { } interface GetPackageJsonResults { - pkg?: PackageJson; - pkgPath?: string; + pkg: PackageJson; + pkgPath: string; } async function preloadStdin(): Promise { @@ -37,7 +37,7 @@ async function preloadStdin(): Promise { return; } - const st = createWriteStream(null, { fd, autoClose: true }); + const st = createWriteStream("", { fd, autoClose: true }); process.stdin.pipe(st); st.on("finish", () => { resolve(path); @@ -52,7 +52,7 @@ async function preloadStdin(): Promise { async function getPackageJson( args: ParsedArgs, regenerateReportName: boolean -): Promise { +): Promise> { /* get from explicit path passed as argument */ if (args.pkgfile) { return { diff --git a/src/package-json.spec.ts b/src/package-json.spec.ts index 14a28756..f7a0f5c0 100644 --- a/src/package-json.spec.ts +++ b/src/package-json.spec.ts @@ -7,7 +7,7 @@ import { npmInfoMockDefault } from "./utils/npm-info"; jest.mock("./utils/npm-info"); -let pkg: PackageJson; +let pkg: PackageJson & Required>; beforeEach(() => { pkg = { diff --git a/src/rules/outdated-engines.spec.ts b/src/rules/outdated-engines.spec.ts index e8d1779e..9a1931f9 100644 --- a/src/rules/outdated-engines.spec.ts +++ b/src/rules/outdated-engines.spec.ts @@ -28,7 +28,9 @@ describe("should return error when unsupported version satisfies engines.node", ${">= 12.x"} | ${"Node 12"} `("$description", ({ range, description }) => { expect.assertions(1); - pkg.engines.node = range; + pkg.engines = { + node: range, + }; /* eslint-disable-next-line security/detect-non-literal-regexp -- not under user control */ const message = new RegExp( String.raw`engines\.node is satisfied by ${description} \(EOL since \d{4}-.*\)` @@ -47,7 +49,9 @@ describe("should return error when unsupported version satisfies engines.node", it("should return error engines.node is not a valid semver range", () => { expect.assertions(1); - pkg.engines.node = "foobar"; + pkg.engines = { + node: "foobar", + }; expect(Array.from(outdatedEngines(pkg))).toMatchInlineSnapshot(` [ { @@ -63,7 +67,7 @@ it("should return error engines.node is not a valid semver range", () => { it("should return error engines.node is missing", () => { expect.assertions(1); - delete pkg.engines.node; + pkg.engines = {}; expect(Array.from(outdatedEngines(pkg))).toMatchInlineSnapshot(` [ { @@ -95,6 +99,8 @@ it("should return error engines is missing", () => { it("should not return error when engines.node only supports active versions", () => { expect.assertions(1); - pkg.engines.node = ">= 14"; + pkg.engines = { + node: ">= 14", + }; expect(Array.from(outdatedEngines(pkg))).toMatchInlineSnapshot(`[]`); }); diff --git a/src/rules/outdated-engines.ts b/src/rules/outdated-engines.ts index c8662349..dc69f8d1 100644 --- a/src/rules/outdated-engines.ts +++ b/src/rules/outdated-engines.ts @@ -41,7 +41,7 @@ export function* outdatedEngines(pkg: PackageJson): Generator { if (!semver.satisfies(expanded, range)) { continue; } - const nodeRelease = parsed.major || `0.${parsed.minor}`; + const nodeRelease = parsed?.major || `0.${parsed?.minor}`; const message = `engines.node is satisfied by Node ${nodeRelease} (EOL since ${descriptor.eol})`; yield { ruleId, diff --git a/src/rules/types-node-matching-engine.spec.ts b/src/rules/types-node-matching-engine.spec.ts index 2c8aa63e..acbef95f 100644 --- a/src/rules/types-node-matching-engine.spec.ts +++ b/src/rules/types-node-matching-engine.spec.ts @@ -1,20 +1,21 @@ import PackageJson from "../types/package-json"; import { typesNodeMatchingEngine } from "./types-node-matching-engine"; -let pkg: PackageJson; +let pkg: PackageJson & Required>; beforeEach(() => { pkg = { name: "mock-package", version: "1.2.3", - devDependencies: {}, engines: {}, }; }); it("should return error when engine is lower major than types", () => { expect.assertions(1); - pkg.devDependencies["@types/node"] = "^14.1.2"; + pkg.devDependencies = { + "@types/node": "^14.1.2", + }; pkg.engines.node = ">= 12"; expect(Array.from(typesNodeMatchingEngine(pkg))).toMatchInlineSnapshot(` [ @@ -31,7 +32,9 @@ it("should return error when engine is lower major than types", () => { it("should return error when engine is higher major than types", () => { expect.assertions(1); - pkg.devDependencies["@types/node"] = "^12.1.2"; + pkg.devDependencies = { + "@types/node": "^12.1.2", + }; pkg.engines.node = ">= 14"; expect(Array.from(typesNodeMatchingEngine(pkg))).toMatchInlineSnapshot(` [ @@ -48,14 +51,18 @@ it("should return error when engine is higher major than types", () => { it("should not return error when engine and types have same major", () => { expect.assertions(1); - pkg.devDependencies["@types/node"] = "^12.1.2"; + pkg.devDependencies = { + "@types/node": "^12.1.2", + }; pkg.engines.node = ">= 12"; expect(Array.from(typesNodeMatchingEngine(pkg))).toEqual([]); }); it("should handle || in engine constraint", () => { expect.assertions(1); - pkg.devDependencies["@types/node"] = "^14.1.2"; + pkg.devDependencies = { + "@types/node": "^14.1.2", + }; pkg.engines.node = "^10.2.3 || ^12.2.3 || 14.2.3"; expect(Array.from(typesNodeMatchingEngine(pkg))).toMatchInlineSnapshot(` [ diff --git a/src/rules/verify-engine-constraint.ts b/src/rules/verify-engine-constraint.ts index a2e351f3..3d7efa26 100644 --- a/src/rules/verify-engine-constraint.ts +++ b/src/rules/verify-engine-constraint.ts @@ -29,6 +29,10 @@ export async function verifyEngineConstraint(pkg: PackageJson): Promise = new Map(); let defaultInfo: PackageJson | null = null; export async function npmInfo(pkg: string): Promise { - if (mock.has(pkg)) { - return mock.get(pkg); + const mocked = mock.get(pkg); + if (mocked) { + return mocked; } else if (defaultInfo) { return defaultInfo; } else { diff --git a/src/utils/npm-info.ts b/src/utils/npm-info.ts index e1741f91..d260d390 100644 --- a/src/utils/npm-info.ts +++ b/src/utils/npm-info.ts @@ -4,8 +4,9 @@ import PackageJson from "../types/package-json"; const cache: Map = new Map(); export async function npmInfo(pkg: string): Promise { - if (cache.has(pkg)) { - return cache.get(pkg); + const cached = cache.get(pkg); + if (cached) { + return cached; } const result = await execa("npm", ["info", "--json", pkg]); diff --git a/tsconfig.json b/tsconfig.json index 5d8b3e74..2c5839fc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,8 +13,7 @@ "resolveJsonModule": true, "sourceMap": true, "target": "es2017", - "strict": true, - "strictNullChecks": false + "strict": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "**/__mocks__"]