From 9953401f752ee4d9da57c426fba15e472b711b68 Mon Sep 17 00:00:00 2001 From: Niko Virtala Date: Sun, 29 Dec 2024 16:39:00 +0200 Subject: [PATCH] fix: add missing coverage provider dependency --- src/index.ts | 25 ++++++++++++++++++++++--- test/vitest.test.ts | 12 ++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index c55b80d..f7d2d80 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { Component } from "projen/lib/component"; +import { DependencyType } from "projen/lib/dependencies"; import { Jest, NodeProject } from "projen/lib/javascript"; import { Project } from "projen/lib/project"; import { TextFile } from "projen/lib/textfile"; @@ -220,9 +221,10 @@ export class Vitest extends Component { private readonly coverageEnabled: boolean; private environment: string; private globals: boolean; - private coverageProvider: string; - private coverageReporters: Array; + private coverageProvider: CoverageProvider; + private coverageReporters: Array; private coverageDirectory: string; + private version: string; constructor(project: NodeProject, options: VitestOptions = {}) { super(project); @@ -242,9 +244,11 @@ export class Vitest extends Component { this.coverageProvider = options.config?.coverageProvider ?? CoverageProvider.V8; this.coverageReporters = options.config?.coverageReporters ?? [CoverageReporter.TEXT, CoverageReporter.LCOV]; this.coverageDirectory = options.config?.coverageDirectory ?? "coverage"; + this.version = options.vitestVersion ?? "^2"; - project.addDevDeps(`vitest@${options.vitestVersion ?? "^2"}`); + project.addDevDeps(`vitest@${this.version}`); + this.configureCoverageProvider(this.coverageProvider); this.addTestCommand(); this.synthesizeConfig(); } @@ -267,6 +271,21 @@ export class Vitest extends Component { } public configureCoverageProvider(provider: CoverageProvider): void { + const providerPackages = { + [CoverageProvider.V8]: `@vitest/coverage-v8@${this.version}`, + [CoverageProvider.ISTANBUL]: `@vitest/coverage-istanbul@${this.version}`, + }; + + // remove existing provider packages if they exist + Object.values(providerPackages).forEach((providerPackage) => { + try { + this.project.deps.removeDependency(providerPackage); + } catch { + // ignore errors when dependency doesn't exist + } + }); + + this.project.deps.addDependency(providerPackages[provider], DependencyType.DEVENV); this.coverageProvider = provider; this.synthesizeConfig(); } diff --git a/test/vitest.test.ts b/test/vitest.test.ts index d2c5970..4249075 100644 --- a/test/vitest.test.ts +++ b/test/vitest.test.ts @@ -33,8 +33,10 @@ describe("vitest", () => { expect(() => new Vitest(project)).not.toThrow(); const snapshot = synthSnapshot(project); + expect(snapshot["vitest.config.ts"]).toBeDefined(); expect(snapshot["package.json"].devDependencies.vitest).toBe("^2"); + expect(snapshot["package.json"].devDependencies["@vitest/coverage-v8"]).toBe("^2"); }); test("custom environment", () => { @@ -50,7 +52,9 @@ describe("vitest", () => { vitest.configureCoverageProvider(CoverageProvider.ISTANBUL); const snapshot = synthSnapshot(project); + expect(snapshot["vitest.config.ts"]).toContain('provider: "istanbul"'); + expect(snapshot["package.json"].devDependencies["@vitest/coverage-istanbul"]).toBe("^2"); }); test("custom coverage reporters", () => { @@ -77,6 +81,14 @@ describe("vitest", () => { expect(snapshot["vitest.config.ts"]).toContain('"**/*.test.js"'); }); + test("handles non-existent dependencies gracefully", () => { + const vitest = new Vitest(project); + + expect(() => vitest.configureCoverageProvider(CoverageProvider.V8)).not.toThrow(); + expect(() => vitest.configureCoverageProvider(CoverageProvider.ISTANBUL)).not.toThrow(); + expect(() => vitest.configureCoverageProvider(CoverageProvider.V8)).not.toThrow(); + }); + test("initialize with custom options", () => { new Vitest(project, { configFilePath: "custom.vitest.config.ts",