diff --git a/.eslintrc.js b/.eslintrc.js index f1b55bf589..ebc7854666 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -25,6 +25,7 @@ module.exports = { "groups": ["builtin", "external", "internal", "parent", "sibling", "index"] } ], + 'import/no-default-export': 'error', 'prettier/prettier': ['error'], 'sort-imports': 'off', 'no-case-declarations': 'off', diff --git a/.gitignore b/.gitignore index 99fe4738e7..874bfa8910 100644 --- a/.gitignore +++ b/.gitignore @@ -3,37 +3,29 @@ lerna-debug.log npm-debug.log stryker.log lint.log - coverage reports .tscache stryker-tmp .stryker-tmp .stryker-tmp-2 +.nyc_output +.DS_Store *.map -# Ignore heap dumps -packages/report.*.json - +src-generated +dist +dist-test +packages/report.*.json # Ignore heap dumps e2e/module/*.js e2e/module/*.map e2e/module/*.d.ts e2e/*.js e2e/*.map e2e/*.d.ts -packages/*/src/**/*.js -packages/*/test/**/*.js -packages/*/src/**/*.d.ts -packages/*/test/**/*.d.ts -packages/*/dist -e2e/test/*/dist -e2e/test/*/dist-test .idea *.iml *.tmp.txt -.nyc_output package-lock.json -.DS_Store tsconfig.*.tsbuildinfo -src-generated packages/core/schema __filterSpecs.js \ No newline at end of file diff --git a/e2e/helpers.ts b/e2e/helpers.ts index de11c6b19a..26cc2e6fc3 100644 --- a/e2e/helpers.ts +++ b/e2e/helpers.ts @@ -1,4 +1,4 @@ -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { mutationTestReportSchema } from '@stryker-mutator/api/report'; import { expect } from 'chai'; @@ -6,10 +6,10 @@ import path from 'path'; import { calculateMetrics, MetricsResult, Metrics } from 'mutation-testing-metrics'; export async function readMutationTestResult(eventResultDirectory = path.resolve('reports', 'mutation', 'events')) { - const allReportFiles = await fs.readdir(eventResultDirectory); + const allReportFiles = await fsPromises.readdir(eventResultDirectory); const mutationTestReportFile = allReportFiles.find(file => !!file.match(/.*onMutationTestReportReady.*/)); expect(mutationTestReportFile).ok; - const mutationTestReportContent = await fs.readFile(path.resolve(eventResultDirectory, mutationTestReportFile || ''), 'utf8'); + const mutationTestReportContent = await fsPromises.readFile(path.resolve(eventResultDirectory, mutationTestReportFile || ''), 'utf8'); const report = JSON.parse(mutationTestReportContent) as mutationTestReportSchema.MutationTestResult; const metricsResult = calculateMetrics(report.files); return metricsResult; @@ -20,7 +20,7 @@ type WritableMetricsResult = { }; export function readLogFile(fileName = path.resolve('stryker.log')): Promise { - return fs.readFile(fileName, 'utf8'); + return fsPromises.readFile(fileName, 'utf8'); } export async function expectMetricsResult(expectedMetricsResult: Partial) { diff --git a/e2e/test/command/verify/verify.ts b/e2e/test/command/verify/verify.ts index c4baaf77bf..4abbb74b98 100644 --- a/e2e/test/command/verify/verify.ts +++ b/e2e/test/command/verify/verify.ts @@ -1,4 +1,4 @@ -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { expect } from 'chai'; import { expectMetricsResult, produceMetrics } from '../../../helpers'; @@ -21,7 +21,7 @@ describe('After running stryker with the command test runner', () => { }); it('should write to a log file', async () => { - const strykerLog = await fs.readFile('./stryker.log', 'utf8'); + const strykerLog = await fsPromises.readFile('./stryker.log', 'utf8'); expect(strykerLog).contains('INFO DryRunExecutor Initial test run succeeded. Ran 1 test'); expect(strykerLog).matches(/MutationTestExecutor Done in \d+/); expect(strykerLog).not.contains('ERROR'); diff --git a/e2e/test/exit-prematurely-dry-run-fails/verify/verify.ts b/e2e/test/exit-prematurely-dry-run-fails/verify/verify.ts index 558024b478..88958cfe2d 100644 --- a/e2e/test/exit-prematurely-dry-run-fails/verify/verify.ts +++ b/e2e/test/exit-prematurely-dry-run-fails/verify/verify.ts @@ -1,6 +1,5 @@ -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import chai, { expect } from 'chai'; -import { it } from 'mocha'; import chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); @@ -9,7 +8,7 @@ describe('Verify stryker has handled dry run failure correctly', () => { let strykerLog: string; before(async () => { - strykerLog = await fs.readFile('./stryker.log', 'utf8'); + strykerLog = await fsPromises.readFile('./stryker.log', 'utf8'); }); it('should about failed tests in initial test run', async () => { @@ -30,6 +29,6 @@ describe('Verify stryker has handled dry run failure correctly', () => { it('should not delete the temp dir', async () => { - await expect(fs.stat('.stryker-tmp'), 'Expected the `.stryker-tmp` dir to not be deleted.').not.rejected; + await expect(fsPromises.stat('.stryker-tmp'), 'Expected the `.stryker-tmp` dir to not be deleted.').not.rejected; }); }); diff --git a/e2e/test/jasmine-javascript/verify/verify.ts b/e2e/test/jasmine-javascript/verify/verify.ts index 8737472a96..c5a963941a 100644 --- a/e2e/test/jasmine-javascript/verify/verify.ts +++ b/e2e/test/jasmine-javascript/verify/verify.ts @@ -1,4 +1,4 @@ -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { expect } from 'chai'; import { expectMetrics } from '../../../helpers'; @@ -20,7 +20,7 @@ describe('After running stryker with test runner jasmine, test framework jasmine }); it('should write to a log file', async () => { - const strykerLog = await fs.readFile('./stryker.log', 'utf8'); + const strykerLog = await fsPromises.readFile('./stryker.log', 'utf8'); expect(strykerLog).matches(/INFO InputFileResolver Found 2 of 9 file\(s\) to be mutated/); expect(strykerLog).matches(/Done in \d+ second/); // TODO, we now have an error because of a memory leak: https://github.com/jasmine/jasmine-npm/issues/134 diff --git a/e2e/test/mocha-old-version/verify/verify.ts b/e2e/test/mocha-old-version/verify/verify.ts index 5b0cd6bc49..9753b8afd2 100644 --- a/e2e/test/mocha-old-version/verify/verify.ts +++ b/e2e/test/mocha-old-version/verify/verify.ts @@ -1,13 +1,12 @@ -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { expect } from 'chai'; -import { it } from 'mocha'; describe('Verify stryker runs with mocha < 6', () => { let strykerLog: string; before(async () => { - strykerLog = await fs.readFile('./stryker.log', 'utf8'); + strykerLog = await fsPromises.readFile('./stryker.log', 'utf8'); }); it('should warn about old mocha version', async () => { diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index 0e691f3f81..dd536c792f 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../tsconfig.settings.json", "compilerOptions": { "declaration": false, + "composite": false, "importHelpers": false, "esModuleInterop": true, "rootDir": ".", diff --git a/helpers/bootstrap-local-dependencies.ts b/helpers/bootstrap-local-dependencies.ts index 25c24d999c..825e8dc1c9 100644 --- a/helpers/bootstrap-local-dependencies.ts +++ b/helpers/bootstrap-local-dependencies.ts @@ -1,5 +1,5 @@ import { ListByPackage, LocalInstaller, progress } from 'install-local'; -import * as fs from 'fs'; +import fs from 'fs'; import glob = require('glob'); import path = require('path'); diff --git a/package.json b/package.json index a6565f72ec..5431f7e2db 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@types/rimraf": "~3.0.0", "@types/sinon": "^9.0.10", "@types/sinon-chai": "~3.2.4", + "@types/source-map-support": "^0.5.3", "@typescript-eslint/eslint-plugin": "4.14.0", "@typescript-eslint/parser": "4.14.1", "chai": "~4.2.0", @@ -41,7 +42,7 @@ "rimraf": "~3.0.0", "sinon": "~9.2.0", "sinon-chai": "~3.5.0", - "source-map-support": "~0.5.6", + "source-map-support": "^0.5.19", "typescript": "~4.1.3" }, "scripts": { @@ -50,7 +51,7 @@ "lint": "eslint . --resolve-plugins-relative-to . --ext .ts,.tsx", "lint:log": "eslint . --resolve-plugins-relative-to . --ext .ts,.tsx -f compact -o lint.log", "lint:fix": "eslint . --resolve-plugins-relative-to . --ext .ts,.tsx --fix", - "clean": "rimraf \"packages/api/!(stryker.conf)+(.d.ts|.js|.map)\" \"packages/*/+(test|src)/**/*+(.d.ts|.js|.map)\" \"packages/*/{.nyc_output,reports,coverage,src-generated,*.tsbuildinfo,.stryker-tmp,dist}\"", + "clean": "rimraf \"packages/*/{.nyc_output,reports,coverage,src-generated,*.tsbuildinfo,.stryker-tmp,dist}\" \"packages/core/schema/stryker-schema.json\"", "generate": "node tasks/generate-json-schema-to-ts.js && node tasks/generate-mono-schema.js", "prebuild": "npm run generate", "build": "tsc -b && lerna run build", diff --git a/packages/api/.gitignore b/packages/api/.gitignore deleted file mode 100644 index 8e68761e15..0000000000 --- a/packages/api/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/*.js -/*.d.ts -!/stryker.conf.js -testResources/module/**/*.js -testResources/module/**/*.d.ts \ No newline at end of file diff --git a/packages/api/.mocharc.jsonc b/packages/api/.mocharc.jsonc index 907a3f97fc..fd7a9c163b 100644 --- a/packages/api/.mocharc.jsonc +++ b/packages/api/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": ["test/setup.js"], + "require": ["dist/test/setup.js"], "timeout": 10000 } diff --git a/packages/api/.npmignore b/packages/api/.npmignore index 35f619f144..69ec1fed9c 100644 --- a/packages/api/.npmignore +++ b/packages/api/.npmignore @@ -1,13 +1,14 @@ -**/* -!*.d.ts -!bin/** -!src/** -!schema/** -!*.js -src/**/*.map -src/**/*.ts -!{src,src-generated}/**/*.d.ts -!schema/*.json -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/api/.vscode/launch.json b/packages/api/.vscode/launch.json index c7285fbf35..1623468693 100644 --- a/packages/api/.vscode/launch.json +++ b/packages/api/.vscode/launch.json @@ -10,13 +10,12 @@ "--timeout", "999999", "--colors", - "${workspaceRoot}/test/helpers/**/*.js", - "${workspaceRoot}/test/unit/**/*.js" + "${workspaceRoot}/dist/test/helpers/**/*.js", + "${workspaceRoot}/dist/test/unit/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/api/check.d.ts b/packages/api/check.d.ts new file mode 100644 index 0000000000..62df6ec958 --- /dev/null +++ b/packages/api/check.d.ts @@ -0,0 +1 @@ +export * from './dist/src/check'; diff --git a/packages/api/check.js b/packages/api/check.js new file mode 100644 index 0000000000..76d3d8bffd --- /dev/null +++ b/packages/api/check.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/check") diff --git a/packages/api/check.ts b/packages/api/check.ts deleted file mode 100644 index df68ba5faa..0000000000 --- a/packages/api/check.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './src/check/checker'; -export * from './src/check/check-result'; -export * from './src/check/check-status'; diff --git a/packages/api/core.d.ts b/packages/api/core.d.ts new file mode 100644 index 0000000000..660f2ae860 --- /dev/null +++ b/packages/api/core.d.ts @@ -0,0 +1 @@ +export * from './dist/src/core'; diff --git a/packages/api/core.js b/packages/api/core.js new file mode 100644 index 0000000000..f99f6406cf --- /dev/null +++ b/packages/api/core.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/core") diff --git a/packages/api/core.ts b/packages/api/core.ts deleted file mode 100644 index d973484b7e..0000000000 --- a/packages/api/core.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { default as File } from './src/core/file'; -export { default as Position } from './src/core/position'; -export { default as Location } from './src/core/location'; -export { default as Range } from './src/core/range'; -export { default as Mutant } from './src/core/mutant'; -export * from './src-generated/stryker-core'; -export * from './src/core/report-types'; -export * from './src/core/stryker-options-schema'; -export * from './src/core/partial-stryker-options'; -export * from './src/core/instrument'; -export * from './src/core/mutant-coverage'; diff --git a/packages/api/logging.d.ts b/packages/api/logging.d.ts new file mode 100644 index 0000000000..9b604f071a --- /dev/null +++ b/packages/api/logging.d.ts @@ -0,0 +1 @@ +export * from './dist/src/logging'; diff --git a/packages/api/logging.js b/packages/api/logging.js new file mode 100644 index 0000000000..fd095fd6f7 --- /dev/null +++ b/packages/api/logging.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/logging") diff --git a/packages/api/logging.ts b/packages/api/logging.ts deleted file mode 100644 index 3c9584dd5e..0000000000 --- a/packages/api/logging.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Logger } from './src/logging/logger'; -export { default as LoggerFactoryMethod } from './src/logging/logger-factory-method'; diff --git a/packages/api/package.json b/packages/api/package.json index c451f5014f..a7ddf86ab9 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -9,7 +9,7 @@ "scripts": { "stryker": "node ../core/bin/stryker run", "test": "nyc npm run test:unit", - "test:unit": "mocha \"test/unit/**/*.js\"" + "test:unit": "mocha \"dist/test/unit/**/*.js\"" }, "keywords": [ "mutation testing", diff --git a/packages/api/plugin.d.ts b/packages/api/plugin.d.ts new file mode 100644 index 0000000000..4781459199 --- /dev/null +++ b/packages/api/plugin.d.ts @@ -0,0 +1 @@ +export * from './dist/src/plugin'; diff --git a/packages/api/plugin.js b/packages/api/plugin.js new file mode 100644 index 0000000000..fec32aab75 --- /dev/null +++ b/packages/api/plugin.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/plugin") diff --git a/packages/api/plugin.ts b/packages/api/plugin.ts deleted file mode 100644 index cba97b8276..0000000000 --- a/packages/api/plugin.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './src/plugin/contexts'; -export * from './src/plugin/plugins'; -export * from './src/plugin/plugin-kind'; -export * from './src/plugin/tokens'; -export * from './src/plugin/scope'; -export { Injectable, Injector, InjectionToken, CorrespondingType, Disposable } from 'typed-inject'; diff --git a/packages/api/report.d.ts b/packages/api/report.d.ts new file mode 100644 index 0000000000..1e762cad17 --- /dev/null +++ b/packages/api/report.d.ts @@ -0,0 +1 @@ +export * from './dist/src/report'; diff --git a/packages/api/report.js b/packages/api/report.js new file mode 100644 index 0000000000..802ed6274a --- /dev/null +++ b/packages/api/report.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/report") diff --git a/packages/api/report.ts b/packages/api/report.ts deleted file mode 100644 index bc5f7283eb..0000000000 --- a/packages/api/report.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as mutationTestReportSchema from 'mutation-testing-report-schema'; - -export { default as Reporter } from './src/report/reporter'; -export * from './src/report/mutant-result'; -export { default as MutantStatus } from './src/report/mutant-status'; -export { default as SourceFile } from './src/report/source-file'; -export { default as MatchedMutant } from './src/report/matched-mutant'; -export { - /** - * Types exported directly from mutation-testing-schema - * @see https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/mutation-testing-report-schema - */ - mutationTestReportSchema, -}; diff --git a/packages/api/src/check/checker.ts b/packages/api/src/check/checker.ts index 67a7cd3800..0454a91a67 100644 --- a/packages/api/src/check/checker.ts +++ b/packages/api/src/check/checker.ts @@ -1,4 +1,4 @@ -import { Mutant } from '../../core'; +import { Mutant } from '../core'; import { CheckResult } from './check-result'; diff --git a/packages/api/src/check/index.ts b/packages/api/src/check/index.ts new file mode 100644 index 0000000000..2f9e3bbcaf --- /dev/null +++ b/packages/api/src/check/index.ts @@ -0,0 +1,3 @@ +export * from './checker'; +export * from './check-result'; +export * from './check-status'; diff --git a/packages/api/src/core/file.ts b/packages/api/src/core/file.ts index 9a27b4e3c0..cebd0d3d9a 100644 --- a/packages/api/src/core/file.ts +++ b/packages/api/src/core/file.ts @@ -3,7 +3,7 @@ import { Surrializable, surrial } from 'surrial'; /** * Represents a file within Stryker. Could be a strictly in-memory file. */ -export default class File implements Surrializable { +export class File implements Surrializable { private _textContent: string | undefined; private readonly _content: Buffer; diff --git a/packages/api/src/core/index.ts b/packages/api/src/core/index.ts new file mode 100644 index 0000000000..4ef67d5724 --- /dev/null +++ b/packages/api/src/core/index.ts @@ -0,0 +1,11 @@ +export { File } from './file'; +export { Position } from './position'; +export { Location } from './location'; +export { Range } from './range'; +export { Mutant } from './mutant'; +export * from '../../src-generated/stryker-core'; +export * from './report-types'; +export * from './stryker-options-schema'; +export * from './partial-stryker-options'; +export * from './instrument'; +export * from './mutant-coverage'; diff --git a/packages/api/src/core/location.ts b/packages/api/src/core/location.ts index e6315e431f..a0028f893d 100644 --- a/packages/api/src/core/location.ts +++ b/packages/api/src/core/location.ts @@ -1,11 +1,9 @@ -import Position from './position'; +import { Position } from './position'; /** * A location in the source code which can span multiple lines and/or columns. */ -interface Location { +export interface Location { start: Position; end: Position; } - -export default Location; diff --git a/packages/api/src/core/mutant.ts b/packages/api/src/core/mutant.ts index f0c107930f..42ab40c2f4 100644 --- a/packages/api/src/core/mutant.ts +++ b/packages/api/src/core/mutant.ts @@ -1,10 +1,10 @@ -import Range from './range'; -import Location from './location'; +import { Range } from './range'; +import { Location } from './location'; /** * Represents a mutant */ -interface Mutant { +export interface Mutant { /** * The id of the mutant. Unique within a run. */ @@ -34,5 +34,3 @@ interface Mutant { */ ignoreReason?: string; } - -export default Mutant; diff --git a/packages/api/src/core/partial-stryker-options.ts b/packages/api/src/core/partial-stryker-options.ts index 02b571bd23..e63b4a9ed3 100644 --- a/packages/api/src/core/partial-stryker-options.ts +++ b/packages/api/src/core/partial-stryker-options.ts @@ -1,4 +1,4 @@ -import { StrykerOptions } from '../../core'; +import { StrykerOptions } from '../../src-generated/stryker-core'; /** * When configuring stryker, every option is optional diff --git a/packages/api/src/core/position.ts b/packages/api/src/core/position.ts index c258599066..b612ef0103 100644 --- a/packages/api/src/core/position.ts +++ b/packages/api/src/core/position.ts @@ -2,9 +2,7 @@ * A specific spot in the source code based on line and column. * Stryker uses zero-based indexes. So the first character in a file is at line 0, column 0. */ -interface Position { +export interface Position { line: number; column: number; } - -export default Position; diff --git a/packages/api/src/core/range.ts b/packages/api/src/core/range.ts index 0bf0bed25d..5193db35fd 100644 --- a/packages/api/src/core/range.ts +++ b/packages/api/src/core/range.ts @@ -1,6 +1,4 @@ /** * Represents a location in a file by range. */ -type Range = [fromInclusive: number, toExclusive: number]; - -export default Range; +export type Range = [fromInclusive: number, toExclusive: number]; diff --git a/packages/api/src/core/report-types.ts b/packages/api/src/core/report-types.ts index 30cdadfce8..6e7f567cfc 100644 --- a/packages/api/src/core/report-types.ts +++ b/packages/api/src/core/report-types.ts @@ -1,3 +1,3 @@ -import { ReportType } from '../../core'; +import { ReportType } from '../../src-generated/stryker-core'; export const ALL_REPORT_TYPES = Object.freeze([ReportType.Full, ReportType.MutationScore]); diff --git a/packages/api/src/logging/index.ts b/packages/api/src/logging/index.ts new file mode 100644 index 0000000000..2a5e11eb99 --- /dev/null +++ b/packages/api/src/logging/index.ts @@ -0,0 +1,2 @@ +export { Logger } from './logger'; +export { LoggerFactoryMethod } from './logger-factory-method'; diff --git a/packages/api/src/logging/logger-factory-method.ts b/packages/api/src/logging/logger-factory-method.ts index f95989d11a..1f09c46009 100644 --- a/packages/api/src/logging/logger-factory-method.ts +++ b/packages/api/src/logging/logger-factory-method.ts @@ -1,4 +1,4 @@ -import Logger from './logger'; +import { Logger } from './logger'; /** * Represents a factory to get loggers by category name. @@ -7,5 +7,4 @@ import Logger from './logger'; * @param {String} [categoryName] name of category to log to. * @returns {Logger} instance of logger for the category */ -type LoggerFactoryMethod = (categoryName?: string) => Logger; -export default LoggerFactoryMethod; +export type LoggerFactoryMethod = (categoryName?: string) => Logger; diff --git a/packages/api/src/logging/logger.ts b/packages/api/src/logging/logger.ts index bb214070f5..5d1f2d8734 100644 --- a/packages/api/src/logging/logger.ts +++ b/packages/api/src/logging/logger.ts @@ -1,4 +1,4 @@ -export default interface Logger { +export interface Logger { isTraceEnabled(): boolean; isDebugEnabled(): boolean; isInfoEnabled(): boolean; diff --git a/packages/api/src/plugin/contexts.ts b/packages/api/src/plugin/contexts.ts index fffae47489..61c7aafe8d 100644 --- a/packages/api/src/plugin/contexts.ts +++ b/packages/api/src/plugin/contexts.ts @@ -1,5 +1,5 @@ -import { StrykerOptions } from '../../core'; -import { Logger, LoggerFactoryMethod } from '../../logging'; +import { StrykerOptions } from '../core'; +import { Logger, LoggerFactoryMethod } from '../logging'; import { PluginResolver } from './plugins'; import { commonTokens } from './tokens'; diff --git a/packages/api/src/plugin/index.ts b/packages/api/src/plugin/index.ts new file mode 100644 index 0000000000..69b75910f8 --- /dev/null +++ b/packages/api/src/plugin/index.ts @@ -0,0 +1,6 @@ +export * from './contexts'; +export * from './plugins'; +export * from './plugin-kind'; +export * from './tokens'; +export * from './scope'; +export { Injectable, Injector, InjectionToken, CorrespondingType, Disposable } from 'typed-inject'; diff --git a/packages/api/src/plugin/plugins.ts b/packages/api/src/plugin/plugins.ts index d89ca9ee73..58fb93b5fc 100644 --- a/packages/api/src/plugin/plugins.ts +++ b/packages/api/src/plugin/plugins.ts @@ -1,8 +1,8 @@ import { InjectableClass, InjectableFunction, InjectionToken } from 'typed-inject'; -import { Reporter } from '../../report'; -import { TestRunner } from '../../test-runner'; -import { Checker } from '../../check'; +import { Reporter } from '../report'; +import { TestRunner } from '../test-runner'; +import { Checker } from '../check'; import { PluginContext } from './contexts'; import { PluginKind } from './plugin-kind'; diff --git a/packages/api/src/report/index.ts b/packages/api/src/report/index.ts new file mode 100644 index 0000000000..79074321bd --- /dev/null +++ b/packages/api/src/report/index.ts @@ -0,0 +1,14 @@ +import * as mutationTestReportSchema from 'mutation-testing-report-schema'; + +export { Reporter } from './reporter'; +export * from './mutant-result'; +export { MutantStatus } from './mutant-status'; +export { SourceFile } from './source-file'; +export { MatchedMutant } from './matched-mutant'; +export { + /** + * Types exported directly from mutation-testing-schema + * @see https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/mutation-testing-report-schema + */ + mutationTestReportSchema, +}; diff --git a/packages/api/src/report/matched-mutant.ts b/packages/api/src/report/matched-mutant.ts index f16953aed0..fa2aa8925b 100644 --- a/packages/api/src/report/matched-mutant.ts +++ b/packages/api/src/report/matched-mutant.ts @@ -1,4 +1,4 @@ -interface MatchedMutant { +export interface MatchedMutant { /** * The ID of the mutant */ @@ -28,5 +28,3 @@ interface MatchedMutant { */ readonly replacement: string; } - -export default MatchedMutant; diff --git a/packages/api/src/report/mutant-result.ts b/packages/api/src/report/mutant-result.ts index 53cae95da3..f79d8a5d05 100644 --- a/packages/api/src/report/mutant-result.ts +++ b/packages/api/src/report/mutant-result.ts @@ -1,6 +1,6 @@ -import { Location, Range } from '../../core'; +import { Location, Range } from '../core'; -import MutantStatus from './mutant-status'; +import { MutantStatus } from './mutant-status'; export interface BaseMutantResult { id: string; diff --git a/packages/api/src/report/mutant-status.ts b/packages/api/src/report/mutant-status.ts index 009f508f46..61bb8527bf 100644 --- a/packages/api/src/report/mutant-status.ts +++ b/packages/api/src/report/mutant-status.ts @@ -1,4 +1,4 @@ -enum MutantStatus { +export enum MutantStatus { /** * The status of a survived mutant, because it was not covered by any test. */ @@ -42,5 +42,3 @@ enum MutantStatus { */ Ignored, } - -export default MutantStatus; diff --git a/packages/api/src/report/reporter.ts b/packages/api/src/report/reporter.ts index 654867ae34..65cd682d5d 100644 --- a/packages/api/src/report/reporter.ts +++ b/packages/api/src/report/reporter.ts @@ -1,13 +1,13 @@ import { MutationTestResult } from 'mutation-testing-report-schema'; -import MatchedMutant from './matched-mutant'; +import { MatchedMutant } from './matched-mutant'; import { MutantResult } from './mutant-result'; -import SourceFile from './source-file'; +import { SourceFile } from './source-file'; /** * Represents a reporter which can report during or after a Stryker run */ -interface Reporter { +export interface Reporter { /** * Called when a source file was loaded * @param file The immutable source file @@ -53,5 +53,3 @@ interface Reporter { */ wrapUp?(): void | Promise | Promise; } - -export default Reporter; diff --git a/packages/api/src/report/source-file.ts b/packages/api/src/report/source-file.ts index 4d7a5ec691..3e6521539b 100644 --- a/packages/api/src/report/source-file.ts +++ b/packages/api/src/report/source-file.ts @@ -1,6 +1,4 @@ -interface SourceFile { +export interface SourceFile { path: string; content: string; } - -export default SourceFile; diff --git a/packages/api/src/test_runner/dry-run-result.ts b/packages/api/src/test-runner/dry-run-result.ts similarity index 100% rename from packages/api/src/test_runner/dry-run-result.ts rename to packages/api/src/test-runner/dry-run-result.ts diff --git a/packages/api/src/test_runner/dry-run-status.ts b/packages/api/src/test-runner/dry-run-status.ts similarity index 100% rename from packages/api/src/test_runner/dry-run-status.ts rename to packages/api/src/test-runner/dry-run-status.ts diff --git a/packages/api/src/test-runner/index.ts b/packages/api/src/test-runner/index.ts new file mode 100644 index 0000000000..bf1e0cde7a --- /dev/null +++ b/packages/api/src/test-runner/index.ts @@ -0,0 +1,8 @@ +export * from './test-result'; +export * from './test-runner'; +export * from './test-status'; +export * from './dry-run-result'; +export * from './run-options'; +export * from './mutant-run-result'; +export * from './dry-run-status'; +export * from './run-result-helpers'; diff --git a/packages/api/src/test_runner/mutant-run-result.ts b/packages/api/src/test-runner/mutant-run-result.ts similarity index 100% rename from packages/api/src/test_runner/mutant-run-result.ts rename to packages/api/src/test-runner/mutant-run-result.ts diff --git a/packages/api/src/test_runner/run-options.ts b/packages/api/src/test-runner/run-options.ts similarity index 85% rename from packages/api/src/test_runner/run-options.ts rename to packages/api/src/test-runner/run-options.ts index c66b0a4f7d..d8e7448fe3 100644 --- a/packages/api/src/test_runner/run-options.ts +++ b/packages/api/src/test-runner/run-options.ts @@ -1,4 +1,4 @@ -import { Mutant, CoverageAnalysis } from '../../core'; +import { Mutant, CoverageAnalysis } from '../core'; export interface RunOptions { /** @@ -19,5 +19,3 @@ export interface MutantRunOptions extends RunOptions { activeMutant: Mutant; sandboxFileName: string; } - -export default RunOptions; diff --git a/packages/api/src/test_runner/run-result-helpers.ts b/packages/api/src/test-runner/run-result-helpers.ts similarity index 100% rename from packages/api/src/test_runner/run-result-helpers.ts rename to packages/api/src/test-runner/run-result-helpers.ts diff --git a/packages/api/src/test_runner/test-result.ts b/packages/api/src/test-runner/test-result.ts similarity index 100% rename from packages/api/src/test_runner/test-result.ts rename to packages/api/src/test-runner/test-result.ts diff --git a/packages/api/src/test_runner/test-runner.ts b/packages/api/src/test-runner/test-runner.ts similarity index 100% rename from packages/api/src/test_runner/test-runner.ts rename to packages/api/src/test-runner/test-runner.ts diff --git a/packages/api/src/test_runner/test-status.ts b/packages/api/src/test-runner/test-status.ts similarity index 100% rename from packages/api/src/test_runner/test-status.ts rename to packages/api/src/test-runner/test-status.ts diff --git a/packages/api/test-runner.d.ts b/packages/api/test-runner.d.ts new file mode 100644 index 0000000000..7b04fbf788 --- /dev/null +++ b/packages/api/test-runner.d.ts @@ -0,0 +1 @@ +export * from './dist/src/test-runner'; diff --git a/packages/api/test-runner.js b/packages/api/test-runner.js new file mode 100644 index 0000000000..e1ec376e77 --- /dev/null +++ b/packages/api/test-runner.js @@ -0,0 +1 @@ +module.exports = require("./dist/src/test-runner") diff --git a/packages/api/test-runner.ts b/packages/api/test-runner.ts deleted file mode 100644 index dd52f5e964..0000000000 --- a/packages/api/test-runner.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './src/test_runner/test-result'; -export * from './src/test_runner/test-runner'; -export * from './src/test_runner/test-status'; -export * from './src/test_runner/dry-run-result'; -export * from './src/test_runner/run-options'; -export * from './src/test_runner/mutant-run-result'; -export * from './src/test_runner/dry-run-status'; -export * from './src/test_runner/run-result-helpers'; diff --git a/packages/api/test/setup.ts b/packages/api/test/setup.ts index ca7bc2aaa8..0e71b122fe 100644 --- a/packages/api/test/setup.ts +++ b/packages/api/test/setup.ts @@ -1,8 +1,8 @@ import 'source-map-support/register'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinonChai from 'sinon-chai'; -import * as sinon from 'sinon'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinonChai from 'sinon-chai'; +import sinon from 'sinon'; chai.use(sinonChai); chai.use(chaiAsPromised); diff --git a/packages/api/test/unit/core/file.spec.ts b/packages/api/test/unit/core/file.spec.ts index 93eda79e5d..a856e03395 100644 --- a/packages/api/test/unit/core/file.spec.ts +++ b/packages/api/test/unit/core/file.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { deserialize, serialize } from 'surrial'; -import { File } from '../../../core'; +import { File } from '../../../src/core'; describe('File', () => { it('should allow utf8 encoded string content in the constructor', () => { diff --git a/packages/api/test/unit/core/log-level.spec.ts b/packages/api/test/unit/core/log-level.spec.ts index 40b059d8b4..8bc56f6f39 100644 --- a/packages/api/test/unit/core/log-level.spec.ts +++ b/packages/api/test/unit/core/log-level.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { LogLevel } from '../../../core'; +import { LogLevel } from '../../../src/core'; describe('LogLevel', () => { function arrangeActAssertLogLevel(actual: LogLevel, expected: string) { diff --git a/packages/api/test/unit/plugin/plugins.spec.ts b/packages/api/test/unit/plugin/plugins.spec.ts index 69abdc4f7f..f856418c5a 100644 --- a/packages/api/test/unit/plugin/plugins.spec.ts +++ b/packages/api/test/unit/plugin/plugins.spec.ts @@ -1,8 +1,6 @@ import { expect } from 'chai'; -import { declareClassPlugin, declareFactoryPlugin } from '../../../src/plugin/plugins'; -import { PluginKind } from '../../../src/plugin/plugin-kind'; -import { tokens, commonTokens } from '../../../src/plugin/tokens'; +import { tokens, commonTokens, PluginKind, declareClassPlugin, declareFactoryPlugin } from '../../../src/plugin'; import { Logger } from '../../../logging'; import { MutantResult } from '../../../report'; diff --git a/packages/api/test/unit/plugin/tokens.spec.ts b/packages/api/test/unit/plugin/tokens.spec.ts index 253d13725a..50beeb6fc0 100644 --- a/packages/api/test/unit/plugin/tokens.spec.ts +++ b/packages/api/test/unit/plugin/tokens.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { commonTokens, tokens } from '../../../plugin'; +import { commonTokens, tokens } from '../../../src/plugin'; describe('tokens', () => { it('should return input as array', () => { diff --git a/packages/api/test/unit/test_runner/run-result-helpers.spec.ts b/packages/api/test/unit/test_runner/run-result-helpers.spec.ts index 40265df661..776b22d56b 100644 --- a/packages/api/test/unit/test_runner/run-result-helpers.spec.ts +++ b/packages/api/test/unit/test_runner/run-result-helpers.spec.ts @@ -1,7 +1,6 @@ import { expect } from 'chai'; -import { toMutantRunResult, DryRunStatus, MutantRunResult, MutantRunStatus } from '../../../test-runner'; -import { TestStatus } from '../../../src/test_runner/test-status'; +import { TestStatus, toMutantRunResult, DryRunStatus, MutantRunResult, MutantRunStatus } from '../../../src/test-runner'; describe('runResultHelpers', () => { describe(toMutantRunResult.name, () => { diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index e98368432f..c428877a4e 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -8,4 +8,4 @@ "path": "./tsconfig.test.json" } ] -} \ No newline at end of file +} diff --git a/packages/api/tsconfig.src.json b/packages/api/tsconfig.src.json index fc27a4dec9..a08cd4ea4a 100644 --- a/packages/api/tsconfig.src.json +++ b/packages/api/tsconfig.src.json @@ -1,18 +1,13 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": "." }, "include": [ "src", "src-generated", "schema/*.json", - "check.ts", - "core.ts", - "logging.ts", - "plugin.ts", - "report.ts", - "test-runner.ts" ], "references": [] } diff --git a/packages/api/tsconfig.test.json b/packages/api/tsconfig.test.json index 981c6a6fc7..645b3bae3f 100644 --- a/packages/api/tsconfig.test.json +++ b/packages/api/tsconfig.test.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "rootDir": ".", + "outDir": "dist/test", + "rootDir": "test", "types": [ "mocha", "node" diff --git a/packages/core/.mocharc.jsonc b/packages/core/.mocharc.jsonc index 3c32c9ff9d..f8c595f590 100644 --- a/packages/core/.mocharc.jsonc +++ b/packages/core/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": ["./test/setup.js"], + "require": ["./dist/test/setup.js"], "timeout": 10000 } diff --git a/packages/core/.npmignore b/packages/core/.npmignore index 8733fb52ef..8aea5c63c4 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -1,11 +1,12 @@ -**/* -!*.d.ts -!bin/** -!src/** -src/**/*.map -src/**/*.ts -!schema/*.json -!src/**/*.d.ts -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/reports +/testResources +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.gitattributes \ No newline at end of file diff --git a/packages/core/.nycrc.json b/packages/core/.nycrc.json index 0a316c4dc8..c7e42d2cba 100644 --- a/packages/core/.nycrc.json +++ b/packages/core/.nycrc.json @@ -1,6 +1,6 @@ { "include": [ - "src/**/*.js" + "dist/src/**/*.js" ], "excludeAfterRemap": false, "checkCoverage": true, diff --git a/packages/core/.vscode/launch.json b/packages/core/.vscode/launch.json index 8e17468252..934b6812aa 100644 --- a/packages/core/.vscode/launch.json +++ b/packages/core/.vscode/launch.json @@ -7,15 +7,13 @@ "name": "Unit tests", "program": "${workspaceRoot}/../../node_modules/mocha/bin/_mocha", "args": [ - "--timeout", - "999999", + "--no-timeout", "--colors", - "${workspaceRoot}/test/unit/**/*.js" + "${workspaceRoot}/dist/test/unit/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" @@ -27,43 +25,13 @@ "name": "Integration tests", "program": "${workspaceRoot}/../../node_modules/mocha/bin/_mocha", "args": [ - "--timeout", - "999999", + "--no-timeout", "--colors", - "${workspaceRoot}/test/integration/**/*.js" + "${workspaceRoot}/dist/test/integration/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" - ], - "skipFiles": [ - "/**" - ] - }, - { - "name": "Run own dog food", - "type": "node", - "request": "launch", - "program": "${workspaceRoot}/bin/stryker", - // "preLaunchTask": "build", - "stopOnEntry": false, - "args": [ - "run" - ], - "cwd": "${workspaceRoot}", - "runtimeExecutable": null, - "runtimeArgs": [ - "--nolazy" - ], - "env": { - "NODE_ENV": "development" - }, - "console": "internalConsole", - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/core/bin/stryker b/packages/core/bin/stryker index d88f815c81..e719c22725 100755 --- a/packages/core/bin/stryker +++ b/packages/core/bin/stryker @@ -5,5 +5,5 @@ process.title = 'stryker'; // Run the Stryker CLI -const StrykerCli = require('../src/stryker-cli').default; +const { StrykerCli } = require('..'); new StrykerCli(process.argv).run(); diff --git a/packages/core/package.json b/packages/core/package.json index 54dbda91b3..d6753b9149 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -2,13 +2,13 @@ "name": "@stryker-mutator/core", "version": "4.4.1", "description": "The extendable JavaScript mutation testing framework", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "start": "tsc -w", "test": "nyc npm run test:all", "test:all": "npm run test:unit && npm run test:integration", - "test:unit": "mocha 'test/unit/**/*.js'", - "test:integration": "mocha --timeout 60000 'test/integration/**/*.js'", + "test:unit": "mocha 'dist/test/unit/**/*.js'", + "test:integration": "mocha --timeout 60000 'dist/test/integration/**/*.js'", "stryker": "node bin/stryker run" }, "repository": { diff --git a/packages/core/src/checker/checker-facade.ts b/packages/core/src/checker/checker-facade.ts index 8132d99c41..3b0ade7c1d 100644 --- a/packages/core/src/checker/checker-facade.ts +++ b/packages/core/src/checker/checker-facade.ts @@ -4,7 +4,7 @@ import { Mutant, StrykerOptions } from '@stryker-mutator/api/core'; import { tokens, Disposable } from 'typed-inject'; import { commonTokens } from '@stryker-mutator/api/plugin'; -import ChildProcessProxy from '../child-proxy/child-process-proxy'; +import { ChildProcessProxy } from '../child-proxy/child-process-proxy'; import { LoggingClientContext } from '../logging'; import { coreTokens } from '../di'; diff --git a/packages/core/src/child-proxy/child-process-crashed-error.ts b/packages/core/src/child-proxy/child-process-crashed-error.ts index a0441e7175..e76658877b 100644 --- a/packages/core/src/child-proxy/child-process-crashed-error.ts +++ b/packages/core/src/child-proxy/child-process-crashed-error.ts @@ -1,6 +1,6 @@ import { StrykerError } from '@stryker-mutator/util'; -export default class ChildProcessCrashedError extends StrykerError { +export class ChildProcessCrashedError extends StrykerError { constructor(public readonly pid: number, message: string, public readonly exitCode?: number, public readonly signal?: string, innerError?: Error) { super(message, innerError); Error.captureStackTrace(this, ChildProcessCrashedError); diff --git a/packages/core/src/child-proxy/child-process-proxy-worker.ts b/packages/core/src/child-proxy/child-process-proxy-worker.ts index 37dd79aff3..fa11360d98 100644 --- a/packages/core/src/child-proxy/child-process-proxy-worker.ts +++ b/packages/core/src/child-proxy/child-process-proxy-worker.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import path from 'path'; import { File } from '@stryker-mutator/api/core'; import { errorToString } from '@stryker-mutator/util'; @@ -10,8 +10,8 @@ import { deserialize, serialize } from '../utils/object-utils'; import { autoStart, CallMessage, ParentMessage, ParentMessageKind, WorkerMessage, WorkerMessageKind, InitMessage } from './message-protocol'; -export default class ChildProcessProxyWorker { - private log: Logger; +export class ChildProcessProxyWorker { + private log?: Logger; public realSubject: any; @@ -100,7 +100,7 @@ export default class ChildProcessProxyWorker { private removeAnyAdditionalMessageListeners(exceptListener: NodeJS.MessageListener) { process.listeners('message').forEach((listener) => { if (listener !== exceptListener) { - this.log.debug( + this.log?.debug( "Removing an additional message listener, we don't want eavesdropping on our inter-process communication: %s", listener.toString() ); @@ -118,11 +118,11 @@ export default class ChildProcessProxyWorker { const unhandledRejections: Array> = []; process.on('unhandledRejection', (reason, promise) => { const unhandledPromiseId = unhandledRejections.push(promise); - this.log.debug(`UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: ${unhandledPromiseId}): ${reason}`); + this.log?.debug(`UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: ${unhandledPromiseId}): ${reason}`); }); process.on('rejectionHandled', (promise) => { const unhandledPromiseId = unhandledRejections.indexOf(promise) + 1; - this.log.debug(`PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: ${unhandledPromiseId})`); + this.log?.debug(`PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: ${unhandledPromiseId})`); }); } } diff --git a/packages/core/src/child-proxy/child-process-proxy.ts b/packages/core/src/child-proxy/child-process-proxy.ts index e5d141d708..c959bec3f7 100644 --- a/packages/core/src/child-proxy/child-process-proxy.ts +++ b/packages/core/src/child-proxy/child-process-proxy.ts @@ -1,5 +1,5 @@ -import { ChildProcess, fork } from 'child_process'; -import * as os from 'os'; +import childProcess from 'child_process'; +import os from 'os'; import { File, StrykerOptions } from '@stryker-mutator/api/core'; import { PluginContext } from '@stryker-mutator/api/plugin'; @@ -9,11 +9,11 @@ import { Disposable, InjectableClass, InjectionToken } from 'typed-inject'; import { LoggingClientContext } from '../logging'; import { deserialize, kill, padLeft, serialize } from '../utils/object-utils'; -import StringBuilder from '../utils/string-builder'; +import { StringBuilder } from '../utils/string-builder'; -import ChildProcessCrashedError from './child-process-crashed-error'; +import { ChildProcessCrashedError } from './child-process-crashed-error'; import { autoStart, ParentMessage, ParentMessageKind, WorkerMessage, WorkerMessageKind } from './message-protocol'; -import OutOfMemoryError from './out-of-memory-error'; +import { OutOfMemoryError } from './out-of-memory-error'; type Func = (...args: TS) => R; @@ -27,10 +27,10 @@ const BROKEN_PIPE_ERROR_CODE = 'EPIPE'; const IPC_CHANNEL_CLOSED_ERROR_CODE = 'ERR_IPC_CHANNEL_CLOSED'; const TIMEOUT_FOR_DISPOSE = 2000; -export default class ChildProcessProxy implements Disposable { +export class ChildProcessProxy implements Disposable { public readonly proxy: Promisified; - private readonly worker: ChildProcess; + private readonly worker: childProcess.ChildProcess; private readonly initTask: Task; private disposeTask: ExpirableTask | undefined; private currentError: ChildProcessCrashedError | undefined; @@ -49,7 +49,7 @@ export default class ChildProcessProxy implements Disposable { workingDirectory: string, execArgv: string[] ) { - this.worker = fork(require.resolve('./child-process-proxy-worker'), [autoStart], { silent: true, execArgv }); + this.worker = childProcess.fork(require.resolve('./child-process-proxy-worker'), [autoStart], { silent: true, execArgv }); this.initTask = new Task(); this.log.debug('Started %s in child process %s%s', requireName, this.worker.pid, execArgv.length ? ` (using args ${execArgv.join(' ')})` : ''); this.send({ diff --git a/packages/core/src/child-proxy/out-of-memory-error.ts b/packages/core/src/child-proxy/out-of-memory-error.ts index 75b974dd84..04a49bc642 100644 --- a/packages/core/src/child-proxy/out-of-memory-error.ts +++ b/packages/core/src/child-proxy/out-of-memory-error.ts @@ -1,6 +1,6 @@ -import ChildProcessCrashedError from './child-process-crashed-error'; +import { ChildProcessCrashedError } from './child-process-crashed-error'; -export default class OutOfMemoryError extends ChildProcessCrashedError { +export class OutOfMemoryError extends ChildProcessCrashedError { constructor(pid: number, exitCode: number) { super(pid, `Process ${pid} ran out of memory`, exitCode); this.message = 'Process '; diff --git a/packages/core/src/concurrent/concurrency-token-provider.ts b/packages/core/src/concurrent/concurrency-token-provider.ts index 6e054452ae..99b75a6c3b 100644 --- a/packages/core/src/concurrent/concurrency-token-provider.ts +++ b/packages/core/src/concurrent/concurrency-token-provider.ts @@ -1,4 +1,4 @@ -import os = require('os'); +import os from 'os'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { ReplaySubject, Observable, range } from 'rxjs'; diff --git a/packages/core/src/config/config-reader.ts b/packages/core/src/config/config-reader.ts index 7a59b2bc8a..fe257df418 100644 --- a/packages/core/src/config/config-reader.ts +++ b/packages/core/src/config/config-reader.ts @@ -1,10 +1,10 @@ -import * as path from 'path'; +import path from 'path'; import { PartialStrykerOptions } from '@stryker-mutator/api/core'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { deepMerge } from '@stryker-mutator/util/src/deep-merge'; +import { deepMerge } from '@stryker-mutator/util'; import { coreTokens } from '../di'; import { ConfigError } from '../errors'; @@ -22,7 +22,7 @@ module.exports = { const DEFAULT_CONFIG_FILE = 'stryker.conf'; -export default class ConfigReader { +export class ConfigReader { public static inject = tokens(coreTokens.cliOptions, commonTokens.logger, coreTokens.optionsValidator); constructor(private readonly cliOptions: PartialStrykerOptions, private readonly log: Logger, private readonly validator: OptionsValidator) {} diff --git a/packages/core/src/config/create-config.ts b/packages/core/src/config/create-config.ts index 880dec893b..96a8bf9e0c 100644 --- a/packages/core/src/config/create-config.ts +++ b/packages/core/src/config/create-config.ts @@ -1,4 +1,4 @@ -import { deepMerge } from '@stryker-mutator/util/src/deep-merge'; +import { deepMerge } from '@stryker-mutator/util'; import { StrykerOptions, PartialStrykerOptions } from '@stryker-mutator/api/core'; /** diff --git a/packages/core/src/config/options-validator.ts b/packages/core/src/config/options-validator.ts index 7ae08a7e80..84a88f3413 100644 --- a/packages/core/src/config/options-validator.ts +++ b/packages/core/src/config/options-validator.ts @@ -1,4 +1,4 @@ -import os = require('os'); +import os from 'os'; import Ajv, { ValidateFunction } from 'ajv'; import { StrykerOptions, strykerCoreSchema } from '@stryker-mutator/api/core'; @@ -10,8 +10,7 @@ import type { JSONSchema7 } from 'json-schema'; import { coreTokens } from '../di'; import { ConfigError } from '../errors'; import { isWarningEnabled } from '../utils/object-utils'; - -import CommandTestRunner from '../test-runner/command-test-runner'; +import { CommandTestRunner } from '../test-runner/command-test-runner'; import { describeErrors } from './validation-errors'; diff --git a/packages/core/src/config/read-config.ts b/packages/core/src/config/read-config.ts index bb9e4e44d9..7dbefbc564 100644 --- a/packages/core/src/config/read-config.ts +++ b/packages/core/src/config/read-config.ts @@ -2,7 +2,7 @@ import { tokens } from '@stryker-mutator/api/plugin'; import { coreTokens } from '../di'; -import ConfigReader from './config-reader'; +import { ConfigReader } from './config-reader'; export function readConfig(configReader: ConfigReader) { return configReader.readConfig(); diff --git a/packages/core/src/config/validation-errors.ts b/packages/core/src/config/validation-errors.ts index e57bd3d6e9..bc3d750594 100644 --- a/packages/core/src/config/validation-errors.ts +++ b/packages/core/src/config/validation-errors.ts @@ -1,6 +1,6 @@ import { ErrorObject } from 'ajv'; -import groupby = require('lodash.groupby'); +import groupby from 'lodash.groupby'; /** * Convert AJV errors to human readable messages diff --git a/packages/core/src/di/build-main-injector.ts b/packages/core/src/di/build-main-injector.ts index 641773ecc5..21c14c830c 100644 --- a/packages/core/src/di/build-main-injector.ts +++ b/packages/core/src/di/build-main-injector.ts @@ -1,14 +1,14 @@ -import execa = require('execa'); +import execa from 'execa'; import { StrykerOptions, strykerCoreSchema, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { commonTokens, Injector, PluginContext, PluginKind, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { I } from '@stryker-mutator/util'; import { readConfig, buildSchemaWithPluginContributions, OptionsValidator, validateOptions, markUnknownOptions } from '../config'; -import ConfigReader from '../config/config-reader'; -import BroadcastReporter from '../reporters/broadcast-reporter'; +import { ConfigReader } from '../config/config-reader'; +import { BroadcastReporter } from '../reporters/broadcast-reporter'; import { TemporaryDirectory } from '../utils/temporary-directory'; -import Timer from '../utils/timer'; +import { Timer } from '../utils/timer'; import { UnexpectedExitHandler } from '../unexpected-exit-handler'; import { pluginResolverFactory } from './factory-methods'; @@ -33,11 +33,11 @@ buildMainInjector.inject = tokens(commonTokens.injector); export function buildMainInjector(injector: CliOptionsProvider): Injector { const pluginResolverProvider = createPluginResolverProvider(injector); return pluginResolverProvider + .provideValue(coreTokens.timer, new Timer()) // greedy initialize, so the time starts immediately .provideFactory(coreTokens.pluginCreatorReporter, PluginCreator.createFactory(PluginKind.Reporter)) .provideFactory(coreTokens.pluginCreatorChecker, PluginCreator.createFactory(PluginKind.Checker)) .provideClass(coreTokens.reporter, BroadcastReporter) .provideClass(coreTokens.temporaryDirectory, TemporaryDirectory) - .provideClass(coreTokens.timer, Timer) .provideValue(coreTokens.execa, execa) .provideValue(coreTokens.process, process) .provideClass(coreTokens.unexpectedExitRegistry, UnexpectedExitHandler); diff --git a/packages/core/src/di/plugin-loader.ts b/packages/core/src/di/plugin-loader.ts index 0efd8efcdd..10cc387d7c 100644 --- a/packages/core/src/di/plugin-loader.ts +++ b/packages/core/src/di/plugin-loader.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import path from 'path'; import { readdirSync } from 'fs'; import { Logger } from '@stryker-mutator/api/logging'; @@ -63,8 +63,8 @@ export class PluginLoader implements PluginResolver { if (typeof pluginExpression === 'string') { if (pluginExpression.includes('*')) { // Plugin directory is the node_modules folder of the module that installed stryker - // So if current __dirname is './@stryker-mutator/core/src/di' so 4 directories above - const pluginDirectory = path.dirname(path.resolve(__dirname, '..', '..', '..', '..', pluginExpression)); + // So if current __dirname is './@stryker-mutator/core/dist/src/di' so 4 directories above + const pluginDirectory = path.dirname(path.resolve(__dirname, '..', '..', '..', '..', '..', pluginExpression)); const regexp = new RegExp('^' + path.basename(pluginExpression).replace('*', '.*')); this.log.debug('Loading %s from %s', pluginExpression, pluginDirectory); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c1a0cfc77c..d8905e05a2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,8 @@ -import Stryker from './stryker'; -import StrykerCli from './stryker-cli'; +import { Stryker } from './stryker'; +import { StrykerCli } from './stryker-cli'; export { Stryker, StrykerCli }; + +// One default export for backward compatibility +// eslint-disable-next-line import/no-default-export export default Stryker; diff --git a/packages/core/src/initializer/choice-type.ts b/packages/core/src/initializer/choice-type.ts index 7a83fc8af3..88a0bb0ead 100644 --- a/packages/core/src/initializer/choice-type.ts +++ b/packages/core/src/initializer/choice-type.ts @@ -1,4 +1,4 @@ -import Separator = require('inquirer/lib/objects/separator'); +import Separator from 'inquirer/lib/objects/separator'; /** * The "ChoiceType" is used often and is annoying to keep in sync (types change often). diff --git a/packages/core/src/initializer/gitignore-writer.ts b/packages/core/src/initializer/gitignore-writer.ts index 3a3260df55..9fe640613a 100644 --- a/packages/core/src/initializer/gitignore-writer.ts +++ b/packages/core/src/initializer/gitignore-writer.ts @@ -1,4 +1,4 @@ -import * as os from 'os'; +import os from 'os'; import { existsSync, promises as fs } from 'fs'; import { tokens } from '@stryker-mutator/api/plugin'; @@ -9,7 +9,7 @@ import { initializerTokens } from '.'; const GITIGNORE_FILE = '.gitignore'; -export default class GitignoreWriter { +export class GitignoreWriter { public static inject = tokens(initializerTokens.out); constructor(private readonly out: typeof console.log) {} diff --git a/packages/core/src/initializer/index.ts b/packages/core/src/initializer/index.ts index 29fdb32cea..a5846f0273 100644 --- a/packages/core/src/initializer/index.ts +++ b/packages/core/src/initializer/index.ts @@ -4,12 +4,12 @@ import { RestClient } from 'typed-rest-client'; import { provideLogger } from '../di'; import * as initializerTokens from './initializer-tokens'; -import NpmClient from './npm-client'; -import StrykerConfigWriter from './stryker-config-writer'; -import StrykerInitializer from './stryker-initializer'; +import { NpmClient } from './npm-client'; +import { StrykerConfigWriter } from './stryker-config-writer'; +import { StrykerInitializer } from './stryker-initializer'; import { StrykerInquirer } from './stryker-inquirer'; -import strykerPresets from './stryker-presets'; -import GitignoreWriter from './gitignore-writer'; +import { strykerPresets } from './stryker-presets'; +import { GitignoreWriter } from './gitignore-writer'; const BASE_NPM_SEARCH = 'https://api.npms.io'; const BASE_NPM_PACKAGE = 'https://www.unpkg.com'; diff --git a/packages/core/src/initializer/npm-client.ts b/packages/core/src/initializer/npm-client.ts index e1c7d5336a..2f6302a6c4 100644 --- a/packages/core/src/initializer/npm-client.ts +++ b/packages/core/src/initializer/npm-client.ts @@ -4,7 +4,7 @@ import { errorToString } from '@stryker-mutator/util'; import { IRestResponse, RestClient } from 'typed-rest-client/RestClient'; import { PackageInfo } from './package-info'; -import PromptOption from './prompt-option'; +import { PromptOption } from './prompt-option'; import { initializerTokens } from '.'; @@ -36,7 +36,7 @@ const handleResult = (from: string) => (response: IRestResponse): T => { } }; -export default class NpmClient { +export class NpmClient { public static inject = tokens(commonTokens.logger, initializerTokens.restClientNpmSearch, initializerTokens.restClientNpm); constructor(private readonly log: Logger, private readonly searchClient: RestClient, private readonly packageClient: RestClient) {} diff --git a/packages/core/src/initializer/presets/angular-preset.ts b/packages/core/src/initializer/presets/angular-preset.ts index 9dcb259fe9..d3cd2c4bfe 100644 --- a/packages/core/src/initializer/presets/angular-preset.ts +++ b/packages/core/src/initializer/presets/angular-preset.ts @@ -1,9 +1,9 @@ -import * as os from 'os'; +import os from 'os'; import { StrykerOptions } from '@stryker-mutator/api/core'; -import Preset from './preset'; -import PresetConfiguration from './preset-configuration'; +import { Preset } from './preset'; +import { PresetConfiguration } from './preset-configuration'; const guideUrl = 'https://stryker-mutator.io/docs/stryker/guides/angular'; diff --git a/packages/core/src/initializer/presets/preset-configuration.ts b/packages/core/src/initializer/presets/preset-configuration.ts index 8a1238159f..1758d82d34 100644 --- a/packages/core/src/initializer/presets/preset-configuration.ts +++ b/packages/core/src/initializer/presets/preset-configuration.ts @@ -1,6 +1,6 @@ import { File, PartialStrykerOptions } from '@stryker-mutator/api/core'; -export default interface PresetConfiguration { +export interface PresetConfiguration { config: PartialStrykerOptions; guideUrl: string; dependencies: string[]; diff --git a/packages/core/src/initializer/presets/preset.ts b/packages/core/src/initializer/presets/preset.ts index 15a131fd9f..457a6fed41 100644 --- a/packages/core/src/initializer/presets/preset.ts +++ b/packages/core/src/initializer/presets/preset.ts @@ -1,7 +1,6 @@ -import PresetConfig from './preset-configuration'; +import { PresetConfiguration } from './preset-configuration'; -interface Preset { +export interface Preset { readonly name: string; - createConfig(): Promise; + createConfig(): Promise; } -export default Preset; diff --git a/packages/core/src/initializer/presets/react-preset.ts b/packages/core/src/initializer/presets/react-preset.ts index c403617806..dcb448af53 100644 --- a/packages/core/src/initializer/presets/react-preset.ts +++ b/packages/core/src/initializer/presets/react-preset.ts @@ -1,7 +1,7 @@ import { StrykerOptions } from '@stryker-mutator/api/core'; -import Preset from './preset'; -import PresetConfiguration from './preset-configuration'; +import { Preset } from './preset'; +import { PresetConfiguration } from './preset-configuration'; const guideUrl = 'https://stryker-mutator.io/docs/stryker/guides/react'; diff --git a/packages/core/src/initializer/presets/vue-js-preset.ts b/packages/core/src/initializer/presets/vue-js-preset.ts index e4425c9455..91ded390c4 100644 --- a/packages/core/src/initializer/presets/vue-js-preset.ts +++ b/packages/core/src/initializer/presets/vue-js-preset.ts @@ -1,8 +1,8 @@ -import inquirer = require('inquirer'); +import inquirer from 'inquirer'; import { File, PartialStrykerOptions } from '@stryker-mutator/api/core'; -import Preset from './preset'; -import PresetConfiguration from './preset-configuration'; +import { Preset } from './preset'; +import { PresetConfiguration } from './preset-configuration'; const guideUrl = 'https://stryker-mutator.io/docs/stryker/guides/vuejs'; diff --git a/packages/core/src/initializer/prompt-option.ts b/packages/core/src/initializer/prompt-option.ts index 57ed353a45..ecfc8894a5 100644 --- a/packages/core/src/initializer/prompt-option.ts +++ b/packages/core/src/initializer/prompt-option.ts @@ -1,8 +1,6 @@ import { PackageInfo } from './package-info'; -interface PromptOption { +export interface PromptOption { name: string; pkg: PackageInfo | null; } - -export default PromptOption; diff --git a/packages/core/src/initializer/stryker-config-writer.ts b/packages/core/src/initializer/stryker-config-writer.ts index 9c79089c7e..4db4073200 100644 --- a/packages/core/src/initializer/stryker-config-writer.ts +++ b/packages/core/src/initializer/stryker-config-writer.ts @@ -5,17 +5,17 @@ import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { childProcessAsPromised } from '@stryker-mutator/util'; -import CommandTestRunner from '../test-runner/command-test-runner'; +import { CommandTestRunner } from '../test-runner/command-test-runner'; -import PresetConfiguration from './presets/preset-configuration'; -import PromptOption from './prompt-option'; +import { PresetConfiguration } from './presets/preset-configuration'; +import { PromptOption } from './prompt-option'; import { initializerTokens } from '.'; const STRYKER_JS_CONFIG_FILE = 'stryker.conf.js'; const STRYKER_JSON_CONFIG_FILE = 'stryker.conf.json'; -export default class StrykerConfigWriter { +export class StrykerConfigWriter { public static inject = tokens(commonTokens.logger, initializerTokens.out); constructor(private readonly log: Logger, private readonly out: typeof console.log) {} diff --git a/packages/core/src/initializer/stryker-initializer.ts b/packages/core/src/initializer/stryker-initializer.ts index c45dccccd9..fbf3aec574 100644 --- a/packages/core/src/initializer/stryker-initializer.ts +++ b/packages/core/src/initializer/stryker-initializer.ts @@ -1,17 +1,17 @@ -import * as child from 'child_process'; -import { promises as fs } from 'fs'; +import childProcess from 'child_process'; +import { promises as fsPromises } from 'fs'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Logger } from '@stryker-mutator/api/logging'; import { notEmpty } from '@stryker-mutator/util'; -import NpmClient from './npm-client'; +import { NpmClient } from './npm-client'; import { PackageInfo } from './package-info'; -import Preset from './presets/preset'; -import PromptOption from './prompt-option'; -import StrykerConfigWriter from './stryker-config-writer'; +import { Preset } from './presets/preset'; +import { PromptOption } from './prompt-option'; +import { StrykerConfigWriter } from './stryker-config-writer'; import { StrykerInquirer } from './stryker-inquirer'; -import GitignoreWriter from './gitignore-writer'; +import { GitignoreWriter } from './gitignore-writer'; import { initializerTokens } from '.'; @@ -20,7 +20,7 @@ const enum PackageManager { Yarn = 'yarn', } -export default class StrykerInitializer { +export class StrykerInitializer { public static inject = tokens( commonTokens.logger, initializerTokens.out, @@ -89,7 +89,7 @@ export default class StrykerInitializer { const isJsonSelected = await this.selectJsonConfigType(); const configFileName = await configWriter.writePreset(presetConfig, isJsonSelected); if (presetConfig.additionalConfigFiles) { - await Promise.all(presetConfig.additionalConfigFiles.map(({ name, content }) => fs.writeFile(name, content))); + await Promise.all(presetConfig.additionalConfigFiles.map(({ name, content }) => fsPromises.writeFile(name, content))); } const selectedPackageManager = await this.selectPackageManager(); this.installNpmDependencies(presetConfig.dependencies, selectedPackageManager); @@ -184,7 +184,7 @@ export default class StrykerInitializer { const cmd = selectedOption.name === PackageManager.Npm ? `npm i --save-dev ${dependencyArg}` : `yarn add ${dependencyArg} --dev`; this.out(cmd); try { - child.execSync(cmd, { stdio: [0, 1, 2] }); + childProcess.execSync(cmd, { stdio: [0, 1, 2] }); } catch (_) { this.out(`An error occurred during installation, please try it yourself: "${cmd}"`); } diff --git a/packages/core/src/initializer/stryker-inquirer.ts b/packages/core/src/initializer/stryker-inquirer.ts index 7338f2053c..6b59c3c374 100644 --- a/packages/core/src/initializer/stryker-inquirer.ts +++ b/packages/core/src/initializer/stryker-inquirer.ts @@ -1,11 +1,10 @@ -import * as inquirer from 'inquirer'; +import inquirer from 'inquirer'; -import CommandTestRunner from '../test-runner/command-test-runner'; +import { CommandTestRunner } from '../test-runner/command-test-runner'; import { ChoiceType } from './choice-type'; - -import Preset from './presets/preset'; -import PromptOption from './prompt-option'; +import { Preset } from './presets/preset'; +import { PromptOption } from './prompt-option'; export interface PromptResult { additionalNpmDependencies: string[]; diff --git a/packages/core/src/initializer/stryker-presets.ts b/packages/core/src/initializer/stryker-presets.ts index 3f34f81c06..ba1efa098a 100644 --- a/packages/core/src/initializer/stryker-presets.ts +++ b/packages/core/src/initializer/stryker-presets.ts @@ -1,8 +1,7 @@ import { AngularPreset } from './presets/angular-preset'; -import Preset from './presets/preset'; +import { Preset } from './presets/preset'; import { ReactPreset } from './presets/react-preset'; import { VueJsPreset } from './presets/vue-js-preset'; // Add new presets here -const strykerPresets: Preset[] = [new AngularPreset(), new ReactPreset(), new VueJsPreset()]; -export default strykerPresets; +export const strykerPresets: Preset[] = [new AngularPreset(), new ReactPreset(), new VueJsPreset()]; diff --git a/packages/core/src/input/input-file-collection.ts b/packages/core/src/input/input-file-collection.ts index 31ff28cb13..d6dc461738 100644 --- a/packages/core/src/input/input-file-collection.ts +++ b/packages/core/src/input/input-file-collection.ts @@ -1,10 +1,10 @@ -import os = require('os'); +import os from 'os'; import { File } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { normalizeWhitespaces } from '@stryker-mutator/util'; -export default class InputFileCollection { +export class InputFileCollection { public readonly files: readonly File[]; public readonly filesToMutate: readonly File[]; diff --git a/packages/core/src/input/input-file-resolver.ts b/packages/core/src/input/input-file-resolver.ts index 6d226b62e1..ba1f3575ee 100644 --- a/packages/core/src/input/input-file-resolver.ts +++ b/packages/core/src/input/input-file-resolver.ts @@ -1,6 +1,6 @@ import { StringDecoder } from 'string_decoder'; -import * as path from 'path'; -import fs = require('fs'); +import path from 'path'; +import fs from 'fs'; import { from } from 'rxjs'; import { filter, map, mergeMap, toArray } from 'rxjs/operators'; @@ -11,11 +11,11 @@ import { SourceFile } from '@stryker-mutator/api/report'; import { childProcessAsPromised, isErrnoException, normalizeWhitespaces, StrykerError, notEmpty } from '@stryker-mutator/util'; import { coreTokens } from '../di'; -import StrictReporter from '../reporters/strict-reporter'; +import { StrictReporter } from '../reporters/strict-reporter'; import { glob, MAX_CONCURRENT_FILE_IO } from '../utils/file-utils'; import { defaultOptions } from '../config/options-validator'; -import InputFileCollection from './input-file-collection'; +import { InputFileCollection } from './input-file-collection'; function toReportSourceFile(file: File): SourceFile { return { @@ -49,7 +49,7 @@ function decodeGitLsOutput(line: string) { return line; } -export default class InputFileResolver { +export class InputFileResolver { private readonly mutatePatterns: readonly string[]; private readonly filePatterns: readonly string[] | undefined; private readonly tempDirName: string; diff --git a/packages/core/src/logging/log-configurator.ts b/packages/core/src/logging/log-configurator.ts index 4ad6fd19f9..b7c6f8f9da 100644 --- a/packages/core/src/logging/log-configurator.ts +++ b/packages/core/src/logging/log-configurator.ts @@ -1,5 +1,5 @@ import { LogLevel } from '@stryker-mutator/api/core'; -import * as log4js from 'log4js'; +import log4js from 'log4js'; import { getFreePort } from '../utils/net-utils'; diff --git a/packages/core/src/logging/log-utils.ts b/packages/core/src/logging/log-utils.ts index 21dd457176..ef2772a360 100644 --- a/packages/core/src/logging/log-utils.ts +++ b/packages/core/src/logging/log-utils.ts @@ -1,5 +1,5 @@ import { LogLevel } from '@stryker-mutator/api/core'; -import * as log4js from 'log4js'; +import log4js from 'log4js'; /** * Determines the minimal log level (where trace < off) diff --git a/packages/core/src/mutants/find-mutant-test-coverage.ts b/packages/core/src/mutants/find-mutant-test-coverage.ts index 087c3a0cd7..32419a952b 100644 --- a/packages/core/src/mutants/find-mutant-test-coverage.ts +++ b/packages/core/src/mutants/find-mutant-test-coverage.ts @@ -7,7 +7,7 @@ import { MatchedMutant } from '@stryker-mutator/api/report'; import { Logger } from '@stryker-mutator/api/logging'; import { coreTokens } from '../di'; -import StrictReporter from '../reporters/strict-reporter'; +import { StrictReporter } from '../reporters/strict-reporter'; export interface MutantTestCoverage { estimatedNetTime: number; diff --git a/packages/core/src/process/1-prepare-executor.ts b/packages/core/src/process/1-prepare-executor.ts index 1279681ffa..e5ff696555 100644 --- a/packages/core/src/process/1-prepare-executor.ts +++ b/packages/core/src/process/1-prepare-executor.ts @@ -3,7 +3,7 @@ import { commonTokens, Injector, tokens } from '@stryker-mutator/api/plugin'; import { LogConfigurator } from '../logging'; import { buildMainInjector, coreTokens, CliOptionsProvider } from '../di'; -import InputFileResolver from '../input/input-file-resolver'; +import { InputFileResolver } from '../input/input-file-resolver'; import { ConfigError } from '../errors'; import { MutantInstrumenterContext } from '.'; @@ -15,7 +15,6 @@ export class PrepareExecutor { public async execute(): Promise> { LogConfigurator.configureMainProcess(this.cliOptions.logLevel, this.cliOptions.fileLogLevel, this.cliOptions.allowConsoleColors); const mainInjector = buildMainInjector(this.injector); - mainInjector.resolve(coreTokens.timer).reset(); const options = mainInjector.resolve(commonTokens.options); const loggingContext = await LogConfigurator.configureLoggingServer(options.logLevel, options.fileLogLevel, options.allowConsoleColors); const inputFiles = await mainInjector.injectClass(InputFileResolver).resolve(); diff --git a/packages/core/src/process/2-mutant-instrumenter-executor.ts b/packages/core/src/process/2-mutant-instrumenter-executor.ts index e3dbb9acb5..62d6cb0ece 100644 --- a/packages/core/src/process/2-mutant-instrumenter-executor.ts +++ b/packages/core/src/process/2-mutant-instrumenter-executor.ts @@ -3,7 +3,7 @@ import { Instrumenter, InstrumentResult } from '@stryker-mutator/instrumenter'; import { File, StrykerOptions } from '@stryker-mutator/api/core'; import { MainContext, coreTokens } from '../di'; -import InputFileCollection from '../input/input-file-collection'; +import { InputFileCollection } from '../input/input-file-collection'; import { Sandbox } from '../sandbox/sandbox'; import { LoggingClientContext } from '../logging'; diff --git a/packages/core/src/process/3-dry-run-executor.ts b/packages/core/src/process/3-dry-run-executor.ts index e6f095ce47..6f4e962661 100644 --- a/packages/core/src/process/3-dry-run-executor.ts +++ b/packages/core/src/process/3-dry-run-executor.ts @@ -20,7 +20,7 @@ import { Checker } from '@stryker-mutator/api/check'; import { coreTokens } from '../di'; import { Sandbox } from '../sandbox/sandbox'; -import Timer from '../utils/timer'; +import { Timer } from '../utils/timer'; import { createTestRunnerFactory } from '../test-runner'; import { MutationTestReportHelper } from '../reporters/mutation-test-report-helper'; import { ConfigError } from '../errors'; @@ -65,8 +65,6 @@ function isFailedTest(testResult: TestResult): testResult is FailedTestResult { } export class DryRunExecutor { - private readonly dryRunTimeout: number; - public static readonly inject = tokens( commonTokens.injector, commonTokens.logger, @@ -125,7 +123,7 @@ export class DryRunExecutor { const dryRunTimeout = this.options.dryRunTimeoutMinutes * 1000 * 60; this.timer.mark(INITIAL_TEST_RUN_MARKER); this.log.info('Starting initial test run. This may take a while.'); - this.log.debug(`Using timeout of ${this.dryRunTimeout} ms.`); + this.log.debug(`Using timeout of ${dryRunTimeout} ms.`); const dryRunResult = await testRunner.dryRun({ timeout: dryRunTimeout, coverageAnalysis: this.options.coverageAnalysis }); const grossTimeMS = this.timer.elapsedMs(INITIAL_TEST_RUN_MARKER); const humanReadableTimeElapsed = this.timer.humanReadableElapsed(INITIAL_TEST_RUN_MARKER); diff --git a/packages/core/src/process/4-mutation-test-executor.ts b/packages/core/src/process/4-mutation-test-executor.ts index 82a53cc750..6b9df150c3 100644 --- a/packages/core/src/process/4-mutation-test-executor.ts +++ b/packages/core/src/process/4-mutation-test-executor.ts @@ -9,10 +9,10 @@ import { I } from '@stryker-mutator/util'; import { CheckStatus, Checker, CheckResult, PassedCheckResult } from '@stryker-mutator/api/check'; import { coreTokens } from '../di'; -import StrictReporter from '../reporters/strict-reporter'; +import { StrictReporter } from '../reporters/strict-reporter'; import { MutantTestCoverage } from '../mutants/find-mutant-test-coverage'; import { MutationTestReportHelper } from '../reporters/mutation-test-report-helper'; -import Timer from '../utils/timer'; +import { Timer } from '../utils/timer'; import { Pool, ConcurrencyTokenProvider } from '../concurrent'; import { Sandbox } from '../sandbox'; diff --git a/packages/core/src/reporters/broadcast-reporter.ts b/packages/core/src/reporters/broadcast-reporter.ts index bf0c6bf626..9219cba199 100644 --- a/packages/core/src/reporters/broadcast-reporter.ts +++ b/packages/core/src/reporters/broadcast-reporter.ts @@ -7,9 +7,9 @@ import { tokens } from 'typed-inject'; import { coreTokens } from '../di'; import { PluginCreator } from '../di/plugin-creator'; -import StrictReporter from './strict-reporter'; +import { StrictReporter } from './strict-reporter'; -export default class BroadcastReporter implements StrictReporter { +export class BroadcastReporter implements StrictReporter { public static readonly inject = tokens(commonTokens.options, coreTokens.pluginCreatorReporter, commonTokens.logger); public readonly reporters: { diff --git a/packages/core/src/reporters/ci/circle-provider.ts b/packages/core/src/reporters/ci/circle-provider.ts index bd30860954..518c7ad59b 100644 --- a/packages/core/src/reporters/ci/circle-provider.ts +++ b/packages/core/src/reporters/ci/circle-provider.ts @@ -5,7 +5,7 @@ import { CIProvider } from './provider'; /** * https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables */ -class CircleProvider implements CIProvider { +export class CircleProvider implements CIProvider { public determineProject(): string { return `${this.determineProvider()}/${this.determineRepository()}`; } @@ -32,5 +32,3 @@ class CircleProvider implements CIProvider { } } } - -export default CircleProvider; diff --git a/packages/core/src/reporters/ci/github-actions-provider.ts b/packages/core/src/reporters/ci/github-actions-provider.ts index eb4dcb9dfc..f64887c436 100644 --- a/packages/core/src/reporters/ci/github-actions-provider.ts +++ b/packages/core/src/reporters/ci/github-actions-provider.ts @@ -5,7 +5,7 @@ import { CIProvider } from './provider'; /** * https://help.github.com/en/actions/automating-your-workflow-with-github-actions/using-environment-variables#default-environment-variables */ -export default class GithubActionsCIProvider implements CIProvider { +export class GithubActionsCIProvider implements CIProvider { public determineProject(): string { return `github.com/${getEnvironmentVariableOrThrow('GITHUB_REPOSITORY')}`; } diff --git a/packages/core/src/reporters/ci/provider.ts b/packages/core/src/reporters/ci/provider.ts index 868d61cb03..775f2f8cf3 100644 --- a/packages/core/src/reporters/ci/provider.ts +++ b/packages/core/src/reporters/ci/provider.ts @@ -1,8 +1,8 @@ import { getEnvironmentVariable } from '../../utils/object-utils'; -import CircleProvider from './circle-provider'; -import TravisProvider from './travis-provider'; -import GithubActionsCIProvider from './github-actions-provider'; +import { CircleProvider } from './circle-provider'; +import { TravisProvider } from './travis-provider'; +import { GithubActionsCIProvider } from './github-actions-provider'; /** * Represents an object that can provide information about a CI/CD provider. diff --git a/packages/core/src/reporters/ci/travis-provider.ts b/packages/core/src/reporters/ci/travis-provider.ts index 7a5b9bf416..131420b3ec 100644 --- a/packages/core/src/reporters/ci/travis-provider.ts +++ b/packages/core/src/reporters/ci/travis-provider.ts @@ -5,7 +5,7 @@ import { CIProvider } from './provider'; /** * See https://docs.travis-ci.com/user/environment-variables/#default-environment-variables */ -class TravisProvider implements CIProvider { +export class TravisProvider implements CIProvider { public determineProject(): string | undefined { const slug = getEnvironmentVariable('TRAVIS_REPO_SLUG'); if (slug) { @@ -18,5 +18,3 @@ class TravisProvider implements CIProvider { return getEnvironmentVariable('TRAVIS_PULL_REQUEST_BRANCH') || getEnvironmentVariable('TRAVIS_BRANCH'); } } - -export default TravisProvider; diff --git a/packages/core/src/reporters/clear-text-reporter.ts b/packages/core/src/reporters/clear-text-reporter.ts index c9820f3ac2..6403c073d9 100644 --- a/packages/core/src/reporters/clear-text-reporter.ts +++ b/packages/core/src/reporters/clear-text-reporter.ts @@ -1,6 +1,6 @@ -import * as os from 'os'; +import os from 'os'; -import chalk = require('chalk'); +import chalk from 'chalk'; import { Position, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; @@ -8,9 +8,9 @@ import { MutantResult, MutantStatus, mutationTestReportSchema, Reporter, Undetec import { calculateMetrics } from 'mutation-testing-metrics'; import { tokens } from 'typed-inject'; -import ClearTextScoreTable from './clear-text-score-table'; +import { ClearTextScoreTable } from './clear-text-score-table'; -export default class ClearTextReporter implements Reporter { +export class ClearTextReporter implements Reporter { public static inject = tokens(commonTokens.logger, commonTokens.options); constructor(private readonly log: Logger, private readonly options: StrykerOptions) { this.configConsoleColor(); diff --git a/packages/core/src/reporters/clear-text-score-table.ts b/packages/core/src/reporters/clear-text-score-table.ts index b7bcf94525..eb7a48b0a5 100644 --- a/packages/core/src/reporters/clear-text-score-table.ts +++ b/packages/core/src/reporters/clear-text-score-table.ts @@ -1,10 +1,10 @@ -import * as os from 'os'; +import os from 'os'; import { MutationScoreThresholds } from '@stryker-mutator/api/core'; import { MetricsResult } from 'mutation-testing-metrics'; -import chalk = require('chalk'); -import flatMap = require('lodash.flatmap'); +import chalk from 'chalk'; +import flatMap from 'lodash.flatmap'; const FILES_ROOT_NAME = 'All files'; @@ -84,7 +84,7 @@ class FileColumn extends Column { /** * Represents a clear text table for mutation score */ -export default class ClearTextScoreTable { +export class ClearTextScoreTable { private readonly columns: Column[]; constructor(private readonly metricsResult: MetricsResult, thresholds: MutationScoreThresholds) { diff --git a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts index 53ce2158b6..558dd2fea8 100644 --- a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts +++ b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter-client.ts @@ -16,7 +16,7 @@ interface ReportResponseBody { const STRYKER_DASHBOARD_API_KEY = 'STRYKER_DASHBOARD_API_KEY'; -export default class DashboardReporterClient { +export class DashboardReporterClient { public static inject = tokens(commonTokens.logger, dashboardReporterTokens.httpClient, commonTokens.options); constructor(private readonly log: Logger, private readonly httpClient: HttpClient, private readonly options: StrykerOptions) {} diff --git a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts index 257a4052a9..fe50f5836c 100644 --- a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts +++ b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts @@ -6,11 +6,11 @@ import { calculateMetrics } from 'mutation-testing-metrics'; import { CIProvider } from '../ci/provider'; -import DashboardReporterClient from './dashboard-reporter-client'; +import { DashboardReporterClient } from './dashboard-reporter-client'; import { dashboardReporterTokens } from './tokens'; import { Report } from './report'; -export default class DashboardReporter implements Reporter { +export class DashboardReporter implements Reporter { public static readonly inject = tokens( commonTokens.logger, dashboardReporterTokens.dashboardReporterClient, diff --git a/packages/core/src/reporters/dashboard-reporter/index.ts b/packages/core/src/reporters/dashboard-reporter/index.ts index fa48777f0a..ea9e8c7195 100644 --- a/packages/core/src/reporters/dashboard-reporter/index.ts +++ b/packages/core/src/reporters/dashboard-reporter/index.ts @@ -3,8 +3,8 @@ import { HttpClient } from 'typed-rest-client/HttpClient'; import { determineCIProvider } from '../ci/provider'; -import DashboardReporter from './dashboard-reporter'; -import DashboardReporterClient from './dashboard-reporter-client'; +import { DashboardReporter } from './dashboard-reporter'; +import { DashboardReporterClient } from './dashboard-reporter-client'; import { dashboardReporterTokens } from './tokens'; export function dashboardReporterFactory(injector: Injector): DashboardReporter { diff --git a/packages/core/src/reporters/dots-reporter.ts b/packages/core/src/reporters/dots-reporter.ts index 1eec4df7b4..07f28c5907 100644 --- a/packages/core/src/reporters/dots-reporter.ts +++ b/packages/core/src/reporters/dots-reporter.ts @@ -1,10 +1,10 @@ -import * as os from 'os'; +import os from 'os'; import { MutantResult, MutantStatus, Reporter } from '@stryker-mutator/api/report'; -import chalk = require('chalk'); +import chalk from 'chalk'; -export default class DotsReporter implements Reporter { +export class DotsReporter implements Reporter { public onMutantTested(result: MutantResult) { let toLog: string; switch (result.status) { diff --git a/packages/core/src/reporters/event-recorder-reporter.ts b/packages/core/src/reporters/event-recorder-reporter.ts index c37ae3f20e..4be8f5981b 100644 --- a/packages/core/src/reporters/event-recorder-reporter.ts +++ b/packages/core/src/reporters/event-recorder-reporter.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import { promises as fs } from 'fs'; +import path from 'path'; +import { promises as fsPromises } from 'fs'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; @@ -8,9 +8,9 @@ import { MatchedMutant, MutantResult, mutationTestReportSchema, Reporter, Source import { cleanFolder } from '../utils/file-utils'; -import StrictReporter from './strict-reporter'; +import { StrictReporter } from './strict-reporter'; -export default class EventRecorderReporter implements StrictReporter { +export class EventRecorderReporter implements StrictReporter { public static readonly inject = tokens(commonTokens.logger, commonTokens.options); private readonly allWork: Array> = []; @@ -24,7 +24,7 @@ export default class EventRecorderReporter implements StrictReporter { private writeToFile(methodName: keyof Reporter, data: any) { const filename = path.join(this.options.eventReporter.baseDir, `${this.format(this.index++)}-${methodName}.json`); this.log.debug(`Writing event ${methodName} to file ${filename}`); - return fs.writeFile(filename, JSON.stringify(data), { encoding: 'utf8' }); + return fsPromises.writeFile(filename, JSON.stringify(data), { encoding: 'utf8' }); } private format(input: number) { diff --git a/packages/core/src/reporters/html/html-reporter.ts b/packages/core/src/reporters/html/html-reporter.ts index 7501879801..6e867573d9 100644 --- a/packages/core/src/reporters/html/html-reporter.ts +++ b/packages/core/src/reporters/html/html-reporter.ts @@ -1,6 +1,6 @@ -import * as path from 'path'; +import path from 'path'; -import fileUrl = require('file-url'); +import fileUrl from 'file-url'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; @@ -13,7 +13,7 @@ import { reportTemplate as reportTemplate } from './report-template'; const DEFAULT_BASE_FOLDER = path.normalize('reports/mutation/html'); export const RESOURCES_DIR_NAME = 'strykerResources'; -export default class HtmlReporter implements Reporter { +export class HtmlReporter implements Reporter { private _baseDir!: string; private mainPromise: Promise | undefined; diff --git a/packages/core/src/reporters/index.ts b/packages/core/src/reporters/index.ts index cc878dd912..5303c5f089 100644 --- a/packages/core/src/reporters/index.ts +++ b/packages/core/src/reporters/index.ts @@ -1,17 +1,17 @@ import { declareClassPlugin, declareFactoryPlugin, PluginKind } from '@stryker-mutator/api/plugin'; -import ClearTextReporter from './clear-text-reporter'; +import { ClearTextReporter } from './clear-text-reporter'; import { dashboardReporterFactory } from './dashboard-reporter'; -import DotsReporter from './dots-reporter'; -import EventRecorderReporter from './event-recorder-reporter'; -import ProgressAppendOnlyReporter from './progress-append-only-reporter'; -import ProgressReporter from './progress-reporter'; -import HtmlReporter from './html/html-reporter'; -import JsonReporter from './json-reporter'; +import { DotsReporter } from './dots-reporter'; +import { EventRecorderReporter } from './event-recorder-reporter'; +import { ProgressAppendOnlyReporter } from './progress-append-only-reporter'; +import { ProgressBarReporter } from './progress-reporter'; +import { HtmlReporter } from './html/html-reporter'; +import { JsonReporter } from './json-reporter'; export const strykerPlugins = [ declareClassPlugin(PluginKind.Reporter, 'clear-text', ClearTextReporter), - declareClassPlugin(PluginKind.Reporter, 'progress', ProgressReporter), + declareClassPlugin(PluginKind.Reporter, 'progress', ProgressBarReporter), declareClassPlugin(PluginKind.Reporter, 'progress-append-only', ProgressAppendOnlyReporter), declareClassPlugin(PluginKind.Reporter, 'dots', DotsReporter), declareClassPlugin(PluginKind.Reporter, 'event-recorder', EventRecorderReporter), diff --git a/packages/core/src/reporters/json-reporter.ts b/packages/core/src/reporters/json-reporter.ts index e078c114f2..f62eb71482 100644 --- a/packages/core/src/reporters/json-reporter.ts +++ b/packages/core/src/reporters/json-reporter.ts @@ -1,18 +1,18 @@ -import * as path from 'path'; +import path from 'path'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { mutationTestReportSchema, Reporter } from '@stryker-mutator/api/report'; -import fileUrl = require('file-url'); +import fileUrl from 'file-url'; import * as ReporterUtil from './reporter-util'; const INDENTION_LEVEL = 0; export const RESOURCES_DIR_NAME = 'strykerResources'; -export default class JsonReporter implements Reporter { +export class JsonReporter implements Reporter { private mainPromise: Promise | undefined; constructor(private readonly options: StrykerOptions, private readonly log: Logger) {} diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index 291be02765..90de819763 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import path from 'path'; import { Location, Position, StrykerOptions, Mutant } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; @@ -21,7 +21,7 @@ import { CompleteDryRunResult, MutantRunResult, MutantRunStatus } from '@stryker import { CheckStatus, PassedCheckResult, CheckResult } from '@stryker-mutator/api/check'; import { coreTokens } from '../di'; -import InputFileCollection from '../input/input-file-collection'; +import { InputFileCollection } from '../input/input-file-collection'; import { setExitCode } from '../utils/object-utils'; import { MutantTestCoverage } from '../mutants/find-mutant-test-coverage'; import { mutatedLines, originalLines } from '../utils/mutant-utils'; diff --git a/packages/core/src/reporters/progress-append-only-reporter.ts b/packages/core/src/reporters/progress-append-only-reporter.ts index fafe85485d..58040a21e9 100644 --- a/packages/core/src/reporters/progress-append-only-reporter.ts +++ b/packages/core/src/reporters/progress-append-only-reporter.ts @@ -1,11 +1,11 @@ -import * as os from 'os'; +import os from 'os'; import { MatchedMutant } from '@stryker-mutator/api/report'; -import ProgressKeeper from './progress-keeper'; +import { ProgressKeeper } from './progress-keeper'; -export default class ProgressAppendOnlyReporter extends ProgressKeeper { - private intervalReference: NodeJS.Timer; +export class ProgressAppendOnlyReporter extends ProgressKeeper { + private intervalReference?: NodeJS.Timer; public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { super.onAllMutantsMatchedWithTests(matchedMutants); @@ -15,7 +15,9 @@ export default class ProgressAppendOnlyReporter extends ProgressKeeper { } public onAllMutantsTested(): void { - clearInterval(this.intervalReference); + if (this.intervalReference) { + clearInterval(this.intervalReference); + } } private render() { diff --git a/packages/core/src/reporters/progress-bar.ts b/packages/core/src/reporters/progress-bar.ts index 6129c8757b..e41f7b9fc4 100644 --- a/packages/core/src/reporters/progress-bar.ts +++ b/packages/core/src/reporters/progress-bar.ts @@ -1,3 +1,3 @@ -import ProgressBar = require('progress'); +import ProgressBar from 'progress'; -export default ProgressBar; +export { ProgressBar }; diff --git a/packages/core/src/reporters/progress-keeper.ts b/packages/core/src/reporters/progress-keeper.ts index ed113e21c5..1982352cc8 100644 --- a/packages/core/src/reporters/progress-keeper.ts +++ b/packages/core/src/reporters/progress-keeper.ts @@ -1,10 +1,11 @@ import { MatchedMutant, MutantResult, Reporter } from '@stryker-mutator/api/report'; import { MutantStatus } from '@stryker-mutator/api/report'; -import Timer from '../utils/timer'; +import { Timer } from '../utils/timer'; -abstract class ProgressKeeper implements Reporter { - private timer: Timer; +export abstract class ProgressKeeper implements Reporter { + private timer!: Timer; + private mutantIdsWithoutCoverage!: string[]; protected progress = { survived: 0, timedOut: 0, @@ -12,8 +13,6 @@ abstract class ProgressKeeper implements Reporter { total: 0, }; - private mutantIdsWithoutCoverage: string[]; - public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { this.timer = new Timer(); this.mutantIdsWithoutCoverage = matchedMutants.filter((m) => !m.runAllTests && !m.testFilter?.length).map((m) => m.id); @@ -58,4 +57,3 @@ abstract class ProgressKeeper implements Reporter { : '<1m'; } } -export default ProgressKeeper; diff --git a/packages/core/src/reporters/progress-reporter.ts b/packages/core/src/reporters/progress-reporter.ts index 9d5d6d63ae..3e19ae1bb9 100644 --- a/packages/core/src/reporters/progress-reporter.ts +++ b/packages/core/src/reporters/progress-reporter.ts @@ -1,10 +1,10 @@ import { MatchedMutant, MutantResult } from '@stryker-mutator/api/report'; -import ProgressBar from './progress-bar'; -import ProgressKeeper from './progress-keeper'; +import { ProgressBar } from './progress-bar'; +import { ProgressKeeper } from './progress-keeper'; -export default class ProgressBarReporter extends ProgressKeeper { - private progressBar: ProgressBar; +export class ProgressBarReporter extends ProgressKeeper { + private progressBar?: ProgressBar; public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { super.onAllMutantsMatchedWithTests(matchedMutants); @@ -34,10 +34,10 @@ export default class ProgressBarReporter extends ProgressKeeper { } private tick(tickObj: Record): void { - this.progressBar.tick(tickObj); + this.progressBar?.tick(tickObj); } private render(renderObj: Record): void { - this.progressBar.render(renderObj); + this.progressBar?.render(renderObj); } } diff --git a/packages/core/src/reporters/reporter-util.ts b/packages/core/src/reporters/reporter-util.ts index 2e6746fcc2..13057d74b0 100644 --- a/packages/core/src/reporters/reporter-util.ts +++ b/packages/core/src/reporters/reporter-util.ts @@ -1,9 +1,9 @@ -import * as ReporterUtil from 'path'; +import path from 'path'; import { promisify } from 'util'; import { createReadStream, createWriteStream, promises as fs } from 'fs'; -import mkdirp = require('mkdirp'); -import * as rimraf from 'rimraf'; +import mkdirp from 'mkdirp'; +import rimraf from 'rimraf'; export function copyFile(fromFilename: string, toFilename: string): Promise { return new Promise((resolve, reject) => { @@ -20,6 +20,6 @@ export const deleteDir = promisify(rimraf); export const mkdir = mkdirp; export async function writeFile(fileName: string, content: string) { - await mkdirp(ReporterUtil.dirname(fileName)); + await mkdirp(path.dirname(fileName)); await fs.writeFile(fileName, content, 'utf8'); } diff --git a/packages/core/src/reporters/strict-reporter.ts b/packages/core/src/reporters/strict-reporter.ts index 0c07935ed0..7469143572 100644 --- a/packages/core/src/reporters/strict-reporter.ts +++ b/packages/core/src/reporters/strict-reporter.ts @@ -1,5 +1,3 @@ import { Reporter } from '@stryker-mutator/api/report'; -type StrictReporter = Required; - -export default StrictReporter; +export type StrictReporter = Required; diff --git a/packages/core/src/sandbox/disable-type-checks-preprocessor.ts b/packages/core/src/sandbox/disable-type-checks-preprocessor.ts index a8c9e399f4..7096a93b32 100644 --- a/packages/core/src/sandbox/disable-type-checks-preprocessor.ts +++ b/packages/core/src/sandbox/disable-type-checks-preprocessor.ts @@ -1,6 +1,6 @@ -import path = require('path'); +import path from 'path'; -import minimatch = require('minimatch'); +import minimatch from 'minimatch'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { File, StrykerOptions } from '@stryker-mutator/api/core'; import type { disableTypeChecks } from '@stryker-mutator/instrumenter'; diff --git a/packages/core/src/sandbox/sandbox.ts b/packages/core/src/sandbox/sandbox.ts index 8b3f901f4b..37c869d58e 100644 --- a/packages/core/src/sandbox/sandbox.ts +++ b/packages/core/src/sandbox/sandbox.ts @@ -1,8 +1,8 @@ -import path = require('path'); +import path from 'path'; import { promises as fsPromises } from 'fs'; -import execa = require('execa'); -import npmRunPath = require('npm-run-path'); +import execa from 'execa'; +import npmRunPath from 'npm-run-path'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { File } from '@stryker-mutator/api/core'; import { normalizeWhitespaces, I } from '@stryker-mutator/util'; diff --git a/packages/core/src/sandbox/ts-config-preprocessor.ts b/packages/core/src/sandbox/ts-config-preprocessor.ts index 34d11488f2..320833fdbe 100644 --- a/packages/core/src/sandbox/ts-config-preprocessor.ts +++ b/packages/core/src/sandbox/ts-config-preprocessor.ts @@ -1,4 +1,4 @@ -import path = require('path'); +import path from 'path'; import { StrykerOptions, File } from '@stryker-mutator/api/core'; import { tokens, commonTokens } from '@stryker-mutator/api/plugin'; diff --git a/packages/core/src/stryker-cli.ts b/packages/core/src/stryker-cli.ts index 5ae1ea6f92..886ec67cc6 100644 --- a/packages/core/src/stryker-cli.ts +++ b/packages/core/src/stryker-cli.ts @@ -1,11 +1,11 @@ -import * as commander from 'commander'; +import commander from 'commander'; import { DashboardOptions, ALL_REPORT_TYPES, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { MutantResult } from '@stryker-mutator/api/report'; import { initializerFactory } from './initializer'; import { LogConfigurator } from './logging'; -import Stryker from './stryker'; +import { Stryker } from './stryker'; import { defaultOptions } from './config/options-validator'; /** @@ -31,7 +31,7 @@ function parseBoolean(val: string) { return v !== 'false' && v !== '0'; } -export default class StrykerCli { +export class StrykerCli { private command = ''; private strykerConfig: string | null = null; @@ -45,7 +45,7 @@ export default class StrykerCli { const dashboard: Partial = {}; const defaultValues = defaultOptions(); this.program - .version(require('../package.json').version) + .version(require('../../package.json').version) .usage(' [options] [configFile]') .description( `Possible commands: diff --git a/packages/core/src/stryker.ts b/packages/core/src/stryker.ts index efdf023106..1654cc17ef 100644 --- a/packages/core/src/stryker.ts +++ b/packages/core/src/stryker.ts @@ -13,7 +13,7 @@ import { retrieveCause, ConfigError } from './errors'; * The main Stryker class. * It provides a single `runMutationTest()` function which runs mutation testing: */ -export default class Stryker { +export class Stryker { /** * @constructor * @param cliOptions The cli options. diff --git a/packages/core/src/test-runner/child-process-test-runner-decorator.ts b/packages/core/src/test-runner/child-process-test-runner-decorator.ts index 70adfe2978..22943b6513 100644 --- a/packages/core/src/test-runner/child-process-test-runner-decorator.ts +++ b/packages/core/src/test-runner/child-process-test-runner-decorator.ts @@ -2,8 +2,8 @@ import { StrykerOptions } from '@stryker-mutator/api/core'; import { TestRunner, DryRunOptions, MutantRunOptions, MutantRunResult, DryRunResult } from '@stryker-mutator/api/test-runner'; import { ExpirableTask } from '@stryker-mutator/util'; -import ChildProcessCrashedError from '../child-proxy/child-process-crashed-error'; -import ChildProcessProxy from '../child-proxy/child-process-proxy'; +import { ChildProcessCrashedError } from '../child-proxy/child-process-crashed-error'; +import { ChildProcessProxy } from '../child-proxy/child-process-proxy'; import { LoggingClientContext } from '../logging'; import { ChildProcessTestRunnerWorker } from './child-process-test-runner-worker'; @@ -13,7 +13,7 @@ const MAX_WAIT_FOR_DISPOSE = 2000; /** * Runs the given test runner in a child process and forwards reports about test results */ -export default class ChildProcessTestRunnerDecorator implements TestRunner { +export class ChildProcessTestRunnerDecorator implements TestRunner { private readonly worker: ChildProcessProxy; constructor(options: StrykerOptions, sandboxWorkingDirectory: string, loggingContext: LoggingClientContext) { diff --git a/packages/core/src/test-runner/command-test-runner.ts b/packages/core/src/test-runner/command-test-runner.ts index 6fa40f0f9c..ec1fe0c97b 100644 --- a/packages/core/src/test-runner/command-test-runner.ts +++ b/packages/core/src/test-runner/command-test-runner.ts @@ -1,5 +1,5 @@ import { exec } from 'child_process'; -import * as os from 'os'; +import os from 'os'; import { StrykerOptions, CommandRunnerOptions, INSTRUMENTER_CONSTANTS } from '@stryker-mutator/api/core'; import { @@ -17,7 +17,7 @@ import { import { errorToString, StrykerError } from '@stryker-mutator/util'; import { kill } from '../utils/object-utils'; -import Timer from '../utils/timer'; +import { Timer } from '../utils/timer'; /** * A test runner that uses a (bash or cmd) command to execute the tests. @@ -25,7 +25,7 @@ import Timer from '../utils/timer'; * instead, it mimics a simple test result based on the exit code. * The command can be configured, but defaults to `npm test`. */ -export default class CommandTestRunner implements TestRunner { +export class CommandTestRunner implements TestRunner { /** * "command" */ diff --git a/packages/core/src/test-runner/index.ts b/packages/core/src/test-runner/index.ts index bce828a470..2f7b7e0575 100644 --- a/packages/core/src/test-runner/index.ts +++ b/packages/core/src/test-runner/index.ts @@ -6,11 +6,11 @@ import { LoggingClientContext } from '../logging'; import { coreTokens } from '../di'; import { Sandbox } from '../sandbox/sandbox'; -import RetryDecorator from './retry-decorator'; -import TimeoutDecorator from './timeout-decorator'; -import ChildProcessTestRunnerDecorator from './child-process-test-runner-decorator'; -import CommandTestRunner from './command-test-runner'; -import MaxTestRunnerReuseDecorator from './max-test-runner-reuse-decorator'; +import { RetryDecorator } from './retry-decorator'; +import { TimeoutDecorator } from './timeout-decorator'; +import { ChildProcessTestRunnerDecorator } from './child-process-test-runner-decorator'; +import { CommandTestRunner } from './command-test-runner'; +import { MaxTestRunnerReuseDecorator } from './max-test-runner-reuse-decorator'; createTestRunnerFactory.inject = tokens(commonTokens.options, coreTokens.sandbox, coreTokens.loggingContext); export function createTestRunnerFactory( diff --git a/packages/core/src/test-runner/max-test-runner-reuse-decorator.ts b/packages/core/src/test-runner/max-test-runner-reuse-decorator.ts index c965779663..aa1d69846c 100644 --- a/packages/core/src/test-runner/max-test-runner-reuse-decorator.ts +++ b/packages/core/src/test-runner/max-test-runner-reuse-decorator.ts @@ -2,12 +2,12 @@ import { MutantRunOptions, MutantRunResult, TestRunner } from '@stryker-mutator/ import { StrykerOptions } from '@stryker-mutator/api/core'; -import TestRunnerDecorator from './test-runner-decorator'; +import { TestRunnerDecorator } from './test-runner-decorator'; /** * Wraps a test runner and implements the retry functionality. */ -export default class MaxTestRunnerReuseDecorator extends TestRunnerDecorator { +export class MaxTestRunnerReuseDecorator extends TestRunnerDecorator { public runs = 0; private readonly restartAfter; diff --git a/packages/core/src/test-runner/retry-decorator.ts b/packages/core/src/test-runner/retry-decorator.ts index bea8ade1e4..0c5c490054 100644 --- a/packages/core/src/test-runner/retry-decorator.ts +++ b/packages/core/src/test-runner/retry-decorator.ts @@ -2,16 +2,16 @@ import { DryRunStatus, DryRunResult, DryRunOptions, MutantRunResult, MutantRunOp import { errorToString } from '@stryker-mutator/util'; import { getLogger } from 'log4js'; -import OutOfMemoryError from '../child-proxy/out-of-memory-error'; +import { OutOfMemoryError } from '../child-proxy/out-of-memory-error'; -import TestRunnerDecorator from './test-runner-decorator'; +import { TestRunnerDecorator } from './test-runner-decorator'; const ERROR_MESSAGE = 'Test runner crashed. Tried twice to restart it without any luck. Last time the error message was: '; /** * Wraps a test runner and implements the retry functionality. */ -export default class RetryDecorator extends TestRunnerDecorator { +export class RetryDecorator extends TestRunnerDecorator { private readonly log = getLogger(RetryDecorator.name); public async dryRun(options: DryRunOptions): Promise { diff --git a/packages/core/src/test-runner/test-runner-decorator.ts b/packages/core/src/test-runner/test-runner-decorator.ts index a7084ee67c..0352bc5756 100644 --- a/packages/core/src/test-runner/test-runner-decorator.ts +++ b/packages/core/src/test-runner/test-runner-decorator.ts @@ -1,8 +1,8 @@ import { TestRunner, DryRunOptions, MutantRunOptions, MutantRunResult, DryRunResult } from '@stryker-mutator/api/test-runner'; import { Disposable } from 'typed-inject'; -export default class TestRunnerDecorator implements Required, Disposable { - protected innerRunner: TestRunner; +export class TestRunnerDecorator implements Required, Disposable { + protected innerRunner!: TestRunner; constructor(private readonly testRunnerProducer: () => TestRunner) { this.createInnerRunner(); diff --git a/packages/core/src/test-runner/timeout-decorator.ts b/packages/core/src/test-runner/timeout-decorator.ts index 5e79eae9bc..d090c55d5c 100644 --- a/packages/core/src/test-runner/timeout-decorator.ts +++ b/packages/core/src/test-runner/timeout-decorator.ts @@ -2,12 +2,12 @@ import { DryRunStatus, DryRunResult, DryRunOptions, MutantRunOptions, MutantRunR import { getLogger } from 'log4js'; import { ExpirableTask } from '@stryker-mutator/util'; -import TestRunnerDecorator from './test-runner-decorator'; +import { TestRunnerDecorator } from './test-runner-decorator'; /** * Wraps a test runner and implements the timeout functionality. */ -export default class TimeoutDecorator extends TestRunnerDecorator { +export class TimeoutDecorator extends TestRunnerDecorator { private readonly log = getLogger(TimeoutDecorator.name); public async dryRun(options: DryRunOptions): Promise { diff --git a/packages/core/src/utils/file-utils.ts b/packages/core/src/utils/file-utils.ts index 850ffe480b..a45b04da37 100644 --- a/packages/core/src/utils/file-utils.ts +++ b/packages/core/src/utils/file-utils.ts @@ -1,11 +1,11 @@ -import * as path from 'path'; -import fs = require('fs'); +import path from 'path'; +import fs from 'fs'; import { promisify } from 'util'; -import * as nodeGlob from 'glob'; -import mkdirpModule = require('mkdirp'); -import * as rimraf from 'rimraf'; +import nodeGlob from 'glob'; +import mkdirpModule from 'mkdirp'; +import rimraf from 'rimraf'; export const MAX_CONCURRENT_FILE_IO = 256; diff --git a/packages/core/src/utils/net-utils.ts b/packages/core/src/utils/net-utils.ts index b82b8a8d33..959a945ae9 100644 --- a/packages/core/src/utils/net-utils.ts +++ b/packages/core/src/utils/net-utils.ts @@ -1,4 +1,4 @@ -import getPort = require('get-port'); +import getPort from 'get-port'; /** * A wrapper around `getPort` for testing purposes diff --git a/packages/core/src/utils/object-utils.ts b/packages/core/src/utils/object-utils.ts index 416d9776c9..b1b04099fe 100644 --- a/packages/core/src/utils/object-utils.ts +++ b/packages/core/src/utils/object-utils.ts @@ -1,4 +1,4 @@ -import treeKill = require('tree-kill'); +import treeKill from 'tree-kill'; import { StrykerError, KnownKeys } from '@stryker-mutator/util'; import { WarningOptions } from '@stryker-mutator/api/core'; diff --git a/packages/core/src/utils/string-builder.ts b/packages/core/src/utils/string-builder.ts index d0fcafceae..4d8e061f68 100644 --- a/packages/core/src/utils/string-builder.ts +++ b/packages/core/src/utils/string-builder.ts @@ -2,7 +2,7 @@ import { EOL } from 'os'; const DEFAULT_MAX_SIZE = 2048; -export default class StringBuilder { +export class StringBuilder { private currentLength = 0; private readonly strings: string[] = []; private readonly maxSize = DEFAULT_MAX_SIZE; diff --git a/packages/core/src/utils/temporary-directory.ts b/packages/core/src/utils/temporary-directory.ts index 65c1fb37f8..1a7b86368c 100644 --- a/packages/core/src/utils/temporary-directory.ts +++ b/packages/core/src/utils/temporary-directory.ts @@ -1,10 +1,10 @@ -import * as path from 'path'; +import path from 'path'; import { createReadStream, createWriteStream } from 'fs'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import * as mkdirp from 'mkdirp'; +import mkdirp from 'mkdirp'; import { Disposable } from 'typed-inject'; import { deleteDir } from './file-utils'; diff --git a/packages/core/src/utils/timer.ts b/packages/core/src/utils/timer.ts index c8be84c8e1..12971801f9 100644 --- a/packages/core/src/utils/timer.ts +++ b/packages/core/src/utils/timer.ts @@ -1,20 +1,12 @@ -export default class Timer { - private readonly now: () => Date; - private start: Date; - private markers: { +export class Timer { + private readonly start: Date; + private readonly markers: { [name: string]: Date | undefined; - }; + } = Object.create(null); - constructor(now = () => new Date()) { - this.now = now; - this.reset(); - } - - public reset() { - this.markers = Object.create(null); + constructor(private readonly now = () => new Date()) { this.start = this.now(); } - public humanReadableElapsed(sinceMarker?: string) { const elapsedSeconds = this.elapsedSeconds(sinceMarker); return Timer.humanReadableElapsedMinutes(elapsedSeconds) + Timer.humanReadableElapsedSeconds(elapsedSeconds); diff --git a/packages/core/test.js b/packages/core/test.js deleted file mode 100644 index 67d39df9ba..0000000000 --- a/packages/core/test.js +++ /dev/null @@ -1,22 +0,0 @@ -const { merge, of, Subject, zip } = require('rxjs'); -const { map, tap } = require('rxjs/operators'); - - -const recycle = new Subject(); - -const worker$ = merge(of(0, 1), recycle); - -zip(worker$, of('a', 'b', 'c', 'd')) - .pipe( - map(([worker, input]) => { - const output = `(${worker}, ${input})`; - console.log('passing', output); - if (input === 'd') { - throw new Error('input was d'); - } - recycle.next(worker); - return output; - }), - tap({ complete() { console.log('complete') } }) - ).subscribe(n => console.log('output', n)); - diff --git a/packages/core/test/helpers/child-process-mock.ts b/packages/core/test/helpers/child-process-mock.ts index 12603c120f..021d199c6b 100644 --- a/packages/core/test/helpers/child-process-mock.ts +++ b/packages/core/test/helpers/child-process-mock.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events'; -export default class ChildProcessMock extends EventEmitter { +export class ChildProcessMock extends EventEmitter { public stdout = new EventEmitter(); public stderr = new EventEmitter(); diff --git a/packages/core/test/helpers/log-mock.ts b/packages/core/test/helpers/log-mock.ts index 7b0dd67b5c..1a26695c0c 100644 --- a/packages/core/test/helpers/log-mock.ts +++ b/packages/core/test/helpers/log-mock.ts @@ -1,5 +1,5 @@ -import * as logging from 'log4js'; -import * as sinon from 'sinon'; +import logging from 'log4js'; +import sinon from 'sinon'; import { logger, Mock } from './producers'; @@ -10,6 +10,6 @@ beforeEach(() => { sinon.stub(logging, 'getLogger').returns(log); }); -export default function currentLogMock() { +export function currentLogMock() { return log; } diff --git a/packages/core/test/helpers/producers.ts b/packages/core/test/helpers/producers.ts index 638f743382..b4ee836ed2 100644 --- a/packages/core/test/helpers/producers.ts +++ b/packages/core/test/helpers/producers.ts @@ -3,7 +3,7 @@ import { CpuInfo } from 'os'; import { ClearTextReporterOptions } from '@stryker-mutator/api/core'; import { factory } from '@stryker-mutator/test-helpers'; import { Logger } from 'log4js'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { ReplaySubject } from 'rxjs'; import { TestRunner } from '@stryker-mutator/api/test-runner'; import { Checker } from '@stryker-mutator/api/check'; diff --git a/packages/core/test/helpers/test-runner-mock.ts b/packages/core/test/helpers/test-runner-mock.ts index 8229095e34..041133b400 100644 --- a/packages/core/test/helpers/test-runner-mock.ts +++ b/packages/core/test/helpers/test-runner-mock.ts @@ -1,6 +1,6 @@ -import * as sinon from 'sinon'; +import sinon from 'sinon'; -export default class TestRunnerMock { +export class TestRunnerMock { public init: sinon.SinonStub = sinon.stub(); public run: sinon.SinonStub = sinon.stub(); public dispose: sinon.SinonStub = sinon.stub(); diff --git a/packages/core/test/helpers/test-utils.ts b/packages/core/test/helpers/test-utils.ts index e51ecf0d5d..22c7ce0e66 100644 --- a/packages/core/test/helpers/test-utils.ts +++ b/packages/core/test/helpers/test-utils.ts @@ -6,6 +6,6 @@ export function sleep(ms = 0) { }); } -export function resolveFromRoot(...pathSegments: string[]) { - return resolve(__dirname, '..', '..', ...pathSegments); +export function resolveFromRoot(...pathSegments: string[]): string { + return resolve(__dirname, '..', '..', '..', ...pathSegments); } diff --git a/packages/core/test/integration/child-proxy/child-process-proxy.it.spec.ts b/packages/core/test/integration/child-proxy/child-process-proxy.it.spec.ts index 2d1b62f178..56d95af328 100644 --- a/packages/core/test/integration/child-proxy/child-process-proxy.it.spec.ts +++ b/packages/core/test/integration/child-proxy/child-process-proxy.it.spec.ts @@ -1,18 +1,18 @@ -import * as path from 'path'; +import path from 'path'; import { File, LogLevel } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { testInjector, LoggingServer } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as log4js from 'log4js'; +import log4js from 'log4js'; import { filter } from 'rxjs/operators'; import { Task } from '@stryker-mutator/util'; -import ChildProcessCrashedError from '../../../src/child-proxy/child-process-crashed-error'; -import ChildProcessProxy from '../../../src/child-proxy/child-process-proxy'; -import OutOfMemoryError from '../../../src/child-proxy/out-of-memory-error'; -import currentLogMock from '../../helpers/log-mock'; +import { ChildProcessCrashedError } from '../../../src/child-proxy/child-process-crashed-error'; +import { ChildProcessProxy } from '../../../src/child-proxy/child-process-proxy'; +import { OutOfMemoryError } from '../../../src/child-proxy/out-of-memory-error'; +import { currentLogMock } from '../../helpers/log-mock'; import { Mock } from '../../helpers/producers'; import { sleep } from '../../helpers/test-utils'; diff --git a/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts b/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts index 84e3fa69b5..b3f2fa82f1 100644 --- a/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts +++ b/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts @@ -1,18 +1,15 @@ -import * as path from 'path'; - import { TestStatus, DryRunStatus } from '@stryker-mutator/api/test-runner'; -import { factory } from '@stryker-mutator/test-helpers'; +import { factory, assertions } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { CommandRunnerOptions } from '@stryker-mutator/api/core'; -import { assertions } from '@stryker-mutator/test-helpers'; - -import CommandTestRunner from '../../../src/test-runner/command-test-runner'; +import { CommandTestRunner } from '../../../src/test-runner/command-test-runner'; import * as objectUtils from '../../../src/utils/object-utils'; +import { resolveFromRoot } from '../../helpers/test-utils'; describe(`${CommandTestRunner.name} integration`, () => { - const workingDir = path.resolve(__dirname, '..', '..', '..', 'testResources', 'command-runner'); + const workingDir = resolveFromRoot('testResources', 'command-runner'); describe(CommandTestRunner.prototype.dryRun.name, () => { it('should report test as successful', async () => { diff --git a/packages/core/test/integration/config-reader/config-reader.it.spec.ts b/packages/core/test/integration/config-reader/config-reader.it.spec.ts index b9a2144e09..eb816e9a7f 100644 --- a/packages/core/test/integration/config-reader/config-reader.it.spec.ts +++ b/packages/core/test/integration/config-reader/config-reader.it.spec.ts @@ -1,13 +1,14 @@ -import * as path from 'path'; +import path from 'path'; import { StrykerOptions, strykerCoreSchema } from '@stryker-mutator/api/core'; import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import ConfigReader from '../../../src/config/config-reader'; +import { ConfigReader } from '../../../src/config/config-reader'; import { coreTokens } from '../../../src/di'; import { OptionsValidator } from '../../../src/config/options-validator'; +import { resolveFromRoot } from '../../helpers/test-utils'; describe(ConfigReader.name, () => { let sut: ConfigReader; @@ -20,9 +21,7 @@ describe(ConfigReader.name, () => { .injectClass(ConfigReader); } - function resolveTestResource(...segments: string[]) { - return path.resolve(__dirname, '..', '..', '..', 'testResources', 'config-reader', ...segments); - } + const resolveTestResource = resolveFromRoot.bind(undefined, 'testResources', 'config-reader'); let originalCwd: string; diff --git a/packages/core/test/integration/input/input-file-resolver.it.spec.ts b/packages/core/test/integration/input/input-file-resolver.it.spec.ts index 389b6e9878..b6fe430b62 100644 --- a/packages/core/test/integration/input/input-file-resolver.it.spec.ts +++ b/packages/core/test/integration/input/input-file-resolver.it.spec.ts @@ -1,20 +1,11 @@ -import path = require('path'); - import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { coreTokens } from '../../../src/di'; -import InputFileResolver from '../../../src/input/input-file-resolver'; +import { InputFileResolver } from '../../../src/input/input-file-resolver'; +import { resolveFromRoot } from '../../helpers/test-utils'; -const resolveTestResource: typeof path.resolve = path.resolve.bind( - path, - __dirname, - '..' /* input */, - '..' /* integration */, - '..' /* test */, - 'testResources', - 'input-files' -); +const resolveTestResource = resolveFromRoot.bind(undefined, 'testResources', 'input-files'); describe(`${InputFileResolver.name} integration`, () => { let sut: InputFileResolver; diff --git a/packages/core/test/integration/options-validation/options-validation.it.spec.ts b/packages/core/test/integration/options-validation/options-validation.it.spec.ts index 2bc14a0400..fc02b35785 100644 --- a/packages/core/test/integration/options-validation/options-validation.it.spec.ts +++ b/packages/core/test/integration/options-validation/options-validation.it.spec.ts @@ -1,11 +1,9 @@ import { expect } from 'chai'; import { testInjector } from '@stryker-mutator/test-helpers'; import { commonTokens } from '@stryker-mutator/api/plugin'; - -import sinon = require('sinon'); +import sinon from 'sinon'; import { createPluginResolverProvider, coreTokens } from '../../../src/di'; - import { resolveFromRoot } from '../../helpers/test-utils'; describe('Options validation integration', () => { diff --git a/packages/core/test/integration/reporters/html/html-reporter.it.spec.ts b/packages/core/test/integration/reporters/html/html-reporter.it.spec.ts index 9d9d0af4a0..bbd27b5f7f 100644 --- a/packages/core/test/integration/reporters/html/html-reporter.it.spec.ts +++ b/packages/core/test/integration/reporters/html/html-reporter.it.spec.ts @@ -1,9 +1,9 @@ -import * as fs from 'fs'; +import fs from 'fs'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import HtmlReporter from '../../../../src/reporters/html/html-reporter'; +import { HtmlReporter } from '../../../../src/reporters/html/html-reporter'; import { simpleReport } from './simple-report'; diff --git a/packages/core/test/integration/test-runner/additional-test-runners.ts b/packages/core/test/integration/test-runner/additional-test-runners.ts index 5a54dbb1b7..b42827b7de 100644 --- a/packages/core/test/integration/test-runner/additional-test-runners.ts +++ b/packages/core/test/integration/test-runner/additional-test-runners.ts @@ -1,5 +1,5 @@ -import * as os from 'os'; -import { isRegExp } from 'util'; +import os from 'os'; +import { types } from 'util'; import { StrykerOptions } from '@stryker-mutator/api/core'; import { commonTokens, declareClassPlugin, PluginKind, tokens } from '@stryker-mutator/api/plugin'; @@ -70,7 +70,7 @@ class DiscoverRegexTestRunner implements TestRunner { constructor(private readonly options: StrykerOptions) {} public async dryRun(): Promise { - if (isRegExp(this.options.someRegex)) { + if (types.isRegExp(this.options.someRegex)) { return factory.completeDryRunResult(); } else { return factory.errorDryRunResult({ errorMessage: 'No regex found in runnerOptions.strykerOptions.someRegex' }); @@ -119,7 +119,7 @@ class NeverResolvedTestRunner implements TestRunner { } class SlowInitAndDisposeTestRunner implements TestRunner { - public inInit: boolean; + public inInit = false; public init() { return new Promise((resolve) => { @@ -160,13 +160,13 @@ class VerifyWorkingFolderTestRunner implements TestRunner { } class AsyncronousPromiseRejectionHandlerTestRunner implements TestRunner { - public promise: Promise; + public promise?: Promise; public async init() { this.promise = Promise.reject('Reject for now, but will be caught asynchronously'); } public async dryRun(): Promise { - this.promise.catch(() => {}); + this.promise!.catch(() => {}); return factory.completeDryRunResult(); } public async mutantRun(): Promise { diff --git a/packages/core/test/integration/test-runner/create-test-runner-factory.it.spec.ts b/packages/core/test/integration/test-runner/create-test-runner-factory.it.spec.ts index 02a21a622d..f55879488e 100644 --- a/packages/core/test/integration/test-runner/create-test-runner-factory.it.spec.ts +++ b/packages/core/test/integration/test-runner/create-test-runner-factory.it.spec.ts @@ -1,13 +1,12 @@ +import fs from 'fs'; + import { LogLevel } from '@stryker-mutator/api/core'; import { expect } from 'chai'; -import * as log4js from 'log4js'; +import log4js from 'log4js'; import { toArray } from 'rxjs/operators'; -import { LoggingServer, testInjector, factory } from '@stryker-mutator/test-helpers'; - +import { LoggingServer, testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { TestRunner, DryRunStatus } from '@stryker-mutator/api/test-runner'; -import { expectCompleted, expectErrored } from '@stryker-mutator/test-helpers/src/assertions'; - import { LoggingClientContext } from '../../../src/logging'; import { createTestRunnerFactory } from '../../../src/test-runner'; import { sleep } from '../../helpers/test-utils'; @@ -15,8 +14,6 @@ import { coreTokens } from '../../../src/di'; import { CounterTestRunner } from './additional-test-runners'; -const fs = require('fs'); - describe(`${createTestRunnerFactory.name} integration`, () => { let createSut: () => Required; let sut: Required; @@ -79,7 +76,7 @@ describe(`${createTestRunnerFactory.name} integration`, () => { it('should pass along the coverage result from the test runner behind', async () => { await arrangeSut('coverage-reporting'); const result = await actDryRun(); - expectCompleted(result); + assertions.expectCompleted(result); expect(result.mutantCoverage).deep.eq(factory.mutantCoverage({ static: { 1: 42 } })); }); @@ -92,7 +89,7 @@ describe(`${createTestRunnerFactory.name} integration`, () => { it('should try to report coverage from the global scope, even when the test runner behind does not', async () => { await arrangeSut('direct-resolved'); const result = await actDryRun(); - expectCompleted(result); + assertions.expectCompleted(result); expect(result.mutantCoverage).eq('coverageObject'); }); @@ -112,20 +109,20 @@ describe(`${createTestRunnerFactory.name} integration`, () => { it('should convert any `Error` objects to string', async () => { await arrangeSut('errored'); const result = await actDryRun(1000); - expectErrored(result); + assertions.expectErrored(result); expect(result.errorMessage).includes('SyntaxError: This is invalid syntax!').and.includes('at ErroredTestRunner.dryRun'); }); it('should run only after initialization, even when it is slow', async () => { await arrangeSut('slow-init-dispose'); const result = await actDryRun(1000); - expectCompleted(result); + assertions.expectCompleted(result); }); it('should be able to run twice in quick succession', async () => { await arrangeSut('direct-resolved'); const result = await actDryRun(); - expectCompleted(result); + assertions.expectCompleted(result); }); it('should reject when `init` of test runner behind rejects', async () => { @@ -135,7 +132,7 @@ describe(`${createTestRunnerFactory.name} integration`, () => { it('should change the current working directory to the sandbox directory', async () => { await arrangeSut('verify-working-folder'); const result = await actDryRun(); - expectCompleted(result); + assertions.expectCompleted(result); }); it('should be able to recover from an async crash', async () => { @@ -143,13 +140,13 @@ describe(`${createTestRunnerFactory.name} integration`, () => { await arrangeSut('time-bomb'); await sleep(550); const result = await actDryRun(); - expectCompleted(result); + assertions.expectCompleted(result); }); it('should report if a crash happens twice', async () => { await arrangeSut('proximity-mine'); const result = await actDryRun(); - expectErrored(result); + assertions.expectErrored(result); expect(result.errorMessage).contains('Test runner crashed'); }); diff --git a/packages/core/test/integration/utils/file-utils.it.spec.ts b/packages/core/test/integration/utils/file-utils.it.spec.ts index 020d7cd33b..2d158351f2 100644 --- a/packages/core/test/integration/utils/file-utils.it.spec.ts +++ b/packages/core/test/integration/utils/file-utils.it.spec.ts @@ -1,12 +1,12 @@ -import os = require('os'); -import path = require('path'); +import os from 'os'; +import path from 'path'; import { promises as fsPromises } from 'fs'; -import mkdirp = require('mkdirp'); +import mkdirp from 'mkdirp'; import { expect } from 'chai'; import { File } from '@stryker-mutator/api/core'; -import nodeGlob = require('glob'); +import nodeGlob from 'glob'; import { assertions } from '@stryker-mutator/test-helpers'; import * as fileUtils from '../../../src/utils/file-utils'; diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts index f166d2814a..74b51350af 100644 --- a/packages/core/test/setup.ts +++ b/packages/core/test/setup.ts @@ -1,9 +1,9 @@ import 'source-map-support/register'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinonChai from 'sinon-chai'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinonChai from 'sinon-chai'; import { testInjector } from '@stryker-mutator/test-helpers'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; chai.use(sinonChai); chai.use(chaiAsPromised); diff --git a/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts b/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts index 86d93aa79b..e7324c5da8 100644 --- a/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts +++ b/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts @@ -1,14 +1,14 @@ -import * as childProcess from 'child_process'; +import childProcess from 'child_process'; import { EventEmitter } from 'events'; -import * as os from 'os'; +import os from 'os'; import { LogLevel, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import ChildProcessProxy from '../../../src/child-proxy/child-process-proxy'; +import { ChildProcessProxy } from '../../../src/child-proxy/child-process-proxy'; import { autoStart, DisposeMessage, @@ -21,8 +21,8 @@ import { import { LoggingClientContext } from '../../../src/logging'; import { serialize } from '../../../src/utils/object-utils'; import * as objectUtils from '../../../src/utils/object-utils'; -import OutOfMemoryError from '../../../src/child-proxy/out-of-memory-error'; -import currentLogMock from '../../helpers/log-mock'; +import { OutOfMemoryError } from '../../../src/child-proxy/out-of-memory-error'; +import { currentLogMock } from '../../helpers/log-mock'; import { Mock } from '../../helpers/producers'; import { HelloClass } from './hello-class'; diff --git a/packages/core/test/unit/child-proxy/child-process-worker.spec.ts b/packages/core/test/unit/child-proxy/child-process-worker.spec.ts index d6ec332cb1..fa6252c45f 100644 --- a/packages/core/test/unit/child-proxy/child-process-worker.spec.ts +++ b/packages/core/test/unit/child-proxy/child-process-worker.spec.ts @@ -1,12 +1,12 @@ -import * as path from 'path'; +import path from 'path'; import { LogLevel } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import ChildProcessProxyWorker from '../../../src/child-proxy/child-process-proxy-worker'; +import { ChildProcessProxyWorker } from '../../../src/child-proxy/child-process-proxy-worker'; import { CallMessage, InitMessage, @@ -20,7 +20,7 @@ import * as di from '../../../src/di'; import { LogConfigurator } from '../../../src/logging'; import { LoggingClientContext } from '../../../src/logging'; import { serialize } from '../../../src/utils/object-utils'; -import currentLogMock from '../../helpers/log-mock'; +import { currentLogMock } from '../../helpers/log-mock'; import { Mock } from '../../helpers/producers'; import { HelloClass } from './hello-class'; diff --git a/packages/core/test/unit/concurrent/concurrency-token-provider.spec.ts b/packages/core/test/unit/concurrent/concurrency-token-provider.spec.ts index b48f5fbc42..eaf256f820 100644 --- a/packages/core/test/unit/concurrent/concurrency-token-provider.spec.ts +++ b/packages/core/test/unit/concurrent/concurrency-token-provider.spec.ts @@ -1,7 +1,7 @@ -import os = require('os'); +import os from 'os'; import { expect } from 'chai'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { toArray } from 'rxjs/operators'; import { testInjector } from '@stryker-mutator/test-helpers'; diff --git a/packages/core/test/unit/concurrent/pool.spec.ts b/packages/core/test/unit/concurrent/pool.spec.ts index 259d4493d3..363c6402cb 100644 --- a/packages/core/test/unit/concurrent/pool.spec.ts +++ b/packages/core/test/unit/concurrent/pool.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { toArray } from 'rxjs/operators'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { factory, tick } from '@stryker-mutator/test-helpers'; import { Task, ExpirableTask } from '@stryker-mutator/util'; import { range, ReplaySubject } from 'rxjs'; diff --git a/packages/core/test/unit/config/options-validator.spec.ts b/packages/core/test/unit/config/options-validator.spec.ts index e1f5fe040b..e4bd57c0da 100644 --- a/packages/core/test/unit/config/options-validator.spec.ts +++ b/packages/core/test/unit/config/options-validator.spec.ts @@ -1,6 +1,6 @@ -import os = require('os'); +import os from 'os'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { LogLevel, ReportType, strykerCoreSchema, StrykerOptions } from '@stryker-mutator/api/core'; import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; diff --git a/packages/core/test/unit/di/build-main-injector.spec.ts b/packages/core/test/unit/di/build-main-injector.spec.ts index 24b1ce7098..442a48b4d6 100644 --- a/packages/core/test/unit/di/build-main-injector.spec.ts +++ b/packages/core/test/unit/di/build-main-injector.spec.ts @@ -2,22 +2,22 @@ import { commonTokens, PluginKind } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { StrykerOptions, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { createInjector } from 'typed-inject'; import * as optionsValidatorModule from '../../../src/config/options-validator'; import * as pluginLoaderModule from '../../../src/di/plugin-loader'; -import ConfigReader, * as configReaderModule from '../../../src/config/config-reader'; +import * as configReaderModule from '../../../src/config/config-reader'; import { PluginCreator, PluginLoader, coreTokens, provideLogger } from '../../../src/di'; import { buildMainInjector, CliOptionsProvider } from '../../../src/di/build-main-injector'; import * as broadcastReporterModule from '../../../src/reporters/broadcast-reporter'; -import currentLogMock from '../../helpers/log-mock'; +import { currentLogMock } from '../../helpers/log-mock'; import { UnexpectedExitHandler } from '../../../src/unexpected-exit-handler'; describe(buildMainInjector.name, () => { let pluginLoaderMock: sinon.SinonStubbedInstance; - let configReaderMock: sinon.SinonStubbedInstance; + let configReaderMock: sinon.SinonStubbedInstance; let pluginCreatorMock: sinon.SinonStubbedInstance>; let broadcastReporterMock: sinon.SinonStubbedInstance; let optionsValidatorStub: sinon.SinonStubbedInstance; @@ -27,7 +27,7 @@ describe(buildMainInjector.name, () => { let cliOptions: PartialStrykerOptions; beforeEach(() => { - configReaderMock = sinon.createStubInstance(ConfigReader); + configReaderMock = sinon.createStubInstance(configReaderModule.ConfigReader); pluginCreatorMock = sinon.createStubInstance(PluginCreator); pluginCreatorMock = sinon.createStubInstance(PluginCreator); pluginLoaderMock = sinon.createStubInstance(PluginLoader); @@ -42,8 +42,8 @@ describe(buildMainInjector.name, () => { stubInjectable(PluginCreator, 'createFactory').returns(() => pluginCreatorMock); stubInjectable(optionsValidatorModule, 'OptionsValidator').returns(optionsValidatorStub); stubInjectable(pluginLoaderModule, 'PluginLoader').returns(pluginLoaderMock); - stubInjectable(configReaderModule, 'default').returns(configReaderMock); - stubInjectable(broadcastReporterModule, 'default').returns(broadcastReporterMock); + stubInjectable(configReaderModule, 'ConfigReader').returns(configReaderMock); + stubInjectable(broadcastReporterModule, 'BroadcastReporter').returns(broadcastReporterMock); }); afterEach(async () => { @@ -84,7 +84,7 @@ describe(buildMainInjector.name, () => { it('should inject the `cliOptions` in the config reader', () => { cliOptions.mutate = ['some', 'files']; buildMainInjector(injector).resolve(commonTokens.options); - expect(configReaderModule.default).calledWith(cliOptions); + expect(configReaderModule.ConfigReader).calledWith(cliOptions); }); it('should validate the options', () => { diff --git a/packages/core/test/unit/di/plugin-loader-spec.ts b/packages/core/test/unit/di/plugin-loader.spec.ts similarity index 88% rename from packages/core/test/unit/di/plugin-loader-spec.ts rename to packages/core/test/unit/di/plugin-loader.spec.ts index 177dbc5e55..cb588e608a 100644 --- a/packages/core/test/unit/di/plugin-loader-spec.ts +++ b/packages/core/test/unit/di/plugin-loader.spec.ts @@ -1,9 +1,9 @@ -import * as path from 'path'; -import * as fs from 'fs'; +import path from 'path'; +import fs from 'fs'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { coreTokens } from '../../../src/di'; import { PluginLoader } from '../../../src/di/plugin-loader'; @@ -68,15 +68,17 @@ describe('PluginLoader', () => { }); it('should read from a `node_modules` folder', () => { - expect(pluginDirectoryReadMock).calledWith(path.resolve(__dirname, '..', '..', '..', '..', '..', '@stryker-mutator')); + expect(pluginDirectoryReadMock).calledWith(path.resolve(__dirname, '..', '..', '..', '..', '..', '..', '@stryker-mutator')); }); it('should load "@stryker-mutator/jasmine-framework" and "@stryker-mutator/karma-runner"', () => { expect(fileUtils.importModule).calledTwice; expect(fileUtils.importModule).calledWithMatch( - path.resolve(__dirname, '..', '..', '..', '..', '..', '@stryker-mutator', 'jasmine-framework') + path.resolve(__dirname, '..', '..', '..', '..', '..', '..', '@stryker-mutator', 'jasmine-framework') + ); + expect(fileUtils.importModule).calledWithMatch( + path.resolve(__dirname, '..', '..', '..', '..', '..', '..', '@stryker-mutator', 'karma-runner') ); - expect(fileUtils.importModule).calledWithMatch(path.resolve(__dirname, '..', '..', '..', '..', '..', '@stryker-mutator', 'karma-runner')); }); }); }); diff --git a/packages/core/test/unit/initializer/gitignore-writer.spec.ts b/packages/core/test/unit/initializer/gitignore-writer.spec.ts index dff0c58bbf..be0aedf627 100644 --- a/packages/core/test/unit/initializer/gitignore-writer.spec.ts +++ b/packages/core/test/unit/initializer/gitignore-writer.spec.ts @@ -1,11 +1,11 @@ -import * as os from 'os'; -import * as fs from 'fs'; +import os from 'os'; +import fs from 'fs'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import GitignoreWriter from '../../../src/initializer/gitignore-writer'; +import { GitignoreWriter } from '../../../src/initializer/gitignore-writer'; import { initializerTokens } from '../../../src/initializer'; const GITIGNORE_FILE = '.gitignore'; diff --git a/packages/core/test/unit/initializer/presets.spec.ts b/packages/core/test/unit/initializer/presets.spec.ts index b32e4f15ad..37a1092693 100644 --- a/packages/core/test/unit/initializer/presets.spec.ts +++ b/packages/core/test/unit/initializer/presets.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import * as inquirer from 'inquirer'; -import * as sinon from 'sinon'; +import inquirer from 'inquirer'; +import sinon from 'sinon'; import { AngularPreset } from '../../../src/initializer/presets/angular-preset'; import { ReactPreset } from '../../../src/initializer/presets/react-preset'; diff --git a/packages/core/test/unit/initializer/stryker-initializer.spec.ts b/packages/core/test/unit/initializer/stryker-initializer.spec.ts index d1ddb3eec0..bf1c637623 100644 --- a/packages/core/test/unit/initializer/stryker-initializer.spec.ts +++ b/packages/core/test/unit/initializer/stryker-initializer.spec.ts @@ -1,23 +1,23 @@ -import * as child from 'child_process'; -import * as fs from 'fs'; +import childProcess from 'child_process'; +import fs from 'fs'; import { testInjector } from '@stryker-mutator/test-helpers'; import { childProcessAsPromised, normalizeWhitespaces } from '@stryker-mutator/util'; import { expect } from 'chai'; -import * as inquirer from 'inquirer'; -import * as sinon from 'sinon'; +import inquirer from 'inquirer'; +import sinon from 'sinon'; import { IRestResponse, RestClient } from 'typed-rest-client/RestClient'; import { initializerTokens } from '../../../src/initializer'; -import NpmClient from '../../../src/initializer/npm-client'; +import { NpmClient } from '../../../src/initializer/npm-client'; import { PackageInfo } from '../../../src/initializer/package-info'; -import Preset from '../../../src/initializer/presets/preset'; -import PresetConfiguration from '../../../src/initializer/presets/preset-configuration'; -import StrykerConfigWriter from '../../../src/initializer/stryker-config-writer'; -import StrykerInitializer from '../../../src/initializer/stryker-initializer'; +import { Preset } from '../../../src/initializer/presets/preset'; +import { PresetConfiguration } from '../../../src/initializer/presets/preset-configuration'; +import { StrykerConfigWriter } from '../../../src/initializer/stryker-config-writer'; +import { StrykerInitializer } from '../../../src/initializer/stryker-initializer'; import { StrykerInquirer } from '../../../src/initializer/stryker-inquirer'; import { Mock } from '../../helpers/producers'; -import GitignoreWriter from '../../../src/initializer/gitignore-writer'; +import { GitignoreWriter } from '../../../src/initializer/gitignore-writer'; describe(StrykerInitializer.name, () => { let sut: StrykerInitializer; @@ -42,7 +42,7 @@ describe(StrykerInitializer.name, () => { }; childExec = sinon.stub(childProcessAsPromised, 'exec'); inquirerPrompt = sinon.stub(inquirer, 'prompt'); - childExecSync = sinon.stub(child, 'execSync'); + childExecSync = sinon.stub(childProcess, 'execSync'); fsWriteFile = sinon.stub(fs.promises, 'writeFile'); fsExistsSync = sinon.stub(fs, 'existsSync'); restClientSearch = sinon.createStubInstance(RestClient); diff --git a/packages/core/test/unit/input/input-file-resolver.spec.ts b/packages/core/test/unit/input/input-file-resolver.spec.ts index 6896180677..02eb5bb9a6 100644 --- a/packages/core/test/unit/input/input-file-resolver.spec.ts +++ b/packages/core/test/unit/input/input-file-resolver.spec.ts @@ -1,18 +1,17 @@ -import * as os from 'os'; -import * as path from 'path'; -import fs = require('fs'); +import os from 'os'; +import path from 'path'; +import fs from 'fs'; import { File } from '@stryker-mutator/api/core'; import { SourceFile } from '@stryker-mutator/api/report'; import { testInjector, factory, assertions, tick } from '@stryker-mutator/test-helpers'; -import { createIsDirError, fileNotFoundError } from '@stryker-mutator/test-helpers/src/factory'; import { childProcessAsPromised, errorToString, Task } from '@stryker-mutator/util'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { coreTokens } from '../../../src/di'; -import InputFileResolver from '../../../src/input/input-file-resolver'; -import BroadcastReporter from '../../../src/reporters/broadcast-reporter'; +import { InputFileResolver } from '../../../src/input/input-file-resolver'; +import { BroadcastReporter } from '../../../src/reporters/broadcast-reporter'; import * as fileUtils from '../../../src/utils/file-utils'; import { Mock, mock } from '../../helpers/producers'; @@ -114,7 +113,7 @@ describe(InputFileResolver.name, () => { deleted/file.js `), }); - const error = fileNotFoundError(); + const error = factory.fileNotFoundError(); readFileStub.withArgs('deleted/file.js').rejects(error); const result = await sut.resolve(); expect(result.files).lengthOf(0); @@ -127,7 +126,7 @@ describe(InputFileResolver.name, () => { submoduleDir `), }); - const fileIsDirError = createIsDirError(); + const fileIsDirError = factory.createIsDirError(); readFileStub.withArgs('submoduleDir').rejects(fileIsDirError); const result = await sut.resolve(); expect(result.files).lengthOf(0); diff --git a/packages/core/test/unit/logging/log-configurator.spec.ts b/packages/core/test/unit/logging/log-configurator.spec.ts index c028191cc7..d081a606f9 100644 --- a/packages/core/test/unit/logging/log-configurator.spec.ts +++ b/packages/core/test/unit/logging/log-configurator.spec.ts @@ -1,7 +1,7 @@ import { LogLevel } from '@stryker-mutator/api/core'; import { expect } from 'chai'; -import * as log4js from 'log4js'; -import * as sinon from 'sinon'; +import log4js from 'log4js'; +import sinon from 'sinon'; import { LogConfigurator } from '../../../src/logging'; import { LoggingClientContext } from '../../../src/logging'; diff --git a/packages/core/test/unit/logging/multi-appender.spec.ts b/packages/core/test/unit/logging/multi-appender.spec.ts index 2932033ee1..fd924d04ac 100644 --- a/packages/core/test/unit/logging/multi-appender.spec.ts +++ b/packages/core/test/unit/logging/multi-appender.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import * as log4js from 'log4js'; +import log4js from 'log4js'; import { configure, RuntimeAppender } from '../../../src/logging/multi-appender'; diff --git a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts index 5045b987bc..33e486991a 100644 --- a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts +++ b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts @@ -1,4 +1,4 @@ -import sinon = require('sinon'); +import sinon from 'sinon'; import { expect } from 'chai'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; diff --git a/packages/core/test/unit/process/1-prepare-executor.spec.ts b/packages/core/test/unit/process/1-prepare-executor.spec.ts index 7a51281938..f958caac25 100644 --- a/packages/core/test/unit/process/1-prepare-executor.spec.ts +++ b/packages/core/test/unit/process/1-prepare-executor.spec.ts @@ -4,15 +4,15 @@ import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { PartialStrykerOptions, File, LogLevel } from '@stryker-mutator/api/core'; import { commonTokens } from '@stryker-mutator/api/plugin'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { PrepareExecutor } from '../../../src/process'; import { coreTokens } from '../../../src/di'; import { LogConfigurator, LoggingClientContext } from '../../../src/logging'; import * as buildMainInjectorModule from '../../../src/di/build-main-injector'; -import Timer from '../../../src/utils/timer'; -import InputFileResolver from '../../../src/input/input-file-resolver'; -import InputFileCollection from '../../../src/input/input-file-collection'; +import { Timer } from '../../../src/utils/timer'; +import { InputFileResolver } from '../../../src/input/input-file-resolver'; +import { InputFileCollection } from '../../../src/input/input-file-collection'; import { TemporaryDirectory } from '../../../src/utils/temporary-directory'; import { ConfigError } from '../../../src/errors'; @@ -74,11 +74,6 @@ describe(PrepareExecutor.name, () => { expect(buildMainInjectorModule.buildMainInjector).calledWith(injectorMock); }); - it('should reset the timer', async () => { - await sut.execute(); - expect(timerMock.reset).calledOnce; - }); - it('should resolve input files', async () => { await sut.execute(); expect(inputFileResolverMock.resolve).called; diff --git a/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts b/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts index 6dcba66d32..db4c4cfcac 100644 --- a/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts +++ b/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts @@ -1,4 +1,4 @@ -import sinon = require('sinon'); +import sinon from 'sinon'; import { expect } from 'chai'; import { File } from '@stryker-mutator/api/core'; import { Injector } from 'typed-inject'; @@ -9,7 +9,7 @@ import { Checker } from '@stryker-mutator/api/check'; import { I } from '@stryker-mutator/util'; import { DryRunContext, MutantInstrumenterContext, MutantInstrumenterExecutor } from '../../../src/process'; -import InputFileCollection from '../../../src/input/input-file-collection'; +import { InputFileCollection } from '../../../src/input/input-file-collection'; import { coreTokens } from '../../../src/di'; import { createConcurrencyTokenProviderMock, createCheckerPoolMock, ConcurrencyTokenProviderMock } from '../../helpers/producers'; import { createCheckerFactory } from '../../../src/checker/checker-facade'; diff --git a/packages/core/test/unit/process/3-dry-run-executor.spec.ts b/packages/core/test/unit/process/3-dry-run-executor.spec.ts index 2d4030429e..e8837812e1 100644 --- a/packages/core/test/unit/process/3-dry-run-executor.spec.ts +++ b/packages/core/test/unit/process/3-dry-run-executor.spec.ts @@ -2,7 +2,7 @@ import { EOL } from 'os'; import { Injector } from 'typed-inject'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { TestRunner, CompleteDryRunResult, ErrorDryRunResult, TimeoutDryRunResult, DryRunResult } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; import { Observable } from 'rxjs'; @@ -10,7 +10,7 @@ import { mergeMap } from 'rxjs/operators'; import { I } from '@stryker-mutator/util'; -import Timer from '../../../src/utils/timer'; +import { Timer } from '../../../src/utils/timer'; import { DryRunContext, DryRunExecutor, MutationTestContext } from '../../../src/process'; import { coreTokens } from '../../../src/di'; import { ConfigError } from '../../../src/errors'; diff --git a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts index 5586db1c9e..2674a0a4a0 100644 --- a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts +++ b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts @@ -1,4 +1,4 @@ -import sinon = require('sinon'); +import sinon from 'sinon'; import { expect } from 'chai'; import { testInjector, factory, tick } from '@stryker-mutator/test-helpers'; import { Reporter } from '@stryker-mutator/api/report'; @@ -14,7 +14,7 @@ import { coreTokens } from '../../../src/di'; import { createTestRunnerPoolMock, createMutantTestCoverage, createCheckerPoolMock } from '../../helpers/producers'; import { MutantTestCoverage } from '../../../src/mutants/find-mutant-test-coverage'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; -import Timer from '../../../src/utils/timer'; +import { Timer } from '../../../src/utils/timer'; import { ConcurrencyTokenProvider, Pool } from '../../../src/concurrent'; import { Sandbox } from '../../../src/sandbox'; diff --git a/packages/core/test/unit/reporters/broadcast-reporter.spec.ts b/packages/core/test/unit/reporters/broadcast-reporter.spec.ts index adf54e00fd..91a9e0ae4d 100644 --- a/packages/core/test/unit/reporters/broadcast-reporter.spec.ts +++ b/packages/core/test/unit/reporters/broadcast-reporter.spec.ts @@ -1,13 +1,12 @@ import { PluginKind } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; -import { ALL_REPORTER_EVENTS } from '@stryker-mutator/test-helpers/src/factory'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { coreTokens } from '../../../src/di'; import { PluginCreator } from '../../../src/di/plugin-creator'; -import BroadcastReporter from '../../../src/reporters/broadcast-reporter'; +import { BroadcastReporter } from '../../../src/reporters/broadcast-reporter'; describe('BroadcastReporter', () => { let sut: BroadcastReporter; @@ -126,7 +125,7 @@ describe('BroadcastReporter', () => { beforeEach(() => { actualError = new Error('some error'); - ALL_REPORTER_EVENTS.forEach((eventName) => rep1[eventName].throws(actualError)); + factory.ALL_REPORTER_EVENTS.forEach((eventName) => rep1[eventName].throws(actualError)); }); it('should still broadcast to other reporters', () => { @@ -134,7 +133,7 @@ describe('BroadcastReporter', () => { }); it('should log each error', () => { - ALL_REPORTER_EVENTS.forEach((eventName) => { + factory.ALL_REPORTER_EVENTS.forEach((eventName) => { (sut as any)[eventName](); expect(testInjector.logger.error).to.have.been.calledWith(`An error occurred during '${eventName}' on reporter 'rep1'.`, actualError); }); @@ -149,7 +148,7 @@ describe('BroadcastReporter', () => { } function actArrangeAssertAllEvents() { - ALL_REPORTER_EVENTS.forEach((eventName) => { + factory.ALL_REPORTER_EVENTS.forEach((eventName) => { const eventData = eventName === 'wrapUp' ? undefined : eventName; (sut as any)[eventName](eventName); expect(rep1[eventName]).calledWith(eventData); diff --git a/packages/core/test/unit/reporters/ci/circle-provider.spec.ts b/packages/core/test/unit/reporters/ci/circle-provider.spec.ts index 4f2ab3cb2a..5a2f97b48a 100644 --- a/packages/core/test/unit/reporters/ci/circle-provider.spec.ts +++ b/packages/core/test/unit/reporters/ci/circle-provider.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import CircleProvider from '../../../../src/reporters/ci/circle-provider'; +import { CircleProvider } from '../../../../src/reporters/ci/circle-provider'; import { EnvironmentVariableStore } from '../../../helpers/environment-variable-store'; describe(CircleProvider.name, () => { diff --git a/packages/core/test/unit/reporters/ci/github-actions-provider.spec.ts b/packages/core/test/unit/reporters/ci/github-actions-provider.spec.ts index ad2a5de263..61888bb960 100644 --- a/packages/core/test/unit/reporters/ci/github-actions-provider.spec.ts +++ b/packages/core/test/unit/reporters/ci/github-actions-provider.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { StrykerError } from '@stryker-mutator/util'; -import GithubActionsCIProvider from '../../../../src/reporters/ci/github-actions-provider'; +import { GithubActionsCIProvider } from '../../../../src/reporters/ci/github-actions-provider'; import { EnvironmentVariableStore } from '../../../helpers/environment-variable-store'; describe(GithubActionsCIProvider.name, () => { diff --git a/packages/core/test/unit/reporters/ci/provider.spec.ts b/packages/core/test/unit/reporters/ci/provider.spec.ts index 3619e9fcc8..5a36dc0489 100644 --- a/packages/core/test/unit/reporters/ci/provider.spec.ts +++ b/packages/core/test/unit/reporters/ci/provider.spec.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; import { determineCIProvider } from '../../../../src/reporters/ci/provider'; -import TravisProvider from '../../../../src/reporters/ci/travis-provider'; -import CircleProvider from '../../../../src/reporters/ci/circle-provider'; +import { TravisProvider } from '../../../../src/reporters/ci/travis-provider'; +import { CircleProvider } from '../../../../src/reporters/ci/circle-provider'; import { EnvironmentVariableStore } from '../../../helpers/environment-variable-store'; -import GithubActionsProvider from '../../../../src/reporters/ci/github-actions-provider'; +import { GithubActionsCIProvider } from '../../../../src/reporters/ci/github-actions-provider'; -describe('determineCiProvider()', () => { +describe(determineCIProvider.name, () => { const env = new EnvironmentVariableStore(); beforeEach(() => { @@ -38,6 +38,6 @@ describe('determineCiProvider()', () => { it('should provide Github when running in the github actions CI environment', () => { env.set('GITHUB_ACTION', 'true'); const result = determineCIProvider(); - expect(result).instanceOf(GithubActionsProvider); + expect(result).instanceOf(GithubActionsCIProvider); }); }); diff --git a/packages/core/test/unit/reporters/ci/travis-provider.spec.ts b/packages/core/test/unit/reporters/ci/travis-provider.spec.ts index 8864f8c52d..0867d5407a 100644 --- a/packages/core/test/unit/reporters/ci/travis-provider.spec.ts +++ b/packages/core/test/unit/reporters/ci/travis-provider.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import TravisProvider from '../../../../src/reporters/ci/travis-provider'; +import { TravisProvider } from '../../../../src/reporters/ci/travis-provider'; import { EnvironmentVariableStore } from '../../../helpers/environment-variable-store'; describe(TravisProvider.name, () => { diff --git a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts index d8ba6f3435..8af7220da1 100644 --- a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts +++ b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts @@ -1,14 +1,13 @@ -import * as os from 'os'; +import os from 'os'; import { mutationTestReportSchema, MutantStatus } from '@stryker-mutator/api/report'; import { testInjector, factory } from '@stryker-mutator/test-helpers'; -import { mutationScoreThresholds } from '@stryker-mutator/test-helpers/src/factory'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import chalk = require('chalk'); +import chalk from 'chalk'; -import ClearTextReporter from '../../../src/reporters/clear-text-reporter'; +import { ClearTextReporter } from '../../../src/reporters/clear-text-reporter'; describe(ClearTextReporter.name, () => { let sut: ClearTextReporter; @@ -41,7 +40,7 @@ describe(ClearTextReporter.name, () => { }, }, schemaVersion: '1.0', - thresholds: mutationScoreThresholds({}), + thresholds: factory.mutationScoreThresholds({}), }); const serializedTable: string = stdoutStub.getCall(0).args[0]; @@ -65,7 +64,7 @@ describe(ClearTextReporter.name, () => { sut.onMutationTestReportReady({ files: {}, schemaVersion: '1.0', - thresholds: mutationScoreThresholds({}), + thresholds: factory.mutationScoreThresholds({}), }); expect(chalk.level).to.eq(0); diff --git a/packages/core/test/unit/reporters/clear-text-score-table.spec.ts b/packages/core/test/unit/reporters/clear-text-score-table.spec.ts index b1457e383a..02544ae309 100644 --- a/packages/core/test/unit/reporters/clear-text-score-table.spec.ts +++ b/packages/core/test/unit/reporters/clear-text-score-table.spec.ts @@ -1,15 +1,14 @@ -import * as os from 'os'; +import os from 'os'; import { MutationScoreThresholds } from '@stryker-mutator/api/core'; -import { testInjector } from '@stryker-mutator/test-helpers'; -import { metrics, metricsResult } from '@stryker-mutator/test-helpers/src/factory'; +import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { MetricsResult } from 'mutation-testing-metrics'; -import chalk = require('chalk'); -import flatMap = require('lodash.flatmap'); +import chalk from 'chalk'; +import flatMap from 'lodash.flatmap'; -import ClearTextScoreTable from '../../../src/reporters/clear-text-score-table'; +import { ClearTextScoreTable } from '../../../src/reporters/clear-text-score-table'; describe(ClearTextScoreTable.name, () => { describe('draw', () => { @@ -20,15 +19,15 @@ describe(ClearTextScoreTable.name, () => { childResults: [ { childResults: [], - metrics: metrics({ mutationScore: 59.99 }), + metrics: factory.metrics({ mutationScore: 59.99 }), name: 'some/test/for/a/deep/file.js', }, ], - metrics: metrics({ mutationScore: 60 }), + metrics: factory.metrics({ mutationScore: 60 }), name: 'child1', }, ], - metrics: metrics({ + metrics: factory.metrics({ compileErrors: 7, killed: 1, mutationScore: 80, @@ -58,7 +57,7 @@ describe(ClearTextScoreTable.name, () => { it('should grow columns widths based on value size', () => { const metricsResult: MetricsResult = { childResults: [], - metrics: metrics({ + metrics: factory.metrics({ killed: 1000000000, }), name: 'root', @@ -75,15 +74,15 @@ describe(ClearTextScoreTable.name, () => { it('should color scores < low threshold in red, < high threshold in yellow and > high threshold in green', () => { const thresholds: MutationScoreThresholds = { high: 60, low: 50, break: 0 }; - const input: MetricsResult = metricsResult({ + const input: MetricsResult = factory.metricsResult({ childResults: [ - metricsResult({ metrics: metrics({ mutationScore: 60.0 }) }), - metricsResult({ metrics: metrics({ mutationScore: 59.99 }) }), - metricsResult({ metrics: metrics({ mutationScore: 50.01 }) }), - metricsResult({ metrics: metrics({ mutationScore: 50.0 }) }), - metricsResult({ metrics: metrics({ mutationScore: 49.99 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 60.0 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 59.99 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 50.01 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 50.0 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 49.99 }) }), ], - metrics: metrics({ mutationScore: 60.01 }), + metrics: factory.metrics({ mutationScore: 60.01 }), }); const sut = new ClearTextScoreTable(input, thresholds); @@ -99,9 +98,12 @@ describe(ClearTextScoreTable.name, () => { it('should color score in red and green if low equals high thresholds', () => { const thresholds: MutationScoreThresholds = { high: 50, low: 50, break: 0 }; - const input: MetricsResult = metricsResult({ - childResults: [metricsResult({ metrics: metrics({ mutationScore: 50.0 }) }), metricsResult({ metrics: metrics({ mutationScore: 49.99 }) })], - metrics: metrics({ mutationScore: 50.01 }), + const input: MetricsResult = factory.metricsResult({ + childResults: [ + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 50.0 }) }), + factory.metricsResult({ metrics: factory.metrics({ mutationScore: 49.99 }) }), + ], + metrics: factory.metrics({ mutationScore: 50.01 }), }); const sut = new ClearTextScoreTable(input, thresholds); diff --git a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter-client.spec.ts b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter-client.spec.ts index a87c05d7aa..7cb9598bbe 100644 --- a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter-client.spec.ts +++ b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter-client.spec.ts @@ -1,20 +1,17 @@ -import { testInjector } from '@stryker-mutator/test-helpers'; +import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { HttpClient } from 'typed-rest-client/HttpClient'; -import { mutationTestReportSchemaMutationTestResult } from '@stryker-mutator/test-helpers/src/factory'; - import { IHttpClientResponse } from 'typed-rest-client/Interfaces'; -import StrykerDashboardClient from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; -import DashboardReporterClient from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; +import { DashboardReporterClient } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; import { dashboardReporterTokens } from '../../../../src/reporters/dashboard-reporter/tokens'; import { Mock, mock } from '../../../helpers/producers'; import { Report } from '../../../../src/reporters/dashboard-reporter/report'; import { EnvironmentVariableStore } from '../../../helpers/environment-variable-store'; describe(DashboardReporterClient.name, () => { - let sut: StrykerDashboardClient; + let sut: DashboardReporterClient; let httpClient: Mock; let environment: EnvironmentVariableStore; @@ -43,7 +40,7 @@ describe(DashboardReporterClient.name, () => { const expectedHref = 'foo/bar'; respondWith(200, `{ "href": "${expectedHref}" }`); environment.set('STRYKER_DASHBOARD_API_KEY', apiKey); - const report = mutationTestReportSchemaMutationTestResult(); + const report = factory.mutationTestReportSchemaMutationTestResult(); const expectedBody = JSON.stringify(report); const expectedUrl = `${baseUrl}/${projectName}/${expectedVersion}`; @@ -64,7 +61,7 @@ describe(DashboardReporterClient.name, () => { it('should put the report for a specific module', async () => { // Arrange respondWith(); - const report = mutationTestReportSchemaMutationTestResult(); + const report = factory.mutationTestReportSchemaMutationTestResult(); const expectedUrl = `${baseUrl}/${projectName}/${expectedVersion}?module=stryker%20module`; // Act @@ -77,7 +74,7 @@ describe(DashboardReporterClient.name, () => { it('should use configured baseUrl', async () => { // Arrange respondWith(); - const report = mutationTestReportSchemaMutationTestResult(); + const report = factory.mutationTestReportSchemaMutationTestResult(); testInjector.options.dashboard.baseUrl = 'https://foo.bar.com/api'; const expectedUrl = `https://foo.bar.com/api/${projectName}/${expectedVersion}?module=stryker%20module`; @@ -107,7 +104,7 @@ describe(DashboardReporterClient.name, () => { it('should throw an unexpected error if the dashboard responds with 500', async () => { // Arrange respondWith(500, 'Internal server error'); - const report = mutationTestReportSchemaMutationTestResult(); + const report = factory.mutationTestReportSchemaMutationTestResult(); // Act const promise = sut.updateReport({ report, projectName, version, moduleName: undefined }); diff --git a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts index a62da7ac8b..fba48cb037 100644 --- a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts +++ b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts @@ -1,30 +1,22 @@ import { mutationTestReportSchema } from '@stryker-mutator/api/report'; -import { testInjector } from '@stryker-mutator/test-helpers'; -import { - mutationTestReportSchemaFileResult, - mutationTestReportSchemaMutantResult, - mutationTestReportSchemaMutationTestResult, -} from '@stryker-mutator/test-helpers/src/factory'; +import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { ReportType } from '@stryker-mutator/api/core'; import { CIProvider } from '../../../../src/reporters/ci/provider'; -import DashboardReporter from '../../../../src/reporters/dashboard-reporter/dashboard-reporter'; -import { - default as DashboardReporterClient, - default as StrykerDashboardClient, -} from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; +import { DashboardReporter } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter'; +import { DashboardReporterClient } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; import { dashboardReporterTokens } from '../../../../src/reporters/dashboard-reporter/tokens'; import { mock, Mock } from '../../../helpers/producers'; import { Report } from '../../../../src/reporters/dashboard-reporter/report'; describe(DashboardReporter.name, () => { - let dashboardClientMock: Mock; + let dashboardClientMock: Mock; let ciProviderMock: Mock; beforeEach(() => { - dashboardClientMock = mock(StrykerDashboardClient); + dashboardClientMock = mock(DashboardReporterClient); ciProviderMock = { determineProject: sinon.stub(), determineVersion: sinon.stub(), @@ -47,7 +39,7 @@ describe(DashboardReporter.name, () => { testInjector.options.dashboard.module = 'bazModule'; // Act - await act(mutationTestReportSchemaMutationTestResult()); + await act(factory.mutationTestReportSchemaMutationTestResult()); // Assert expect(dashboardClientMock.updateReport).calledWithMatch({ @@ -62,7 +54,7 @@ describe(DashboardReporter.name, () => { testInjector.options.dashboard.reportType = ReportType.Full; ciProviderMock.determineProject.returns('github.com/foo/bar'); ciProviderMock.determineVersion.returns('master'); - const expectedMutationTestResult = mutationTestReportSchemaMutationTestResult(); + const expectedMutationTestResult = factory.mutationTestReportSchemaMutationTestResult(); // Act await act(expectedMutationTestResult); @@ -82,14 +74,14 @@ describe(DashboardReporter.name, () => { testInjector.options.dashboard.reportType = ReportType.MutationScore; ciProviderMock.determineProject.returns('github.com/foo/bar'); ciProviderMock.determineVersion.returns('master'); - const mutationTestResult = mutationTestReportSchemaMutationTestResult({ + const mutationTestResult = factory.mutationTestReportSchemaMutationTestResult({ files: { - 'a.js': mutationTestReportSchemaFileResult({ + 'a.js': factory.mutationTestReportSchemaFileResult({ mutants: [ - mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Survived }), + factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Survived }), ], }), }, @@ -116,7 +108,7 @@ describe(DashboardReporter.name, () => { const sut = createSut(null); // Act - sut.onMutationTestReportReady(mutationTestReportSchemaMutationTestResult()); + sut.onMutationTestReportReady(factory.mutationTestReportSchemaMutationTestResult()); await sut.wrapUp(); // Assert diff --git a/packages/core/test/unit/reporters/dots-reporter.spec.ts b/packages/core/test/unit/reporters/dots-reporter.spec.ts index b61a5d8cef..7bb7f4ccb5 100644 --- a/packages/core/test/unit/reporters/dots-reporter.spec.ts +++ b/packages/core/test/unit/reporters/dots-reporter.spec.ts @@ -1,12 +1,12 @@ -import * as os from 'os'; +import os from 'os'; import { MutantStatus } from '@stryker-mutator/api/report'; import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; -import chalk = require('chalk'); +import sinon from 'sinon'; +import chalk from 'chalk'; -import DotsReporter from '../../../src/reporters/dots-reporter'; +import { DotsReporter } from '../../../src/reporters/dots-reporter'; describe(DotsReporter.name, () => { let sut: DotsReporter; diff --git a/packages/core/test/unit/reporters/event-recorder-reporter.spec.ts b/packages/core/test/unit/reporters/event-recorder-reporter.spec.ts index d07d726977..e2d848b93b 100644 --- a/packages/core/test/unit/reporters/event-recorder-reporter.spec.ts +++ b/packages/core/test/unit/reporters/event-recorder-reporter.spec.ts @@ -1,13 +1,12 @@ -import * as fs from 'fs'; +import fs from 'fs'; import { Reporter } from '@stryker-mutator/api/report'; -import { testInjector } from '@stryker-mutator/test-helpers'; -import { ALL_REPORTER_EVENTS } from '@stryker-mutator/test-helpers/src/factory'; +import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import EventRecorderReporter from '../../../src/reporters/event-recorder-reporter'; -import StrictReporter from '../../../src/reporters/strict-reporter'; +import { EventRecorderReporter } from '../../../src/reporters/event-recorder-reporter'; +import { StrictReporter } from '../../../src/reporters/strict-reporter'; import * as fileUtils from '../../../src/utils/file-utils'; describe(EventRecorderReporter.name, () => { @@ -62,7 +61,7 @@ describe(EventRecorderReporter.name, () => { }); }; - ALL_REPORTER_EVENTS.filter((event) => event !== 'wrapUp').forEach(arrangeActAssertEvent); + factory.ALL_REPORTER_EVENTS.filter((event) => event !== 'wrapUp').forEach(arrangeActAssertEvent); }); describe('and cleanFolder results in a rejection', () => { diff --git a/packages/core/test/unit/reporters/html/html-reporter.spec.ts b/packages/core/test/unit/reporters/html/html-reporter.spec.ts index 75932b24e5..651bf420a6 100644 --- a/packages/core/test/unit/reporters/html/html-reporter.spec.ts +++ b/packages/core/test/unit/reporters/html/html-reporter.spec.ts @@ -1,11 +1,11 @@ -import * as path from 'path'; +import path from 'path'; import { mutationTestReportSchema } from '@stryker-mutator/api/report'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import HtmlReporter from '../../../../src/reporters/html/html-reporter'; +import { HtmlReporter } from '../../../../src/reporters/html/html-reporter'; import * as ReporterUtil from '../../../../src/reporters/reporter-util'; describe(HtmlReporter.name, () => { diff --git a/packages/core/test/unit/reporters/json-reporter.spec.ts b/packages/core/test/unit/reporters/json-reporter.spec.ts index 005f2aebe8..816ded7ccf 100644 --- a/packages/core/test/unit/reporters/json-reporter.spec.ts +++ b/packages/core/test/unit/reporters/json-reporter.spec.ts @@ -1,11 +1,11 @@ -import * as path from 'path'; +import path from 'path'; import { mutationTestReportSchema } from '@stryker-mutator/api/report'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import JsonReporter from '../../../src/reporters/json-reporter'; +import { JsonReporter } from '../../../src/reporters/json-reporter'; import * as JsonReporterUtil from '../../../src/reporters/reporter-util'; describe(JsonReporter.name, () => { diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index 13268a7a2f..15e7990ca4 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -1,4 +1,4 @@ -import sinon = require('sinon'); +import sinon from 'sinon'; import { File, Location, Range } from '@stryker-mutator/api/core'; import { MutantResult, @@ -17,7 +17,7 @@ import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; import { CheckStatus } from '@stryker-mutator/api/check'; import { coreTokens } from '../../../src/di'; -import InputFileCollection from '../../../src/input/input-file-collection'; +import { InputFileCollection } from '../../../src/input/input-file-collection'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; import * as objectUtils from '../../../src/utils/object-utils'; import { createMutantTestCoverage } from '../../helpers/producers'; diff --git a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts index 78ff07f3c3..20f61fd7cb 100644 --- a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts @@ -1,12 +1,10 @@ -import * as os from 'os'; +import os from 'os'; -import { matchedMutant } from '@stryker-mutator/test-helpers/src/factory'; import { expect } from 'chai'; -import * as sinon from 'sinon'; - +import sinon from 'sinon'; import { factory } from '@stryker-mutator/test-helpers'; -import ProgressAppendOnlyReporter from '../../../src/reporters/progress-append-only-reporter'; +import { ProgressAppendOnlyReporter } from '../../../src/reporters/progress-append-only-reporter'; const SECOND = 1000; const TEN_SECONDS = SECOND * 10; @@ -26,9 +24,9 @@ describe(ProgressAppendOnlyReporter.name, () => { describe('onAllMutantsMatchedWithTests() with 3 mutants to test', () => { beforeEach(() => { sut.onAllMutantsMatchedWithTests([ - matchedMutant({ runAllTests: true }), - matchedMutant({ runAllTests: true }), - matchedMutant({ runAllTests: true }), + factory.matchedMutant({ runAllTests: true }), + factory.matchedMutant({ runAllTests: true }), + factory.matchedMutant({ runAllTests: true }), ]); }); diff --git a/packages/core/test/unit/reporters/progress-reporter.spec.ts b/packages/core/test/unit/reporters/progress-reporter.spec.ts index f08a703dd9..8a0b9ddc30 100644 --- a/packages/core/test/unit/reporters/progress-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-reporter.spec.ts @@ -1,12 +1,11 @@ import { MatchedMutant, MutantStatus } from '@stryker-mutator/api/report'; -import { matchedMutant } from '@stryker-mutator/test-helpers/src/factory'; import { expect } from 'chai'; -import * as sinon from 'sinon'; -import ProgressBar = require('progress'); +import sinon from 'sinon'; +import ProgressBar from 'progress'; import { factory } from '@stryker-mutator/test-helpers'; import * as progressBarModule from '../../../src/reporters/progress-bar'; -import ProgressReporter from '../../../src/reporters/progress-reporter'; +import { ProgressBarReporter } from '../../../src/reporters/progress-reporter'; import { Mock, mock } from '../../helpers/producers'; const SECOND = 1000; @@ -15,8 +14,8 @@ const HUNDRED_SECONDS = SECOND * 100; const TEN_THOUSAND_SECONDS = SECOND * 10000; const ONE_HOUR = SECOND * 3600; -describe('ProgressReporter', () => { - let sut: ProgressReporter; +describe(ProgressBarReporter.name, () => { + let sut: ProgressBarReporter; let matchedMutants: MatchedMutant[]; let progressBar: Mock; const progressBarContent = @@ -24,49 +23,51 @@ describe('ProgressReporter', () => { beforeEach(() => { sinon.useFakeTimers(); - - sut = new ProgressReporter(); - + sut = new ProgressBarReporter(); progressBar = mock(ProgressBar); - sinon.stub(progressBarModule, 'default').returns(progressBar); + sinon.stub(progressBarModule, 'ProgressBar').returns(progressBar); }); describe('onAllMutantsMatchedWithTests()', () => { describe('when there are 3 MatchedMutants that all contain Tests', () => { beforeEach(() => { - matchedMutants = [matchedMutant({ runAllTests: true }), matchedMutant({ runAllTests: true }), matchedMutant({ runAllTests: true })]; + matchedMutants = [ + factory.matchedMutant({ runAllTests: true }), + factory.matchedMutant({ runAllTests: true }), + factory.matchedMutant({ runAllTests: true }), + ]; sut.onAllMutantsMatchedWithTests(matchedMutants); }); it('the total of MatchedMutants in the progress bar should be 3', () => { - expect(progressBarModule.default).to.have.been.calledWithMatch(progressBarContent, { total: 3 }); + expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 3 }); }); }); describe("when there are 2 MatchedMutants that all contain Tests and 1 MatchMutant that doesn't have tests", () => { beforeEach(() => { matchedMutants = [ - matchedMutant({ testFilter: undefined }), - matchedMutant({ testFilter: ['spec1'] }), - matchedMutant({ testFilter: ['spec2'] }), + factory.matchedMutant({ testFilter: undefined }), + factory.matchedMutant({ testFilter: ['spec1'] }), + factory.matchedMutant({ testFilter: ['spec2'] }), ]; sut.onAllMutantsMatchedWithTests(matchedMutants); }); it('the total of MatchedMutants in the progress bar should be 2', () => { - expect(progressBarModule.default).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); + expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); }); }); describe('when mutants match to all tests', () => { beforeEach(() => { - matchedMutants = [matchedMutant({ runAllTests: true }), matchedMutant({ runAllTests: true })]; + matchedMutants = [factory.matchedMutant({ runAllTests: true }), factory.matchedMutant({ runAllTests: true })]; sut.onAllMutantsMatchedWithTests(matchedMutants); }); it('the total of MatchedMutants in the progress bar should be 2', () => { - expect(progressBarModule.default).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); + expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); }); }); }); @@ -76,10 +77,10 @@ describe('ProgressReporter', () => { beforeEach(() => { matchedMutants = [ - matchedMutant({ id: '0' }), // NoCoverage - matchedMutant({ id: '1', testFilter: [''] }), - matchedMutant({ id: '2', runAllTests: true }), - matchedMutant({ id: '3', testFilter: [''] }), + factory.matchedMutant({ id: '0' }), // NoCoverage + factory.matchedMutant({ id: '1', testFilter: [''] }), + factory.matchedMutant({ id: '2', runAllTests: true }), + factory.matchedMutant({ id: '3', testFilter: [''] }), ]; sut.onAllMutantsMatchedWithTests(matchedMutants); }); @@ -107,9 +108,9 @@ describe('ProgressReporter', () => { describe('ProgressBar estimated time for 3 mutants', () => { beforeEach(() => { sut.onAllMutantsMatchedWithTests([ - matchedMutant({ id: '1', runAllTests: true }), - matchedMutant({ id: '2', runAllTests: true }), - matchedMutant({ id: '3', runAllTests: true }), + factory.matchedMutant({ id: '1', runAllTests: true }), + factory.matchedMutant({ id: '2', runAllTests: true }), + factory.matchedMutant({ id: '3', runAllTests: true }), ]); }); diff --git a/packages/core/test/unit/sandbox/create-preprocessor.spec.ts b/packages/core/test/unit/sandbox/create-preprocessor.spec.ts index 2cd3b13a2d..3fa05cfd8c 100644 --- a/packages/core/test/unit/sandbox/create-preprocessor.spec.ts +++ b/packages/core/test/unit/sandbox/create-preprocessor.spec.ts @@ -1,4 +1,4 @@ -import path = require('path'); +import path from 'path'; import { testInjector, assertions } from '@stryker-mutator/test-helpers'; import { File } from '@stryker-mutator/api/core'; diff --git a/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts b/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts index 1124a5e649..41ca1dcb65 100644 --- a/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts +++ b/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts @@ -1,8 +1,8 @@ -import path = require('path'); +import path from 'path'; import { File } from '@stryker-mutator/api/core'; import { assertions, testInjector } from '@stryker-mutator/test-helpers'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { expect } from 'chai'; diff --git a/packages/core/test/unit/sandbox/multi-preprocessor.spec.ts b/packages/core/test/unit/sandbox/multi-preprocessor.spec.ts index 2fce332aa6..d146cbea49 100644 --- a/packages/core/test/unit/sandbox/multi-preprocessor.spec.ts +++ b/packages/core/test/unit/sandbox/multi-preprocessor.spec.ts @@ -1,4 +1,4 @@ -import sinon = require('sinon'); +import sinon from 'sinon'; import { File } from '@stryker-mutator/api/core'; import { expect } from 'chai'; diff --git a/packages/core/test/unit/sandbox/sandbox.spec.ts b/packages/core/test/unit/sandbox/sandbox.spec.ts index 19d5276ef7..511d933900 100644 --- a/packages/core/test/unit/sandbox/sandbox.spec.ts +++ b/packages/core/test/unit/sandbox/sandbox.spec.ts @@ -1,13 +1,12 @@ -import path = require('path'); +import path from 'path'; import { promises as fsPromises } from 'fs'; -import execa = require('execa'); -import npmRunPath = require('npm-run-path'); +import execa from 'execa'; +import npmRunPath from 'npm-run-path'; import { expect } from 'chai'; -import sinon = require('sinon'); -import { testInjector, tick } from '@stryker-mutator/test-helpers'; +import sinon from 'sinon'; +import { testInjector, tick, factory } from '@stryker-mutator/test-helpers'; import { File } from '@stryker-mutator/api/core'; -import { fileAlreadyExistsError } from '@stryker-mutator/test-helpers/src/factory'; import { normalizeWhitespaces, Task } from '@stryker-mutator/util'; import { Sandbox } from '../../../src/sandbox/sandbox'; @@ -230,7 +229,7 @@ describe(Sandbox.name, () => { it('should log a warning if "node_modules" already exists in the working folder', async () => { findNodeModulesStub.resolves('node_modules'); - symlinkJunctionStub.rejects(fileAlreadyExistsError()); + symlinkJunctionStub.rejects(factory.fileAlreadyExistsError()); const sut = createSut(); await sut.init(); expect(testInjector.logger.warn).calledWithMatch( diff --git a/packages/core/test/unit/sandbox/ts-config-preprocessor.it.spec.ts b/packages/core/test/unit/sandbox/ts-config-preprocessor.it.spec.ts index c5fca58ead..8553051d1c 100644 --- a/packages/core/test/unit/sandbox/ts-config-preprocessor.it.spec.ts +++ b/packages/core/test/unit/sandbox/ts-config-preprocessor.it.spec.ts @@ -1,4 +1,4 @@ -import path = require('path'); +import path from 'path'; import { expect } from 'chai'; import { File } from '@stryker-mutator/api/core'; diff --git a/packages/core/test/unit/stryker-cli.spec.ts b/packages/core/test/unit/stryker-cli.spec.ts index ade7c361f7..61f17db356 100644 --- a/packages/core/test/unit/stryker-cli.spec.ts +++ b/packages/core/test/unit/stryker-cli.spec.ts @@ -1,10 +1,10 @@ import { Command } from 'commander'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { expect } from 'chai'; import { DashboardOptions, StrykerOptions, ReportType, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { LogConfigurator } from '../../src/logging'; -import StrykerCli from '../../src/stryker-cli'; +import { StrykerCli } from '../../src/stryker-cli'; describe(StrykerCli.name, () => { let runMutationTestingStub: sinon.SinonStub; diff --git a/packages/core/test/unit/stryker.spec.ts b/packages/core/test/unit/stryker.spec.ts index 82efc953c8..da6e3c2485 100644 --- a/packages/core/test/unit/stryker.spec.ts +++ b/packages/core/test/unit/stryker.spec.ts @@ -1,6 +1,6 @@ import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import * as typedInject from 'typed-inject'; import { PartialStrykerOptions, LogLevel } from '@stryker-mutator/api/core'; import { MutantResult } from '@stryker-mutator/api/report'; @@ -8,7 +8,7 @@ import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { LogConfigurator } from '../../src/logging'; -import Stryker from '../../src/stryker'; +import { Stryker } from '../../src/stryker'; import { PrepareExecutor, MutantInstrumenterExecutor, DryRunExecutor, MutationTestExecutor, MutationTestContext } from '../../src/process'; import { coreTokens } from '../../src/di'; import { ConfigError } from '../../src/errors'; diff --git a/packages/core/test/unit/test-runner/child-process-test-runner-decorator.spec.ts b/packages/core/test/unit/test-runner/child-process-test-runner-decorator.spec.ts index c6b01e4d00..a46d8c2b72 100644 --- a/packages/core/test/unit/test-runner/child-process-test-runner-decorator.spec.ts +++ b/packages/core/test/unit/test-runner/child-process-test-runner-decorator.spec.ts @@ -1,17 +1,14 @@ import { LogLevel, StrykerOptions } from '@stryker-mutator/api/core'; -import { strykerOptions } from '@stryker-mutator/test-helpers/src/factory'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { Task } from '@stryker-mutator/util'; - import { TestRunner } from '@stryker-mutator/api/test-runner'; - import { factory } from '@stryker-mutator/test-helpers'; -import ChildProcessCrashedError from '../../../src/child-proxy/child-process-crashed-error'; -import ChildProcessProxy from '../../../src/child-proxy/child-process-proxy'; +import { ChildProcessCrashedError } from '../../../src/child-proxy/child-process-crashed-error'; +import { ChildProcessProxy } from '../../../src/child-proxy/child-process-proxy'; import { LoggingClientContext } from '../../../src/logging'; -import ChildProcessTestRunnerDecorator from '../../../src/test-runner/child-process-test-runner-decorator'; +import { ChildProcessTestRunnerDecorator } from '../../../src/test-runner/child-process-test-runner-decorator'; import { ChildProcessTestRunnerWorker } from '../../../src/test-runner/child-process-test-runner-worker'; describe(ChildProcessTestRunnerDecorator.name, () => { @@ -32,7 +29,7 @@ describe(ChildProcessTestRunnerDecorator.name, () => { }; childProcessProxyCreateStub = sinon.stub(ChildProcessProxy, 'create'); childProcessProxyCreateStub.returns(childProcessProxyMock); - options = strykerOptions({ + options = factory.strykerOptions({ plugins: ['foo-plugin', 'bar-plugin'], }); loggingContext = { port: 4200, level: LogLevel.Fatal }; diff --git a/packages/core/test/unit/test-runner/command-test-runner.spec.ts b/packages/core/test/unit/test-runner/command-test-runner.spec.ts index 811f3b2234..7a723f85d0 100644 --- a/packages/core/test/unit/test-runner/command-test-runner.spec.ts +++ b/packages/core/test/unit/test-runner/command-test-runner.spec.ts @@ -1,30 +1,30 @@ -import * as childProcess from 'child_process'; -import * as os from 'os'; +import childProcess from 'child_process'; +import os from 'os'; import { DryRunResult, DryRunStatus, TestStatus } from '@stryker-mutator/api/test-runner'; import { errorToString, StrykerError } from '@stryker-mutator/util'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { factory, assertions } from '@stryker-mutator/test-helpers'; import { CommandRunnerOptions } from '@stryker-mutator/api/core'; -import CommandTestRunner from '../../../src/test-runner/command-test-runner'; +import { CommandTestRunner } from '../../../src/test-runner/command-test-runner'; import * as objectUtils from '../../../src/utils/object-utils'; -import Timer, * as timerModule from '../../../src/utils/timer'; -import ChildProcessMock from '../../helpers/child-process-mock'; +import * as timerModule from '../../../src/utils/timer'; +import { ChildProcessMock } from '../../helpers/child-process-mock'; import { Mock, mock } from '../../helpers/producers'; describe(CommandTestRunner.name, () => { let childProcessMock: ChildProcessMock; let killStub: sinon.SinonStub; - let timerMock: Mock; + let timerMock: Mock; beforeEach(() => { childProcessMock = new ChildProcessMock(42); sinon.stub(childProcess, 'exec').returns(childProcessMock as childProcess.ChildProcess); killStub = sinon.stub(objectUtils, 'kill'); - timerMock = mock(Timer); - sinon.stub(timerModule, 'default').returns(timerMock); + timerMock = mock(timerModule.Timer); + sinon.stub(timerModule, 'Timer').returns(timerMock); }); describe(CommandTestRunner.prototype.dryRun.name, () => { diff --git a/packages/core/test/unit/test-runner/max-test-runner-reuse-decorator.spec.ts b/packages/core/test/unit/test-runner/max-test-runner-reuse-decorator.spec.ts index 1fbabde4d0..3f8c523955 100644 --- a/packages/core/test/unit/test-runner/max-test-runner-reuse-decorator.spec.ts +++ b/packages/core/test/unit/test-runner/max-test-runner-reuse-decorator.spec.ts @@ -1,10 +1,10 @@ import { TestRunner } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { factory } from '@stryker-mutator/test-helpers'; -import TestRunnerDecorator from '../../../src/test-runner/test-runner-decorator'; -import MaxTestRunnerReuseDecorator from '../../../src/test-runner/max-test-runner-reuse-decorator'; +import { TestRunnerDecorator } from '../../../src/test-runner/test-runner-decorator'; +import { MaxTestRunnerReuseDecorator } from '../../../src/test-runner/max-test-runner-reuse-decorator'; describe(MaxTestRunnerReuseDecorator.name, () => { let testRunner: sinon.SinonStubbedInstance>; diff --git a/packages/core/test/unit/test-runner/retry-decorator.spec.ts b/packages/core/test/unit/test-runner/retry-decorator.spec.ts index f5c24cba08..3592708154 100644 --- a/packages/core/test/unit/test-runner/retry-decorator.spec.ts +++ b/packages/core/test/unit/test-runner/retry-decorator.spec.ts @@ -2,16 +2,13 @@ import { Logger } from '@stryker-mutator/api/logging'; import { errorToString } from '@stryker-mutator/util'; import { TestRunner, DryRunOptions, MutantRunOptions, DryRunResult, MutantRunResult } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; +import { factory, assertions } from '@stryker-mutator/test-helpers'; -import { factory } from '@stryker-mutator/test-helpers'; - -import { expectErrored } from '@stryker-mutator/test-helpers/src/assertions'; - -import ChildProcessCrashedError from '../../../src/child-proxy/child-process-crashed-error'; -import OutOfMemoryError from '../../../src/child-proxy/out-of-memory-error'; -import RetryDecorator from '../../../src/test-runner/retry-decorator'; -import TestRunnerDecorator from '../../../src/test-runner/test-runner-decorator'; -import currentLogMock from '../../helpers/log-mock'; +import { ChildProcessCrashedError } from '../../../src/child-proxy/child-process-crashed-error'; +import { OutOfMemoryError } from '../../../src/child-proxy/out-of-memory-error'; +import { RetryDecorator } from '../../../src/test-runner/retry-decorator'; +import { TestRunnerDecorator } from '../../../src/test-runner/test-runner-decorator'; +import { currentLogMock } from '../../helpers/log-mock'; describe(RetryDecorator.name, () => { let sut: RetryDecorator; @@ -125,7 +122,7 @@ describe(RetryDecorator.name, () => { testRunner2[runMethod].rejects(finalError); const result = await act(sut, options); - expectErrored(result); + assertions.expectErrored(result); expect((result as any).errorMessage).to.be.deep.eq( `Test runner crashed. Tried twice to restart it without any luck. Last time the error message was: ${errorToString(finalError)}` ); diff --git a/packages/core/test/unit/test-runner/test-runner-decorator.spec.ts b/packages/core/test/unit/test-runner/test-runner-decorator.spec.ts index f31d509bfb..7e877a9b77 100644 --- a/packages/core/test/unit/test-runner/test-runner-decorator.spec.ts +++ b/packages/core/test/unit/test-runner/test-runner-decorator.spec.ts @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { TestRunner } from '@stryker-mutator/api/test-runner'; import { factory } from '@stryker-mutator/test-helpers'; -import TestRunnerDecorator from '../../../src/test-runner/test-runner-decorator'; +import { TestRunnerDecorator } from '../../../src/test-runner/test-runner-decorator'; describe('TestRunnerDecorator', () => { let sut: TestRunnerDecorator; diff --git a/packages/core/test/unit/test-runner/timeout-decorator.spec.ts b/packages/core/test/unit/test-runner/timeout-decorator.spec.ts index fc9eb62efc..389129772f 100644 --- a/packages/core/test/unit/test-runner/timeout-decorator.spec.ts +++ b/packages/core/test/unit/test-runner/timeout-decorator.spec.ts @@ -8,11 +8,11 @@ import { MutantRunResult, } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { factory } from '@stryker-mutator/test-helpers'; -import TimeoutDecorator from '../../../src/test-runner/timeout-decorator'; +import { TimeoutDecorator } from '../../../src/test-runner/timeout-decorator'; describe('TimeoutDecorator', () => { let sut: TimeoutDecorator; diff --git a/packages/core/test/unit/unexpected-exit-handler.spec.ts b/packages/core/test/unit/unexpected-exit-handler.spec.ts index dc1cf08097..be2acd694f 100644 --- a/packages/core/test/unit/unexpected-exit-handler.spec.ts +++ b/packages/core/test/unit/unexpected-exit-handler.spec.ts @@ -1,7 +1,7 @@ import { EventEmitter } from 'events'; import { testInjector } from '@stryker-mutator/test-helpers'; -import sinon = require('sinon'); +import sinon from 'sinon'; import { expect } from 'chai'; import { coreTokens } from '../../src/di'; diff --git a/packages/core/test/unit/utils/file-utils.spec.ts b/packages/core/test/unit/utils/file-utils.spec.ts index b73c70ee54..52dc0ee563 100644 --- a/packages/core/test/unit/utils/file-utils.spec.ts +++ b/packages/core/test/unit/utils/file-utils.spec.ts @@ -1,8 +1,8 @@ -import * as path from 'path'; -import * as fs from 'fs'; +import path from 'path'; +import fs from 'fs'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import * as fileUtils from '../../../src/utils/file-utils'; diff --git a/packages/core/test/unit/utils/string-builder.spec.ts b/packages/core/test/unit/utils/string-builder.spec.ts index cf2bdd419d..512d53e5b7 100644 --- a/packages/core/test/unit/utils/string-builder.spec.ts +++ b/packages/core/test/unit/utils/string-builder.spec.ts @@ -2,7 +2,7 @@ import { EOL } from 'os'; import { expect } from 'chai'; -import StringBuilder from '../../../src/utils/string-builder'; +import { StringBuilder } from '../../../src/utils/string-builder'; describe(StringBuilder.name, () => { describe('toString', () => { diff --git a/packages/core/test/unit/utils/temporary-directory.spec.ts b/packages/core/test/unit/utils/temporary-directory.spec.ts index 8fa1acfb3e..09de732fd9 100644 --- a/packages/core/test/unit/utils/temporary-directory.spec.ts +++ b/packages/core/test/unit/utils/temporary-directory.spec.ts @@ -1,11 +1,11 @@ -import * as path from 'path'; -import * as fs from 'fs'; +import path from 'path'; +import fs from 'fs'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as mkdirp from 'mkdirp'; -import * as sinon from 'sinon'; +import mkdirp from 'mkdirp'; +import sinon from 'sinon'; import { StrykerOptions } from '@stryker-mutator/api/core'; diff --git a/packages/core/test/unit/utils/timer.spec.ts b/packages/core/test/unit/utils/timer.spec.ts index ca55cf66c8..67c88b82f3 100644 --- a/packages/core/test/unit/utils/timer.spec.ts +++ b/packages/core/test/unit/utils/timer.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import Timer from '../../../src/utils/timer'; +import { Timer } from '../../../src/utils/timer'; describe(Timer.name, () => { let clock: sinon.SinonFakeTimers; diff --git a/packages/core/tsconfig.src.json b/packages/core/tsconfig.src.json index aaae7cde8d..348baab125 100644 --- a/packages/core/tsconfig.src.json +++ b/packages/core/tsconfig.src.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "noImplicitThis": true, "strictBindCallApply": true, @@ -8,14 +9,14 @@ "types": [] // Exclude global mocha functions for the sources }, "include": [ - "src", "../util/src/Task.ts" + "src" ], "references": [ { "path": "../api/tsconfig.src.json" }, { - "path": "../instrumenter/src" + "path": "../instrumenter/tsconfig.src.json" }, { "path": "../util/tsconfig.src.json" diff --git a/packages/core/tsconfig.test.json b/packages/core/tsconfig.test.json index 222941072d..3d28cec6c4 100644 --- a/packages/core/tsconfig.test.json +++ b/packages/core/tsconfig.test.json @@ -1,7 +1,9 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "rootDir": ".", + "outDir": "dist/test", + "rootDir": "test", + "strictBindCallApply": true, "types": [ "mocha", "node" @@ -18,4 +20,4 @@ "path": "../test-helpers/tsconfig.src.json" } ] -} \ No newline at end of file +} diff --git a/packages/instrumenter/.npmignore b/packages/instrumenter/.npmignore index 026a43bb64..d77680f5aa 100644 --- a/packages/instrumenter/.npmignore +++ b/packages/instrumenter/.npmignore @@ -1,6 +1,15 @@ -* - -!dist/src/**/*.js -!dist/src/**/*.map -!dist/src/**/*.ts -!src/**/* +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/.nyc_output +/typings +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/instrumenter/src/tsconfig.json b/packages/instrumenter/src/tsconfig.json deleted file mode 100644 index cb9df01984..0000000000 --- a/packages/instrumenter/src/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../../../tsconfig.settings.json", - "compilerOptions": { - "outDir": "../dist/src", - "rootDir": ".", - "esModuleInterop": true, - "resolveJsonModule": true, - "types": [ - "node" - ] - }, - "references": [ - { - "path": "../../api/tsconfig.src.json" - }, - { - "path": "../../util/tsconfig.src.json" - } - ], - "include": ["**/*.*", "../typings/*.d.ts"] -} diff --git a/packages/instrumenter/test/helpers/resolve-test-resource.ts b/packages/instrumenter/test/helpers/resolve-test-resource.ts new file mode 100644 index 0000000000..c807498e14 --- /dev/null +++ b/packages/instrumenter/test/helpers/resolve-test-resource.ts @@ -0,0 +1,4 @@ +import path = require('path'); + +export const resolveFromRoot = path.resolve.bind(path, __dirname, '..', '..', '..'); +export const resolveTestResource = resolveFromRoot.bind(path, 'testResources'); diff --git a/packages/instrumenter/test/integration/disable-type-checks.it.spec.ts b/packages/instrumenter/test/integration/disable-type-checks.it.spec.ts index 3bb4c19c28..f2f6f0c62a 100644 --- a/packages/instrumenter/test/integration/disable-type-checks.it.spec.ts +++ b/packages/instrumenter/test/integration/disable-type-checks.it.spec.ts @@ -1,5 +1,4 @@ -import path from 'path'; -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { expect } from 'chai'; import chaiJestSnapshot from 'chai-jest-snapshot'; @@ -8,16 +7,7 @@ import { File } from '@stryker-mutator/api/core'; import { disableTypeChecks } from '../../src'; import { createInstrumenterOptions } from '../helpers/factories'; - -const resolveTestResource = path.resolve.bind( - path, - __dirname, - '..' /* integration */, - '..' /* test */, - '..' /* dist */, - 'testResources', - 'disable-type-checks' -); +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe(`${disableTypeChecks.name} integration`, () => { it('should be able disable type checks of a typescript file', async () => { @@ -31,10 +21,10 @@ describe(`${disableTypeChecks.name} integration`, () => { }); async function arrangeAndActAssert(fileName: string, options = createInstrumenterOptions()) { - const fullFileName = resolveTestResource(fileName); - const file = new File(fullFileName, await fs.readFile(fullFileName)); + const fullFileName = resolveTestResource('disable-type-checks', fileName); + const file = new File(fullFileName, await fsPromises.readFile(fullFileName)); const result = await disableTypeChecks(file, options); - chaiJestSnapshot.setFilename(resolveTestResource(`${fileName}.out.snap`)); + chaiJestSnapshot.setFilename(resolveTestResource('disable-type-checks', `${fileName}.out.snap`)); expect(result.textContent).matchSnapshot(); } }); diff --git a/packages/instrumenter/test/integration/instrumenter.it.spec.ts b/packages/instrumenter/test/integration/instrumenter.it.spec.ts index d31bfec03f..f719d7a337 100644 --- a/packages/instrumenter/test/integration/instrumenter.it.spec.ts +++ b/packages/instrumenter/test/integration/instrumenter.it.spec.ts @@ -1,5 +1,4 @@ -import { promises as fs } from 'fs'; -import path from 'path'; +import { promises as fsPromises } from 'fs'; import { testInjector } from '@stryker-mutator/test-helpers'; import { File } from '@stryker-mutator/api/core'; @@ -8,16 +7,7 @@ import chaiJestSnapshot from 'chai-jest-snapshot'; import { Instrumenter } from '../../src'; import { createInstrumenterOptions } from '../helpers/factories'; - -const resolveTestResource = path.resolve.bind( - path, - __dirname, - '..' /* integration */, - '..' /* test */, - '..' /* dist */, - 'testResources', - 'instrumenter' -); +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('instrumenter integration', () => { let sut: Instrumenter; @@ -72,11 +62,11 @@ describe('instrumenter integration', () => { }); async function arrangeAndActAssert(fileName: string, options = createInstrumenterOptions()) { - const fullFileName = resolveTestResource(fileName); - const file = new File(fullFileName, await fs.readFile(fullFileName)); + const fullFileName = resolveTestResource('instrumenter', fileName); + const file = new File(fullFileName, await fsPromises.readFile(fullFileName)); const result = await sut.instrument([file], options); expect(result.files).lengthOf(1); - chaiJestSnapshot.setFilename(resolveTestResource(`${fileName}.out.snap`)); + chaiJestSnapshot.setFilename(resolveTestResource('instrumenter', `${fileName}.out.snap`)); expect(result.files[0].textContent).matchSnapshot(); } }); diff --git a/packages/instrumenter/test/integration/parsers.it.spec.ts b/packages/instrumenter/test/integration/parsers.it.spec.ts index f294fe54a0..14d9085224 100644 --- a/packages/instrumenter/test/integration/parsers.it.spec.ts +++ b/packages/instrumenter/test/integration/parsers.it.spec.ts @@ -1,13 +1,13 @@ -import { promises as fs } from 'fs'; -import path from 'path'; +import { promises as fsPromises } from 'fs'; import { expect } from 'chai'; import { createParser, ParserOptions } from '../../src/parsers'; import { AstFormat, HtmlAst, TSAst, JSAst, Ast } from '../../src/syntax'; import { createParserOptions } from '../helpers/factories'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; -const resolveTestResource = path.resolve.bind(path, __dirname, '..' /* integration */, '..' /* test */, '..' /* dist */, 'testResources', 'parser'); +const resolveParserTestResource = resolveTestResource.bind(null, 'parser'); describe('parsers integration', () => { it('should allow to parse html with script tags', async () => { @@ -39,13 +39,13 @@ describe('parsers integration', () => { }); it('should allow to parse a react file with project-wide configuration file', async () => { - process.chdir(resolveTestResource('jsx-with-project-wide-config')); + process.chdir(resolveParserTestResource('jsx-with-project-wide-config')); const actual = await actAssertJS('jsx-with-project-wide-config/src/Badge.js'); expect(actual).to.matchSnapshot(); }); it('should ignore configuration when parsing ts files', async () => { - process.chdir(resolveTestResource('ts-in-babel-project')); + process.chdir(resolveParserTestResource('ts-in-babel-project')); const actual = await actAssertTS('ts-in-babel-project/src/app.ts'); expect(actual).to.matchSnapshot(); }); @@ -56,7 +56,7 @@ describe('parsers integration', () => { }); it('should allow a plugin that conflicts with the default plugins as long as plugins are emptied out', async () => { - process.chdir(resolveTestResource('js-in-babel-project')); + process.chdir(resolveParserTestResource('js-in-babel-project')); const actual = await actAssertJS('js-in-babel-project/src/app.js', createParserOptions({ plugins: [] })); expect(actual).to.matchSnapshot(); }); @@ -72,8 +72,8 @@ describe('parsers integration', () => { }); async function act(testResourceFileName: string, options: ParserOptions) { - const fileName = resolveTestResource(testResourceFileName); - const input = await fs.readFile(fileName, 'utf8'); + const fileName = resolveParserTestResource(testResourceFileName); + const input = await fsPromises.readFile(fileName, 'utf8'); const actual = await createParser(options)(input, fileName); cleanFileName(actual, testResourceFileName); return actual; diff --git a/packages/instrumenter/test/integration/parsers.it.spec.js.snap b/packages/instrumenter/test/integration/parsers.it.spec.ts.snap similarity index 58% rename from packages/instrumenter/test/integration/parsers.it.spec.js.snap rename to packages/instrumenter/test/integration/parsers.it.spec.ts.snap index 1998b9daba..b141015e5e 100644 --- a/packages/instrumenter/test/integration/parsers.it.spec.js.snap +++ b/packages/instrumenter/test/integration/parsers.it.spec.ts.snap @@ -1,6842 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`parser integration should allow to parse a *.vue file 1`] = ` -Object { - "format": "html", - "originFileName": "App.vue", - "rawContent": " - - - - -", - "root": Object { - "scripts": Array [ - Object { - "format": "js", - "originFileName": "App.vue", - "rawContent": " -import PokemonComponent from './Pokemon.vue' -import { pokemonService } from './pokemon.service'; - -export default { - components: { - PokemonComponent - }, - data() { - return { - pokemon: [] - } - }, - - created() { - pokemonService.getAll().then(pokemon => (this.pokemon = pokemon)); - } -} -", - "root": Node { - "comments": Array [], - "end": 490, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 26, - }, - "start": Position { - "column": 8, - "line": 8, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 232, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 16, - }, - "start": Position { - "column": 0, - "line": 9, - }, - }, - "source": Node { - "end": 232, - "extra": Object { - "raw": "'./Pokemon.vue'", - "rawValue": "./Pokemon.vue", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 16, - }, - "start": Position { - "column": 29, - "line": 9, - }, - }, - "start": 217, - "type": "StringLiteral", - "value": "./Pokemon.vue", - }, - "specifiers": Array [ - Node { - "end": 211, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 16, - }, - "start": Position { - "column": 7, - "line": 16, - }, - }, - "local": Node { - "end": 211, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 16, - }, - "identifierName": "PokemonComponent", - "start": Position { - "column": 7, - "line": 16, - }, - }, - "name": "PokemonComponent", - "start": 195, - "type": "Identifier", - }, - "start": 195, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 188, - "type": "ImportDeclaration", - }, - Node { - "end": 284, - "loc": SourceLocation { - "end": Position { - "column": 51, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 10, - }, - }, - "source": Node { - "end": 283, - "extra": Object { - "raw": "'./pokemon.service'", - "rawValue": "./pokemon.service", - }, - "loc": SourceLocation { - "end": Position { - "column": 50, - "line": 10, - }, - "start": Position { - "column": 31, - "line": 10, - }, - }, - "start": 264, - "type": "StringLiteral", - "value": "./pokemon.service", - }, - "specifiers": Array [ - Node { - "end": 256, - "imported": Node { - "end": 256, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 24, - }, - "identifierName": "pokemonService", - "start": Position { - "column": 9, - "line": 24, - }, - }, - "name": "pokemonService", - "start": 242, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 24, - }, - "start": Position { - "column": 9, - "line": 24, - }, - }, - "local": Node { - "end": 256, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 24, - }, - "identifierName": "pokemonService", - "start": Position { - "column": 9, - "line": 24, - }, - }, - "name": "pokemonService", - "start": 242, - "type": "Identifier", - }, - "start": 242, - "type": "ImportSpecifier", - }, - ], - "start": 233, - "type": "ImportDeclaration", - }, - Node { - "declaration": Node { - "end": 489, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 32, - }, - "start": Position { - "column": 15, - "line": 12, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 343, - "key": Node { - "end": 315, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 13, - }, - "identifierName": "components", - "start": Position { - "column": 2, - "line": 20, - }, - }, - "name": "components", - "start": 305, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 2, - "line": 20, - }, - }, - "method": false, - "shorthand": false, - "start": 305, - "type": "ObjectProperty", - "value": Node { - "end": 343, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 14, - "line": 13, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 339, - "extra": Object { - "shorthand": true, - }, - "key": Node { - "end": 339, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 28, - }, - "identifierName": "PokemonComponent", - "start": Position { - "column": 4, - "line": 28, - }, - }, - "name": "PokemonComponent", - "start": 323, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 28, - }, - "start": Position { - "column": 4, - "line": 28, - }, - }, - "method": false, - "shorthand": true, - "start": 323, - "type": "ObjectProperty", - "value": Node { - "end": 339, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 28, - }, - "identifierName": "PokemonComponent", - "start": Position { - "column": 4, - "line": 28, - }, - }, - "name": "PokemonComponent", - "start": 323, - "type": "Identifier", - }, - }, - ], - "start": 317, - "type": "ObjectExpression", - }, - }, - Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "argument": Node { - "end": 392, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 26, - }, - "start": Position { - "column": 11, - "line": 17, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 386, - "key": Node { - "end": 382, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 18, - }, - "identifierName": "pokemon", - "start": Position { - "column": 6, - "line": 25, - }, - }, - "name": "pokemon", - "start": 375, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 25, - }, - "start": Position { - "column": 6, - "line": 25, - }, - }, - "method": false, - "shorthand": false, - "start": 375, - "type": "ObjectProperty", - "value": Node { - "elements": Array [], - "end": 386, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 25, - }, - "start": Position { - "column": 15, - "line": 18, - }, - }, - "start": 384, - "type": "ArrayExpression", - }, - }, - ], - "start": 367, - "type": "ObjectExpression", - }, - "end": 392, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 26, - }, - "start": Position { - "column": 4, - "line": 17, - }, - }, - "start": 360, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 396, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 27, - }, - "start": Position { - "column": 9, - "line": 16, - }, - }, - "start": 354, - "type": "BlockStatement", - }, - "computed": false, - "end": 396, - "generator": false, - "id": null, - "key": Node { - "end": 351, - "loc": SourceLocation { - "end": Position { - "column": 6, - "line": 16, - }, - "identifierName": "data", - "start": Position { - "column": 2, - "line": 23, - }, - }, - "name": "data", - "start": 347, - "type": "Identifier", - }, - "kind": "method", - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 27, - }, - "start": Position { - "column": 2, - "line": 23, - }, - }, - "method": true, - "params": Array [], - "start": 347, - "type": "ObjectMethod", - }, - Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "end": 483, - "expression": Node { - "arguments": Array [ - Node { - "async": false, - "body": Node { - "end": 480, - "extra": Object { - "parenStart": 270, - "parenthesized": true, - }, - "left": Node { - "computed": false, - "end": 470, - "loc": SourceLocation { - "end": Position { - "column": 57, - "line": 30, - }, - "start": Position { - "column": 45, - "line": 37, - }, - }, - "object": Node { - "end": 462, - "loc": SourceLocation { - "end": Position { - "column": 49, - "line": 23, - }, - "start": Position { - "column": 45, - "line": 37, - }, - }, - "start": 458, - "type": "ThisExpression", - }, - "property": Node { - "end": 470, - "loc": SourceLocation { - "end": Position { - "column": 57, - "line": 30, - }, - "identifierName": "pokemon", - "start": Position { - "column": 50, - "line": 23, - }, - }, - "name": "pokemon", - "start": 463, - "type": "Identifier", - }, - "start": 458, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 67, - "line": 30, - }, - "start": Position { - "column": 45, - "line": 37, - }, - }, - "operator": "=", - "right": Node { - "end": 480, - "loc": SourceLocation { - "end": Position { - "column": 67, - "line": 30, - }, - "identifierName": "pokemon", - "start": Position { - "column": 60, - "line": 23, - }, - }, - "name": "pokemon", - "start": 473, - "type": "Identifier", - }, - "start": 458, - "type": "AssignmentExpression", - }, - "end": 481, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 68, - "line": 23, - }, - "start": Position { - "column": 33, - "line": 30, - }, - }, - "params": Array [ - Node { - "end": 453, - "loc": SourceLocation { - "end": Position { - "column": 40, - "line": 23, - }, - "identifierName": "pokemon", - "start": Position { - "column": 33, - "line": 30, - }, - }, - "name": "pokemon", - "start": 446, - "type": "Identifier", - }, - ], - "start": 446, - "type": "ArrowFunctionExpression", - }, - ], - "callee": Node { - "computed": false, - "end": 445, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 30, - }, - "start": Position { - "column": 4, - "line": 58, - }, - }, - "object": Node { - "arguments": Array [], - "callee": Node { - "computed": false, - "end": 438, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 30, - }, - "start": Position { - "column": 4, - "line": 58, - }, - }, - "object": Node { - "end": 431, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 23, - }, - "identifierName": "pokemonService", - "start": Position { - "column": 4, - "line": 58, - }, - }, - "name": "pokemonService", - "start": 417, - "type": "Identifier", - }, - "property": Node { - "end": 438, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 30, - }, - "identifierName": "getAll", - "start": Position { - "column": 19, - "line": 23, - }, - }, - "name": "getAll", - "start": 432, - "type": "Identifier", - }, - "start": 417, - "type": "MemberExpression", - }, - "end": 440, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 23, - }, - "start": Position { - "column": 4, - "line": 58, - }, - }, - "start": 417, - "type": "CallExpression", - }, - "property": Node { - "end": 445, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 30, - }, - "identifierName": "then", - "start": Position { - "column": 28, - "line": 23, - }, - }, - "name": "then", - "start": 441, - "type": "Identifier", - }, - "start": 417, - "type": "MemberExpression", - }, - "end": 482, - "loc": SourceLocation { - "end": Position { - "column": 69, - "line": 23, - }, - "start": Position { - "column": 4, - "line": 58, - }, - }, - "start": 417, - "type": "CallExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 70, - "line": 23, - }, - "start": Position { - "column": 4, - "line": 58, - }, - }, - "start": 417, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 487, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 31, - }, - "start": Position { - "column": 12, - "line": 22, - }, - }, - "start": 411, - "type": "BlockStatement", - }, - "computed": false, - "end": 487, - "generator": false, - "id": null, - "key": Node { - "end": 408, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 22, - }, - "identifierName": "created", - "start": Position { - "column": 2, - "line": 29, - }, - }, - "name": "created", - "start": 401, - "type": "Identifier", - }, - "kind": "method", - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 31, - }, - "start": Position { - "column": 2, - "line": 29, - }, - }, - "method": true, - "params": Array [], - "start": 401, - "type": "ObjectMethod", - }, - ], - "start": 301, - "type": "ObjectExpression", - }, - "end": 489, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 32, - }, - "start": Position { - "column": 0, - "line": 12, - }, - }, - "start": 286, - "type": "ExportDefaultDeclaration", - }, - ], - "directives": Array [], - "end": 490, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 26, - }, - "start": Position { - "column": 8, - "line": 8, - }, - }, - "sourceType": "module", - "start": 187, - "type": "Program", - }, - "start": 187, - "type": "File", - }, - }, - ], - }, -} -`; - -exports[`parser integration should allow to parse a an angular file 1`] = ` -Object { - "format": "ts", - "originFileName": "app.component.ts", - "rawContent": "import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - title = 'angular-app'; -} -", - "root": Node { - "comments": Array [], - "end": 216, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 11, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 42, - "importKind": "value", - "loc": SourceLocation { - "end": Position { - "column": 42, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "range": Array [ - 0, - 42, - ], - "source": Node { - "end": 41, - "extra": Object { - "raw": "'@angular/core'", - "rawValue": "@angular/core", - }, - "loc": SourceLocation { - "end": Position { - "column": 41, - "line": 1, - }, - "start": Position { - "column": 26, - "line": 1, - }, - }, - "range": Array [ - 26, - 41, - ], - "start": 26, - "type": "StringLiteral", - "value": "@angular/core", - }, - "specifiers": Array [ - Node { - "end": 18, - "imported": Node { - "end": 18, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "identifierName": "Component", - "start": Position { - "column": 9, - "line": 1, - }, - }, - "name": "Component", - "range": Array [ - 9, - 18, - ], - "start": 9, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 9, - "line": 1, - }, - }, - "local": Node { - "end": 18, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "identifierName": "Component", - "start": Position { - "column": 9, - "line": 1, - }, - }, - "name": "Component", - "range": Array [ - 9, - 18, - ], - "start": 9, - "type": "Identifier", - }, - "range": Array [ - 9, - 18, - ], - "start": 9, - "type": "ImportSpecifier", - }, - ], - "start": 0, - "type": "ImportDeclaration", - }, - Node { - "declaration": Node { - "body": Node { - "body": Array [ - Node { - "computed": false, - "end": 213, - "key": Node { - "end": 196, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 9, - }, - "identifierName": "title", - "start": Position { - "column": 2, - "line": 9, - }, - }, - "name": "title", - "range": Array [ - 191, - 196, - ], - "start": 191, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 9, - }, - "start": Position { - "column": 2, - "line": 9, - }, - }, - "range": Array [ - 191, - 213, - ], - "start": 191, - "static": false, - "type": "ClassProperty", - "value": Node { - "end": 212, - "extra": Object { - "raw": "'angular-app'", - "rawValue": "angular-app", - }, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 9, - }, - "start": Position { - "column": 10, - "line": 9, - }, - }, - "range": Array [ - 199, - 212, - ], - "start": 199, - "type": "StringLiteral", - "value": "angular-app", - }, - }, - ], - "end": 215, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 26, - "line": 8, - }, - }, - "range": Array [ - 187, - 215, - ], - "start": 187, - "type": "ClassBody", - }, - "decorators": Array [ - Node { - "end": 160, - "expression": Node { - "arguments": Array [ - Node { - "end": 159, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 7, - }, - "start": Position { - "column": 11, - "line": 3, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 79, - "key": Node { - "end": 67, - "loc": SourceLocation { - "end": Position { - "column": 10, - "line": 4, - }, - "identifierName": "selector", - "start": Position { - "column": 2, - "line": 4, - }, - }, - "name": "selector", - "range": Array [ - 59, - 67, - ], - "start": 59, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 22, - "line": 4, - }, - "start": Position { - "column": 2, - "line": 4, - }, - }, - "method": false, - "range": Array [ - 59, - 79, - ], - "shorthand": false, - "start": 59, - "type": "ObjectProperty", - "value": Node { - "end": 79, - "extra": Object { - "raw": "'app-root'", - "rawValue": "app-root", - }, - "loc": SourceLocation { - "end": Position { - "column": 22, - "line": 4, - }, - "start": Position { - "column": 12, - "line": 4, - }, - }, - "range": Array [ - 69, - 79, - ], - "start": 69, - "type": "StringLiteral", - "value": "app-root", - }, - }, - Node { - "computed": false, - "end": 118, - "key": Node { - "end": 94, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 5, - }, - "identifierName": "templateUrl", - "start": Position { - "column": 2, - "line": 5, - }, - }, - "name": "templateUrl", - "range": Array [ - 83, - 94, - ], - "start": 83, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 37, - "line": 5, - }, - "start": Position { - "column": 2, - "line": 5, - }, - }, - "method": false, - "range": Array [ - 83, - 118, - ], - "shorthand": false, - "start": 83, - "type": "ObjectProperty", - "value": Node { - "end": 118, - "extra": Object { - "raw": "'./app.component.html'", - "rawValue": "./app.component.html", - }, - "loc": SourceLocation { - "end": Position { - "column": 37, - "line": 5, - }, - "start": Position { - "column": 15, - "line": 5, - }, - }, - "range": Array [ - 96, - 118, - ], - "start": 96, - "type": "StringLiteral", - "value": "./app.component.html", - }, - }, - Node { - "computed": false, - "end": 157, - "key": Node { - "end": 131, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 6, - }, - "identifierName": "styleUrls", - "start": Position { - "column": 2, - "line": 6, - }, - }, - "name": "styleUrls", - "range": Array [ - 122, - 131, - ], - "start": 122, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 37, - "line": 6, - }, - "start": Position { - "column": 2, - "line": 6, - }, - }, - "method": false, - "range": Array [ - 122, - 157, - ], - "shorthand": false, - "start": 122, - "type": "ObjectProperty", - "value": Node { - "elements": Array [ - Node { - "end": 156, - "extra": Object { - "raw": "'./app.component.scss'", - "rawValue": "./app.component.scss", - }, - "loc": SourceLocation { - "end": Position { - "column": 36, - "line": 6, - }, - "start": Position { - "column": 14, - "line": 6, - }, - }, - "range": Array [ - 134, - 156, - ], - "start": 134, - "type": "StringLiteral", - "value": "./app.component.scss", - }, - ], - "end": 157, - "loc": SourceLocation { - "end": Position { - "column": 37, - "line": 6, - }, - "start": Position { - "column": 13, - "line": 6, - }, - }, - "range": Array [ - 133, - 157, - ], - "start": 133, - "type": "ArrayExpression", - }, - }, - ], - "range": Array [ - 55, - 159, - ], - "start": 55, - "type": "ObjectExpression", - }, - ], - "callee": Node { - "end": 54, - "loc": SourceLocation { - "end": Position { - "column": 10, - "line": 3, - }, - "identifierName": "Component", - "start": Position { - "column": 1, - "line": 3, - }, - }, - "name": "Component", - "range": Array [ - 45, - 54, - ], - "start": 45, - "type": "Identifier", - }, - "end": 160, - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 7, - }, - "start": Position { - "column": 1, - "line": 3, - }, - }, - "range": Array [ - 45, - 160, - ], - "start": 45, - "type": "CallExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 7, - }, - "start": Position { - "column": 0, - "line": 3, - }, - }, - "range": Array [ - 44, - 160, - ], - "start": 44, - "type": "Decorator", - }, - ], - "end": 215, - "id": Node { - "end": 186, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 8, - }, - "identifierName": "AppComponent", - "start": Position { - "column": 13, - "line": 8, - }, - }, - "name": "AppComponent", - "range": Array [ - 174, - 186, - ], - "start": 174, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 3, - }, - }, - "range": Array [ - 44, - 215, - ], - "start": 44, - "superClass": null, - "type": "ClassDeclaration", - }, - "end": 215, - "exportKind": "value", - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 8, - }, - }, - "range": Array [ - 161, - 215, - ], - "source": null, - "specifiers": Array [], - "start": 161, - "type": "ExportNamedDeclaration", - }, - ], - "directives": Array [], - "end": 216, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 11, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "range": Array [ - 0, - 216, - ], - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "range": Array [ - 0, - 216, - ], - "start": 0, - "type": "File", - }, -} -`; - -exports[`parser integration should allow to parse a react file react code with project-wide configuration file 1`] = ` -Object { - "format": "js", - "originFileName": "jsx-with-project-wide-config/src/Badge.js", - "rawContent": "import React from 'react'; -import PropTypes from 'prop-types'; - -const propTypes = { - color: PropTypes.string -}; - -const defaultProps = { - color: 'secondary', -}; - -const Badge = (props) => { - let { - color, - ...attributes - } = props; - - const classes = ['badge', 'badge-' + color]; - - if (attributes.href && Tag === 'span') { - Tag = 'a'; - } - - return ( - - ); -}; - -Badge.propTypes = propTypes; -Badge.defaultProps = defaultProps; - -export default Badge; -", - "root": Node { - "comments": Array [], - "end": 507, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 26, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "source": Node { - "end": 25, - "extra": Object { - "raw": "'react'", - "rawValue": "react", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 1, - }, - "start": Position { - "column": 18, - "line": 1, - }, - }, - "start": 18, - "type": "StringLiteral", - "value": "react", - }, - "specifiers": Array [ - Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "start": Position { - "column": 7, - "line": 1, - }, - }, - "local": Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "identifierName": "React", - "start": Position { - "column": 7, - "line": 1, - }, - }, - "name": "React", - "start": 7, - "type": "Identifier", - }, - "start": 7, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 0, - "type": "ImportDeclaration", - }, - Node { - "end": 62, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 2, - }, - "start": Position { - "column": 0, - "line": 2, - }, - }, - "source": Node { - "end": 61, - "extra": Object { - "raw": "'prop-types'", - "rawValue": "prop-types", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 2, - }, - "start": Position { - "column": 22, - "line": 2, - }, - }, - "start": 49, - "type": "StringLiteral", - "value": "prop-types", - }, - "specifiers": Array [ - Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "start": Position { - "column": 7, - "line": 2, - }, - }, - "local": Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 7, - "line": 2, - }, - }, - "name": "PropTypes", - "start": 34, - "type": "Identifier", - }, - "start": 34, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 27, - "type": "ImportDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 111, - "id": Node { - "end": 79, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 4, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 4, - }, - }, - "name": "propTypes", - "start": 70, - "type": "Identifier", - }, - "init": Node { - "end": 111, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 18, - "line": 4, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 109, - "key": Node { - "end": 91, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 5, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 5, - }, - }, - "name": "color", - "start": 86, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 2, - "line": 5, - }, - }, - "method": false, - "shorthand": false, - "start": 86, - "type": "ObjectProperty", - "value": Node { - "computed": false, - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 9, - "line": 5, - }, - }, - "object": Node { - "end": 102, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 5, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 9, - "line": 5, - }, - }, - "name": "PropTypes", - "start": 93, - "type": "Identifier", - }, - "property": Node { - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "identifierName": "string", - "start": Position { - "column": 19, - "line": 5, - }, - }, - "name": "string", - "start": 103, - "type": "Identifier", - }, - "start": 93, - "type": "MemberExpression", - }, - }, - ], - "start": 82, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 6, - "line": 4, - }, - }, - "start": 70, - "type": "VariableDeclarator", - }, - ], - "end": 112, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 6, - }, - "start": Position { - "column": 0, - "line": 4, - }, - }, - "start": 64, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 160, - "id": Node { - "end": 132, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 8, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 8, - }, - }, - "name": "defaultProps", - "start": 120, - "type": "Identifier", - }, - "init": Node { - "end": 160, - "extra": Object { - "trailingComma": 157, - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 21, - "line": 8, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 157, - "key": Node { - "end": 144, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 9, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 9, - }, - }, - "name": "color", - "start": 139, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 2, - "line": 9, - }, - }, - "method": false, - "shorthand": false, - "start": 139, - "type": "ObjectProperty", - "value": Node { - "end": 157, - "extra": Object { - "raw": "'secondary'", - "rawValue": "secondary", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 9, - "line": 9, - }, - }, - "start": 146, - "type": "StringLiteral", - "value": "secondary", - }, - }, - ], - "start": 135, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 8, - }, - }, - "start": 120, - "type": "VariableDeclarator", - }, - ], - "end": 161, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 8, - }, - }, - "start": 114, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 417, - "id": Node { - "end": 174, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 12, - }, - "identifierName": "Badge", - "start": Position { - "column": 6, - "line": 12, - }, - }, - "name": "Badge", - "start": 169, - "type": "Identifier", - }, - "init": Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "declarations": Array [ - Node { - "end": 238, - "id": Node { - "end": 230, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 207, - "extra": Object { - "shorthand": true, - }, - "key": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "start": Position { - "column": 4, - "line": 14, - }, - }, - "method": false, - "shorthand": true, - "start": 202, - "type": "ObjectProperty", - "value": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - }, - Node { - "argument": Node { - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "identifierName": "attributes", - "start": Position { - "column": 7, - "line": 15, - }, - }, - "name": "attributes", - "start": 216, - "type": "Identifier", - }, - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "start": Position { - "column": 4, - "line": 15, - }, - }, - "start": 213, - "type": "RestElement", - }, - ], - "start": 196, - "type": "ObjectPattern", - }, - "init": Node { - "end": 238, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "identifierName": "props", - "start": Position { - "column": 6, - "line": 16, - }, - }, - "name": "props", - "start": 233, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "start": 196, - "type": "VariableDeclarator", - }, - ], - "end": 239, - "kind": "let", - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 16, - }, - "start": Position { - "column": 2, - "line": 13, - }, - }, - "start": 192, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 286, - "id": Node { - "end": 256, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 18, - }, - "identifierName": "classes", - "start": Position { - "column": 8, - "line": 18, - }, - }, - "name": "classes", - "start": 249, - "type": "Identifier", - }, - "init": Node { - "elements": Array [ - Node { - "end": 267, - "extra": Object { - "raw": "'badge'", - "rawValue": "badge", - }, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 18, - }, - "start": Position { - "column": 19, - "line": 18, - }, - }, - "start": 260, - "type": "StringLiteral", - "value": "badge", - }, - Node { - "end": 285, - "left": Node { - "end": 277, - "extra": Object { - "raw": "'badge-'", - "rawValue": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 36, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "start": 269, - "type": "StringLiteral", - "value": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "operator": "+", - "right": Node { - "end": 285, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "identifierName": "color", - "start": Position { - "column": 39, - "line": 18, - }, - }, - "name": "color", - "start": 280, - "type": "Identifier", - }, - "start": 269, - "type": "BinaryExpression", - }, - ], - "end": 286, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 18, - "line": 18, - }, - }, - "start": 259, - "type": "ArrayExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 8, - "line": 18, - }, - }, - "start": 249, - "type": "VariableDeclarator", - }, - ], - "end": 287, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 46, - "line": 18, - }, - "start": Position { - "column": 2, - "line": 18, - }, - }, - "start": 243, - "type": "VariableDeclaration", - }, - Node { - "alternate": null, - "consequent": Node { - "body": Array [ - Node { - "end": 346, - "expression": Node { - "end": 345, - "left": Node { - "end": 339, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 21, - }, - "identifierName": "Tag", - "start": Position { - "column": 4, - "line": 21, - }, - }, - "name": "Tag", - "start": 336, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "operator": "=", - "right": Node { - "end": 345, - "extra": Object { - "raw": "'a'", - "rawValue": "a", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 10, - "line": 21, - }, - }, - "start": 342, - "type": "StringLiteral", - "value": "a", - }, - "start": 336, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 14, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "start": 336, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 41, - "line": 20, - }, - }, - "start": 330, - "type": "BlockStatement", - }, - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 2, - "line": 20, - }, - }, - "start": 291, - "test": Node { - "end": 328, - "left": Node { - "computed": false, - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "object": Node { - "end": 305, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 20, - }, - "identifierName": "attributes", - "start": Position { - "column": 6, - "line": 20, - }, - }, - "name": "attributes", - "start": 295, - "type": "Identifier", - }, - "property": Node { - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "identifierName": "href", - "start": Position { - "column": 17, - "line": 20, - }, - }, - "name": "href", - "start": 306, - "type": "Identifier", - }, - "start": 295, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "operator": "&&", - "right": Node { - "end": 328, - "left": Node { - "end": 317, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 20, - }, - "identifierName": "Tag", - "start": Position { - "column": 25, - "line": 20, - }, - }, - "name": "Tag", - "start": 314, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 25, - "line": 20, - }, - }, - "operator": "===", - "right": Node { - "end": 328, - "extra": Object { - "raw": "'span'", - "rawValue": "span", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 33, - "line": 20, - }, - }, - "start": 322, - "type": "StringLiteral", - "value": "span", - }, - "start": 314, - "type": "BinaryExpression", - }, - "start": 295, - "type": "LogicalExpression", - }, - "type": "IfStatement", - }, - Node { - "argument": Node { - "children": Array [], - "closingElement": null, - "end": 410, - "extra": Object { - "parenStart": 361, - "parenthesized": true, - }, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "openingElement": Node { - "attributes": Array [ - Node { - "argument": Node { - "end": 386, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 25, - }, - "identifierName": "attributes", - "start": Position { - "column": 13, - "line": 25, - }, - }, - "name": "attributes", - "start": 376, - "type": "Identifier", - }, - "end": 387, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 25, - }, - "start": Position { - "column": 9, - "line": 25, - }, - }, - "start": 372, - "type": "JSXSpreadAttribute", - }, - Node { - "end": 407, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": Node { - "end": 397, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": "className", - "start": 388, - "type": "JSXIdentifier", - }, - "start": 388, - "type": "JSXAttribute", - "value": Node { - "end": 407, - "expression": Node { - "end": 406, - "loc": SourceLocation { - "end": Position { - "column": 43, - "line": 25, - }, - "identifierName": "classes", - "start": Position { - "column": 36, - "line": 25, - }, - }, - "name": "classes", - "start": 399, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 35, - "line": 25, - }, - }, - "start": 398, - "type": "JSXExpressionContainer", - }, - }, - ], - "end": 410, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "name": Node { - "end": 371, - "loc": SourceLocation { - "end": Position { - "column": 8, - "line": 25, - }, - "start": Position { - "column": 5, - "line": 25, - }, - }, - "name": "Tag", - "start": 368, - "type": "JSXIdentifier", - }, - "selfClosing": true, - "start": 367, - "type": "JSXOpeningElement", - }, - "start": 367, - "type": "JSXElement", - }, - "end": 415, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 26, - }, - "start": Position { - "column": 2, - "line": 24, - }, - }, - "start": 354, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 417, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 25, - "line": 12, - }, - }, - "start": 188, - "type": "BlockStatement", - }, - "end": 417, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 14, - "line": 12, - }, - }, - "params": Array [ - Node { - "end": 183, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 12, - }, - "identifierName": "props", - "start": Position { - "column": 15, - "line": 12, - }, - }, - "name": "props", - "start": 178, - "type": "Identifier", - }, - ], - "start": 177, - "type": "ArrowFunctionExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 6, - "line": 12, - }, - }, - "start": 169, - "type": "VariableDeclarator", - }, - ], - "end": 418, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 27, - }, - "start": Position { - "column": 0, - "line": 12, - }, - }, - "start": 163, - "type": "VariableDeclaration", - }, - Node { - "end": 448, - "expression": Node { - "end": 447, - "left": Node { - "computed": false, - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "object": Node { - "end": 425, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 29, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 29, - }, - }, - "name": "Badge", - "start": 420, - "type": "Identifier", - }, - "property": Node { - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 29, - }, - }, - "name": "propTypes", - "start": 426, - "type": "Identifier", - }, - "start": 420, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "operator": "=", - "right": Node { - "end": 447, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 18, - "line": 29, - }, - }, - "name": "propTypes", - "start": 438, - "type": "Identifier", - }, - "start": 420, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "start": 420, - "type": "ExpressionStatement", - }, - Node { - "end": 483, - "expression": Node { - "end": 482, - "left": Node { - "computed": false, - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "object": Node { - "end": 454, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 30, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 30, - }, - }, - "name": "Badge", - "start": 449, - "type": "Identifier", - }, - "property": Node { - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 455, - "type": "Identifier", - }, - "start": 449, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "operator": "=", - "right": Node { - "end": 482, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 21, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 470, - "type": "Identifier", - }, - "start": 449, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "start": 449, - "type": "ExpressionStatement", - }, - Node { - "declaration": Node { - "end": 505, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 32, - }, - "identifierName": "Badge", - "start": Position { - "column": 15, - "line": 32, - }, - }, - "name": "Badge", - "start": 500, - "type": "Identifier", - }, - "end": 506, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 32, - }, - "start": Position { - "column": 0, - "line": 32, - }, - }, - "start": 485, - "type": "ExportDefaultDeclaration", - }, - ], - "directives": Array [], - "end": 507, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "start": 0, - "type": "File", - }, -} -`; - -exports[`parser integration should allow to parse a react file with custom babelrc file 1`] = ` -Object { - "format": "js", - "originFileName": "jsx-with-babelrc/Badge.js", - "rawContent": "import React from 'react'; -import PropTypes from 'prop-types'; - -const propTypes = { - color: PropTypes.string -}; - -const defaultProps = { - color: 'secondary', -}; - -const Badge = (props) => { - let { - color, - ...attributes - } = props; - - const classes = ['badge', 'badge-' + color]; - - if (attributes.href && Tag === 'span') { - Tag = 'a'; - } - - return ( - - ); -}; - -Badge.propTypes = propTypes; -Badge.defaultProps = defaultProps; - -export default Badge; -", - "root": Node { - "comments": Array [], - "end": 507, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 26, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "source": Node { - "end": 25, - "extra": Object { - "raw": "'react'", - "rawValue": "react", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 1, - }, - "start": Position { - "column": 18, - "line": 1, - }, - }, - "start": 18, - "type": "StringLiteral", - "value": "react", - }, - "specifiers": Array [ - Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "start": Position { - "column": 7, - "line": 1, - }, - }, - "local": Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "identifierName": "React", - "start": Position { - "column": 7, - "line": 1, - }, - }, - "name": "React", - "start": 7, - "type": "Identifier", - }, - "start": 7, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 0, - "type": "ImportDeclaration", - }, - Node { - "end": 62, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 2, - }, - "start": Position { - "column": 0, - "line": 2, - }, - }, - "source": Node { - "end": 61, - "extra": Object { - "raw": "'prop-types'", - "rawValue": "prop-types", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 2, - }, - "start": Position { - "column": 22, - "line": 2, - }, - }, - "start": 49, - "type": "StringLiteral", - "value": "prop-types", - }, - "specifiers": Array [ - Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "start": Position { - "column": 7, - "line": 2, - }, - }, - "local": Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 7, - "line": 2, - }, - }, - "name": "PropTypes", - "start": 34, - "type": "Identifier", - }, - "start": 34, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 27, - "type": "ImportDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 111, - "id": Node { - "end": 79, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 4, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 4, - }, - }, - "name": "propTypes", - "start": 70, - "type": "Identifier", - }, - "init": Node { - "end": 111, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 18, - "line": 4, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 109, - "key": Node { - "end": 91, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 5, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 5, - }, - }, - "name": "color", - "start": 86, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 2, - "line": 5, - }, - }, - "method": false, - "shorthand": false, - "start": 86, - "type": "ObjectProperty", - "value": Node { - "computed": false, - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 9, - "line": 5, - }, - }, - "object": Node { - "end": 102, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 5, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 9, - "line": 5, - }, - }, - "name": "PropTypes", - "start": 93, - "type": "Identifier", - }, - "property": Node { - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "identifierName": "string", - "start": Position { - "column": 19, - "line": 5, - }, - }, - "name": "string", - "start": 103, - "type": "Identifier", - }, - "start": 93, - "type": "MemberExpression", - }, - }, - ], - "start": 82, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 6, - "line": 4, - }, - }, - "start": 70, - "type": "VariableDeclarator", - }, - ], - "end": 112, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 6, - }, - "start": Position { - "column": 0, - "line": 4, - }, - }, - "start": 64, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 160, - "id": Node { - "end": 132, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 8, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 8, - }, - }, - "name": "defaultProps", - "start": 120, - "type": "Identifier", - }, - "init": Node { - "end": 160, - "extra": Object { - "trailingComma": 157, - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 21, - "line": 8, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 157, - "key": Node { - "end": 144, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 9, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 9, - }, - }, - "name": "color", - "start": 139, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 2, - "line": 9, - }, - }, - "method": false, - "shorthand": false, - "start": 139, - "type": "ObjectProperty", - "value": Node { - "end": 157, - "extra": Object { - "raw": "'secondary'", - "rawValue": "secondary", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 9, - "line": 9, - }, - }, - "start": 146, - "type": "StringLiteral", - "value": "secondary", - }, - }, - ], - "start": 135, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 8, - }, - }, - "start": 120, - "type": "VariableDeclarator", - }, - ], - "end": 161, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 8, - }, - }, - "start": 114, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 417, - "id": Node { - "end": 174, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 12, - }, - "identifierName": "Badge", - "start": Position { - "column": 6, - "line": 12, - }, - }, - "name": "Badge", - "start": 169, - "type": "Identifier", - }, - "init": Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "declarations": Array [ - Node { - "end": 238, - "id": Node { - "end": 230, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 207, - "extra": Object { - "shorthand": true, - }, - "key": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "start": Position { - "column": 4, - "line": 14, - }, - }, - "method": false, - "shorthand": true, - "start": 202, - "type": "ObjectProperty", - "value": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - }, - Node { - "argument": Node { - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "identifierName": "attributes", - "start": Position { - "column": 7, - "line": 15, - }, - }, - "name": "attributes", - "start": 216, - "type": "Identifier", - }, - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "start": Position { - "column": 4, - "line": 15, - }, - }, - "start": 213, - "type": "RestElement", - }, - ], - "start": 196, - "type": "ObjectPattern", - }, - "init": Node { - "end": 238, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "identifierName": "props", - "start": Position { - "column": 6, - "line": 16, - }, - }, - "name": "props", - "start": 233, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "start": 196, - "type": "VariableDeclarator", - }, - ], - "end": 239, - "kind": "let", - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 16, - }, - "start": Position { - "column": 2, - "line": 13, - }, - }, - "start": 192, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 286, - "id": Node { - "end": 256, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 18, - }, - "identifierName": "classes", - "start": Position { - "column": 8, - "line": 18, - }, - }, - "name": "classes", - "start": 249, - "type": "Identifier", - }, - "init": Node { - "elements": Array [ - Node { - "end": 267, - "extra": Object { - "raw": "'badge'", - "rawValue": "badge", - }, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 18, - }, - "start": Position { - "column": 19, - "line": 18, - }, - }, - "start": 260, - "type": "StringLiteral", - "value": "badge", - }, - Node { - "end": 285, - "left": Node { - "end": 277, - "extra": Object { - "raw": "'badge-'", - "rawValue": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 36, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "start": 269, - "type": "StringLiteral", - "value": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "operator": "+", - "right": Node { - "end": 285, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "identifierName": "color", - "start": Position { - "column": 39, - "line": 18, - }, - }, - "name": "color", - "start": 280, - "type": "Identifier", - }, - "start": 269, - "type": "BinaryExpression", - }, - ], - "end": 286, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 18, - "line": 18, - }, - }, - "start": 259, - "type": "ArrayExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 8, - "line": 18, - }, - }, - "start": 249, - "type": "VariableDeclarator", - }, - ], - "end": 287, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 46, - "line": 18, - }, - "start": Position { - "column": 2, - "line": 18, - }, - }, - "start": 243, - "type": "VariableDeclaration", - }, - Node { - "alternate": null, - "consequent": Node { - "body": Array [ - Node { - "end": 346, - "expression": Node { - "end": 345, - "left": Node { - "end": 339, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 21, - }, - "identifierName": "Tag", - "start": Position { - "column": 4, - "line": 21, - }, - }, - "name": "Tag", - "start": 336, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "operator": "=", - "right": Node { - "end": 345, - "extra": Object { - "raw": "'a'", - "rawValue": "a", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 10, - "line": 21, - }, - }, - "start": 342, - "type": "StringLiteral", - "value": "a", - }, - "start": 336, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 14, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "start": 336, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 41, - "line": 20, - }, - }, - "start": 330, - "type": "BlockStatement", - }, - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 2, - "line": 20, - }, - }, - "start": 291, - "test": Node { - "end": 328, - "left": Node { - "computed": false, - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "object": Node { - "end": 305, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 20, - }, - "identifierName": "attributes", - "start": Position { - "column": 6, - "line": 20, - }, - }, - "name": "attributes", - "start": 295, - "type": "Identifier", - }, - "property": Node { - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "identifierName": "href", - "start": Position { - "column": 17, - "line": 20, - }, - }, - "name": "href", - "start": 306, - "type": "Identifier", - }, - "start": 295, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "operator": "&&", - "right": Node { - "end": 328, - "left": Node { - "end": 317, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 20, - }, - "identifierName": "Tag", - "start": Position { - "column": 25, - "line": 20, - }, - }, - "name": "Tag", - "start": 314, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 25, - "line": 20, - }, - }, - "operator": "===", - "right": Node { - "end": 328, - "extra": Object { - "raw": "'span'", - "rawValue": "span", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 33, - "line": 20, - }, - }, - "start": 322, - "type": "StringLiteral", - "value": "span", - }, - "start": 314, - "type": "BinaryExpression", - }, - "start": 295, - "type": "LogicalExpression", - }, - "type": "IfStatement", - }, - Node { - "argument": Node { - "children": Array [], - "closingElement": null, - "end": 410, - "extra": Object { - "parenStart": 361, - "parenthesized": true, - }, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "openingElement": Node { - "attributes": Array [ - Node { - "argument": Node { - "end": 386, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 25, - }, - "identifierName": "attributes", - "start": Position { - "column": 13, - "line": 25, - }, - }, - "name": "attributes", - "start": 376, - "type": "Identifier", - }, - "end": 387, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 25, - }, - "start": Position { - "column": 9, - "line": 25, - }, - }, - "start": 372, - "type": "JSXSpreadAttribute", - }, - Node { - "end": 407, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": Node { - "end": 397, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": "className", - "start": 388, - "type": "JSXIdentifier", - }, - "start": 388, - "type": "JSXAttribute", - "value": Node { - "end": 407, - "expression": Node { - "end": 406, - "loc": SourceLocation { - "end": Position { - "column": 43, - "line": 25, - }, - "identifierName": "classes", - "start": Position { - "column": 36, - "line": 25, - }, - }, - "name": "classes", - "start": 399, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 35, - "line": 25, - }, - }, - "start": 398, - "type": "JSXExpressionContainer", - }, - }, - ], - "end": 410, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "name": Node { - "end": 371, - "loc": SourceLocation { - "end": Position { - "column": 8, - "line": 25, - }, - "start": Position { - "column": 5, - "line": 25, - }, - }, - "name": "Tag", - "start": 368, - "type": "JSXIdentifier", - }, - "selfClosing": true, - "start": 367, - "type": "JSXOpeningElement", - }, - "start": 367, - "type": "JSXElement", - }, - "end": 415, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 26, - }, - "start": Position { - "column": 2, - "line": 24, - }, - }, - "start": 354, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 417, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 25, - "line": 12, - }, - }, - "start": 188, - "type": "BlockStatement", - }, - "end": 417, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 14, - "line": 12, - }, - }, - "params": Array [ - Node { - "end": 183, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 12, - }, - "identifierName": "props", - "start": Position { - "column": 15, - "line": 12, - }, - }, - "name": "props", - "start": 178, - "type": "Identifier", - }, - ], - "start": 177, - "type": "ArrowFunctionExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 6, - "line": 12, - }, - }, - "start": 169, - "type": "VariableDeclarator", - }, - ], - "end": 418, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 27, - }, - "start": Position { - "column": 0, - "line": 12, - }, - }, - "start": 163, - "type": "VariableDeclaration", - }, - Node { - "end": 448, - "expression": Node { - "end": 447, - "left": Node { - "computed": false, - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "object": Node { - "end": 425, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 29, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 29, - }, - }, - "name": "Badge", - "start": 420, - "type": "Identifier", - }, - "property": Node { - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 29, - }, - }, - "name": "propTypes", - "start": 426, - "type": "Identifier", - }, - "start": 420, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "operator": "=", - "right": Node { - "end": 447, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 18, - "line": 29, - }, - }, - "name": "propTypes", - "start": 438, - "type": "Identifier", - }, - "start": 420, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "start": 420, - "type": "ExpressionStatement", - }, - Node { - "end": 483, - "expression": Node { - "end": 482, - "left": Node { - "computed": false, - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "object": Node { - "end": 454, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 30, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 30, - }, - }, - "name": "Badge", - "start": 449, - "type": "Identifier", - }, - "property": Node { - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 455, - "type": "Identifier", - }, - "start": 449, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "operator": "=", - "right": Node { - "end": 482, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 21, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 470, - "type": "Identifier", - }, - "start": 449, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "start": 449, - "type": "ExpressionStatement", - }, - Node { - "declaration": Node { - "end": 505, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 32, - }, - "identifierName": "Badge", - "start": Position { - "column": 15, - "line": 32, - }, - }, - "name": "Badge", - "start": 500, - "type": "Identifier", - }, - "end": 506, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 32, - }, - "start": Position { - "column": 0, - "line": 32, - }, - }, - "start": 485, - "type": "ExportDefaultDeclaration", - }, - ], - "directives": Array [], - "end": 507, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "start": 0, - "type": "File", - }, -} -`; - -exports[`parser integration should allow to parse a react file with project-wide configuration file 1`] = ` -Object { - "format": "js", - "originFileName": "jsx-with-project-wide-config/src/Badge.js", - "rawContent": "import React from 'react'; -import PropTypes from 'prop-types'; - -const propTypes = { - color: PropTypes.string -}; - -const defaultProps = { - color: 'secondary', -}; - -const Badge = (props) => { - let { - color, - ...attributes - } = props; - - const classes = ['badge', 'badge-' + color]; - - if (attributes.href && Tag === 'span') { - Tag = 'a'; - } - - return ( - - ); -}; - -Badge.propTypes = propTypes; -Badge.defaultProps = defaultProps; - -export default Badge; -", - "root": Node { - "comments": Array [], - "end": 507, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 26, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "source": Node { - "end": 25, - "extra": Object { - "raw": "'react'", - "rawValue": "react", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 1, - }, - "start": Position { - "column": 18, - "line": 1, - }, - }, - "start": 18, - "type": "StringLiteral", - "value": "react", - }, - "specifiers": Array [ - Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "start": Position { - "column": 7, - "line": 1, - }, - }, - "local": Node { - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "identifierName": "React", - "start": Position { - "column": 7, - "line": 1, - }, - }, - "name": "React", - "start": 7, - "type": "Identifier", - }, - "start": 7, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 0, - "type": "ImportDeclaration", - }, - Node { - "end": 62, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 2, - }, - "start": Position { - "column": 0, - "line": 2, - }, - }, - "source": Node { - "end": 61, - "extra": Object { - "raw": "'prop-types'", - "rawValue": "prop-types", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 2, - }, - "start": Position { - "column": 22, - "line": 2, - }, - }, - "start": 49, - "type": "StringLiteral", - "value": "prop-types", - }, - "specifiers": Array [ - Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "start": Position { - "column": 7, - "line": 2, - }, - }, - "local": Node { - "end": 43, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 2, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 7, - "line": 2, - }, - }, - "name": "PropTypes", - "start": 34, - "type": "Identifier", - }, - "start": 34, - "type": "ImportDefaultSpecifier", - }, - ], - "start": 27, - "type": "ImportDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 111, - "id": Node { - "end": 79, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 4, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 4, - }, - }, - "name": "propTypes", - "start": 70, - "type": "Identifier", - }, - "init": Node { - "end": 111, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 18, - "line": 4, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 109, - "key": Node { - "end": 91, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 5, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 5, - }, - }, - "name": "color", - "start": 86, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 2, - "line": 5, - }, - }, - "method": false, - "shorthand": false, - "start": 86, - "type": "ObjectProperty", - "value": Node { - "computed": false, - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "start": Position { - "column": 9, - "line": 5, - }, - }, - "object": Node { - "end": 102, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 5, - }, - "identifierName": "PropTypes", - "start": Position { - "column": 9, - "line": 5, - }, - }, - "name": "PropTypes", - "start": 93, - "type": "Identifier", - }, - "property": Node { - "end": 109, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 5, - }, - "identifierName": "string", - "start": Position { - "column": 19, - "line": 5, - }, - }, - "name": "string", - "start": 103, - "type": "Identifier", - }, - "start": 93, - "type": "MemberExpression", - }, - }, - ], - "start": 82, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 6, - }, - "start": Position { - "column": 6, - "line": 4, - }, - }, - "start": 70, - "type": "VariableDeclarator", - }, - ], - "end": 112, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 6, - }, - "start": Position { - "column": 0, - "line": 4, - }, - }, - "start": 64, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 160, - "id": Node { - "end": 132, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 8, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 8, - }, - }, - "name": "defaultProps", - "start": 120, - "type": "Identifier", - }, - "init": Node { - "end": 160, - "extra": Object { - "trailingComma": 157, - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 21, - "line": 8, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 157, - "key": Node { - "end": 144, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 9, - }, - "identifierName": "color", - "start": Position { - "column": 2, - "line": 9, - }, - }, - "name": "color", - "start": 139, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 2, - "line": 9, - }, - }, - "method": false, - "shorthand": false, - "start": 139, - "type": "ObjectProperty", - "value": Node { - "end": 157, - "extra": Object { - "raw": "'secondary'", - "rawValue": "secondary", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 9, - }, - "start": Position { - "column": 9, - "line": 9, - }, - }, - "start": 146, - "type": "StringLiteral", - "value": "secondary", - }, - }, - ], - "start": 135, - "type": "ObjectExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 8, - }, - }, - "start": 120, - "type": "VariableDeclarator", - }, - ], - "end": 161, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 10, - }, - "start": Position { - "column": 0, - "line": 8, - }, - }, - "start": 114, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 417, - "id": Node { - "end": 174, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 12, - }, - "identifierName": "Badge", - "start": Position { - "column": 6, - "line": 12, - }, - }, - "name": "Badge", - "start": 169, - "type": "Identifier", - }, - "init": Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "declarations": Array [ - Node { - "end": 238, - "id": Node { - "end": 230, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 207, - "extra": Object { - "shorthand": true, - }, - "key": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "start": Position { - "column": 4, - "line": 14, - }, - }, - "method": false, - "shorthand": true, - "start": 202, - "type": "ObjectProperty", - "value": Node { - "end": 207, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 14, - }, - "identifierName": "color", - "start": Position { - "column": 4, - "line": 14, - }, - }, - "name": "color", - "start": 202, - "type": "Identifier", - }, - }, - Node { - "argument": Node { - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "identifierName": "attributes", - "start": Position { - "column": 7, - "line": 15, - }, - }, - "name": "attributes", - "start": 216, - "type": "Identifier", - }, - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 17, - "line": 15, - }, - "start": Position { - "column": 4, - "line": 15, - }, - }, - "start": 213, - "type": "RestElement", - }, - ], - "start": 196, - "type": "ObjectPattern", - }, - "init": Node { - "end": 238, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "identifierName": "props", - "start": Position { - "column": 6, - "line": 16, - }, - }, - "name": "props", - "start": 233, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 16, - }, - "start": Position { - "column": 6, - "line": 13, - }, - }, - "start": 196, - "type": "VariableDeclarator", - }, - ], - "end": 239, - "kind": "let", - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 16, - }, - "start": Position { - "column": 2, - "line": 13, - }, - }, - "start": 192, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 286, - "id": Node { - "end": 256, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 18, - }, - "identifierName": "classes", - "start": Position { - "column": 8, - "line": 18, - }, - }, - "name": "classes", - "start": 249, - "type": "Identifier", - }, - "init": Node { - "elements": Array [ - Node { - "end": 267, - "extra": Object { - "raw": "'badge'", - "rawValue": "badge", - }, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 18, - }, - "start": Position { - "column": 19, - "line": 18, - }, - }, - "start": 260, - "type": "StringLiteral", - "value": "badge", - }, - Node { - "end": 285, - "left": Node { - "end": 277, - "extra": Object { - "raw": "'badge-'", - "rawValue": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 36, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "start": 269, - "type": "StringLiteral", - "value": "badge-", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "start": Position { - "column": 28, - "line": 18, - }, - }, - "operator": "+", - "right": Node { - "end": 285, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 18, - }, - "identifierName": "color", - "start": Position { - "column": 39, - "line": 18, - }, - }, - "name": "color", - "start": 280, - "type": "Identifier", - }, - "start": 269, - "type": "BinaryExpression", - }, - ], - "end": 286, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 18, - "line": 18, - }, - }, - "start": 259, - "type": "ArrayExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 45, - "line": 18, - }, - "start": Position { - "column": 8, - "line": 18, - }, - }, - "start": 249, - "type": "VariableDeclarator", - }, - ], - "end": 287, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 46, - "line": 18, - }, - "start": Position { - "column": 2, - "line": 18, - }, - }, - "start": 243, - "type": "VariableDeclaration", - }, - Node { - "alternate": null, - "consequent": Node { - "body": Array [ - Node { - "end": 346, - "expression": Node { - "end": 345, - "left": Node { - "end": 339, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 21, - }, - "identifierName": "Tag", - "start": Position { - "column": 4, - "line": 21, - }, - }, - "name": "Tag", - "start": 336, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "operator": "=", - "right": Node { - "end": 345, - "extra": Object { - "raw": "'a'", - "rawValue": "a", - }, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 21, - }, - "start": Position { - "column": 10, - "line": 21, - }, - }, - "start": 342, - "type": "StringLiteral", - "value": "a", - }, - "start": 336, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 14, - "line": 21, - }, - "start": Position { - "column": 4, - "line": 21, - }, - }, - "start": 336, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 41, - "line": 20, - }, - }, - "start": 330, - "type": "BlockStatement", - }, - "end": 350, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 22, - }, - "start": Position { - "column": 2, - "line": 20, - }, - }, - "start": 291, - "test": Node { - "end": 328, - "left": Node { - "computed": false, - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "object": Node { - "end": 305, - "loc": SourceLocation { - "end": Position { - "column": 16, - "line": 20, - }, - "identifierName": "attributes", - "start": Position { - "column": 6, - "line": 20, - }, - }, - "name": "attributes", - "start": 295, - "type": "Identifier", - }, - "property": Node { - "end": 310, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 20, - }, - "identifierName": "href", - "start": Position { - "column": 17, - "line": 20, - }, - }, - "name": "href", - "start": 306, - "type": "Identifier", - }, - "start": 295, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 6, - "line": 20, - }, - }, - "operator": "&&", - "right": Node { - "end": 328, - "left": Node { - "end": 317, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 20, - }, - "identifierName": "Tag", - "start": Position { - "column": 25, - "line": 20, - }, - }, - "name": "Tag", - "start": 314, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 25, - "line": 20, - }, - }, - "operator": "===", - "right": Node { - "end": 328, - "extra": Object { - "raw": "'span'", - "rawValue": "span", - }, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 20, - }, - "start": Position { - "column": 33, - "line": 20, - }, - }, - "start": 322, - "type": "StringLiteral", - "value": "span", - }, - "start": 314, - "type": "BinaryExpression", - }, - "start": 295, - "type": "LogicalExpression", - }, - "type": "IfStatement", - }, - Node { - "argument": Node { - "children": Array [], - "closingElement": null, - "end": 410, - "extra": Object { - "parenStart": 361, - "parenthesized": true, - }, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "openingElement": Node { - "attributes": Array [ - Node { - "argument": Node { - "end": 386, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 25, - }, - "identifierName": "attributes", - "start": Position { - "column": 13, - "line": 25, - }, - }, - "name": "attributes", - "start": 376, - "type": "Identifier", - }, - "end": 387, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 25, - }, - "start": Position { - "column": 9, - "line": 25, - }, - }, - "start": 372, - "type": "JSXSpreadAttribute", - }, - Node { - "end": 407, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": Node { - "end": 397, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 25, - }, - "start": Position { - "column": 25, - "line": 25, - }, - }, - "name": "className", - "start": 388, - "type": "JSXIdentifier", - }, - "start": 388, - "type": "JSXAttribute", - "value": Node { - "end": 407, - "expression": Node { - "end": 406, - "loc": SourceLocation { - "end": Position { - "column": 43, - "line": 25, - }, - "identifierName": "classes", - "start": Position { - "column": 36, - "line": 25, - }, - }, - "name": "classes", - "start": 399, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 44, - "line": 25, - }, - "start": Position { - "column": 35, - "line": 25, - }, - }, - "start": 398, - "type": "JSXExpressionContainer", - }, - }, - ], - "end": 410, - "loc": SourceLocation { - "end": Position { - "column": 47, - "line": 25, - }, - "start": Position { - "column": 4, - "line": 25, - }, - }, - "name": Node { - "end": 371, - "loc": SourceLocation { - "end": Position { - "column": 8, - "line": 25, - }, - "start": Position { - "column": 5, - "line": 25, - }, - }, - "name": "Tag", - "start": 368, - "type": "JSXIdentifier", - }, - "selfClosing": true, - "start": 367, - "type": "JSXOpeningElement", - }, - "start": 367, - "type": "JSXElement", - }, - "end": 415, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 26, - }, - "start": Position { - "column": 2, - "line": 24, - }, - }, - "start": 354, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 417, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 25, - "line": 12, - }, - }, - "start": 188, - "type": "BlockStatement", - }, - "end": 417, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 14, - "line": 12, - }, - }, - "params": Array [ - Node { - "end": 183, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 12, - }, - "identifierName": "props", - "start": Position { - "column": 15, - "line": 12, - }, - }, - "name": "props", - "start": 178, - "type": "Identifier", - }, - ], - "start": 177, - "type": "ArrowFunctionExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 27, - }, - "start": Position { - "column": 6, - "line": 12, - }, - }, - "start": 169, - "type": "VariableDeclarator", - }, - ], - "end": 418, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 2, - "line": 27, - }, - "start": Position { - "column": 0, - "line": 12, - }, - }, - "start": 163, - "type": "VariableDeclaration", - }, - Node { - "end": 448, - "expression": Node { - "end": 447, - "left": Node { - "computed": false, - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "object": Node { - "end": 425, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 29, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 29, - }, - }, - "name": "Badge", - "start": 420, - "type": "Identifier", - }, - "property": Node { - "end": 435, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 6, - "line": 29, - }, - }, - "name": "propTypes", - "start": 426, - "type": "Identifier", - }, - "start": 420, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "operator": "=", - "right": Node { - "end": 447, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 29, - }, - "identifierName": "propTypes", - "start": Position { - "column": 18, - "line": 29, - }, - }, - "name": "propTypes", - "start": 438, - "type": "Identifier", - }, - "start": 420, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 29, - }, - "start": Position { - "column": 0, - "line": 29, - }, - }, - "start": 420, - "type": "ExpressionStatement", - }, - Node { - "end": 483, - "expression": Node { - "end": 482, - "left": Node { - "computed": false, - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "object": Node { - "end": 454, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 30, - }, - "identifierName": "Badge", - "start": Position { - "column": 0, - "line": 30, - }, - }, - "name": "Badge", - "start": 449, - "type": "Identifier", - }, - "property": Node { - "end": 467, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 6, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 455, - "type": "Identifier", - }, - "start": 449, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "operator": "=", - "right": Node { - "end": 482, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 30, - }, - "identifierName": "defaultProps", - "start": Position { - "column": 21, - "line": 30, - }, - }, - "name": "defaultProps", - "start": 470, - "type": "Identifier", - }, - "start": 449, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 30, - }, - "start": Position { - "column": 0, - "line": 30, - }, - }, - "start": 449, - "type": "ExpressionStatement", - }, - Node { - "declaration": Node { - "end": 505, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 32, - }, - "identifierName": "Badge", - "start": Position { - "column": 15, - "line": 32, - }, - }, - "name": "Badge", - "start": 500, - "type": "Identifier", - }, - "end": 506, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 32, - }, - "start": Position { - "column": 0, - "line": 32, - }, - }, - "start": 485, - "type": "ExportDefaultDeclaration", - }, - ], - "directives": Array [], - "end": 507, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 33, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "start": 0, - "type": "File", - }, -} -`; - -exports[`parser integration should allow to parse html with script tags 1`] = ` -Object { - "format": "html", - "originFileName": "index.html", - "rawContent": " - - - - - Document - - - - - - - -", - "root": Object { - "scripts": Array [ - Object { - "format": "js", - "originFileName": "index.html", - "rawContent": " - alert('hello there'); - ", - "root": Node { - "comments": Array [], - "end": 232, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 11, - }, - "start": Position { - "column": 12, - "line": 9, - }, - }, - "program": Node { - "body": Array [ - Node { - "end": 227, - "expression": Node { - "arguments": Array [ - Node { - "end": 225, - "extra": Object { - "raw": "'hello there'", - "rawValue": "hello there", - }, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 10, - }, - "start": Position { - "column": 14, - "line": 10, - }, - }, - "start": 212, - "type": "StringLiteral", - "value": "hello there", - }, - ], - "callee": Node { - "end": 211, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 10, - }, - "identifierName": "alert", - "start": Position { - "column": 8, - "line": 26, - }, - }, - "name": "alert", - "start": 206, - "type": "Identifier", - }, - "end": 226, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 10, - }, - "start": Position { - "column": 8, - "line": 26, - }, - }, - "start": 206, - "type": "CallExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 10, - }, - "start": Position { - "column": 8, - "line": 26, - }, - }, - "start": 206, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 232, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 11, - }, - "start": Position { - "column": 12, - "line": 9, - }, - }, - "sourceType": "module", - "start": 197, - "type": "Program", - }, - "start": 197, - "type": "File", - }, - }, - Object { - "format": "ts", - "originFileName": "index.html", - "rawContent": " - function fib(n: number) { - if (n == 0 || n == 1) { - return n; - } else { - return (f(n-1) + f(n-2)); - } - } - ", - "root": Node { - "comments": Array [], - "end": 452, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 21, - }, - "start": Position { - "column": 35, - "line": 13, - }, - }, - "program": Node { - "body": Array [ - Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "alternate": Node { - "body": Array [ - Node { - "argument": Node { - "end": 423, - "extra": Object { - "parenStart": 129, - "parenthesized": true, - }, - "left": Node { - "arguments": Array [ - Node { - "end": 413, - "left": Node { - "end": 411, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 18, - }, - "identifierName": "n", - "start": Position { - "column": 22, - "line": 30, - }, - }, - "name": "n", - "range": Array [ - 132, - 133, - ], - "start": 410, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 30, - }, - "start": Position { - "column": 22, - "line": 30, - }, - }, - "operator": "-", - "range": Array [ - 132, - 135, - ], - "right": Node { - "end": 413, - "extra": Object { - "raw": "1", - "rawValue": 1, - }, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 30, - }, - "start": Position { - "column": 24, - "line": 18, - }, - }, - "range": Array [ - 134, - 135, - ], - "start": 412, - "type": "NumericLiteral", - "value": 1, - }, - "start": 410, - "type": "BinaryExpression", - }, - ], - "callee": Node { - "end": 409, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 18, - }, - "identifierName": "f", - "start": Position { - "column": 20, - "line": 42, - }, - }, - "name": "f", - "range": Array [ - 130, - 131, - ], - "start": 408, - "type": "Identifier", - }, - "end": 414, - "loc": SourceLocation { - "end": Position { - "column": 26, - "line": 18, - }, - "start": Position { - "column": 20, - "line": 42, - }, - }, - "range": Array [ - 130, - 136, - ], - "start": 408, - "type": "CallExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 30, - }, - "start": Position { - "column": 20, - "line": 42, - }, - }, - "operator": "+", - "range": Array [ - 130, - 145, - ], - "right": Node { - "arguments": Array [ - Node { - "end": 422, - "left": Node { - "end": 420, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 18, - }, - "identifierName": "n", - "start": Position { - "column": 31, - "line": 30, - }, - }, - "name": "n", - "range": Array [ - 141, - 142, - ], - "start": 419, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 30, - }, - "start": Position { - "column": 31, - "line": 30, - }, - }, - "operator": "-", - "range": Array [ - 141, - 144, - ], - "right": Node { - "end": 422, - "extra": Object { - "raw": "2", - "rawValue": 2, - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 30, - }, - "start": Position { - "column": 33, - "line": 18, - }, - }, - "range": Array [ - 143, - 144, - ], - "start": 421, - "type": "NumericLiteral", - "value": 2, - }, - "start": 419, - "type": "BinaryExpression", - }, - ], - "callee": Node { - "end": 418, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 18, - }, - "identifierName": "f", - "start": Position { - "column": 29, - "line": 30, - }, - }, - "name": "f", - "range": Array [ - 139, - 140, - ], - "start": 417, - "type": "Identifier", - }, - "end": 423, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 30, - }, - "start": Position { - "column": 29, - "line": 30, - }, - }, - "range": Array [ - 139, - 145, - ], - "start": 417, - "type": "CallExpression", - }, - "start": 408, - "type": "BinaryExpression", - }, - "end": 425, - "loc": SourceLocation { - "end": Position { - "column": 37, - "line": 18, - }, - "start": Position { - "column": 12, - "line": 18, - }, - }, - "range": Array [ - 122, - 147, - ], - "start": 400, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 437, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 31, - }, - "start": Position { - "column": 17, - "line": 17, - }, - }, - "range": Array [ - 108, - 159, - ], - "start": 386, - "type": "BlockStatement", - }, - "consequent": Node { - "body": Array [ - Node { - "argument": Node { - "end": 367, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 16, - }, - "identifierName": "n", - "start": Position { - "column": 19, - "line": 16, - }, - }, - "name": "n", - "range": Array [ - 88, - 89, - ], - "start": 366, - "type": "Identifier", - }, - "end": 368, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 16, - }, - "start": Position { - "column": 12, - "line": 16, - }, - }, - "range": Array [ - 81, - 90, - ], - "start": 359, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 380, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 17, - }, - "start": Position { - "column": 32, - "line": 15, - }, - }, - "range": Array [ - 67, - 102, - ], - "start": 345, - "type": "BlockStatement", - }, - "end": 437, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 31, - }, - "start": Position { - "column": 10, - "line": 15, - }, - }, - "range": Array [ - 45, - 159, - ], - "start": 323, - "test": Node { - "end": 343, - "left": Node { - "end": 333, - "left": Node { - "end": 328, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 15, - }, - "identifierName": "n", - "start": Position { - "column": 14, - "line": 39, - }, - }, - "name": "n", - "range": Array [ - 49, - 50, - ], - "start": 327, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 27, - }, - "start": Position { - "column": 14, - "line": 39, - }, - }, - "operator": "==", - "range": Array [ - 49, - 55, - ], - "right": Node { - "end": 333, - "extra": Object { - "raw": "0", - "rawValue": 0, - }, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 27, - }, - "start": Position { - "column": 19, - "line": 15, - }, - }, - "range": Array [ - 54, - 55, - ], - "start": 332, - "type": "NumericLiteral", - "value": 0, - }, - "start": 327, - "type": "BinaryExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 39, - }, - "start": Position { - "column": 14, - "line": 39, - }, - }, - "operator": "||", - "range": Array [ - 49, - 65, - ], - "right": Node { - "end": 343, - "left": Node { - "end": 338, - "loc": SourceLocation { - "end": Position { - "column": 25, - "line": 15, - }, - "identifierName": "n", - "start": Position { - "column": 24, - "line": 27, - }, - }, - "name": "n", - "range": Array [ - 59, - 60, - ], - "start": 337, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 39, - }, - "start": Position { - "column": 24, - "line": 27, - }, - }, - "operator": "==", - "range": Array [ - 59, - 65, - ], - "right": Node { - "end": 343, - "extra": Object { - "raw": "1", - "rawValue": 1, - }, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 39, - }, - "start": Position { - "column": 29, - "line": 15, - }, - }, - "range": Array [ - 64, - 65, - ], - "start": 342, - "type": "NumericLiteral", - "value": 1, - }, - "start": 337, - "type": "BinaryExpression", - }, - "start": 327, - "type": "LogicalExpression", - }, - "type": "IfStatement", - }, - ], - "directives": Array [], - "end": 447, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 32, - }, - "start": Position { - "column": 32, - "line": 14, - }, - }, - "range": Array [ - 33, - 169, - ], - "start": 311, - "type": "BlockStatement", - }, - "end": 447, - "generator": false, - "id": Node { - "end": 299, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 14, - }, - "identifierName": "fib", - "start": Position { - "column": 17, - "line": 14, - }, - }, - "name": "fib", - "range": Array [ - 18, - 21, - ], - "start": 296, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 32, - }, - "start": Position { - "column": 8, - "line": 14, - }, - }, - "params": Array [ - Node { - "end": 309, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 38, - }, - "identifierName": "n", - "start": Position { - "column": 21, - "line": 14, - }, - }, - "name": "n", - "range": Array [ - 22, - 31, - ], - "start": 300, - "type": "Identifier", - "typeAnnotation": Node { - "end": 309, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 38, - }, - "start": Position { - "column": 22, - "line": 14, - }, - }, - "range": Array [ - 23, - 31, - ], - "start": 301, - "type": "TSTypeAnnotation", - "typeAnnotation": Node { - "end": 309, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 38, - }, - "start": Position { - "column": 24, - "line": 14, - }, - }, - "range": Array [ - 25, - 31, - ], - "start": 303, - "type": "TSNumberKeyword", - }, - }, - }, - ], - "range": Array [ - 9, - 169, - ], - "start": 287, - "type": "FunctionDeclaration", - }, - ], - "directives": Array [], - "end": 452, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 21, - }, - "start": Position { - "column": 35, - "line": 13, - }, - }, - "range": Array [ - 0, - 174, - ], - "sourceType": "module", - "start": 278, - "type": "Program", - }, - "range": Array [ - 0, - 174, - ], - "start": 278, - "type": "File", - }, - }, - ], - }, -} -`; - exports[`parsers integration should allow a plugin that conflicts with the default plugins as long as plugins are emptied out 1`] = ` Object { "format": "js", @@ -6966,101 +129,6 @@ Object { } `; -exports[`parsers integration should allow custom babel config to override default options when overriding plugins 1`] = ` -Object { - "format": "js", - "originFileName": "js-in-babel-project/src/app.js", - "rawContent": "class App {} -", - "root": Node { - "comments": Array [], - "end": 13, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 2, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "body": Node { - "body": Array [], - "end": 12, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "start": Position { - "column": 10, - "line": 1, - }, - }, - "start": 10, - "type": "ClassBody", - }, - "end": 12, - "id": Node { - "end": 9, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 1, - }, - "identifierName": "App", - "start": Position { - "column": 6, - "line": 1, - }, - }, - "name": "App", - "start": 6, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "start": 0, - "superClass": null, - "type": "ClassDeclaration", - }, - ], - "directives": Array [], - "end": 13, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 0, - "line": 2, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "start": 0, - "type": "File", - }, -} -`; - exports[`parsers integration should allow to parse a *.vue file 1`] = ` Object { "format": "html", diff --git a/packages/instrumenter/test/integration/printers.it.spec.ts b/packages/instrumenter/test/integration/printers.it.spec.ts index b24833f059..7b690529ba 100644 --- a/packages/instrumenter/test/integration/printers.it.spec.ts +++ b/packages/instrumenter/test/integration/printers.it.spec.ts @@ -1,5 +1,4 @@ -import path from 'path'; -import { promises as fs } from 'fs'; +import { promises as fsPromises } from 'fs'; import { normalizeWhitespaces } from '@stryker-mutator/util'; import { expect } from 'chai'; @@ -7,8 +6,9 @@ import { expect } from 'chai'; import { createParser } from '../../src/parsers'; import { print } from '../../src/printers'; import { createParserOptions } from '../helpers/factories'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; -const resolveTestResource = path.resolve.bind(path, __dirname, '..' /* integration */, '..' /* test */, '..' /* dist */, 'testResources', 'printer'); +const resolvePrinterTestResource = resolveTestResource.bind(null, 'printer'); describe('parse and print integration', () => { describe('echo', () => { @@ -17,8 +17,8 @@ describe('parse and print integration', () => { }); async function actArrangeAndAssert(relativeFileName: string) { - const fileName = resolveTestResource('echo', relativeFileName); - const code = await fs.readFile(fileName, 'utf8'); + const fileName = resolvePrinterTestResource('echo', relativeFileName); + const code = await fsPromises.readFile(fileName, 'utf8'); const parsed = await createParser(createParserOptions())(code, fileName); const output = print(parsed); expect(normalizeWhitespaces(output)).eq(normalizeWhitespaces(code)); @@ -30,9 +30,9 @@ describe('parse and print integration', () => { }); async function actArrangeAndAssert(testCase: string) { - const inputFileName = resolveTestResource('html', `${testCase}.in.html`); - const outputFileName = resolveTestResource('html', `${testCase}.out.html`); - const [input, expectedOutput] = await Promise.all([fs.readFile(inputFileName, 'utf8'), fs.readFile(outputFileName, 'utf8')]); + const inputFileName = resolvePrinterTestResource('html', `${testCase}.in.html`); + const outputFileName = resolvePrinterTestResource('html', `${testCase}.out.html`); + const [input, expectedOutput] = await Promise.all([fsPromises.readFile(inputFileName, 'utf8'), fsPromises.readFile(outputFileName, 'utf8')]); const parsed = await createParser(createParserOptions())(input, inputFileName); const actualOutput = print(parsed); expect(normalizeWhitespaces(actualOutput)).eq(normalizeWhitespaces(expectedOutput)); diff --git a/packages/instrumenter/test/integration/transformers.it.spec.js.snap b/packages/instrumenter/test/integration/transformers.it.spec.ts.snap similarity index 87% rename from packages/instrumenter/test/integration/transformers.it.spec.js.snap rename to packages/instrumenter/test/integration/transformers.it.spec.ts.snap index 328d6f185f..ccf57806a4 100644 --- a/packages/instrumenter/test/integration/transformers.it.spec.js.snap +++ b/packages/instrumenter/test/integration/transformers.it.spec.ts.snap @@ -15460,1847 +15460,3 @@ Object { }, } `; - -exports[`transformers integration should transform html files 1`] = ` -Object { - "format": "html", - "originFileName": "example.html", - "rawContent": "", - "root": Object { - "scripts": Array [ - Object { - "format": "js", - "originFileName": "example.js", - "rawContent": "const foo = 40 + 2", - "root": Node { - "comments": Array [], - "end": 18, - "errors": Array [], - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "program": Node { - "body": Array [ - Node { - "declarations": Array [ - Node { - "end": 449, - "id": Node { - "end": 19, - "loc": SourceLocation { - "end": Position { - "column": 19, - "line": 1, - }, - "identifierName": "__global_69fa48", - "start": Position { - "column": 4, - "line": 1, - }, - }, - "name": "__global_69fa48", - "start": 4, - "type": "Identifier", - }, - "init": Node { - "arguments": Array [ - Node { - "arguments": Array [], - "callee": Node { - "arguments": Array [ - Node { - "end": 445, - "extra": Object { - "raw": "\\"return this\\"", - "rawValue": "return this", - }, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 14, - }, - "start": Position { - "column": 16, - "line": 14, - }, - }, - "start": 432, - "type": "StringLiteral", - "value": "return this", - }, - ], - "callee": Node { - "end": 431, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 14, - }, - "identifierName": "Function", - "start": Position { - "column": 7, - "line": 14, - }, - }, - "name": "Function", - "start": 423, - "type": "Identifier", - }, - "end": 446, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 14, - }, - "start": Position { - "column": 3, - "line": 14, - }, - }, - "start": 419, - "type": "NewExpression", - }, - "end": 448, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 14, - }, - "start": Position { - "column": 3, - "line": 14, - }, - }, - "start": 419, - "type": "CallExpression", - }, - ], - "callee": Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "end": 104, - "expression": Node { - "end": 103, - "left": Node { - "computed": false, - "end": 60, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 2, - }, - "start": Position { - "column": 2, - "line": 2, - }, - }, - "object": Node { - "end": 39, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 2, - }, - "identifierName": "g", - "start": Position { - "column": 2, - "line": 2, - }, - }, - "name": "g", - "start": 38, - "type": "Identifier", - }, - "property": Node { - "end": 60, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 2, - }, - "identifierName": "__mutationCoverage__", - "start": Position { - "column": 4, - "line": 2, - }, - }, - "name": "__mutationCoverage__", - "start": 40, - "type": "Identifier", - }, - "start": 38, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 67, - "line": 2, - }, - "start": Position { - "column": 2, - "line": 2, - }, - }, - "operator": "=", - "right": Node { - "end": 103, - "left": Node { - "computed": false, - "end": 85, - "loc": SourceLocation { - "end": Position { - "column": 49, - "line": 2, - }, - "start": Position { - "column": 27, - "line": 2, - }, - }, - "object": Node { - "end": 64, - "loc": SourceLocation { - "end": Position { - "column": 28, - "line": 2, - }, - "identifierName": "g", - "start": Position { - "column": 27, - "line": 2, - }, - }, - "name": "g", - "start": 63, - "type": "Identifier", - }, - "property": Node { - "end": 85, - "loc": SourceLocation { - "end": Position { - "column": 49, - "line": 2, - }, - "identifierName": "__mutationCoverage__", - "start": Position { - "column": 29, - "line": 2, - }, - }, - "name": "__mutationCoverage__", - "start": 65, - "type": "Identifier", - }, - "start": 63, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 67, - "line": 2, - }, - "start": Position { - "column": 27, - "line": 2, - }, - }, - "operator": "||", - "right": Node { - "end": 103, - "loc": SourceLocation { - "end": Position { - "column": 67, - "line": 2, - }, - "start": Position { - "column": 53, - "line": 2, - }, - }, - "properties": Array [ - Node { - "computed": false, - "end": 101, - "key": Node { - "end": 97, - "loc": SourceLocation { - "end": Position { - "column": 61, - "line": 2, - }, - "identifierName": "static", - "start": Position { - "column": 55, - "line": 2, - }, - }, - "name": "static", - "start": 91, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 65, - "line": 2, - }, - "start": Position { - "column": 55, - "line": 2, - }, - }, - "method": false, - "shorthand": false, - "start": 91, - "type": "ObjectProperty", - "value": Node { - "end": 101, - "loc": SourceLocation { - "end": Position { - "column": 65, - "line": 2, - }, - "start": Position { - "column": 63, - "line": 2, - }, - }, - "properties": Array [], - "start": 99, - "type": "ObjectExpression", - }, - }, - ], - "start": 89, - "type": "ObjectExpression", - }, - "start": 63, - "type": "LogicalExpression", - }, - "start": 38, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 68, - "line": 2, - }, - "start": Position { - "column": 2, - "line": 2, - }, - }, - "start": 38, - "type": "ExpressionStatement", - }, - Node { - "end": 403, - "expression": Node { - "end": 402, - "left": Node { - "computed": false, - "end": 124, - "loc": SourceLocation { - "end": Position { - "column": 19, - "line": 3, - }, - "start": Position { - "column": 2, - "line": 3, - }, - }, - "object": Node { - "end": 108, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 3, - }, - "identifierName": "g", - "start": Position { - "column": 2, - "line": 3, - }, - }, - "name": "g", - "start": 107, - "type": "Identifier", - }, - "property": Node { - "end": 124, - "loc": SourceLocation { - "end": Position { - "column": 19, - "line": 3, - }, - "identifierName": "__coverMutant__", - "start": Position { - "column": 4, - "line": 3, - }, - }, - "name": "__coverMutant__", - "start": 109, - "type": "Identifier", - }, - "start": 107, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 12, - }, - "start": Position { - "column": 2, - "line": 3, - }, - }, - "operator": "=", - "right": Node { - "end": 402, - "left": Node { - "computed": false, - "end": 144, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 3, - }, - "start": Position { - "column": 22, - "line": 3, - }, - }, - "object": Node { - "end": 128, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 3, - }, - "identifierName": "g", - "start": Position { - "column": 22, - "line": 3, - }, - }, - "name": "g", - "start": 127, - "type": "Identifier", - }, - "property": Node { - "end": 144, - "loc": SourceLocation { - "end": Position { - "column": 39, - "line": 3, - }, - "identifierName": "__coverMutant__", - "start": Position { - "column": 24, - "line": 3, - }, - }, - "name": "__coverMutant__", - "start": 129, - "type": "Identifier", - }, - "start": 127, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 12, - }, - "start": Position { - "column": 22, - "line": 3, - }, - }, - "operator": "||", - "right": Node { - "async": false, - "body": Node { - "body": Array [ - Node { - "declarations": Array [ - Node { - "end": 203, - "id": Node { - "end": 171, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 4, - }, - "identifierName": "c", - "start": Position { - "column": 8, - "line": 4, - }, - }, - "name": "c", - "start": 170, - "type": "Identifier", - }, - "init": Node { - "computed": false, - "end": 203, - "loc": SourceLocation { - "end": Position { - "column": 41, - "line": 4, - }, - "start": Position { - "column": 12, - "line": 4, - }, - }, - "object": Node { - "computed": false, - "end": 196, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 4, - }, - "start": Position { - "column": 12, - "line": 4, - }, - }, - "object": Node { - "end": 175, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 4, - }, - "identifierName": "g", - "start": Position { - "column": 12, - "line": 4, - }, - }, - "name": "g", - "start": 174, - "type": "Identifier", - }, - "property": Node { - "end": 196, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 4, - }, - "identifierName": "__mutationCoverage__", - "start": Position { - "column": 14, - "line": 4, - }, - }, - "name": "__mutationCoverage__", - "start": 176, - "type": "Identifier", - }, - "start": 174, - "type": "MemberExpression", - }, - "property": Node { - "end": 203, - "loc": SourceLocation { - "end": Position { - "column": 41, - "line": 4, - }, - "identifierName": "static", - "start": Position { - "column": 35, - "line": 4, - }, - }, - "name": "static", - "start": 197, - "type": "Identifier", - }, - "start": 174, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 41, - "line": 4, - }, - "start": Position { - "column": 8, - "line": 4, - }, - }, - "start": 170, - "type": "VariableDeclarator", - }, - ], - "end": 204, - "kind": "var", - "loc": SourceLocation { - "end": Position { - "column": 42, - "line": 4, - }, - "start": Position { - "column": 4, - "line": 4, - }, - }, - "start": 166, - "type": "VariableDeclaration", - }, - Node { - "alternate": null, - "consequent": Node { - "body": Array [ - Node { - "end": 290, - "expression": Node { - "end": 289, - "left": Node { - "end": 243, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 6, - }, - "identifierName": "c", - "start": Position { - "column": 6, - "line": 6, - }, - }, - "name": "c", - "start": 242, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 53, - "line": 6, - }, - "start": Position { - "column": 6, - "line": 6, - }, - }, - "operator": "=", - "right": Node { - "computed": true, - "end": 289, - "loc": SourceLocation { - "end": Position { - "column": 53, - "line": 6, - }, - "start": Position { - "column": 10, - "line": 6, - }, - }, - "object": Node { - "computed": false, - "end": 268, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 6, - }, - "start": Position { - "column": 10, - "line": 6, - }, - }, - "object": Node { - "end": 247, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 6, - }, - "identifierName": "g", - "start": Position { - "column": 10, - "line": 6, - }, - }, - "name": "g", - "start": 246, - "type": "Identifier", - }, - "property": Node { - "end": 268, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 6, - }, - "identifierName": "__mutationCoverage__", - "start": Position { - "column": 12, - "line": 6, - }, - }, - "name": "__mutationCoverage__", - "start": 248, - "type": "Identifier", - }, - "start": 246, - "type": "MemberExpression", - }, - "property": Node { - "computed": false, - "end": 288, - "loc": SourceLocation { - "end": Position { - "column": 52, - "line": 6, - }, - "start": Position { - "column": 33, - "line": 6, - }, - }, - "object": Node { - "end": 270, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 6, - }, - "identifierName": "g", - "start": Position { - "column": 33, - "line": 6, - }, - }, - "name": "g", - "start": 269, - "type": "Identifier", - }, - "property": Node { - "end": 288, - "loc": SourceLocation { - "end": Position { - "column": 52, - "line": 6, - }, - "identifierName": "__currentTestId__", - "start": Position { - "column": 35, - "line": 6, - }, - }, - "name": "__currentTestId__", - "start": 271, - "type": "Identifier", - }, - "start": 269, - "type": "MemberExpression", - }, - "start": 246, - "type": "MemberExpression", - }, - "start": 242, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 54, - "line": 6, - }, - "start": Position { - "column": 6, - "line": 6, - }, - }, - "start": 242, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 296, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 7, - }, - "start": Position { - "column": 29, - "line": 5, - }, - }, - "start": 234, - "type": "BlockStatement", - }, - "end": 296, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 7, - }, - "start": Position { - "column": 4, - "line": 5, - }, - }, - "start": 209, - "test": Node { - "computed": false, - "end": 232, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 5, - }, - "start": Position { - "column": 8, - "line": 5, - }, - }, - "object": Node { - "end": 214, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 5, - }, - "identifierName": "g", - "start": Position { - "column": 8, - "line": 5, - }, - }, - "name": "g", - "start": 213, - "type": "Identifier", - }, - "property": Node { - "end": 232, - "loc": SourceLocation { - "end": Position { - "column": 27, - "line": 5, - }, - "identifierName": "__currentTestId__", - "start": Position { - "column": 10, - "line": 5, - }, - }, - "name": "__currentTestId__", - "start": 215, - "type": "Identifier", - }, - "start": 213, - "type": "MemberExpression", - }, - "type": "IfStatement", - }, - Node { - "declarations": Array [ - Node { - "end": 318, - "id": Node { - "end": 306, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 8, - }, - "identifierName": "a", - "start": Position { - "column": 8, - "line": 8, - }, - }, - "name": "a", - "start": 305, - "type": "Identifier", - }, - "init": Node { - "end": 318, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 8, - }, - "identifierName": "arguments", - "start": Position { - "column": 12, - "line": 8, - }, - }, - "name": "arguments", - "start": 309, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 21, - "line": 8, - }, - "start": Position { - "column": 8, - "line": 8, - }, - }, - "start": 305, - "type": "VariableDeclarator", - }, - ], - "end": 319, - "kind": "var", - "loc": SourceLocation { - "end": Position { - "column": 22, - "line": 8, - }, - "start": Position { - "column": 4, - "line": 8, - }, - }, - "start": 301, - "type": "VariableDeclaration", - }, - Node { - "body": Node { - "body": Array [ - Node { - "end": 392, - "expression": Node { - "end": 391, - "left": Node { - "computed": true, - "end": 370, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 10, - }, - }, - "object": Node { - "end": 364, - "loc": SourceLocation { - "end": Position { - "column": 7, - "line": 10, - }, - "identifierName": "c", - "start": Position { - "column": 6, - "line": 10, - }, - }, - "name": "c", - "start": 363, - "type": "Identifier", - }, - "property": Node { - "computed": true, - "end": 369, - "loc": SourceLocation { - "end": Position { - "column": 12, - "line": 10, - }, - "start": Position { - "column": 8, - "line": 10, - }, - }, - "object": Node { - "end": 366, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 10, - }, - "identifierName": "a", - "start": Position { - "column": 8, - "line": 10, - }, - }, - "name": "a", - "start": 365, - "type": "Identifier", - }, - "property": Node { - "end": 368, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 10, - }, - "identifierName": "i", - "start": Position { - "column": 10, - "line": 10, - }, - }, - "name": "i", - "start": 367, - "type": "Identifier", - }, - "start": 365, - "type": "MemberExpression", - }, - "start": 363, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 10, - }, - }, - "operator": "=", - "right": Node { - "end": 391, - "left": Node { - "end": 386, - "extra": Object { - "parenStart": 373, - "parenthesized": true, - }, - "left": Node { - "computed": true, - "end": 381, - "loc": SourceLocation { - "end": Position { - "column": 24, - "line": 10, - }, - "start": Position { - "column": 17, - "line": 10, - }, - }, - "object": Node { - "end": 375, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 10, - }, - "identifierName": "c", - "start": Position { - "column": 17, - "line": 10, - }, - }, - "name": "c", - "start": 374, - "type": "Identifier", - }, - "property": Node { - "computed": true, - "end": 380, - "loc": SourceLocation { - "end": Position { - "column": 23, - "line": 10, - }, - "start": Position { - "column": 19, - "line": 10, - }, - }, - "object": Node { - "end": 377, - "loc": SourceLocation { - "end": Position { - "column": 20, - "line": 10, - }, - "identifierName": "a", - "start": Position { - "column": 19, - "line": 10, - }, - }, - "name": "a", - "start": 376, - "type": "Identifier", - }, - "property": Node { - "end": 379, - "loc": SourceLocation { - "end": Position { - "column": 22, - "line": 10, - }, - "identifierName": "i", - "start": Position { - "column": 21, - "line": 10, - }, - }, - "name": "i", - "start": 378, - "type": "Identifier", - }, - "start": 376, - "type": "MemberExpression", - }, - "start": 374, - "type": "MemberExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 10, - }, - "start": Position { - "column": 17, - "line": 10, - }, - }, - "operator": "||", - "right": Node { - "end": 386, - "extra": Object { - "raw": "0", - "rawValue": 0, - }, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 10, - }, - "start": Position { - "column": 28, - "line": 10, - }, - }, - "start": 385, - "type": "NumericLiteral", - "value": 0, - }, - "start": 374, - "type": "LogicalExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 10, - }, - "start": Position { - "column": 16, - "line": 10, - }, - }, - "operator": "+", - "right": Node { - "end": 391, - "extra": Object { - "raw": "1", - "rawValue": 1, - }, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 10, - }, - "start": Position { - "column": 33, - "line": 10, - }, - }, - "start": 390, - "type": "NumericLiteral", - "value": 1, - }, - "start": 373, - "type": "BinaryExpression", - }, - "start": 363, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 35, - "line": 10, - }, - "start": Position { - "column": 6, - "line": 10, - }, - }, - "start": 363, - "type": "ExpressionStatement", - }, - ], - "directives": Array [], - "end": 398, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 11, - }, - "start": Position { - "column": 35, - "line": 9, - }, - }, - "start": 355, - "type": "BlockStatement", - }, - "end": 398, - "init": Node { - "declarations": Array [ - Node { - "end": 335, - "id": Node { - "end": 333, - "loc": SourceLocation { - "end": Position { - "column": 13, - "line": 9, - }, - "identifierName": "i", - "start": Position { - "column": 12, - "line": 9, - }, - }, - "name": "i", - "start": 332, - "type": "Identifier", - }, - "init": Node { - "end": 335, - "extra": Object { - "raw": "0", - "rawValue": 0, - }, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 9, - }, - "start": Position { - "column": 14, - "line": 9, - }, - }, - "start": 334, - "type": "NumericLiteral", - "value": 0, - }, - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 9, - }, - "start": Position { - "column": 12, - "line": 9, - }, - }, - "start": 332, - "type": "VariableDeclarator", - }, - ], - "end": 335, - "kind": "var", - "loc": SourceLocation { - "end": Position { - "column": 15, - "line": 9, - }, - "start": Position { - "column": 8, - "line": 9, - }, - }, - "start": 328, - "type": "VariableDeclaration", - }, - "loc": SourceLocation { - "end": Position { - "column": 5, - "line": 11, - }, - "start": Position { - "column": 4, - "line": 9, - }, - }, - "start": 324, - "test": Node { - "end": 349, - "left": Node { - "end": 338, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 9, - }, - "identifierName": "i", - "start": Position { - "column": 17, - "line": 9, - }, - }, - "name": "i", - "start": 337, - "type": "Identifier", - }, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 9, - }, - "start": Position { - "column": 17, - "line": 9, - }, - }, - "operator": "<", - "right": Node { - "computed": false, - "end": 349, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 9, - }, - "start": Position { - "column": 21, - "line": 9, - }, - }, - "object": Node { - "end": 342, - "loc": SourceLocation { - "end": Position { - "column": 22, - "line": 9, - }, - "identifierName": "a", - "start": Position { - "column": 21, - "line": 9, - }, - }, - "name": "a", - "start": 341, - "type": "Identifier", - }, - "property": Node { - "end": 349, - "loc": SourceLocation { - "end": Position { - "column": 29, - "line": 9, - }, - "identifierName": "length", - "start": Position { - "column": 23, - "line": 9, - }, - }, - "name": "length", - "start": 343, - "type": "Identifier", - }, - "start": 341, - "type": "MemberExpression", - }, - "start": 337, - "type": "BinaryExpression", - }, - "type": "ForStatement", - "update": Node { - "argument": Node { - "end": 352, - "loc": SourceLocation { - "end": Position { - "column": 32, - "line": 9, - }, - "identifierName": "i", - "start": Position { - "column": 31, - "line": 9, - }, - }, - "name": "i", - "start": 351, - "type": "Identifier", - }, - "end": 354, - "loc": SourceLocation { - "end": Position { - "column": 34, - "line": 9, - }, - "start": Position { - "column": 31, - "line": 9, - }, - }, - "operator": "++", - "prefix": false, - "start": 351, - "type": "UpdateExpression", - }, - }, - ], - "directives": Array [], - "end": 402, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 12, - }, - "start": Position { - "column": 55, - "line": 3, - }, - }, - "start": 160, - "type": "BlockStatement", - }, - "end": 402, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 3, - "line": 12, - }, - "start": Position { - "column": 43, - "line": 3, - }, - }, - "params": Array [], - "start": 148, - "type": "FunctionExpression", - }, - "start": 127, - "type": "LogicalExpression", - }, - "start": 107, - "type": "AssignmentExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 4, - "line": 12, - }, - "start": Position { - "column": 2, - "line": 3, - }, - }, - "start": 107, - "type": "ExpressionStatement", - }, - Node { - "argument": Node { - "end": 414, - "loc": SourceLocation { - "end": Position { - "column": 10, - "line": 13, - }, - "identifierName": "g", - "start": Position { - "column": 9, - "line": 13, - }, - }, - "name": "g", - "start": 413, - "type": "Identifier", - }, - "end": 415, - "loc": SourceLocation { - "end": Position { - "column": 11, - "line": 13, - }, - "start": Position { - "column": 2, - "line": 13, - }, - }, - "start": 406, - "type": "ReturnStatement", - }, - ], - "directives": Array [], - "end": 417, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 14, - }, - "start": Position { - "column": 34, - "line": 1, - }, - }, - "start": 34, - "type": "BlockStatement", - }, - "end": 417, - "extra": Object { - "parenStart": 22, - "parenthesized": true, - }, - "generator": false, - "id": null, - "loc": SourceLocation { - "end": Position { - "column": 1, - "line": 14, - }, - "start": Position { - "column": 23, - "line": 1, - }, - }, - "params": Array [ - Node { - "end": 33, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 1, - }, - "identifierName": "g", - "start": Position { - "column": 32, - "line": 1, - }, - }, - "name": "g", - "start": 32, - "type": "Identifier", - }, - ], - "start": 23, - "type": "FunctionExpression", - }, - "end": 449, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 14, - }, - "start": Position { - "column": 22, - "line": 1, - }, - }, - "start": 22, - "type": "CallExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 14, - }, - "start": Position { - "column": 4, - "line": 1, - }, - }, - "start": 4, - "type": "VariableDeclarator", - }, - ], - "end": 449, - "kind": "var", - "loc": SourceLocation { - "end": Position { - "column": 33, - "line": 14, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "start": 0, - "type": "VariableDeclaration", - }, - Node { - "declarations": Array [ - Node { - "end": 18, - "id": Node { - "end": 9, - "loc": SourceLocation { - "end": Position { - "column": 9, - "line": 1, - }, - "identifierName": "foo", - "start": Position { - "column": 6, - "line": 1, - }, - }, - "name": "foo", - "start": 6, - "type": "Identifier", - }, - "init": Object { - "alternate": Object { - "expressions": Array [ - Object { - "arguments": Array [ - Object { - "type": "NumericLiteral", - "value": 0, - }, - ], - "callee": Object { - "computed": false, - "object": Object { - "name": "__global_69fa48", - "type": "Identifier", - }, - "optional": null, - "property": Object { - "name": "__coverMutant__", - "type": "Identifier", - }, - "type": "MemberExpression", - }, - "type": "CallExpression", - }, - Node { - "end": 18, - "innerComments": null, - "leadingComments": null, - "left": Node { - "end": 14, - "extra": Object { - "raw": "40", - "rawValue": 40, - }, - "loc": SourceLocation { - "end": Position { - "column": 14, - "line": 1, - }, - "start": Position { - "column": 12, - "line": 1, - }, - }, - "start": 12, - "type": "NumericLiteral", - "value": 40, - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 12, - "line": 1, - }, - }, - "operator": "+", - "right": Node { - "end": 18, - "extra": Object { - "raw": "2", - "rawValue": 2, - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 17, - "line": 1, - }, - }, - "start": 17, - "type": "NumericLiteral", - "value": 2, - }, - "start": 12, - "trailingComments": null, - "type": "BinaryExpression", - }, - ], - "innerComments": null, - "leadingComments": null, - "trailingComments": null, - "type": "SequenceExpression", - }, - "consequent": Object { - "end": 18, - "left": Node { - "end": 14, - "extra": Object { - "raw": "40", - "rawValue": 40, - }, - "loc": SourceLocation { - "end": Position { - "column": 14, - "line": 1, - }, - "start": Position { - "column": 12, - "line": 1, - }, - }, - "start": 12, - "type": "NumericLiteral", - "value": 40, - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 12, - "line": 1, - }, - }, - "operator": "-", - "right": Node { - "end": 18, - "extra": Object { - "raw": "2", - "rawValue": 2, - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 17, - "line": 1, - }, - }, - "start": 17, - "type": "NumericLiteral", - "value": 2, - }, - "start": 12, - "type": "BinaryExpression", - }, - "innerComments": Array [], - "leadingComments": Array [], - "test": Object { - "left": Object { - "computed": false, - "object": Object { - "name": "__global_69fa48", - "type": "Identifier", - }, - "optional": null, - "property": Object { - "name": "activeMutant", - "type": "Identifier", - }, - "type": "MemberExpression", - }, - "operator": "===", - "right": Object { - "type": "NumericLiteral", - "value": 0, - }, - "type": "BinaryExpression", - }, - "trailingComments": Array [], - "type": "ConditionalExpression", - }, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 6, - "line": 1, - }, - }, - "start": 6, - "type": "VariableDeclarator", - }, - ], - "end": 18, - "kind": "const", - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "start": 0, - "type": "VariableDeclaration", - }, - ], - "directives": Array [], - "end": 18, - "interpreter": null, - "loc": SourceLocation { - "end": Position { - "column": 18, - "line": 1, - }, - "start": Position { - "column": 0, - "line": 1, - }, - }, - "sourceType": "module", - "start": 0, - "type": "Program", - }, - "start": 0, - "type": "File", - }, - }, - ], - }, -} -`; diff --git a/packages/instrumenter/test/setup.ts b/packages/instrumenter/test/setup.ts index 77bd5cf4d9..32eb1d5882 100644 --- a/packages/instrumenter/test/setup.ts +++ b/packages/instrumenter/test/setup.ts @@ -1,6 +1,6 @@ -import 'source-map-support/register'; -import { sep } from 'path'; +import path from 'path'; +import 'source-map-support/register'; import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import sinonChai from 'sinon-chai'; @@ -8,6 +8,7 @@ import sinon from 'sinon'; import { testInjector } from '@stryker-mutator/test-helpers'; import chaiJestSnapshot from 'chai-jest-snapshot'; import type { Context } from 'mocha'; +import { retrieveSourceMap } from 'source-map-support'; chai.use(sinonChai); chai.use(chaiAsPromised); @@ -29,6 +30,17 @@ export const mochaHooks = { beforeEach(this: Context) { originalCwd = process.cwd(); chaiJestSnapshot.configureUsingMochaContext(this); - chaiJestSnapshot.setFilename(this.currentTest!.file!.replace(`${sep}dist`, '') + '.snap'); + chaiJestSnapshot.setFilename(snapshotFileFor(this.currentTest!.file!)); }, }; + +const snapshotFileMap = new Map(); +function snapshotFileFor(outFile: string): string { + let originalFile = snapshotFileMap.get(outFile); + if (!originalFile) { + const sourceMapContent: { sources: string[] } = JSON.parse(retrieveSourceMap(outFile)!.map as string); + originalFile = path.resolve(path.dirname(outFile), sourceMapContent.sources[0]) + '.snap'; + snapshotFileMap.set(outFile, originalFile); + } + return originalFile; +} diff --git a/packages/instrumenter/test/tsconfig.json b/packages/instrumenter/test/tsconfig.json deleted file mode 100644 index c3f30c9d6a..0000000000 --- a/packages/instrumenter/test/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "../../../tsconfig.settings.json", - "compilerOptions": { - "outDir": "../dist/test", - "rootDir": ".", - "esModuleInterop": true, - "types": [ - "mocha", - "node" - ] - }, - "references": [ - { - "path": "../src" - }, - { - "path": "../../test-helpers/tsconfig.src.json" - } - ] -} diff --git a/packages/instrumenter/testResources/disable-type-checks/app.component.ts.out.snap b/packages/instrumenter/testResources/disable-type-checks/app.component.ts.out.snap index c95c1d7ad5..ff564fafd3 100644 --- a/packages/instrumenter/testResources/disable-type-checks/app.component.ts.out.snap +++ b/packages/instrumenter/testResources/disable-type-checks/app.component.ts.out.snap @@ -1,71 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`disableTypeChecks integration should be able disable type checking of a type script file 1`] = ` -"// @ts-nocheck -import {Component, HostListener, Inject} from '@angular/core'; -import {DOCUMENT} from '@angular/common'; - -@Component({ - selector: 'ksw-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - title = 'Kantishop'; - - constructor(@Inject(DOCUMENT) document) { - } - - @HostListener('window:scroll', ['$event']) - onWindowScroll(e) { - // - if (window.pageYOffset > document.getElementById('banner').offsetHeight) { - const element = document.getElementById('kanti-menu'); - element.classList.add('kanti-sticky'); - document.getElementsByTagName('main').item(0).setAttribute('style', 'margin-top: 50px'); - } else { - const element = document.getElementById('kanti-menu'); - element.classList.remove('kanti-sticky'); - document.getElementsByTagName('main').item(0).removeAttribute('style'); - } - } -} -" -`; - -exports[`disableTypeChecks integration should be able disable type checks of a type script file 1`] = ` -"// @ts-nocheck -import {Component, HostListener, Inject} from '@angular/core'; -import {DOCUMENT} from '@angular/common'; - -@Component({ - selector: 'ksw-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - title = 'Kantishop'; - - constructor(@Inject(DOCUMENT) document) { - } - - @HostListener('window:scroll', ['$event']) - onWindowScroll(e) { - // - if (window.pageYOffset > document.getElementById('banner').offsetHeight) { - const element = document.getElementById('kanti-menu'); - element.classList.add('kanti-sticky'); - document.getElementsByTagName('main').item(0).setAttribute('style', 'margin-top: 50px'); - } else { - const element = document.getElementById('kanti-menu'); - element.classList.remove('kanti-sticky'); - document.getElementsByTagName('main').item(0).removeAttribute('style'); - } - } -} -" -`; - exports[`disableTypeChecks integration should be able disable type checks of a typescript file 1`] = ` "// @ts-nocheck import {Component, HostListener, Inject} from '@angular/core'; diff --git a/packages/instrumenter/testResources/disable-type-checks/html-sample.html.out.snap b/packages/instrumenter/testResources/disable-type-checks/html-sample.html.out.snap index f4eb2c49a9..f6e4bb822a 100644 --- a/packages/instrumenter/testResources/disable-type-checks/html-sample.html.out.snap +++ b/packages/instrumenter/testResources/disable-type-checks/html-sample.html.out.snap @@ -1,31 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`disableTypeChecks integration should be able disable type checking of an html file 1`] = ` -" - - - - - - Document - - - - - - -" -`; - exports[`disableTypeChecks integration should be able disable type checks of an html file 1`] = ` " diff --git a/packages/instrumenter/tsconfig.json b/packages/instrumenter/tsconfig.json index d5c40e5337..c428877a4e 100644 --- a/packages/instrumenter/tsconfig.json +++ b/packages/instrumenter/tsconfig.json @@ -2,10 +2,10 @@ "files": [], "references": [ { - "path": "./src" + "path": "./tsconfig.src.json" }, { - "path": "./test" + "path": "./tsconfig.test.json" } ] } diff --git a/packages/instrumenter/tsconfig.src.json b/packages/instrumenter/tsconfig.src.json new file mode 100644 index 0000000000..0f332194d8 --- /dev/null +++ b/packages/instrumenter/tsconfig.src.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.settings.json", + "compilerOptions": { + "outDir": "dist/src", + "rootDir": "src", + "types": [ + "node" + ] + }, + "references": [ + { + "path": "../api/tsconfig.src.json" + }, + { + "path": "../util/tsconfig.src.json" + } + ], + "include": ["src"] +} diff --git a/packages/instrumenter/tsconfig.test.json b/packages/instrumenter/tsconfig.test.json new file mode 100644 index 0000000000..5cf5c49895 --- /dev/null +++ b/packages/instrumenter/tsconfig.test.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.settings.json", + "compilerOptions": { + "outDir": "dist/test", + "rootDir": "test", + "types": [ + "mocha", + "node" + ] + }, + "references": [ + { + "path": "./tsconfig.src.json" + }, + { + "path": "../test-helpers/tsconfig.src.json" + } + ], + "include": [ + "test" + ] +} diff --git a/packages/jasmine-runner/.mocharc.jsonc b/packages/jasmine-runner/.mocharc.jsonc index 6dab901bfe..56b83e806c 100644 --- a/packages/jasmine-runner/.mocharc.jsonc +++ b/packages/jasmine-runner/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": ["test/setup.js"], + "require": ["dist/test/setup.js"], "timeout": 30000 } diff --git a/packages/jasmine-runner/.npmignore b/packages/jasmine-runner/.npmignore index 6d23c7107f..6c49bd2c64 100644 --- a/packages/jasmine-runner/.npmignore +++ b/packages/jasmine-runner/.npmignore @@ -1,11 +1,15 @@ -**/* -!*.d.ts -!bin/** -!src/** -src/**/*.map -src/**/*.ts -!{src,src-generated}/**/*.d.ts -!schema/*.json -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/jasmine-runner/.nycrc.json b/packages/jasmine-runner/.nycrc.json index 6f8a0db075..e400279738 100644 --- a/packages/jasmine-runner/.nycrc.json +++ b/packages/jasmine-runner/.nycrc.json @@ -7,5 +7,5 @@ "functions": 100, "statements": 100, "branches": 85, - "include": "src/**/*.js" + "include": "dist/src/**/*.js" } diff --git a/packages/jasmine-runner/.vscode/launch.json b/packages/jasmine-runner/.vscode/launch.json index f26c524cca..2247d31a44 100644 --- a/packages/jasmine-runner/.vscode/launch.json +++ b/packages/jasmine-runner/.vscode/launch.json @@ -12,12 +12,11 @@ "args": [ "--no-timeout", "--colors", - "${workspaceRoot}/test/**/*.js" + "${workspaceRoot}/dist/test/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/jasmine-runner/package.json b/packages/jasmine-runner/package.json index f78657dd54..bfa5393f75 100644 --- a/packages/jasmine-runner/package.json +++ b/packages/jasmine-runner/package.json @@ -2,10 +2,10 @@ "name": "@stryker-mutator/jasmine-runner", "version": "4.4.1", "description": "A plugin to use the Jasmine (NodeJS) test runner in Stryker, the mutation testing framework for JavaScript and friends", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "test": "nyc npm run test:all", - "test:all": "mocha \"test/**/*.js\"", + "test:all": "mocha \"dist/test/**/*.js\"", "stryker": "node ../core/bin/stryker run" }, "nyc": { diff --git a/packages/jasmine-runner/src/index.ts b/packages/jasmine-runner/src/index.ts index 7f89bcd327..36a366ca4a 100644 --- a/packages/jasmine-runner/src/index.ts +++ b/packages/jasmine-runner/src/index.ts @@ -1,6 +1,6 @@ import { declareFactoryPlugin, PluginKind } from '@stryker-mutator/api/plugin'; -import * as strykerValidationSchema from '../schema/jasmine-runner-options.json'; +import strykerValidationSchema from '../schema/jasmine-runner-options.json'; import { JasmineTestRunner, createJasmineTestRunner, createJasmineTestRunnerFactory } from './jasmine-test-runner'; diff --git a/packages/jasmine-runner/test/helpers/resolve-test-resource.ts b/packages/jasmine-runner/test/helpers/resolve-test-resource.ts new file mode 100644 index 0000000000..c807498e14 --- /dev/null +++ b/packages/jasmine-runner/test/helpers/resolve-test-resource.ts @@ -0,0 +1,4 @@ +import path = require('path'); + +export const resolveFromRoot = path.resolve.bind(path, __dirname, '..', '..', '..'); +export const resolveTestResource = resolveFromRoot.bind(path, 'testResources'); diff --git a/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts b/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts index c70eac9fb7..d5cfc5568f 100644 --- a/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts +++ b/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts @@ -1,16 +1,15 @@ -import path = require('path'); - import { factory, testInjector, assertions } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { MutantRunStatus } from '@stryker-mutator/api/test-runner'; import { JasmineTestRunner, createJasmineTestRunnerFactory } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('JasmineRunner integration with code instrumentation', () => { let sut: JasmineTestRunner; beforeEach(() => { - process.chdir(path.resolve(__dirname, '../../testResources/jasmine-init-instrumented')); + process.chdir(resolveTestResource('jasmine-init-instrumented')); sut = testInjector.injector.injectFunction(createJasmineTestRunnerFactory('__stryker2__')); }); diff --git a/packages/jasmine-runner/test/integration/jasmine-runner.it.spec.ts b/packages/jasmine-runner/test/integration/jasmine-runner.it.spec.ts index d604f24414..190b19acae 100644 --- a/packages/jasmine-runner/test/integration/jasmine-runner.it.spec.ts +++ b/packages/jasmine-runner/test/integration/jasmine-runner.it.spec.ts @@ -1,11 +1,10 @@ -import * as path from 'path'; - import { factory, assertions, testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { TestStatus } from '@stryker-mutator/api/test-runner'; import { JasmineTestRunner, createJasmineTestRunnerFactory } from '../../src/jasmine-test-runner'; import { expectTestResultsToEqual } from '../helpers/assertions'; +import { resolveFromRoot, resolveTestResource } from '../helpers/resolve-test-resource'; import { jasmineInitSuccessResults } from './helpers'; @@ -13,13 +12,13 @@ describe('JasmineRunner integration', () => { let sut: JasmineTestRunner; afterEach(async () => { - process.chdir(path.resolve(__dirname, '../../..')); + process.chdir(resolveFromRoot()); await sut.dispose(); }); describe('using the jasmine-init project', () => { beforeEach(() => { - process.chdir(path.resolve(__dirname, '../../testResources/jasmine-init')); + process.chdir(resolveTestResource('jasmine-init')); testInjector.options.jasmineConfigFile = 'spec/support/jasmine.json'; sut = testInjector.injector.injectFunction(createJasmineTestRunnerFactory('__stryker2__')); }); @@ -85,7 +84,7 @@ describe('JasmineRunner integration', () => { describe('using a jasmine-project with errors', () => { beforeEach(async () => { - process.chdir(path.resolve(__dirname, '../../testResources/errors')); + process.chdir(resolveTestResource('errors')); sut = testInjector.injector.injectFunction(createJasmineTestRunnerFactory('__stryker2__')); }); @@ -100,7 +99,7 @@ describe('JasmineRunner integration', () => { describe('when it includes failed tests', () => { beforeEach(() => { - process.chdir(path.resolve(__dirname, '../../testResources/test-failures')); + process.chdir(resolveTestResource('test-failures')); sut = testInjector.injector.injectFunction(createJasmineTestRunnerFactory('__stryker2__')); }); diff --git a/packages/jasmine-runner/test/integration/memory-leak.it.spec.ts b/packages/jasmine-runner/test/integration/memory-leak.it.spec.ts index 6eccb716a0..c5930eac90 100644 --- a/packages/jasmine-runner/test/integration/memory-leak.it.spec.ts +++ b/packages/jasmine-runner/test/integration/memory-leak.it.spec.ts @@ -1,7 +1,6 @@ import path = require('path'); import execa = require('execa'); - import { expect } from 'chai'; import { JasmineTestRunner } from '../../src'; diff --git a/packages/jasmine-runner/test/integration/memory-leak.worker.ts b/packages/jasmine-runner/test/integration/memory-leak.worker.ts index 48399bd16f..ab40e5f8f7 100644 --- a/packages/jasmine-runner/test/integration/memory-leak.worker.ts +++ b/packages/jasmine-runner/test/integration/memory-leak.worker.ts @@ -1,11 +1,9 @@ -import path = require('path'); - import { testInjector } from '@stryker-mutator/test-helpers'; - import { expect } from 'chai'; import { DryRunStatus, TestStatus } from '@stryker-mutator/api/test-runner'; import { createJasmineTestRunnerFactory } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; /** * This file will run the jasmine runner a number of times in a test suite that is designed @@ -25,7 +23,7 @@ if (require.main === module) { } async function main() { - process.chdir(path.resolve(__dirname, '..', '..', 'testResources', 'big-project')); + process.chdir(resolveTestResource('big-project')); const jasmineRunner = testInjector.injector.injectFunction(createJasmineTestRunnerFactory('__stryker2__')); await doDryRun(); diff --git a/packages/jasmine-runner/test/setup.ts b/packages/jasmine-runner/test/setup.ts index 200cf7c7c7..635c51b8c1 100644 --- a/packages/jasmine-runner/test/setup.ts +++ b/packages/jasmine-runner/test/setup.ts @@ -1,9 +1,9 @@ import 'source-map-support/register'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinonChai from 'sinon-chai'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinonChai from 'sinon-chai'; import { testInjector } from '@stryker-mutator/test-helpers'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; chai.use(sinonChai); chai.use(chaiAsPromised); diff --git a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts index 8712c13374..eefceb68a4 100644 --- a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts +++ b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts @@ -1,4 +1,4 @@ -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { expect } from 'chai'; import { factory, assertions, testInjector } from '@stryker-mutator/test-helpers'; import { TestStatus, CompleteDryRunResult, DryRunStatus } from '@stryker-mutator/api/test-runner'; diff --git a/packages/jasmine-runner/tsconfig.src.json b/packages/jasmine-runner/tsconfig.src.json index 4ac04cbc87..7a5375676a 100644 --- a/packages/jasmine-runner/tsconfig.src.json +++ b/packages/jasmine-runner/tsconfig.src.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "noImplicitThis": true, "types": [ diff --git a/packages/jasmine-runner/tsconfig.test.json b/packages/jasmine-runner/tsconfig.test.json index 21421160ca..18dc8dab75 100644 --- a/packages/jasmine-runner/tsconfig.test.json +++ b/packages/jasmine-runner/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "types": [ "mocha", diff --git a/packages/jest-runner/.mocharc.jsonc b/packages/jest-runner/.mocharc.jsonc index 799f079d25..dfc8099c08 100644 --- a/packages/jest-runner/.mocharc.jsonc +++ b/packages/jest-runner/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": "test/setup.js", + "require": "dist/test/setup.js", "timeout": 10000 } diff --git a/packages/jest-runner/.npmignore b/packages/jest-runner/.npmignore index 910a1d56dc..6c49bd2c64 100644 --- a/packages/jest-runner/.npmignore +++ b/packages/jest-runner/.npmignore @@ -1,12 +1,15 @@ -**/* -!*.d.ts -!bin/** -!jest-env/** -!src/** -src/**/*.map -src/**/*.ts -!{src,src-generated}/**/*.d.ts -!schema/*.json -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/jest-runner/.nycrc.json b/packages/jest-runner/.nycrc.json index 57ff700bda..68864c7bff 100644 --- a/packages/jest-runner/.nycrc.json +++ b/packages/jest-runner/.nycrc.json @@ -7,5 +7,5 @@ "functions": 80, "statements": 80, "branches": 75, - "include": "src/**/*.js" + "include": "dist/src/**/*.js" } diff --git a/packages/jest-runner/.vscode/launch.json b/packages/jest-runner/.vscode/launch.json index 582a321315..f8b0a0f254 100644 --- a/packages/jest-runner/.vscode/launch.json +++ b/packages/jest-runner/.vscode/launch.json @@ -13,13 +13,12 @@ "--timeout", "999999", "--colors", - "${workspaceFolder}/test/helpers/**/*.js", - "${workspaceFolder}/test/unit/**/*.js" + "${workspaceFolder}/dist/test/helpers/**/*.js", + "${workspaceFolder}/dist/test/unit/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" @@ -34,13 +33,12 @@ "--timeout", "999999", "--colors", - "${workspaceFolder}/test/helpers/**/*.js", - "${workspaceFolder}/test/integration/**/*.js" + "${workspaceFolder}/dist/test/helpers/**/*.js", + "${workspaceFolder}/dist/test/integration/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/jest-runner/jest-env/jsdom-sixteen.js b/packages/jest-runner/jest-env/jsdom-sixteen.js index 58ea4a043e..8b7ca7de9b 100644 --- a/packages/jest-runner/jest-env/jsdom-sixteen.js +++ b/packages/jest-runner/jest-env/jsdom-sixteen.js @@ -1 +1 @@ -module.exports = require('../src/jest-plugins/jest-environment-jsdom-sixteen'); +module.exports = require('../dist/src/jest-plugins/jest-environment-jsdom-sixteen'); diff --git a/packages/jest-runner/jest-env/jsdom.js b/packages/jest-runner/jest-env/jsdom.js index e6ca67a130..e597cceed7 100644 --- a/packages/jest-runner/jest-env/jsdom.js +++ b/packages/jest-runner/jest-env/jsdom.js @@ -1 +1 @@ -module.exports = require('../src/jest-plugins/jest-environment-jsdom'); +module.exports = require('../dist/src/jest-plugins/jest-environment-jsdom'); diff --git a/packages/jest-runner/jest-env/node.js b/packages/jest-runner/jest-env/node.js index 9285cf4c03..78d8b623fc 100644 --- a/packages/jest-runner/jest-env/node.js +++ b/packages/jest-runner/jest-env/node.js @@ -1 +1 @@ -module.exports = require('../src/jest-plugins/jest-environment-node'); +module.exports = require('../dist/src/jest-plugins/jest-environment-node'); diff --git a/packages/jest-runner/package.json b/packages/jest-runner/package.json index 66714513d1..1e719cb0fc 100644 --- a/packages/jest-runner/package.json +++ b/packages/jest-runner/package.json @@ -2,12 +2,12 @@ "name": "@stryker-mutator/jest-runner", "version": "4.4.1", "description": "A plugin to use the jest test runner and framework in Stryker, the JavaScript mutation testing framework", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "test": "nyc npm run test:all", "test:all": "npm run test:unit && npm run test:integration", - "test:unit": "mocha \"test/helpers/**/*.js\" \"test/unit/**/*.js\"", - "test:integration": "mocha --timeout 30000 \"test/helpers/**/*.js\" \"test/integration/**/*.js\"", + "test:unit": "mocha \"dist/test/unit/**/*.js\"", + "test:integration": "mocha --timeout 30000 \"dist/test/integration/**/*.js\"", "stryker": "node ../core/bin/stryker run" }, "repository": { diff --git a/packages/jest-runner/src/config-loaders/custom-jest-config-loader.ts b/packages/jest-runner/src/config-loaders/custom-jest-config-loader.ts index c4364450d7..4640641b09 100644 --- a/packages/jest-runner/src/config-loaders/custom-jest-config-loader.ts +++ b/packages/jest-runner/src/config-loaders/custom-jest-config-loader.ts @@ -9,13 +9,13 @@ import { Config } from '@jest/types'; import { loader, projectRoot } from '../plugin-tokens'; import { JestRunnerOptionsWithStrykerOptions } from '../jest-runner-options-with-stryker-options'; -import JestConfigLoader from './jest-config-loader'; +import { JestConfigLoader } from './jest-config-loader'; import { NodeRequireFunction } from './node-require-function'; /** * The Default config loader will load the Jest configuration using the package.json in the package root */ -export default class CustomJestConfigLoader implements JestConfigLoader { +export class CustomJestConfigLoader implements JestConfigLoader { public static inject = tokens(commonTokens.logger, commonTokens.options, loader, projectRoot); constructor( diff --git a/packages/jest-runner/src/config-loaders/index.ts b/packages/jest-runner/src/config-loaders/index.ts index 58c07b261b..2bbbfc0987 100644 --- a/packages/jest-runner/src/config-loaders/index.ts +++ b/packages/jest-runner/src/config-loaders/index.ts @@ -7,9 +7,9 @@ import { requireResolve } from '@stryker-mutator/util'; import { JestRunnerOptionsWithStrykerOptions } from '../jest-runner-options-with-stryker-options'; import * as pluginTokens from '../plugin-tokens'; -import CustomJestConfigLoader from './custom-jest-config-loader'; -import ReactScriptsJestConfigLoader from './react-scripts-jest-config-loader'; -import ReactScriptsTSJestConfigLoader from './react-scripts-ts-jest-config-loader'; +import { CustomJestConfigLoader } from './custom-jest-config-loader'; +import { ReactScriptsJestConfigLoader } from './react-scripts-jest-config-loader'; +import { ReactScriptsTSJestConfigLoader } from './react-scripts-ts-jest-config-loader'; configLoaderFactory.inject = tokens(commonTokens.options, commonTokens.injector, commonTokens.logger); export function configLoaderFactory(options: StrykerOptions, injector: Injector, log: Logger) { diff --git a/packages/jest-runner/src/config-loaders/jest-config-loader.ts b/packages/jest-runner/src/config-loaders/jest-config-loader.ts index ecd2e5246d..b2df5ea095 100644 --- a/packages/jest-runner/src/config-loaders/jest-config-loader.ts +++ b/packages/jest-runner/src/config-loaders/jest-config-loader.ts @@ -8,7 +8,7 @@ import { Config } from '@jest/types'; -export default interface JestConfigLoader { +export interface JestConfigLoader { /* * Load the JSON representation of a Jest Configuration. * diff --git a/packages/jest-runner/src/config-loaders/react-scripts-jest-config-loader.ts b/packages/jest-runner/src/config-loaders/react-scripts-jest-config-loader.ts index 91e284808a..b0d3800ffd 100644 --- a/packages/jest-runner/src/config-loaders/react-scripts-jest-config-loader.ts +++ b/packages/jest-runner/src/config-loaders/react-scripts-jest-config-loader.ts @@ -6,9 +6,9 @@ import { Config } from '@jest/types'; import { createReactJestConfig } from '../utils'; import * as pluginTokens from '../plugin-tokens'; -import JestConfigLoader from './jest-config-loader'; +import { JestConfigLoader } from './jest-config-loader'; -export default class ReactScriptsJestConfigLoader implements JestConfigLoader { +export class ReactScriptsJestConfigLoader implements JestConfigLoader { public static inject = tokens(pluginTokens.resolve, pluginTokens.projectRoot); constructor(private readonly resolve: RequireResolve, private readonly projectRoot: string) {} diff --git a/packages/jest-runner/src/config-loaders/react-scripts-ts-jest-config-loader.ts b/packages/jest-runner/src/config-loaders/react-scripts-ts-jest-config-loader.ts index 03cf8a79a4..86b573a2fb 100644 --- a/packages/jest-runner/src/config-loaders/react-scripts-ts-jest-config-loader.ts +++ b/packages/jest-runner/src/config-loaders/react-scripts-ts-jest-config-loader.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import path from 'path'; import { Logger } from '@stryker-mutator/api/logging'; import { tokens, commonTokens } from '@stryker-mutator/api/plugin'; @@ -8,9 +8,9 @@ import { Config } from '@jest/types'; import { createReactTsJestConfig } from '../utils'; import * as pluginTokens from '../plugin-tokens'; -import JestConfigLoader from './jest-config-loader'; +import { JestConfigLoader } from './jest-config-loader'; -export default class ReactScriptsTSJestConfigLoader implements JestConfigLoader { +export class ReactScriptsTSJestConfigLoader implements JestConfigLoader { public static inject = tokens(commonTokens.logger, pluginTokens.resolve, pluginTokens.projectRoot); constructor(private readonly log: Logger, private readonly resolve: RequireResolve, private readonly projectRoot: string) {} diff --git a/packages/jest-runner/src/index.ts b/packages/jest-runner/src/index.ts index df29bf5db9..0beb4f2947 100644 --- a/packages/jest-runner/src/index.ts +++ b/packages/jest-runner/src/index.ts @@ -1,6 +1,6 @@ import { declareFactoryPlugin, PluginKind } from '@stryker-mutator/api/plugin'; -import * as strykerValidationSchema from '../schema/jest-runner-options.json'; +import strykerValidationSchema from '../schema/jest-runner-options.json'; import { mixinJestEnvironment } from './jest-plugins'; import { jestTestRunnerFactory } from './jest-test-runner'; diff --git a/packages/jest-runner/src/jest-override-options.ts b/packages/jest-runner/src/jest-override-options.ts index c31ef93ac0..9df8f040c7 100644 --- a/packages/jest-runner/src/jest-override-options.ts +++ b/packages/jest-runner/src/jest-override-options.ts @@ -1,6 +1,6 @@ import type { Config } from '@jest/types'; -const JEST_OVERRIDE_OPTIONS: Readonly = Object.freeze({ +export const JEST_OVERRIDE_OPTIONS: Readonly = Object.freeze({ // Prevent the user from using his or her own testResultProcessor because this might // Mess with the way Stryker gets the results testResultsProcessor: undefined, @@ -20,5 +20,3 @@ const JEST_OVERRIDE_OPTIONS: Readonly = Object.freeze({ */ reporters: [], }); - -export default JEST_OVERRIDE_OPTIONS; diff --git a/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts b/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts index 6faec7c230..9a5fc1503b 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts @@ -3,7 +3,7 @@ import { JestRunResult } from '../jest-run-result'; import { JestTestAdapter, RunSettings } from './jest-test-adapter'; -export default class JestGreaterThan25Adapter implements JestTestAdapter { +export class JestGreaterThan25TestAdapter implements JestTestAdapter { public async run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern }: RunSettings): Promise { const config = JSON.stringify(jestConfig); const result = await jestWrapper.runCLI( diff --git a/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts b/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts index 3d7b361d1e..72a4820022 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts @@ -8,7 +8,7 @@ import { RunSettings, JestTestAdapter } from './jest-test-adapter'; * The adapter used for 22 < Jest < 25. * It has a lot of `any` typings here, since the installed typings are not in sync. */ -export default class JestLessThan25TestAdapter implements JestTestAdapter { +export class JestLessThan25TestAdapter implements JestTestAdapter { public run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern }: RunSettings): Promise { const config = JSON.stringify(jestConfig); return jest.runCLI( diff --git a/packages/jest-runner/src/jest-test-adapters/jest-test-adapter-factory.ts b/packages/jest-runner/src/jest-test-adapters/jest-test-adapter-factory.ts index ae28ba7222..60e33f6fa3 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-test-adapter-factory.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-test-adapter-factory.ts @@ -5,8 +5,8 @@ import semver from 'semver'; import { jestVersion } from '../plugin-tokens'; -import JestLessThan25TestAdapter from './jest-less-than-25-adapter'; -import JestGreaterThan25TestAdapter from './jest-greater-than-25-adapter'; +import { JestLessThan25TestAdapter } from './jest-less-than-25-adapter'; +import { JestGreaterThan25TestAdapter } from './jest-greater-than-25-adapter'; export function jestTestAdapterFactory(log: Logger, jestVersion: string, options: StrykerOptions, injector: Injector) { log.debug('Detected Jest version %s', jestVersion); diff --git a/packages/jest-runner/src/jest-test-runner.ts b/packages/jest-runner/src/jest-test-runner.ts index f65d36ee21..bea6442a6f 100644 --- a/packages/jest-runner/src/jest-test-runner.ts +++ b/packages/jest-runner/src/jest-test-runner.ts @@ -24,12 +24,12 @@ import { JestOptions } from '../src-generated/jest-runner-options'; import { jestTestAdapterFactory } from './jest-test-adapters'; import { JestTestAdapter, RunSettings } from './jest-test-adapters/jest-test-adapter'; -import JestConfigLoader from './config-loaders/jest-config-loader'; +import { JestConfigLoader } from './config-loaders/jest-config-loader'; import { withCoverageAnalysis } from './jest-plugins'; import * as pluginTokens from './plugin-tokens'; import { configLoaderFactory } from './config-loaders'; import { JestRunnerOptionsWithStrykerOptions } from './jest-runner-options-with-stryker-options'; -import JEST_OVERRIDE_OPTIONS from './jest-override-options'; +import { JEST_OVERRIDE_OPTIONS } from './jest-override-options'; import { mergeMutantCoverage, verifyAllTestFilesHaveCoverage } from './utils'; import { state } from './messaging'; @@ -49,7 +49,7 @@ export function createJestTestRunnerFactory(namespace: typeof INSTRUMENTER_CONST export const jestTestRunnerFactory = createJestTestRunnerFactory(); -export default class JestTestRunner implements TestRunner { +export class JestTestRunner implements TestRunner { private readonly jestConfig: jest.Config.InitialOptions; private readonly enableFindRelatedTests: boolean; diff --git a/packages/jest-runner/src/messaging.ts b/packages/jest-runner/src/messaging.ts index 96c56a6940..1d92a6b51e 100644 --- a/packages/jest-runner/src/messaging.ts +++ b/packages/jest-runner/src/messaging.ts @@ -8,14 +8,14 @@ class State { } public coverageAnalysis: CoverageAnalysis = 'off'; - private mutantCoverageHandler: MutantCoverageHandler; + private mutantCoverageHandler?: MutantCoverageHandler; public setMutantCoverageHandler(handler: MutantCoverageHandler) { this.mutantCoverageHandler = handler; } public handleMutantCoverage(fileName: string, coverage: MutantCoverage | undefined) { - this.mutantCoverageHandler(fileName, coverage); + this.mutantCoverageHandler!(fileName, coverage); } public resetMutantCoverageHandler() { diff --git a/packages/jest-runner/test/helpers/resolve-test-resource.ts b/packages/jest-runner/test/helpers/resolve-test-resource.ts index d7d5b726da..3c4e989904 100644 --- a/packages/jest-runner/test/helpers/resolve-test-resource.ts +++ b/packages/jest-runner/test/helpers/resolve-test-resource.ts @@ -1,3 +1,10 @@ import path from 'path'; -export const resolveTestResource: typeof path.resolve = path.resolve.bind(path, __dirname, '..' /* test */, '..' /* root */, 'testResources'); +export const resolveTestResource: typeof path.resolve = path.resolve.bind( + path, + __dirname, + '..' /* helpers */, + '..' /* test */, + '..' /* dist */, + 'testResources' +); diff --git a/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts b/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts index 37f402ab11..a69c7a3e0f 100644 --- a/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts +++ b/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts @@ -4,7 +4,7 @@ import { expect } from 'chai'; import { JestOptions } from '../../src-generated/jest-runner-options'; import { JestRunnerOptionsWithStrykerOptions } from '../../src/jest-runner-options-with-stryker-options'; -import JestTestRunner, { createJestTestRunnerFactory } from '../../src/jest-test-runner'; +import { JestTestRunner, createJestTestRunnerFactory } from '../../src/jest-test-runner'; import { createJestOptions } from '../helpers/producers'; import { resolveTestResource } from '../helpers/resolve-test-resource'; diff --git a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts index 131c006b3a..0984fd47cd 100644 --- a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts +++ b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import path from 'path'; import { platform } from 'os'; import { expect } from 'chai'; @@ -6,7 +6,7 @@ import { commonTokens } from '@stryker-mutator/api/plugin'; import { factory, testInjector, assertions } from '@stryker-mutator/test-helpers'; import { CompleteDryRunResult, TestStatus } from '@stryker-mutator/api/test-runner'; -import JestTestRunner, { jestTestRunnerFactory } from '../../src/jest-test-runner'; +import { JestTestRunner, jestTestRunnerFactory } from '../../src/jest-test-runner'; import { JestRunnerOptionsWithStrykerOptions } from '../../src/jest-runner-options-with-stryker-options'; import { JestOptions } from '../../src-generated/jest-runner-options'; import { createJestOptions } from '../helpers/producers'; @@ -14,7 +14,7 @@ import { resolveTestResource } from '../helpers/resolve-test-resource'; const paths = require('react-scripts-ts/config/paths'); // It's a bit hacky, but we need to tell create-react-app-ts to pick a different tsconfig.test.json -paths.appTsTestConfig = require.resolve('../../testResources/reactTsProject/tsconfig.test.json'); +paths.appTsTestConfig = resolveTestResource('reactTsProject/tsconfig.test.json'); // Needed for Jest in order to run tests process.env.BABEL_ENV = 'test'; diff --git a/packages/jest-runner/test/setup.ts b/packages/jest-runner/test/setup.ts index 1fb50781b3..b250aff294 100644 --- a/packages/jest-runner/test/setup.ts +++ b/packages/jest-runner/test/setup.ts @@ -2,7 +2,7 @@ import 'source-map-support/register'; import chai from 'chai'; import chaiAsPromised from 'chai-as-promised'; import sinonChai from 'sinon-chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { testInjector } from '@stryker-mutator/test-helpers'; import { state } from '../src/messaging'; diff --git a/packages/jest-runner/test/unit/config-loaders/config-loader-factory.spec.ts b/packages/jest-runner/test/unit/config-loaders/config-loader-factory.spec.ts index e9058a757e..a9b0f10973 100644 --- a/packages/jest-runner/test/unit/config-loaders/config-loader-factory.spec.ts +++ b/packages/jest-runner/test/unit/config-loaders/config-loader-factory.spec.ts @@ -1,29 +1,29 @@ import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import Sinon, * as sinon from 'sinon'; +import sinon from 'sinon'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { Config } from '@jest/types'; -import CustomJestConfigLoader, * as defaultJestConfigLoader from '../../../src/config-loaders/custom-jest-config-loader'; -import ReactScriptsJestConfigLoader, * as reactScriptsJestConfigLoader from '../../../src/config-loaders/react-scripts-jest-config-loader'; -import ReactScriptsTSJestConfigLoader, * as reactScriptsTSJestConfigLoader from '../../../src/config-loaders/react-scripts-ts-jest-config-loader'; +import * as customJestConfigLoader from '../../../src/config-loaders/custom-jest-config-loader'; +import * as reactScriptsJestConfigLoader from '../../../src/config-loaders/react-scripts-jest-config-loader'; +import * as reactScriptsTSJestConfigLoader from '../../../src/config-loaders/react-scripts-ts-jest-config-loader'; import { JestRunnerOptionsWithStrykerOptions } from '../../../src/jest-runner-options-with-stryker-options'; import { configLoaderFactory } from '../../../src/config-loaders'; describe(configLoaderFactory.name, () => { - let customConfigLoaderStub: Sinon.SinonStubbedInstance; - let reactScriptsJestConfigLoaderStub: Sinon.SinonStubbedInstance; - let reactScriptsTSJestConfigLoaderStub: Sinon.SinonStubbedInstance; + let customConfigLoaderStub: sinon.SinonStubbedInstance; + let reactScriptsJestConfigLoaderStub: sinon.SinonStubbedInstance; + let reactScriptsTSJestConfigLoaderStub: sinon.SinonStubbedInstance; let options: JestRunnerOptionsWithStrykerOptions; beforeEach(() => { - customConfigLoaderStub = sinon.createStubInstance(CustomJestConfigLoader); - reactScriptsJestConfigLoaderStub = sinon.createStubInstance(ReactScriptsJestConfigLoader); - reactScriptsTSJestConfigLoaderStub = sinon.createStubInstance(ReactScriptsTSJestConfigLoader); + customConfigLoaderStub = sinon.createStubInstance(customJestConfigLoader.CustomJestConfigLoader); + reactScriptsJestConfigLoaderStub = sinon.createStubInstance(reactScriptsJestConfigLoader.ReactScriptsJestConfigLoader); + reactScriptsTSJestConfigLoaderStub = sinon.createStubInstance(reactScriptsTSJestConfigLoader.ReactScriptsTSJestConfigLoader); - sinon.stub(defaultJestConfigLoader, 'default').returns(customConfigLoaderStub); - sinon.stub(reactScriptsJestConfigLoader, 'default').returns(reactScriptsJestConfigLoaderStub); - sinon.stub(reactScriptsTSJestConfigLoader, 'default').returns(reactScriptsTSJestConfigLoaderStub); + sinon.stub(customJestConfigLoader, 'CustomJestConfigLoader').returns(customConfigLoaderStub); + sinon.stub(reactScriptsJestConfigLoader, 'ReactScriptsJestConfigLoader').returns(reactScriptsJestConfigLoaderStub); + sinon.stub(reactScriptsTSJestConfigLoader, 'ReactScriptsTSJestConfigLoader').returns(reactScriptsTSJestConfigLoaderStub); const defaultOptions: Partial = { collectCoverage: true, diff --git a/packages/jest-runner/test/unit/config-loaders/custom-config-loader.spec.ts b/packages/jest-runner/test/unit/config-loaders/custom-config-loader.spec.ts index 42f1a5378c..33c65ae083 100644 --- a/packages/jest-runner/test/unit/config-loaders/custom-config-loader.spec.ts +++ b/packages/jest-runner/test/unit/config-loaders/custom-config-loader.spec.ts @@ -3,9 +3,9 @@ import path from 'path'; import { assert, expect } from 'chai'; import sinon from 'sinon'; -import { logger, strykerOptions } from '@stryker-mutator/test-helpers/src/factory'; +import { factory } from '@stryker-mutator/test-helpers'; -import CustomJestConfigLoader from '../../../src/config-loaders/custom-jest-config-loader'; +import { CustomJestConfigLoader } from '../../../src/config-loaders/custom-jest-config-loader'; describe(CustomJestConfigLoader.name, () => { let defaultConfigLoader: CustomJestConfigLoader; @@ -20,7 +20,7 @@ describe(CustomJestConfigLoader.name, () => { readFileSyncStub.returns('{ "jest": { "exampleProperty": "examplePackageJsonValue" }}'); requireStub.returns({ exampleProperty: 'exampleJestConfigValue' }); - defaultConfigLoader = new CustomJestConfigLoader(logger(), strykerOptions(), requireStub, projectRoot); + defaultConfigLoader = new CustomJestConfigLoader(factory.logger(), factory.strykerOptions(), requireStub, projectRoot); }); it('should load the Jest configuration from the jest.config.js in the project root', () => { diff --git a/packages/jest-runner/test/unit/config-loaders/default-config-loader.spec.ts b/packages/jest-runner/test/unit/config-loaders/default-config-loader.spec.ts index 99c3f20315..e7577481ed 100644 --- a/packages/jest-runner/test/unit/config-loaders/default-config-loader.spec.ts +++ b/packages/jest-runner/test/unit/config-loaders/default-config-loader.spec.ts @@ -3,9 +3,9 @@ import path from 'path'; import { assert, expect } from 'chai'; import sinon from 'sinon'; -import { logger, strykerOptions } from '@stryker-mutator/test-helpers/src/factory'; +import { factory } from '@stryker-mutator/test-helpers'; -import CustomJestConfigLoader from '../../../src/config-loaders/custom-jest-config-loader'; +import { CustomJestConfigLoader } from '../../../src/config-loaders/custom-jest-config-loader'; describe(`${CustomJestConfigLoader.name} integration`, () => { let sut: CustomJestConfigLoader; @@ -20,7 +20,7 @@ describe(`${CustomJestConfigLoader.name} integration`, () => { fsStub.readFileSync.returns('{ "jest": { "exampleProperty": "examplePackageJsonValue" }}'); requireStub.returns({ exampleProperty: 'exampleJestConfigValue' }); - sut = new CustomJestConfigLoader(logger(), strykerOptions(), requireStub, projectRoot); + sut = new CustomJestConfigLoader(factory.logger(), factory.strykerOptions(), requireStub, projectRoot); }); it('should load the Jest configuration from the jest.config.js in the projectroot', () => { diff --git a/packages/jest-runner/test/unit/config-loaders/react-scripts-jest-config-loader.spec.ts b/packages/jest-runner/test/unit/config-loaders/react-scripts-jest-config-loader.spec.ts index 96e14889d0..17ccfa226b 100644 --- a/packages/jest-runner/test/unit/config-loaders/react-scripts-jest-config-loader.spec.ts +++ b/packages/jest-runner/test/unit/config-loaders/react-scripts-jest-config-loader.spec.ts @@ -3,7 +3,7 @@ import path from 'path'; import { expect } from 'chai'; import sinon from 'sinon'; -import ReactScriptsJestConfigLoader from '../../../src/config-loaders/react-scripts-jest-config-loader'; +import { ReactScriptsJestConfigLoader } from '../../../src/config-loaders/react-scripts-jest-config-loader'; import * as helper from '../../../src/utils/create-react-jest-config'; describe(ReactScriptsJestConfigLoader.name, () => { diff --git a/packages/jest-runner/test/unit/config-loaders/react-scripts-ts-jest-config-loader.spec.ts b/packages/jest-runner/test/unit/config-loaders/react-scripts-ts-jest-config-loader.spec.ts index b2a17d46c4..3ef0b1bd08 100644 --- a/packages/jest-runner/test/unit/config-loaders/react-scripts-ts-jest-config-loader.spec.ts +++ b/packages/jest-runner/test/unit/config-loaders/react-scripts-ts-jest-config-loader.spec.ts @@ -6,7 +6,7 @@ import { factory } from '@stryker-mutator/test-helpers'; import { assert, expect } from 'chai'; import sinon from 'sinon'; -import ReactScriptsTSJestConfigLoader from '../../../src/config-loaders/react-scripts-ts-jest-config-loader'; +import { ReactScriptsTSJestConfigLoader } from '../../../src/config-loaders/react-scripts-ts-jest-config-loader'; import * as helper from '../../../src/utils/create-react-jest-config'; describe(ReactScriptsTSJestConfigLoader.name, () => { diff --git a/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts b/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts index 80fc7740b8..3f1a0e5828 100644 --- a/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts @@ -4,11 +4,11 @@ import sinon from 'sinon'; import { Config } from '@jest/types'; -import JestGreaterThan25Adapter from '../../../src/jest-test-adapters/jest-greater-than-25-adapter'; +import { JestGreaterThan25TestAdapter } from '../../../src/jest-test-adapters/jest-greater-than-25-adapter'; import { jestWrapper } from '../../../src/utils/jest-wrapper'; -describe(JestGreaterThan25Adapter.name, () => { - let sut: JestGreaterThan25Adapter; +describe(JestGreaterThan25TestAdapter.name, () => { + let sut: JestGreaterThan25TestAdapter; let runCLIStub: sinon.SinonStub; const projectRoot = '/path/to/project'; @@ -22,7 +22,7 @@ describe(JestGreaterThan25Adapter.name, () => { result: 'testResult', }); - sut = testInjector.injector.injectClass(JestGreaterThan25Adapter); + sut = testInjector.injector.injectClass(JestGreaterThan25TestAdapter); }); it('should call the runCLI method with the correct ---projectRoot', async () => { diff --git a/packages/jest-runner/test/unit/jest-test-adapters/jest-test-adapter-factory.spec.ts b/packages/jest-runner/test/unit/jest-test-adapters/jest-test-adapter-factory.spec.ts index 83446138ec..582d7140bb 100644 --- a/packages/jest-runner/test/unit/jest-test-adapters/jest-test-adapter-factory.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-adapters/jest-test-adapter-factory.spec.ts @@ -2,8 +2,8 @@ import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { JestTestAdapter, jestTestAdapterFactory } from '../../../src/jest-test-adapters'; -import JestGreaterThan25Adapter from '../../../src/jest-test-adapters/jest-greater-than-25-adapter'; -import JestLessThan25Adapter from '../../../src/jest-test-adapters/jest-less-than-25-adapter'; +import { JestGreaterThan25TestAdapter } from '../../../src/jest-test-adapters/jest-greater-than-25-adapter'; +import { JestLessThan25TestAdapter } from '../../../src/jest-test-adapters/jest-less-than-25-adapter'; import * as pluginTokens from '../../../src/plugin-tokens'; describe(jestTestAdapterFactory.name, () => { @@ -23,13 +23,13 @@ describe(jestTestAdapterFactory.name, () => { jestVersion = '25.0.0'; const testAdapter = act(); - expect(testAdapter).instanceOf(JestGreaterThan25Adapter); + expect(testAdapter).instanceOf(JestGreaterThan25TestAdapter); }); it('should return a JestLessThan25Adapter when the Jest version is higher or equal to 22.0.0, but less then 25', () => { jestVersion = '22.0.0'; const testAdapter = act(); - expect(testAdapter).instanceOf(JestLessThan25Adapter); + expect(testAdapter).instanceOf(JestLessThan25TestAdapter); }); it('should throw an error when the Jest version is lower than 22.0.0', () => { diff --git a/packages/jest-runner/test/unit/jest-test-runner.spec.ts b/packages/jest-runner/test/unit/jest-test-runner.spec.ts index 3aa5e6562f..2f4c6f31ea 100644 --- a/packages/jest-runner/test/unit/jest-test-runner.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-runner.spec.ts @@ -10,10 +10,10 @@ import { Config } from '@jest/types'; import { Task } from '@stryker-mutator/util'; import { JestTestAdapter } from '../../src/jest-test-adapters'; -import JestTestRunner from '../../src/jest-test-runner'; +import { JestTestRunner } from '../../src/jest-test-runner'; import * as producers from '../helpers/producers'; import * as pluginTokens from '../../src/plugin-tokens'; -import JestConfigLoader from '../../src/config-loaders/jest-config-loader'; +import { JestConfigLoader } from '../../src/config-loaders/jest-config-loader'; import { JestRunnerOptionsWithStrykerOptions } from '../../src/jest-runner-options-with-stryker-options'; import { JestRunResult } from '../../src/jest-run-result'; import { state } from '../../src/messaging'; diff --git a/packages/jest-runner/test/unit/utils/create-react-jest-config.spec.ts b/packages/jest-runner/test/unit/utils/create-react-jest-config.spec.ts index b73bf1e032..0684f6639d 100644 --- a/packages/jest-runner/test/unit/utils/create-react-jest-config.spec.ts +++ b/packages/jest-runner/test/unit/utils/create-react-jest-config.spec.ts @@ -1,5 +1,5 @@ import { assert, expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { createReactJestConfig, createReactTsJestConfig } from '../../../src/utils/create-react-jest-config'; diff --git a/packages/jest-runner/testResources/reactTsProject/src/registerServiceWorker.ts b/packages/jest-runner/testResources/reactTsProject/src/registerServiceWorker.ts index 11c4bc72ce..b079d1ffc0 100644 --- a/packages/jest-runner/testResources/reactTsProject/src/registerServiceWorker.ts +++ b/packages/jest-runner/testResources/reactTsProject/src/registerServiceWorker.ts @@ -19,7 +19,7 @@ const isLocalhost = Boolean( ) ); -export default function register() { +export function register() { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL( diff --git a/packages/jest-runner/tsconfig.src.json b/packages/jest-runner/tsconfig.src.json index a9e7c61a47..d67b495d7f 100644 --- a/packages/jest-runner/tsconfig.src.json +++ b/packages/jest-runner/tsconfig.src.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", - "esModuleInterop": true }, "include": [ "src", diff --git a/packages/jest-runner/tsconfig.test.json b/packages/jest-runner/tsconfig.test.json index fbd97e706a..18dc8dab75 100644 --- a/packages/jest-runner/tsconfig.test.json +++ b/packages/jest-runner/tsconfig.test.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", - "esModuleInterop": true, "types": [ "mocha", "node" @@ -20,4 +20,4 @@ "path": "../test-helpers/tsconfig.src.json" } ] -} \ No newline at end of file +} diff --git a/packages/karma-runner/.mocharc.jsonc b/packages/karma-runner/.mocharc.jsonc index 799f079d25..dfc8099c08 100644 --- a/packages/karma-runner/.mocharc.jsonc +++ b/packages/karma-runner/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": "test/setup.js", + "require": "dist/test/setup.js", "timeout": 10000 } diff --git a/packages/karma-runner/.npmignore b/packages/karma-runner/.npmignore index 9c775202ef..6c49bd2c64 100644 --- a/packages/karma-runner/.npmignore +++ b/packages/karma-runner/.npmignore @@ -1,12 +1,15 @@ -**/* -!*.d.ts -!bin/** -!src/** -!src-generated/*.d.ts -src/**/*.map -src/**/*.ts -!{src,src-generated}/**/*.d.ts -!schema/*.json -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/karma-runner/.nycrc.json b/packages/karma-runner/.nycrc.json index 404e2f0916..51ae892b53 100644 --- a/packages/karma-runner/.nycrc.json +++ b/packages/karma-runner/.nycrc.json @@ -7,5 +7,5 @@ "functions": 95, "statements": 95, "branches": 85, - "include": "src/**/*.js" + "include": "dist/src/**/*.js" } diff --git a/packages/karma-runner/.vscode/launch.json b/packages/karma-runner/.vscode/launch.json index fef31f0c4d..e9f7083141 100644 --- a/packages/karma-runner/.vscode/launch.json +++ b/packages/karma-runner/.vscode/launch.json @@ -8,13 +8,12 @@ "program": "${workspaceRoot}/../../node_modules/mocha/bin/_mocha", "args": [ "--no-timeout", - "${workspaceRoot}/test/unit/**/*.js" + "${workspaceRoot}/dist/test/unit/**/*.js" ], "cwd": "${workspaceFolder}", "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" @@ -29,12 +28,11 @@ "args": [ "--no-timeout", "--exit", - "${workspaceRoot}/test/integration/**/*.js" + "${workspaceRoot}/dist/test/integration/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/karma-runner/package.json b/packages/karma-runner/package.json index 2a4d1d756d..2b0cf8f499 100644 --- a/packages/karma-runner/package.json +++ b/packages/karma-runner/package.json @@ -2,12 +2,12 @@ "name": "@stryker-mutator/karma-runner", "version": "4.4.1", "description": "A plugin to use the karma test runner in Stryker, the JavaScript mutation testing framework", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "test": "nyc npm run test:all", "test:all": "npm run test:unit && npm run test:integration", - "test:unit": "mocha \"test/unit/**/*.js\"", - "test:integration": "mocha --timeout 60000 --exit \"test/integration/**/*.js\"", + "test:unit": "mocha \"dist/test/unit/**/*.js\"", + "test:integration": "mocha --timeout 60000 --exit \"dist/test/integration/**/*.js\"", "stryker": "node ../core/bin/stryker run" }, "repository": { diff --git a/packages/karma-runner/run-angular.d.ts b/packages/karma-runner/run-angular.d.ts deleted file mode 100644 index cb0ff5c3b5..0000000000 --- a/packages/karma-runner/run-angular.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/packages/karma-runner/src/index.ts b/packages/karma-runner/src/index.ts index 7c39bb26b2..5b57bdf4f8 100644 --- a/packages/karma-runner/src/index.ts +++ b/packages/karma-runner/src/index.ts @@ -1,8 +1,8 @@ import { declareClassPlugin, PluginKind } from '@stryker-mutator/api/plugin'; -import * as strykerValidationSchema from '../schema/karma-runner-options.json'; +import strykerValidationSchema from '../schema/karma-runner-options.json'; -import KarmaTestRunner from './karma-test-runner'; +import { KarmaTestRunner } from './karma-test-runner'; export const strykerPlugins = [declareClassPlugin(PluginKind.TestRunner, 'karma', KarmaTestRunner)]; export { strykerValidationSchema }; diff --git a/packages/karma-runner/src/karma-plugins/stryker-reporter.ts b/packages/karma-runner/src/karma-plugins/stryker-reporter.ts index 25552bbc49..7c11579e64 100644 --- a/packages/karma-runner/src/karma-plugins/stryker-reporter.ts +++ b/packages/karma-runner/src/karma-plugins/stryker-reporter.ts @@ -2,7 +2,7 @@ import { EventEmitter } from 'events'; import { DryRunStatus, TestResult, TestStatus } from '@stryker-mutator/api/test-runner'; import { MutantCoverage } from '@stryker-mutator/api/core'; -import * as karma from 'karma'; +import karma from 'karma'; export interface KarmaSpec { description: string; @@ -22,7 +22,7 @@ export interface KarmaSpec { * * i.e. use `public readonly onFoo = () => {}` instead of `onFoo() { }`. */ -export default class StrykerReporter extends EventEmitter implements karma.Reporter { +export class StrykerReporter extends EventEmitter implements karma.Reporter { public adapters: any[] = []; private constructor() { diff --git a/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts b/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts index f0d62e2088..0821fa4bcd 100644 --- a/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts +++ b/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import * as url from 'url'; +import path from 'path'; +import url from 'url'; import { RequestHandler } from 'express'; import { CoverageAnalysis, INSTRUMENTER_CONSTANTS } from '@stryker-mutator/api/core'; @@ -24,7 +24,7 @@ const SHOULD_REPORT_COVERAGE_FLAG = '__strykerShouldReportCoverage__'; const { ACTIVE_MUTANT, NAMESPACE, CURRENT_TEST_ID } = INSTRUMENTER_CONSTANTS; -export default class TestHooksMiddleware { +export class TestHooksMiddleware { private static _instance?: TestHooksMiddleware; private testFramework: 'mocha' | 'jasmine' | undefined; public currentTestHooks = ''; diff --git a/packages/karma-runner/src/karma-test-runner.ts b/packages/karma-runner/src/karma-test-runner.ts index 809ff498c8..e0264324e2 100644 --- a/packages/karma-runner/src/karma-test-runner.ts +++ b/packages/karma-runner/src/karma-test-runner.ts @@ -1,4 +1,4 @@ -import * as karma from 'karma'; +import karma from 'karma'; import { StrykerOptions, MutantCoverage } from '@stryker-mutator/api/core'; import { Logger, LoggerFactoryMethod } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; @@ -16,17 +16,17 @@ import { import { StrykerKarmaSetup } from '../src-generated/karma-runner-options'; import strykerKarmaConf = require('./starters/stryker-karma.conf'); -import ProjectStarter from './starters/project-starter'; -import StrykerReporter from './karma-plugins/stryker-reporter'; +import { ProjectStarter } from './starters/project-starter'; +import { StrykerReporter } from './karma-plugins/stryker-reporter'; import { KarmaRunnerOptionsWithStrykerOptions } from './karma-runner-options-with-stryker-options'; -import TestHooksMiddleware from './karma-plugins/test-hooks-middleware'; +import { TestHooksMiddleware } from './karma-plugins/test-hooks-middleware'; export interface ConfigOptions extends karma.ConfigOptions { detached?: boolean; } -export default class KarmaTestRunner implements TestRunner { - private currentTestResults: TestResult[]; +export class KarmaTestRunner implements TestRunner { + private currentTestResults: TestResult[] = []; private currentErrorMessage: string | undefined; private currentCoverageReport?: MutantCoverage; private readonly starter: ProjectStarter; diff --git a/packages/karma-runner/src/starters/angular-starter.ts b/packages/karma-runner/src/starters/angular-starter.ts index fcb1b14eb3..4885b986d7 100644 --- a/packages/karma-runner/src/starters/angular-starter.ts +++ b/packages/karma-runner/src/starters/angular-starter.ts @@ -1,8 +1,8 @@ -import * as path from 'path'; +import path from 'path'; import decamelize = require('decamelize'); import { Logger, LoggerFactoryMethod } from '@stryker-mutator/api/logging'; -import * as semver from 'semver'; +import semver from 'semver'; import { requireResolve } from '@stryker-mutator/util'; diff --git a/packages/karma-runner/src/starters/project-starter.ts b/packages/karma-runner/src/starters/project-starter.ts index 29d39bd61e..b227a88c86 100644 --- a/packages/karma-runner/src/starters/project-starter.ts +++ b/packages/karma-runner/src/starters/project-starter.ts @@ -5,7 +5,7 @@ import { StrykerKarmaSetup } from '../../src-generated/karma-runner-options'; import * as angularStarter from './angular-starter'; import * as karmaStarter from './karma-starter'; -export default class ProjectStarter { +export class ProjectStarter { constructor(private readonly getLogger: LoggerFactoryMethod, private readonly setup: StrykerKarmaSetup) {} public start() { if (this.setup.projectType === 'angular-cli') { diff --git a/packages/karma-runner/src/starters/stryker-karma.conf.ts b/packages/karma-runner/src/starters/stryker-karma.conf.ts index f3d14bc380..7ac948c0fc 100644 --- a/packages/karma-runner/src/starters/stryker-karma.conf.ts +++ b/packages/karma-runner/src/starters/stryker-karma.conf.ts @@ -1,11 +1,11 @@ -import * as path from 'path'; +import path from 'path'; import { Logger, LoggerFactoryMethod } from '@stryker-mutator/api/logging'; import { Config, ConfigOptions, ClientOptions, InlinePluginType } from 'karma'; import { noopLogger, requireResolve } from '@stryker-mutator/util'; -import StrykerReporter from '../karma-plugins/stryker-reporter'; -import TestHooksMiddleware, { TEST_HOOKS_FILE_NAME } from '../karma-plugins/test-hooks-middleware'; +import { StrykerReporter } from '../karma-plugins/stryker-reporter'; +import { TestHooksMiddleware, TEST_HOOKS_FILE_NAME } from '../karma-plugins/test-hooks-middleware'; function setDefaultOptions(config: Config) { config.set({ diff --git a/packages/karma-runner/test/helpers/resolve-test-resource.ts b/packages/karma-runner/test/helpers/resolve-test-resource.ts new file mode 100644 index 0000000000..b5cc5ecbb5 --- /dev/null +++ b/packages/karma-runner/test/helpers/resolve-test-resource.ts @@ -0,0 +1,10 @@ +import path = require('path'); + +export const resolveTestResource: typeof path.resolve = path.resolve.bind( + path, + __dirname, + '..' /* helpers */, + '..' /* test */, + '..' /* dist */, + 'testResources' +); diff --git a/packages/karma-runner/test/integration/instrumented.it.spec.ts b/packages/karma-runner/test/integration/instrumented.it.spec.ts index 842f9dd3d5..11f588a9eb 100644 --- a/packages/karma-runner/test/integration/instrumented.it.spec.ts +++ b/packages/karma-runner/test/integration/instrumented.it.spec.ts @@ -1,12 +1,11 @@ -import path = require('path'); - import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { KilledMutantRunResult, MutantRunStatus } from '@stryker-mutator/api/test-runner'; -import KarmaTestRunner from '../../src/karma-test-runner'; +import { KarmaTestRunner } from '../../src/karma-test-runner'; import { KarmaRunnerOptionsWithStrykerOptions } from '../../src/karma-runner-options-with-stryker-options'; -import StrykerReporter from '../../src/karma-plugins/stryker-reporter'; +import { StrykerReporter } from '../../src/karma-plugins/stryker-reporter'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; function createSut() { return testInjector.injector.injectClass(KarmaTestRunner); @@ -19,7 +18,7 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { before(async () => { (testInjector.options as KarmaRunnerOptionsWithStrykerOptions).karma = { projectType: 'custom', - configFile: path.resolve(__dirname, '..', '..', 'testResources', 'instrumented', 'karma-jasmine.conf.js'), + configFile: resolveTestResource('instrumented', 'karma-jasmine.conf.js'), }; sut = createSut(); await sut.init(); @@ -154,7 +153,7 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { before(async () => { (testInjector.options as KarmaRunnerOptionsWithStrykerOptions).karma = { projectType: 'custom', - configFile: path.resolve(__dirname, '..', '..', 'testResources', 'instrumented', 'karma-mocha.conf.js'), + configFile: resolveTestResource('instrumented', 'karma-mocha.conf.js'), }; sut = createSut(); await sut.init(); diff --git a/packages/karma-runner/test/integration/karma-test-runner.it.spec.ts b/packages/karma-runner/test/integration/karma-test-runner.it.spec.ts index ab72192f0e..d1d0f35d46 100644 --- a/packages/karma-runner/test/integration/karma-test-runner.it.spec.ts +++ b/packages/karma-runner/test/integration/karma-test-runner.it.spec.ts @@ -1,13 +1,13 @@ import { promisify } from 'util'; -import * as http from 'http'; +import http from 'http'; import { DryRunStatus, TestStatus, CompleteDryRunResult, TestResult, FailedTestResult } from '@stryker-mutator/api/test-runner'; import { testInjector, assertions, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { FilePattern } from 'karma'; -import KarmaTestRunner from '../../src/karma-test-runner'; -import StrykerReporter from '../../src/karma-plugins/stryker-reporter'; +import { KarmaTestRunner } from '../../src/karma-test-runner'; +import { StrykerReporter } from '../../src/karma-plugins/stryker-reporter'; function setOptions( files: ReadonlyArray = [ @@ -221,7 +221,8 @@ class DummyServer { } private async init(): Promise { - await promisify(this.httpServer.listen.bind(this.httpServer))(0, '0.0.0.0'); + const listen: (port: number, host: string) => Promise = promisify(this.httpServer.listen.bind(this.httpServer)); + await listen(0, '0.0.0.0'); } public dispose(): Promise { diff --git a/packages/karma-runner/test/integration/read-config.it.spec.ts b/packages/karma-runner/test/integration/read-config.it.spec.ts index 7271abc8f9..672b3fa17d 100644 --- a/packages/karma-runner/test/integration/read-config.it.spec.ts +++ b/packages/karma-runner/test/integration/read-config.it.spec.ts @@ -1,11 +1,10 @@ -import path = require('path'); - import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { TestStatus } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; -import KarmaTestRunner from '../../src/karma-test-runner'; -import StrykerReporter from '../../src/karma-plugins/stryker-reporter'; +import { KarmaTestRunner } from '../../src/karma-test-runner'; +import { StrykerReporter } from '../../src/karma-plugins/stryker-reporter'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('read config integration', () => { afterEach(() => { @@ -13,7 +12,7 @@ describe('read config integration', () => { }); it('should not override client options in a mocha project', async () => { testInjector.options.karma = { - configFile: path.resolve(__dirname, '..', '..', 'testResources', 'configs', 'mocha-client-options-karma.conf.js'), + configFile: resolveTestResource('configs', 'mocha-client-options-karma.conf.js'), }; const runner = testInjector.injector.injectClass(KarmaTestRunner); await runner.init(); @@ -29,7 +28,7 @@ describe('read config integration', () => { }); it('should not override client options in a jasmine project', async () => { testInjector.options.karma = { - configFile: path.resolve(__dirname, '..', '..', 'testResources', 'configs', 'jasmine-client-options-karma.conf.js'), + configFile: resolveTestResource('configs', 'jasmine-client-options-karma.conf.js'), }; const runner = testInjector.injector.injectClass(KarmaTestRunner); await runner.init(); diff --git a/packages/karma-runner/test/integration/sample.it.spec.ts b/packages/karma-runner/test/integration/sample.it.spec.ts index f7808e8bd7..c0a176d63a 100644 --- a/packages/karma-runner/test/integration/sample.it.spec.ts +++ b/packages/karma-runner/test/integration/sample.it.spec.ts @@ -1,12 +1,11 @@ -import * as path from 'path'; - import { TestStatus } from '@stryker-mutator/api/test-runner'; import { testInjector, assertions, factory } from '@stryker-mutator/test-helpers'; -import KarmaTestRunner from '../../src/karma-test-runner'; +import { KarmaTestRunner } from '../../src/karma-test-runner'; import { expectTestResults, TimelessTestResult } from '../helpers/assertions'; import { KarmaRunnerOptionsWithStrykerOptions } from '../../src/karma-runner-options-with-stryker-options'; -import StrykerReporter from '../../src/karma-plugins/stryker-reporter'; +import { StrykerReporter } from '../../src/karma-plugins/stryker-reporter'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('Sample project', () => { afterEach(() => { @@ -14,7 +13,7 @@ describe('Sample project', () => { }); it('should be able to run karma with jasmine', async () => { - testInjector.options.karma = { configFile: path.resolve(__dirname, '..', '..', 'testResources', 'sampleProject', 'karma-jasmine.conf.js') }; + testInjector.options.karma = { configFile: resolveTestResource('sampleProject', 'karma-jasmine.conf.js') }; const runner = testInjector.injector.injectClass(KarmaTestRunner); await runner.init(); const result = await runner.dryRun(factory.dryRunOptions()); @@ -63,7 +62,7 @@ describe('Sample project', () => { it('should be able to run karma with mocha', async () => { (testInjector.options as KarmaRunnerOptionsWithStrykerOptions).karma = { projectType: 'custom', - configFile: path.resolve(__dirname, '..', '..', 'testResources', 'sampleProject', 'karma-mocha.conf.js'), + configFile: resolveTestResource('sampleProject', 'karma-mocha.conf.js'), }; const runner = testInjector.injector.injectClass(KarmaTestRunner); diff --git a/packages/karma-runner/test/setup.ts b/packages/karma-runner/test/setup.ts index 9fa0e1dbfd..a0f70abdbb 100644 --- a/packages/karma-runner/test/setup.ts +++ b/packages/karma-runner/test/setup.ts @@ -1,8 +1,8 @@ import 'source-map-support/register'; import { testInjector } from '@stryker-mutator/test-helpers'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinonChai from 'sinon-chai'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinonChai from 'sinon-chai'; import sinon = require('sinon'); diff --git a/packages/karma-runner/test/unit/karma-plugins/stryker-reporter.spec.ts b/packages/karma-runner/test/unit/karma-plugins/stryker-reporter.spec.ts index 07d85d58cc..bcbc68e07d 100644 --- a/packages/karma-runner/test/unit/karma-plugins/stryker-reporter.spec.ts +++ b/packages/karma-runner/test/unit/karma-plugins/stryker-reporter.spec.ts @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { TestResults } from 'karma'; import { MutantCoverage } from '@stryker-mutator/api/core'; -import StrykerReporter, { KarmaSpec } from '../../../src/karma-plugins/stryker-reporter'; +import { StrykerReporter, KarmaSpec } from '../../../src/karma-plugins/stryker-reporter'; describe('StrykerReporter', () => { let sut: StrykerReporter; diff --git a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts index ac20fea0e9..b132647a12 100644 --- a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts +++ b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts @@ -5,7 +5,7 @@ import { factory } from '@stryker-mutator/test-helpers'; import { Request, NextFunction, Response } from 'express'; import sinon = require('sinon'); -import TestHooksMiddleware, { TEST_HOOKS_FILE_NAME } from '../../../src/karma-plugins/test-hooks-middleware'; +import { TestHooksMiddleware, TEST_HOOKS_FILE_NAME } from '../../../src/karma-plugins/test-hooks-middleware'; describe(TestHooksMiddleware.name, () => { let sut: TestHooksMiddleware; diff --git a/packages/karma-runner/test/unit/karma-test-runner.spec.ts b/packages/karma-runner/test/unit/karma-test-runner.spec.ts index 632078b082..950bca803b 100644 --- a/packages/karma-runner/test/unit/karma-test-runner.spec.ts +++ b/packages/karma-runner/test/unit/karma-test-runner.spec.ts @@ -5,18 +5,18 @@ import { commonTokens } from '@stryker-mutator/api/plugin'; import { DryRunStatus } from '@stryker-mutator/api/test-runner'; import { testInjector, assertions, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import * as karma from 'karma'; -import * as sinon from 'sinon'; +import karma from 'karma'; +import sinon from 'sinon'; import strykerKarmaConf = require('../../src/starters/stryker-karma.conf'); -import KarmaTestRunner from '../../src/karma-test-runner'; -import ProjectStarter, * as projectStarterModule from '../../src/starters/project-starter'; +import { KarmaTestRunner } from '../../src/karma-test-runner'; +import * as projectStarter from '../../src/starters/project-starter'; import { StrykerKarmaSetup, NgConfigOptions } from '../../src-generated/karma-runner-options'; -import StrykerReporter from '../../src/karma-plugins/stryker-reporter'; -import TestHooksMiddleware from '../../src/karma-plugins/test-hooks-middleware'; +import { StrykerReporter } from '../../src/karma-plugins/stryker-reporter'; +import { TestHooksMiddleware } from '../../src/karma-plugins/test-hooks-middleware'; describe(KarmaTestRunner.name, () => { - let projectStarterMock: sinon.SinonStubbedInstance; + let projectStarterMock: sinon.SinonStubbedInstance; let setGlobalsStub: sinon.SinonStub; let reporterMock: EventEmitter; let karmaRunStub: sinon.SinonStub; @@ -25,9 +25,9 @@ describe(KarmaTestRunner.name, () => { beforeEach(() => { reporterMock = new EventEmitter(); - projectStarterMock = sinon.createStubInstance(ProjectStarter); + projectStarterMock = sinon.createStubInstance(projectStarter.ProjectStarter); testHooksMiddlewareMock = sinon.createStubInstance(TestHooksMiddleware); - sinon.stub(projectStarterModule, 'default').returns(projectStarterMock); + sinon.stub(projectStarter, 'ProjectStarter').returns(projectStarterMock); sinon.stub(StrykerReporter, 'instance').value(reporterMock); setGlobalsStub = sinon.stub(strykerKarmaConf, 'setGlobals'); karmaRunStub = sinon.stub(karma.runner, 'run'); @@ -65,7 +65,7 @@ describe(KarmaTestRunner.name, () => { }); expect(testInjector.logger.warn).not.called; - expect(projectStarterModule.default).calledWith(sinon.match.func, expectedSetup); + expect(projectStarter.ProjectStarter).calledWith(sinon.match.func, expectedSetup); }); it('should run ng test with parameters from stryker options', () => { const ngConfig: NgConfigOptions = {}; @@ -88,7 +88,7 @@ describe(KarmaTestRunner.name, () => { karmaConfigFile: expectedSetup.configFile, }); expect(testInjector.logger.warn).not.called; - expect(projectStarterModule.default).calledWith(sinon.match.func, expectedSetup); + expect(projectStarter.ProjectStarter).calledWith(sinon.match.func, expectedSetup); }); describe('init', () => { diff --git a/packages/karma-runner/test/unit/starters/angular-starter.spec.ts b/packages/karma-runner/test/unit/starters/angular-starter.spec.ts index 3320cdc3fd..f6a77ff5d4 100644 --- a/packages/karma-runner/test/unit/starters/angular-starter.spec.ts +++ b/packages/karma-runner/test/unit/starters/angular-starter.spec.ts @@ -2,7 +2,7 @@ import { LoggerFactoryMethod } from '@stryker-mutator/api/logging'; import { testInjector } from '@stryker-mutator/test-helpers'; import * as utils from '@stryker-mutator/util'; import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import * as sut from '../../../src/starters/angular-starter'; diff --git a/packages/karma-runner/test/unit/starters/stryker-karma.conf.spec.ts b/packages/karma-runner/test/unit/starters/stryker-karma.conf.spec.ts index 4a9b73e6e1..cf3ffad9b3 100644 --- a/packages/karma-runner/test/unit/starters/stryker-karma.conf.spec.ts +++ b/packages/karma-runner/test/unit/starters/stryker-karma.conf.spec.ts @@ -1,14 +1,14 @@ -import * as path from 'path'; +import path from 'path'; import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { Config, ConfigOptions, ClientOptions } from 'karma'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import * as utils from '@stryker-mutator/util'; import sut = require('../../../src/starters/stryker-karma.conf'); -import StrykerReporter from '../../../src/karma-plugins/stryker-reporter'; -import TestHooksMiddleware, { TEST_HOOKS_FILE_NAME } from '../../../src/karma-plugins/test-hooks-middleware'; +import { StrykerReporter } from '../../../src/karma-plugins/stryker-reporter'; +import { TestHooksMiddleware, TEST_HOOKS_FILE_NAME } from '../../../src/karma-plugins/test-hooks-middleware'; describe('stryker-karma.conf.js', () => { let getLogger: sinon.SinonStub; diff --git a/packages/karma-runner/tsconfig.src.json b/packages/karma-runner/tsconfig.src.json index d43ba622eb..59dc99aaa2 100644 --- a/packages/karma-runner/tsconfig.src.json +++ b/packages/karma-runner/tsconfig.src.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "noImplicitThis": true, "types": [ diff --git a/packages/karma-runner/tsconfig.test.json b/packages/karma-runner/tsconfig.test.json index 9382313549..7d06722e9c 100644 --- a/packages/karma-runner/tsconfig.test.json +++ b/packages/karma-runner/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "types": [ "karma", diff --git a/packages/mocha-runner/.mocharc.jsonc b/packages/mocha-runner/.mocharc.jsonc index 799f079d25..dfc8099c08 100644 --- a/packages/mocha-runner/.mocharc.jsonc +++ b/packages/mocha-runner/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": "test/setup.js", + "require": "dist/test/setup.js", "timeout": 10000 } diff --git a/packages/mocha-runner/.npmignore b/packages/mocha-runner/.npmignore index 6d23c7107f..6c49bd2c64 100644 --- a/packages/mocha-runner/.npmignore +++ b/packages/mocha-runner/.npmignore @@ -1,11 +1,15 @@ -**/* -!*.d.ts -!bin/** -!src/** -src/**/*.map -src/**/*.ts -!{src,src-generated}/**/*.d.ts -!schema/*.json -!readme.md -!LICENSE -!CHANGELOG.md \ No newline at end of file +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/mocha-runner/.nycrc.json b/packages/mocha-runner/.nycrc.json index 57ff700bda..68864c7bff 100644 --- a/packages/mocha-runner/.nycrc.json +++ b/packages/mocha-runner/.nycrc.json @@ -7,5 +7,5 @@ "functions": 80, "statements": 80, "branches": 75, - "include": "src/**/*.js" + "include": "dist/src/**/*.js" } diff --git a/packages/mocha-runner/.vscode/launch.json b/packages/mocha-runner/.vscode/launch.json index 3d691d6e1e..78937dc2ee 100644 --- a/packages/mocha-runner/.vscode/launch.json +++ b/packages/mocha-runner/.vscode/launch.json @@ -13,13 +13,12 @@ "--timeout", "999999", "--colors", - "${workspaceFolder}/test/helpers/**/*.js", - "${workspaceFolder}/test/unit/**/*.js" + "${workspaceFolder}/dist/test/helpers/**/*.js", + "${workspaceFolder}/dist/test/unit/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" @@ -34,13 +33,12 @@ "--timeout", "999999", "--colors", - "${workspaceFolder}/test/helpers/**/*.js", - "${workspaceFolder}/test/integration/**/*.js" + "${workspaceFolder}/dist/test/helpers/**/*.js", + "${workspaceFolder}/dist/test/integration/**/*.js" ], "internalConsoleOptions": "openOnSessionStart", "outFiles": [ - "${workspaceRoot}/test/**/*.js", - "${workspaceRoot}/src/**/*.js" + "${workspaceRoot}/dist/**/*.js" ], "skipFiles": [ "/**" diff --git a/packages/mocha-runner/package.json b/packages/mocha-runner/package.json index 456ebc3621..a2c66e5e0e 100644 --- a/packages/mocha-runner/package.json +++ b/packages/mocha-runner/package.json @@ -2,12 +2,12 @@ "name": "@stryker-mutator/mocha-runner", "version": "4.4.1", "description": "A plugin to use the mocha test runner in Stryker, the JavaScript mutation testing framework", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "test": "nyc npm run test:all", "test:all": "npm run test:unit && npm run test:integration", - "test:unit": "mocha 'test/unit/**/*.js'", - "test:integration": "mocha --no-timeout 'test/integration/**/*.js'", + "test:unit": "mocha 'dist/test/unit/**/*.js'", + "test:integration": "mocha --no-timeout 'dist/test/integration/**/*.js'", "stryker": "node ../core/bin/stryker run" }, "repository": { diff --git a/packages/mocha-runner/src/index.ts b/packages/mocha-runner/src/index.ts index 8277bb66a7..1ff936d619 100644 --- a/packages/mocha-runner/src/index.ts +++ b/packages/mocha-runner/src/index.ts @@ -1,6 +1,6 @@ import { declareFactoryPlugin, PluginKind } from '@stryker-mutator/api/plugin'; -import * as strykerValidationSchema from '../schema/mocha-runner-options.json'; +import strykerValidationSchema from '../schema/mocha-runner-options.json'; import { createMochaTestRunner, createMochaTestRunnerFactory } from './mocha-runner-factories'; import { MochaTestRunner } from './mocha-test-runner'; diff --git a/packages/mocha-runner/src/lib-wrapper.ts b/packages/mocha-runner/src/lib-wrapper.ts index aa9596575d..11214db8d6 100644 --- a/packages/mocha-runner/src/lib-wrapper.ts +++ b/packages/mocha-runner/src/lib-wrapper.ts @@ -1,6 +1,6 @@ import path = require('path'); -import * as Mocha from 'mocha'; +import Mocha from 'mocha'; import glob = require('glob'); import { MochaOptions } from '../src-generated/mocha-runner-options'; @@ -41,7 +41,7 @@ try { /** * Wraps Mocha class and require for testability */ -export default class LibWrapper { +export class LibWrapper { public static Mocha = Mocha; public static require = require; public static glob = glob.sync; diff --git a/packages/mocha-runner/src/mocha-adapter.ts b/packages/mocha-runner/src/mocha-adapter.ts index 8990e317df..6d8345e73e 100644 --- a/packages/mocha-runner/src/mocha-adapter.ts +++ b/packages/mocha-runner/src/mocha-adapter.ts @@ -7,7 +7,7 @@ import { PropertyPathBuilder } from '@stryker-mutator/util'; import { MochaOptions, MochaRunnerOptions } from '../src-generated/mocha-runner-options'; -import LibWrapper from './lib-wrapper'; +import { LibWrapper } from './lib-wrapper'; import { MochaTestRunner } from './mocha-test-runner'; const DEFAULT_TEST_PATTERN = 'test/**/*.js'; diff --git a/packages/mocha-runner/src/mocha-options-loader.ts b/packages/mocha-runner/src/mocha-options-loader.ts index ad19913d2c..f0947e8720 100644 --- a/packages/mocha-runner/src/mocha-options-loader.ts +++ b/packages/mocha-runner/src/mocha-options-loader.ts @@ -1,5 +1,5 @@ -import * as fs from 'fs'; -import * as path from 'path'; +import fs from 'fs'; +import path from 'path'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; @@ -7,7 +7,7 @@ import { PropertyPathBuilder } from '@stryker-mutator/util'; import { MochaOptions, MochaRunnerOptions } from '../src-generated/mocha-runner-options'; -import LibWrapper from './lib-wrapper'; +import { LibWrapper } from './lib-wrapper'; import { filterConfig, serializeMochaLoadOptionsArguments } from './utils'; import { MochaRunnerWithStrykerOptions } from './mocha-runner-with-stryker-options'; @@ -29,7 +29,7 @@ export const DEFAULT_MOCHA_OPTIONS: Readonly = Object.freeze({ 'async-only': false, }); -export default class MochaOptionsLoader { +export class MochaOptionsLoader { public static inject = tokens(commonTokens.logger); constructor(private readonly log: Logger) {} diff --git a/packages/mocha-runner/src/mocha-runner-factories.ts b/packages/mocha-runner/src/mocha-runner-factories.ts index 20d7c84b71..ea83b8754f 100644 --- a/packages/mocha-runner/src/mocha-runner-factories.ts +++ b/packages/mocha-runner/src/mocha-runner-factories.ts @@ -3,7 +3,7 @@ import { commonTokens, Injector, PluginContext, tokens } from '@stryker-mutator/ import { DirectoryRequireCache } from '@stryker-mutator/util'; import { MochaAdapter } from './mocha-adapter'; -import MochaOptionsLoader from './mocha-options-loader'; +import { MochaOptionsLoader } from './mocha-options-loader'; import { MochaTestRunner } from './mocha-test-runner'; import * as pluginTokens from './plugin-tokens'; diff --git a/packages/mocha-runner/src/mocha-test-runner.ts b/packages/mocha-runner/src/mocha-test-runner.ts index 4cbfa16299..a99ce9bbad 100644 --- a/packages/mocha-runner/src/mocha-test-runner.ts +++ b/packages/mocha-runner/src/mocha-test-runner.ts @@ -19,11 +19,11 @@ import { MochaOptions } from '../src-generated/mocha-runner-options'; import { StrykerMochaReporter } from './stryker-mocha-reporter'; import { MochaRunnerWithStrykerOptions } from './mocha-runner-with-stryker-options'; import * as pluginTokens from './plugin-tokens'; -import MochaOptionsLoader from './mocha-options-loader'; +import { MochaOptionsLoader } from './mocha-options-loader'; import { MochaAdapter } from './mocha-adapter'; export class MochaTestRunner implements TestRunner { - public testFileNames: string[]; + public testFileNames?: string[]; public rootHooks: any; public mochaOptions!: MochaOptions; private readonly instrumenterContext: InstrumenterContext; @@ -136,7 +136,7 @@ export class MochaTestRunner implements TestRunner { } private addFiles(mocha: Mocha) { - this.testFileNames.forEach((fileName) => { + this.testFileNames?.forEach((fileName) => { mocha.addFile(fileName); }); } diff --git a/packages/mocha-runner/src/stryker-mocha-reporter.ts b/packages/mocha-runner/src/stryker-mocha-reporter.ts index ac3a048f9e..000411c36b 100644 --- a/packages/mocha-runner/src/stryker-mocha-reporter.ts +++ b/packages/mocha-runner/src/stryker-mocha-reporter.ts @@ -2,7 +2,7 @@ import { Logger } from '@stryker-mutator/api/logging'; import { FailedTestResult, TestResult, SuccessTestResult, TestStatus } from '@stryker-mutator/api/test-runner'; import { I } from '@stryker-mutator/util'; -import Timer from './timer'; +import { Timer } from './timer'; export class StrykerMochaReporter { /* @@ -13,7 +13,7 @@ export class StrykerMochaReporter { public static log: Logger | undefined; private readonly timer = new Timer(); private passedCount = 0; - public tests: TestResult[]; + public tests: TestResult[] = []; public static currentInstance: I | undefined; diff --git a/packages/mocha-runner/src/timer.ts b/packages/mocha-runner/src/timer.ts index f992ae8999..d11ea885be 100644 --- a/packages/mocha-runner/src/timer.ts +++ b/packages/mocha-runner/src/timer.ts @@ -1,7 +1,7 @@ // A test can mock away the 'real' Date class. Capture it while we still can. const RealDate = Date; -export default class Timer { - private start: Date; +export class Timer { + private start!: Date; constructor() { this.reset(); diff --git a/packages/mocha-runner/test/helpers/resolve-test-resource.ts b/packages/mocha-runner/test/helpers/resolve-test-resource.ts new file mode 100644 index 0000000000..b5cc5ecbb5 --- /dev/null +++ b/packages/mocha-runner/test/helpers/resolve-test-resource.ts @@ -0,0 +1,10 @@ +import path = require('path'); + +export const resolveTestResource: typeof path.resolve = path.resolve.bind( + path, + __dirname, + '..' /* helpers */, + '..' /* test */, + '..' /* dist */, + 'testResources' +); diff --git a/packages/mocha-runner/test/integration/memory-leak.it.spec.ts b/packages/mocha-runner/test/integration/memory-leak.it.spec.ts index efbf6d9656..ce3d7da0dc 100644 --- a/packages/mocha-runner/test/integration/memory-leak.it.spec.ts +++ b/packages/mocha-runner/test/integration/memory-leak.it.spec.ts @@ -1,7 +1,6 @@ import path = require('path'); import execa = require('execa'); - import { expect } from 'chai'; import { MochaTestRunner } from '../../src'; diff --git a/packages/mocha-runner/test/integration/memory-leak.worker.ts b/packages/mocha-runner/test/integration/memory-leak.worker.ts index 98bc9b3a21..ca63334f1e 100644 --- a/packages/mocha-runner/test/integration/memory-leak.worker.ts +++ b/packages/mocha-runner/test/integration/memory-leak.worker.ts @@ -1,11 +1,10 @@ -import path = require('path'); - import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { DryRunStatus, TestStatus } from '@stryker-mutator/api/test-runner'; import { createMochaTestRunnerFactory } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; /** * This file will run the mocha runner a number of times in a test suite that is designed @@ -25,7 +24,7 @@ if (require.main === module) { } async function main() { - process.chdir(path.resolve(__dirname, '..', '..', 'testResources', 'big-project')); + process.chdir(resolveTestResource('big-project')); testInjector.options.mochaOptions = { 'no-config': true }; const mochaRunner = testInjector.injector.injectFunction(createMochaTestRunnerFactory('__stryker2__')); diff --git a/packages/mocha-runner/test/integration/mocha-file-resolving.it.spec.ts b/packages/mocha-runner/test/integration/mocha-file-resolving.it.spec.ts index 32fc15f6e4..436f947329 100644 --- a/packages/mocha-runner/test/integration/mocha-file-resolving.it.spec.ts +++ b/packages/mocha-runner/test/integration/mocha-file-resolving.it.spec.ts @@ -1,11 +1,10 @@ -import * as path from 'path'; - import { expect } from 'chai'; import { testInjector } from '@stryker-mutator/test-helpers'; -import MochaOptionsLoader from '../../src/mocha-options-loader'; +import { MochaOptionsLoader } from '../../src/mocha-options-loader'; import { MochaRunnerWithStrykerOptions } from '../../src/mocha-runner-with-stryker-options'; import { createMochaTestRunnerFactory } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('Mocha 6 file resolving integration', () => { let options: MochaRunnerWithStrykerOptions; @@ -38,6 +37,6 @@ describe('Mocha 6 file resolving integration', () => { } function resolveTestDir(fileName = '.') { - return path.resolve(__dirname, '..', '..', 'testResources', 'file-resolving', fileName); + return resolveTestResource('file-resolving', fileName); } }); diff --git a/packages/mocha-runner/test/integration/mocha-options-loader.it.spec.ts b/packages/mocha-runner/test/integration/mocha-options-loader.it.spec.ts index 967ccdc241..e81e0f412c 100644 --- a/packages/mocha-runner/test/integration/mocha-options-loader.it.spec.ts +++ b/packages/mocha-runner/test/integration/mocha-options-loader.it.spec.ts @@ -1,11 +1,10 @@ -import * as path from 'path'; - import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { MochaOptions } from '../../src-generated/mocha-runner-options'; -import MochaOptionsLoader, { DEFAULT_MOCHA_OPTIONS } from '../../src/mocha-options-loader'; +import { MochaOptionsLoader, DEFAULT_MOCHA_OPTIONS } from '../../src/mocha-options-loader'; import { MochaRunnerWithStrykerOptions } from '../../src/mocha-runner-with-stryker-options'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe(`${MochaOptionsLoader.name} integration`, () => { let sut: MochaOptionsLoader; @@ -109,7 +108,7 @@ describe(`${MochaOptionsLoader.name} integration`, () => { }); function resolveMochaConfig(relativeName: string) { - return path.resolve(__dirname, '..', '..', 'testResources', 'mocha-config', relativeName); + return resolveTestResource('mocha-config', relativeName); } function actLoad(mochaConfig: MochaOptions): MochaOptions { diff --git a/packages/mocha-runner/test/integration/project-with-root-hooks.it.spec.ts b/packages/mocha-runner/test/integration/project-with-root-hooks.it.spec.ts index e2995d1308..1d7eeac88b 100644 --- a/packages/mocha-runner/test/integration/project-with-root-hooks.it.spec.ts +++ b/packages/mocha-runner/test/integration/project-with-root-hooks.it.spec.ts @@ -1,24 +1,23 @@ -import * as path from 'path'; - import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; -import { expectCompleted } from '@stryker-mutator/test-helpers/src/assertions'; +import { assertions } from '@stryker-mutator/test-helpers'; import { createMochaTestRunnerFactory, MochaTestRunner } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('Running a project with root hooks', () => { let sut: MochaTestRunner; beforeEach(async () => { - process.chdir(path.resolve(__dirname, '..', '..', 'testResources', 'parallel-with-root-hooks-sample')); + process.chdir(resolveTestResource('parallel-with-root-hooks-sample')); sut = testInjector.injector.injectFunction(createMochaTestRunnerFactory('__stryker2__')); await sut.init(); }); it('should have run the root hooks', async () => { const result = await sut.dryRun(factory.dryRunOptions({})); - expectCompleted(result); + assertions.expectCompleted(result); expect(result.tests).has.lengthOf(2); }); }); diff --git a/packages/mocha-runner/test/integration/qunit-sample.it.spec.ts b/packages/mocha-runner/test/integration/qunit-sample.it.spec.ts index 46deca5e85..63786cc540 100644 --- a/packages/mocha-runner/test/integration/qunit-sample.it.spec.ts +++ b/packages/mocha-runner/test/integration/qunit-sample.it.spec.ts @@ -1,10 +1,9 @@ -import * as path from 'path'; - import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { createMochaOptions } from '../helpers/factories'; import { createMochaTestRunnerFactory } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('QUnit sample', () => { function createSut() { @@ -14,7 +13,7 @@ describe('QUnit sample', () => { it('should work when configured with "qunit" ui', async () => { const mochaOptions = createMochaOptions({ require: [], - spec: [resolve('./testResources/qunit-sample/MyMathSpec.js')], + spec: [resolveTestResource('qunit-sample', 'MyMathSpec.js')], ui: 'qunit', }); testInjector.options.mochaOptions = mochaOptions; @@ -33,7 +32,7 @@ describe('QUnit sample', () => { it('should not run tests when not configured with "qunit" ui', async () => { testInjector.options.mochaOptions = createMochaOptions({ - files: [resolve('./testResources/qunit-sample/MyMathSpec.js')], + files: [resolveTestResource('qunit-sample', 'MyMathSpec.js')], }); const sut = createSut(); await sut.init(); @@ -42,7 +41,3 @@ describe('QUnit sample', () => { expect(actualResult.tests).lengthOf(0); }); }); - -function resolve(fileName: string) { - return path.resolve(__dirname, '..', '..', fileName); -} diff --git a/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts b/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts index d9faf12a2b..394bc7b114 100644 --- a/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts +++ b/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts @@ -1,23 +1,18 @@ -import path = require('path'); - import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import { MutantCoverage } from '@stryker-mutator/api/core'; import { MochaTestRunner, createMochaTestRunnerFactory } from '../../src'; import { createMochaOptions } from '../helpers/factories'; - -function resolve(fileName: string) { - return path.resolve(__dirname, '..', '..', fileName); -} +import { resolveTestResource } from '../helpers/resolve-test-resource'; describe('Running an instrumented project', () => { let sut: MochaTestRunner; beforeEach(async () => { const spec = [ - resolve('./testResources/sample-project-instrumented/MyMath.js'), - resolve('./testResources/sample-project-instrumented/MyMathSpec.js'), + resolveTestResource('sample-project-instrumented', 'MyMath.js'), + resolveTestResource('sample-project-instrumented', 'MyMathSpec.js'), ]; testInjector.options.mochaOptions = createMochaOptions({ spec }); sut = testInjector.injector.injectFunction(createMochaTestRunnerFactory('__stryker2__')); diff --git a/packages/mocha-runner/test/integration/sample-project.it.spec.ts b/packages/mocha-runner/test/integration/sample-project.it.spec.ts index d2180f290d..315ac09bf6 100644 --- a/packages/mocha-runner/test/integration/sample-project.it.spec.ts +++ b/packages/mocha-runner/test/integration/sample-project.it.spec.ts @@ -1,21 +1,16 @@ -import * as path from 'path'; - import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import { TestResult, CompleteDryRunResult, TestStatus } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; import { createMochaOptions } from '../helpers/factories'; import { createMochaTestRunnerFactory, MochaTestRunner } from '../../src'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; const countTests = (runResult: CompleteDryRunResult, predicate: (result: TestResult) => boolean) => runResult.tests.filter(predicate).length; const countSucceeded = (runResult: CompleteDryRunResult) => countTests(runResult, (t) => t.status === TestStatus.Success); const countFailed = (runResult: CompleteDryRunResult) => countTests(runResult, (t) => t.status === TestStatus.Failed); -function resolve(fileName: string) { - return path.resolve(__dirname, '..', '..', fileName); -} - describe('Running a sample project', () => { let sut: MochaTestRunner; let spec: string[]; @@ -26,7 +21,7 @@ describe('Running a sample project', () => { describe('when tests pass', () => { beforeEach(() => { - spec = [resolve('./testResources/sample-project/MyMath.js'), resolve('./testResources/sample-project/MyMathSpec.js')]; + spec = [resolveTestResource('sample-project', 'MyMath.js'), resolveTestResource('sample-project', 'MyMathSpec.js')]; testInjector.options.mochaOptions = createMochaOptions({ spec }); sut = createSut(); return sut.init(); @@ -50,7 +45,7 @@ describe('Running a sample project', () => { describe('with an error in an un-included input file', () => { beforeEach(() => { - spec = [resolve('testResources/sample-project/MyMath.js'), resolve('testResources/sample-project/MyMathSpec.js')]; + spec = [resolveTestResource('sample-project', 'MyMath.js'), resolveTestResource('sample-project', 'MyMathSpec.js')]; testInjector.options.mochaOptions = createMochaOptions({ files: spec, }); @@ -66,7 +61,7 @@ describe('Running a sample project', () => { describe('with multiple failed tests', () => { before(() => { - spec = [resolve('testResources/sample-project/MyMath.js'), resolve('testResources/sample-project/MyMathFailedSpec.js')]; + spec = [resolveTestResource('sample-project', 'MyMath.js'), resolveTestResource('sample-project', 'MyMathFailedSpec.js')]; testInjector.options.mochaOptions = createMochaOptions({ spec }); sut = createSut(); return sut.init(); @@ -81,7 +76,7 @@ describe('Running a sample project', () => { describe('when no tests are executed', () => { beforeEach(() => { - spec = [resolve('./testResources/sample-project/MyMath.js')]; + spec = [resolveTestResource('sample-project', 'MyMath.js')]; testInjector.options.mochaOptions = createMochaOptions({ spec }); sut = createSut(); return sut.init(); diff --git a/packages/mocha-runner/test/setup.ts b/packages/mocha-runner/test/setup.ts index a65c845b2a..7722633ca2 100644 --- a/packages/mocha-runner/test/setup.ts +++ b/packages/mocha-runner/test/setup.ts @@ -1,8 +1,8 @@ import 'source-map-support/register'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinon from 'sinon'; -import * as sinonChai from 'sinon-chai'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinon from 'sinon'; +import sinonChai from 'sinon-chai'; import { testInjector } from '@stryker-mutator/test-helpers'; import { StrykerMochaReporter } from '../src/stryker-mocha-reporter'; diff --git a/packages/mocha-runner/test/unit/mocha-adapter.spec.ts b/packages/mocha-runner/test/unit/mocha-adapter.spec.ts index c6478d5cd3..ec889e48b6 100644 --- a/packages/mocha-runner/test/unit/mocha-adapter.spec.ts +++ b/packages/mocha-runner/test/unit/mocha-adapter.spec.ts @@ -6,7 +6,7 @@ import { expect } from 'chai'; import { testInjector } from '@stryker-mutator/test-helpers'; import { MochaAdapter } from '../../src/mocha-adapter'; -import LibWrapper from '../../src/lib-wrapper'; +import { LibWrapper } from '../../src/lib-wrapper'; describe(MochaAdapter.name, () => { let requireStub: sinon.SinonStub; diff --git a/packages/mocha-runner/test/unit/mocha-options-loader.spec.ts b/packages/mocha-runner/test/unit/mocha-options-loader.spec.ts index c8ef152ae6..0cd1399477 100644 --- a/packages/mocha-runner/test/unit/mocha-options-loader.spec.ts +++ b/packages/mocha-runner/test/unit/mocha-options-loader.spec.ts @@ -1,13 +1,13 @@ -import * as fs from 'fs'; -import * as path from 'path'; +import fs from 'fs'; +import path from 'path'; import sinon = require('sinon'); import { expect } from 'chai'; import { testInjector } from '@stryker-mutator/test-helpers'; -import LibWrapper from '../../src/lib-wrapper'; +import { LibWrapper } from '../../src/lib-wrapper'; import { MochaOptions } from '../../src-generated/mocha-runner-options'; -import MochaOptionsLoader from '../../src/mocha-options-loader'; +import { MochaOptionsLoader } from '../../src/mocha-options-loader'; import { MochaRunnerWithStrykerOptions } from '../../src/mocha-runner-with-stryker-options'; describe(MochaOptionsLoader.name, () => { diff --git a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts index fec7319db5..b739018b26 100644 --- a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts +++ b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import * as Mocha from 'mocha'; +import Mocha from 'mocha'; import { testInjector, factory, assertions } from '@stryker-mutator/test-helpers'; import sinon = require('sinon'); import { KilledMutantRunResult, MutantRunStatus } from '@stryker-mutator/api/test-runner'; @@ -9,7 +9,7 @@ import { MochaTestRunner } from '../../src/mocha-test-runner'; import { StrykerMochaReporter } from '../../src/stryker-mocha-reporter'; import { MochaAdapter } from '../../src/mocha-adapter'; import * as pluginTokens from '../../src/plugin-tokens'; -import MochaOptionsLoader from '../../src/mocha-options-loader'; +import { MochaOptionsLoader } from '../../src/mocha-options-loader'; import { createMochaOptions } from '../helpers/factories'; describe(MochaTestRunner.name, () => { @@ -145,7 +145,7 @@ describe(MochaTestRunner.name, () => { }); it('should add collected files ', async () => { - sut.testFileNames.push('foo.js', 'bar.js', 'foo2.js'); + sut.testFileNames!.push('foo.js', 'bar.js', 'foo2.js'); await actDryRun(); expect(mocha.addFile).calledThrice; expect(mocha.addFile).calledWith('foo.js'); diff --git a/packages/mocha-runner/test/unit/timer.spec.ts b/packages/mocha-runner/test/unit/timer.spec.ts index b262a3df60..fe5516f7ca 100644 --- a/packages/mocha-runner/test/unit/timer.spec.ts +++ b/packages/mocha-runner/test/unit/timer.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; -import Timer from '../../src/timer'; +import { Timer } from '../../src/timer'; describe('Timer', () => { let sut: Timer; diff --git a/packages/mocha-runner/tsconfig.src.json b/packages/mocha-runner/tsconfig.src.json index 083803fd44..e761be83e6 100644 --- a/packages/mocha-runner/tsconfig.src.json +++ b/packages/mocha-runner/tsconfig.src.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": "." }, "include": [ @@ -12,6 +13,9 @@ "references": [ { "path": "../api/tsconfig.src.json" + }, + { + "path": "../util/tsconfig.src.json" } ] } diff --git a/packages/mocha-runner/tsconfig.test.json b/packages/mocha-runner/tsconfig.test.json index d4b1083f05..b9e41db373 100644 --- a/packages/mocha-runner/tsconfig.test.json +++ b/packages/mocha-runner/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { + "outDir": "dist", "rootDir": ".", "types": [ "mocha", diff --git a/packages/test-helpers/package.json b/packages/test-helpers/package.json index 7786933d4f..d3d816967b 100644 --- a/packages/test-helpers/package.json +++ b/packages/test-helpers/package.json @@ -3,7 +3,7 @@ "private": true, "version": "4.4.1", "description": "A helper package for testing", - "main": "src/index.js", + "main": "dist/index.js", "scripts": {}, "repository": { "type": "git", diff --git a/packages/test-helpers/src/factory.ts b/packages/test-helpers/src/factory.ts index b3ee5c7b55..3c5406802b 100644 --- a/packages/test-helpers/src/factory.ts +++ b/packages/test-helpers/src/factory.ts @@ -22,7 +22,7 @@ import { IgnoredMutantResult, } from '@stryker-mutator/api/report'; import { Metrics, MetricsResult } from 'mutation-testing-metrics'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { Injector } from 'typed-inject'; import { PluginResolver } from '@stryker-mutator/api/plugin'; import { diff --git a/packages/test-helpers/src/test-injector.ts b/packages/test-helpers/src/test-injector.ts index ab79a5787a..4e416f8c86 100644 --- a/packages/test-helpers/src/test-injector.ts +++ b/packages/test-helpers/src/test-injector.ts @@ -1,16 +1,16 @@ import { StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, PluginContext, PluginResolver } from '@stryker-mutator/api/plugin'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; import { Injector, createInjector } from 'typed-inject'; import * as factory from './factory'; class TestInjector { - public pluginResolver: sinon.SinonStubbedInstance; - public options: StrykerOptions; - public logger: sinon.SinonStubbedInstance; - public injector: Injector; + public pluginResolver!: sinon.SinonStubbedInstance; + public options!: StrykerOptions; + public logger!: sinon.SinonStubbedInstance; + public injector!: Injector; public reset() { this.options = factory.strykerOptions(); diff --git a/packages/test-helpers/tsconfig.src.json b/packages/test-helpers/tsconfig.src.json index 58563b1826..98487fb516 100644 --- a/packages/test-helpers/tsconfig.src.json +++ b/packages/test-helpers/tsconfig.src.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "rootDir": ".", + "outDir": "dist", + "rootDir": "src", "types": [ "node", "mocha" @@ -15,4 +16,4 @@ "path": "../api/tsconfig.src.json" } ] -} \ No newline at end of file +} diff --git a/packages/typescript-checker/.npmignore b/packages/typescript-checker/.npmignore index 3fc43583d9..6c49bd2c64 100644 --- a/packages/typescript-checker/.npmignore +++ b/packages/typescript-checker/.npmignore @@ -1,7 +1,15 @@ -* - -!dist/src/**/*.js -!dist/src/**/*.map -!dist/src/**/*.ts -!src/**/* -!dist/schema/*.json +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/typescript-checker/src/tsconfig.json b/packages/typescript-checker/src/tsconfig.json deleted file mode 100644 index 5473e84176..0000000000 --- a/packages/typescript-checker/src/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../../tsconfig.settings.json", - "compilerOptions": { - "outDir": "../dist", - "rootDir": "..", - "esModuleInterop": true, - "resolveJsonModule": true, - "noImplicitThis": true, - "types": [ - "node" - ], - }, - "references": [ - { - "path": "../../api/tsconfig.src.json" - }, - { - "path": "../../util/tsconfig.src.json" - } - ], - "include": ["**/*.ts", "../src-generated/**/*.ts", "../schema/typescript-checker-options.json"] -} diff --git a/packages/typescript-checker/src/typescript-checker.ts b/packages/typescript-checker/src/typescript-checker.ts index b9ff390910..75967a3f96 100644 --- a/packages/typescript-checker/src/typescript-checker.ts +++ b/packages/typescript-checker/src/typescript-checker.ts @@ -40,7 +40,7 @@ export function create(injector: Injector): TypescriptChecker { * An in-memory type checker implementation which validates type errors of mutants. */ export class TypescriptChecker implements Checker { - private currentTask: Task; + private currentTask: Task = new Task(); private readonly currentErrors: ts.Diagnostic[] = []; /** * Keep track of all tsconfig files which are read during compilation (for project references) diff --git a/packages/typescript-checker/test/tsconfig.json b/packages/typescript-checker/test/tsconfig.json deleted file mode 100644 index c3f30c9d6a..0000000000 --- a/packages/typescript-checker/test/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "../../../tsconfig.settings.json", - "compilerOptions": { - "outDir": "../dist/test", - "rootDir": ".", - "esModuleInterop": true, - "types": [ - "mocha", - "node" - ] - }, - "references": [ - { - "path": "../src" - }, - { - "path": "../../test-helpers/tsconfig.src.json" - } - ] -} diff --git a/packages/typescript-checker/testResources/project-references/tsconfig.settings.json b/packages/typescript-checker/testResources/project-references/tsconfig.settings.json index 447ab8f8ac..3bb8b4a435 100644 --- a/packages/typescript-checker/testResources/project-references/tsconfig.settings.json +++ b/packages/typescript-checker/testResources/project-references/tsconfig.settings.json @@ -2,7 +2,6 @@ "compilerOptions": { "strict": true, "target": "es5", - "esModuleInterop": true, "moduleResolution": "node", "module": "commonjs", "composite": true, diff --git a/packages/typescript-checker/testResources/single-project/tsconfig.json b/packages/typescript-checker/testResources/single-project/tsconfig.json index 92e62065bc..2ec178781b 100644 --- a/packages/typescript-checker/testResources/single-project/tsconfig.json +++ b/packages/typescript-checker/testResources/single-project/tsconfig.json @@ -2,7 +2,6 @@ "compilerOptions": { "strict": true, "target": "es5", - "esModuleInterop": true, "moduleResolution": "node", "module": "commonjs", "outDir": "dist", diff --git a/packages/typescript-checker/tsconfig.json b/packages/typescript-checker/tsconfig.json index 3f926a5be9..c428877a4e 100644 --- a/packages/typescript-checker/tsconfig.json +++ b/packages/typescript-checker/tsconfig.json @@ -2,10 +2,10 @@ "files": [], "references": [ { - "path": "src" + "path": "./tsconfig.src.json" }, { - "path": "test" + "path": "./tsconfig.test.json" } ] } diff --git a/packages/typescript-checker/tsconfig.src.json b/packages/typescript-checker/tsconfig.src.json new file mode 100644 index 0000000000..8fa24dc5ce --- /dev/null +++ b/packages/typescript-checker/tsconfig.src.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.settings.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": ".", + "types": [ + "node" + ], + }, + "references": [ + { + "path": "../api/tsconfig.src.json" + }, + { + "path": "../util/tsconfig.src.json" + } + ], + "include": ["src/**/*.ts", "src-generated/**/*.ts", "schema/typescript-checker-options.json"] +} diff --git a/packages/typescript-checker/tsconfig.test.json b/packages/typescript-checker/tsconfig.test.json new file mode 100644 index 0000000000..3be92b7b0b --- /dev/null +++ b/packages/typescript-checker/tsconfig.test.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.settings.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": ".", + "types": [ + "mocha", + "node" + ] + }, + "references": [ + { + "path": "./tsconfig.src.json" + }, + { + "path": "../test-helpers/tsconfig.src.json" + } + ], + "include": ["test"] +} diff --git a/packages/util/.mocharc.jsonc b/packages/util/.mocharc.jsonc index 907a3f97fc..fd7a9c163b 100644 --- a/packages/util/.mocharc.jsonc +++ b/packages/util/.mocharc.jsonc @@ -1,4 +1,4 @@ { - "require": ["test/setup.js"], + "require": ["dist/test/setup.js"], "timeout": 10000 } diff --git a/packages/util/.npmignore b/packages/util/.npmignore new file mode 100644 index 0000000000..6c49bd2c64 --- /dev/null +++ b/packages/util/.npmignore @@ -0,0 +1,15 @@ +stryker.conf.js +test +dist/test +/schema +/reports +/testResources +/typings +/.nyc_output +.vscode +.nycrc.json +*.tsbuildinfo +tsconfig?(.*).json +.mocharc.jsonc +.nyc_output +.gitattributes \ No newline at end of file diff --git a/packages/util/.nycrc.json b/packages/util/.nycrc.json index 3ca3a4de49..0d62acd7aa 100644 --- a/packages/util/.nycrc.json +++ b/packages/util/.nycrc.json @@ -5,9 +5,8 @@ "branches": 90, "excludeAfterRemap": false, "checkCoverage": true, - "reporter": "html", "reportDir": "reports/coverage", "include": [ - "src/**/*.js" + "dist/src/**/*.js" ] } diff --git a/packages/util/package.json b/packages/util/package.json index 22e88a6fb5..e5d6972abf 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -2,12 +2,12 @@ "name": "@stryker-mutator/util", "version": "4.4.1", "description": "Contains utilities for Stryker, the mutation testing framework for JavaScript and friends", - "main": "src/index.js", + "main": "dist/src/index.js", "scripts": { "test": "nyc npm run test:all", "test:all": "npm run test:unit && npm run test:integration", - "test:unit": "mocha \"test/unit/**/*.js\"", - "test:integration": "mocha \"test/integration/**/*.js\"", + "test:unit": "mocha \"dist/test/unit/**/*.js\"", + "test:integration": "mocha \"dist/test/integration/**/*.js\"", "stryker": "node ../core/bin/stryker run" }, "repository": { diff --git a/packages/util/src/child-process-as-promised.ts b/packages/util/src/child-process-as-promised.ts index 81125cfe60..e2bd29548f 100644 --- a/packages/util/src/child-process-as-promised.ts +++ b/packages/util/src/child-process-as-promised.ts @@ -1,6 +1,6 @@ import * as childProcess from 'child_process'; import { promisify } from 'util'; -export default { +export const childProcessAsPromised = { exec: promisify(childProcess.exec), }; diff --git a/packages/util/src/directory-require-cache.ts b/packages/util/src/directory-require-cache.ts index b391225dc3..6a9c8bab8a 100644 --- a/packages/util/src/directory-require-cache.ts +++ b/packages/util/src/directory-require-cache.ts @@ -11,8 +11,8 @@ import { notEmpty } from './not-empty'; * @see https://github.com/stryker-mutator/stryker/issues/2461 */ export class DirectoryRequireCache { - private cache: Set; - private parents: Set; + private cache: Set | undefined; + private parents: Set | undefined; /** * Records the files required in the current working directory (excluding node_modules) @@ -20,33 +20,34 @@ export class DirectoryRequireCache { */ public record() { if (!this.cache) { + const cache = (this.cache = new Set()); const cwd = process.cwd(); - this.cache = new Set(); Object.keys(require.cache) .filter((fileName) => fileName.startsWith(`${cwd}${path.sep}`) && !fileName.startsWith(path.join(cwd, 'node_modules'))) - .forEach((file) => this.cache.add(file)); + .forEach((file) => cache.add(file)); this.parents = new Set( - Array.from(this.cache) + Array.from(cache) // `module.parent` is deprecated, but seems to work fine, might never be removed. // See https://nodejs.org/api/modules.html#modules_module_parent .map((fileName) => require.cache[fileName]?.parent?.filename) .filter(notEmpty) // Filter out any parents that are in the current cache, since they will be removed anyway - .filter((parentFileName) => !this.cache.has(parentFileName)) + .filter((parentFileName) => !cache.has(parentFileName)) ); } } public clear() { if (this.cache && this.parents) { + const cache = this.cache; this.parents.forEach((parent) => { const parentModule = require.cache[parent]; if (parentModule) { - parentModule.children = parentModule.children.filter((childModule) => !this.cache.has(childModule.id)); + parentModule.children = parentModule.children.filter((childModule) => !cache.has(childModule.id)); } }); - this.cache.forEach((fileName) => delete require.cache[fileName]); + cache.forEach((fileName) => delete require.cache[fileName]); } } } diff --git a/packages/util/src/index.ts b/packages/util/src/index.ts index ed6d871b66..5fca220f42 100644 --- a/packages/util/src/index.ts +++ b/packages/util/src/index.ts @@ -1,5 +1,5 @@ -export { default as childProcessAsPromised } from './child-process-as-promised'; -export { default as StrykerError } from './stryker-error'; +export { childProcessAsPromised } from './child-process-as-promised'; +export { StrykerError } from './stryker-error'; export * from './errors'; export * from './immutable'; export * from './known-keys'; @@ -11,3 +11,4 @@ export * from './i'; export * from './task'; export * from './directory-require-cache'; export * from './require-resolve'; +export * from './deep-merge'; diff --git a/packages/util/src/stryker-error.ts b/packages/util/src/stryker-error.ts index 4f8c44eb72..8b5da81e76 100644 --- a/packages/util/src/stryker-error.ts +++ b/packages/util/src/stryker-error.ts @@ -1,6 +1,6 @@ import { errorToString } from './errors'; -export default class StrykerError extends Error { +export class StrykerError extends Error { constructor(message: string, public readonly innerError?: Error) { super(`${message}${innerError ? `. Inner error: ${errorToString(innerError)}` : ''}`); } diff --git a/packages/util/src/task.ts b/packages/util/src/task.ts index 7aa031b19c..70a1224943 100644 --- a/packages/util/src/task.ts +++ b/packages/util/src/task.ts @@ -3,8 +3,8 @@ */ export class Task { protected _promise: Promise; - private resolveFn: (value: T | PromiseLike) => void; - private rejectFn: (reason: any) => void; + private resolveFn!: (value: T | PromiseLike) => void; + private rejectFn!: (reason: any) => void; private _isCompleted = false; constructor() { diff --git a/packages/util/test/integration/require-resolve.it.spec.ts b/packages/util/test/integration/require-resolve.it.spec.ts index b04a303e61..098f0999e8 100644 --- a/packages/util/test/integration/require-resolve.it.spec.ts +++ b/packages/util/test/integration/require-resolve.it.spec.ts @@ -5,7 +5,15 @@ import { expect } from 'chai'; import { requireResolve } from '../../src'; -const resolveTestResource: typeof path.resolve = path.resolve.bind(path, __dirname, '..', '..', 'testResources', 'require-resolve'); +const resolveTestResource: typeof path.resolve = path.resolve.bind( + path, + __dirname, + '..' /* integration */, + '..' /* test */, + '..' /* dist */, + 'testResources', + 'require-resolve' +); describe(requireResolve.name, () => { it('should be able to require from parent', () => { diff --git a/packages/util/test/setup.ts b/packages/util/test/setup.ts index ca7bc2aaa8..0e71b122fe 100644 --- a/packages/util/test/setup.ts +++ b/packages/util/test/setup.ts @@ -1,8 +1,8 @@ import 'source-map-support/register'; -import * as chai from 'chai'; -import * as chaiAsPromised from 'chai-as-promised'; -import * as sinonChai from 'sinon-chai'; -import * as sinon from 'sinon'; +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import sinonChai from 'sinon-chai'; +import sinon from 'sinon'; chai.use(sinonChai); chai.use(chaiAsPromised); diff --git a/packages/util/test/unit/stryker-error.spec.ts b/packages/util/test/unit/stryker-error.spec.ts index dc920cf878..fb0b34bac7 100644 --- a/packages/util/test/unit/stryker-error.spec.ts +++ b/packages/util/test/unit/stryker-error.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { errorToString } from '../../src/errors'; -import StrykerError from '../../src/stryker-error'; +import { StrykerError } from '../../src/stryker-error'; describe('StrykerError', () => { it('should set inner error', () => { diff --git a/packages/util/tsconfig.src.json b/packages/util/tsconfig.src.json index 809734fd2b..d14cb75380 100644 --- a/packages/util/tsconfig.src.json +++ b/packages/util/tsconfig.src.json @@ -1,10 +1,11 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "rootDir": "." + "outDir": "dist/src", + "rootDir": "src" }, "include": [ "src" ], "references": [ ] -} \ No newline at end of file +} diff --git a/packages/util/tsconfig.test.json b/packages/util/tsconfig.test.json index a8b5123f1f..971fb27c03 100644 --- a/packages/util/tsconfig.test.json +++ b/packages/util/tsconfig.test.json @@ -1,7 +1,8 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "rootDir": ".", + "outDir": "dist/test", + "rootDir": "test", "types": [ "mocha", "node" @@ -18,4 +19,4 @@ "path": "../test-helpers/tsconfig.src.json" } ] -} \ No newline at end of file +} diff --git a/perf/tasks/install.ts b/perf/tasks/install.ts index 6c25696dd8..e139e8162d 100644 --- a/perf/tasks/install.ts +++ b/perf/tasks/install.ts @@ -1,7 +1,7 @@ -import * as fs from 'fs'; -import * as minimatch from 'minimatch'; -import * as path from 'path'; -import * as execa from 'execa'; +import fs from 'fs'; +import minimatch from 'minimatch'; +import path from 'path' +import execa from 'execa'; const testRootDir = path.resolve(__dirname, '..', 'test'); diff --git a/perf/tasks/merge-config.ts b/perf/tasks/merge-config.ts index 1f2e459470..f51ae44dfd 100644 --- a/perf/tasks/merge-config.ts +++ b/perf/tasks/merge-config.ts @@ -1,5 +1,5 @@ -import { promises as fs } from 'fs'; -import path = require('path'); +import { promises as fsPromises } from 'fs'; +import path from 'path'; const testRootDir = path.resolve(__dirname, '..', 'test'); const configRootDir = path.resolve(__dirname, '..', 'config'); @@ -10,23 +10,23 @@ mergeConfiguration().catch((error) => { }); async function mergeConfiguration() { - const testDirs = (await fs.readdir(testRootDir, { withFileTypes: true })).filter((testDir) => testDir.isDirectory()); + const testDirs = (await fsPromises.readdir(testRootDir, { withFileTypes: true })).filter((testDir) => testDir.isDirectory()); for await (const testDir of testDirs) { const configOverrideDir = path.resolve(configRootDir, testDir.name); try { - const configDir = await fs.stat(configOverrideDir); + const configDir = await fsPromises.stat(configOverrideDir); if (configDir.isDirectory()) { const overridePackageFileName = path.resolve(configOverrideDir, 'package.json'); const overrideStrykerConfigFileName = path.resolve(configOverrideDir, 'stryker.conf.json'); try { const overrides = require(overridePackageFileName); const original = require(path.resolve(testRootDir, testDir.name, 'package.json')); - await fs.writeFile(path.resolve(testRootDir, testDir.name, 'package.json'), JSON.stringify({ ...original, ...overrides }, null, 2)); + await fsPromises.writeFile(path.resolve(testRootDir, testDir.name, 'package.json'), JSON.stringify({ ...original, ...overrides }, null, 2)); } catch { console.log(`Note: no overrides found at ${overridePackageFileName}`); } try { - await fs.copyFile(overrideStrykerConfigFileName, path.resolve(testRootDir, testDir.name, 'stryker.conf.json')); + await fsPromises.copyFile(overrideStrykerConfigFileName, path.resolve(testRootDir, testDir.name, 'stryker.conf.json')); } catch { console.log(`Note: no stryker.conf.json file ${overrideStrykerConfigFileName}`); } diff --git a/perf/tasks/run-perf-tests.ts b/perf/tasks/run-perf-tests.ts index a03f1924d4..d9f34f1d11 100644 --- a/perf/tasks/run-perf-tests.ts +++ b/perf/tasks/run-perf-tests.ts @@ -1,9 +1,9 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import * as execa from 'execa'; +import fs from 'fs'; +import path from 'path' +import execa from 'execa'; import { Observable } from 'rxjs'; import { tap, throttleTime } from 'rxjs/operators'; -import * as minimatch from 'minimatch'; +import minimatch from 'minimatch'; const testRootDir = path.resolve(__dirname, '..', 'test'); diff --git a/perf/tsconfig.json b/perf/tsconfig.json index 986bede316..c0f92793a9 100644 --- a/perf/tsconfig.json +++ b/perf/tsconfig.json @@ -3,6 +3,7 @@ "target": "es6", "module": "commonjs", "moduleResolution": "node", - "strict": true + "strict": true, + "esModuleInterop": true } -} \ No newline at end of file +} diff --git a/stryker.parent.conf.json b/stryker.parent.conf.json index 70a3ab9c70..26e0e9b7c7 100644 --- a/stryker.parent.conf.json +++ b/stryker.parent.conf.json @@ -15,6 +15,6 @@ "dashboard": {}, "buildCommand": "tsc -b", "mochaOptions": { - "spec": ["test/unit/**/*.js"] + "spec": ["dist/test/unit/**/*.js"] } } diff --git a/tsconfig.settings.json b/tsconfig.settings.json index 9931040969..a4c22363b9 100644 --- a/tsconfig.settings.json +++ b/tsconfig.settings.json @@ -1,23 +1,20 @@ { "compilerOptions": { - "composite": true, - "declarationMap": true, + "strict": true, "module": "commonjs", "target": "es2017", - "noImplicitAny": true, "moduleResolution": "node", - "rootDir": ".", + "esModuleInterop": true, "sourceMap": true, "declaration": true, + "composite": true, + "declarationMap": true, "forceConsistentCasingInFileNames": true, "allowJs": false, "resolveJsonModule": true, "importHelpers": true, "noUnusedLocals": true, - "alwaysStrict": true, "noImplicitReturns": true, - "strictFunctionTypes": true, - "strictNullChecks": true, "types": [ "node" ], diff --git a/workspace.code-workspace b/workspace.code-workspace index cfee508ac0..5001e5fc70 100644 --- a/workspace.code-workspace +++ b/workspace.code-workspace @@ -66,21 +66,17 @@ "**/*.tsbuildinfo": true, "**/.stryker-tmp": true, "**/CHANGELOG.md": true, + "**/dist": true, + "**/.nyc_output": true, + "**/reports": true }, "files.exclude": { - ".git": true, - ".tscache": true, - "{src,test}/**/*.d.ts": true, //base mapping not possible: https://github.com/Microsoft/vscode/issues/40850 - "*.d.ts": true, // needed to exclude d.ts files in api - "**/*.js": { - "when": "$(basename).ts" - }, - "**/**/*.js": { // HACK! Cannot reuse same key, but this key means essentially the same - "when": "$(basename).tsx" - }, - "**/*.map": { - "when": "$(basename)" - } + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "?(check).js": true }, "eslint.enable": true, "eslint.validate": [