UNPKG

@stryker-mutator/core

Version:

The extendable JavaScript mutation testing framework

72 lines (60 loc) 2.87 kB
import os from 'os'; import fs from 'fs/promises'; import type { execaCommand } from 'execa'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Immutable, type resolveFromCwd } from '@stryker-mutator/util'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { Logger } from '@stryker-mutator/api/logging'; import semver from 'semver'; import { fileUtils } from '../../utils/file-utils.js'; import { coreTokens } from '../../di/index.js'; import { CustomInitializer, CustomInitializerConfiguration } from './custom-initializer.js'; const guideUrl = 'https://stryker-mutator.io/docs/stryker-js/guides/angular'; const karmaConfigFile = 'karma.conf.js'; export class AngularInitializer implements CustomInitializer { public static inject = [commonTokens.logger, coreTokens.execa, coreTokens.resolveFromCwd] as const; constructor( private readonly log: Logger, private readonly execa: typeof execaCommand, private readonly resolve: typeof resolveFromCwd, ) {} public readonly name = 'angular-cli'; // Please keep config in sync with handbook private readonly dependencies = ['@stryker-mutator/karma-runner']; private readonly config: Immutable<Partial<StrykerOptions>> = { mutate: ['src/**/*.ts', '!src/**/*.spec.ts', '!src/test.ts', '!src/environments/*.ts'], testRunner: 'karma', karma: { configFile: karmaConfigFile, projectType: 'angular-cli', config: { browsers: ['ChromeHeadless'], }, }, reporters: ['progress', 'clear-text', 'html'], ignorers: ['angular'], concurrency: Math.floor(os.cpus().length / 2), concurrency_comment: 'Recommended to use about half of your available cores when running stryker with angular', coverageAnalysis: 'perTest', }; public async createConfig(): Promise<CustomInitializerConfiguration> { const [karmaConfigExists, ngVersionOutput] = await Promise.all([fileUtils.exists(karmaConfigFile), this.getCurrentAngularVersion()]); if (!karmaConfigExists && ngVersionOutput && semver.gte(ngVersionOutput, '15.1.0')) { const command = 'npx ng generate config karma'; this.log.info(`No "karma.conf.js" file found, running command: "${command}"`); const { stdout } = await this.execa(command); this.log.info(`\n${stdout}`); } return { config: this.config, guideUrl, dependencies: this.dependencies }; } private async getCurrentAngularVersion(): Promise<string | undefined> { try { const packageLocation = this.resolve('@angular/cli/package.json'); return JSON.parse(await fs.readFile(packageLocation, 'utf8')).version; } catch (err) { const error = err as Error; this.log.warn(`Could not discover your local angular-cli version. Continuing without generating karma configuration. ${error.stack}`); return undefined; } } }