stryker-mutator / stryker-js

Mutation testing for JavaScript and friends
https://stryker-mutator.io
Apache License 2.0
2.55k stars 242 forks source link

Can't use Explicit Resource Management #4876

Open artsiommiksiuk opened 1 month ago

artsiommiksiuk commented 1 month ago

Summary Seems like I can't use latest explicit resource management via polyfils (importing them manually from esm-shims and in vitest attaching via setupFiles).

Stryker config

/** @type {import('@stryker-mutator/api/core').PartialStrykerOptions} */
const config = {
  packageManager: "npm",
  reporters: ["html", "clear-text", "progress"],
  testRunner: "vitest",
  coverageAnalysis: "perTest",
  mutate: [
    "src/packages/**/*.ts"
  ],
  checkers: ["typescript"],
  tsconfigFile: "tsconfig.json",
  typescriptChecker: {
    "prioritizePerformanceOverAccuracy": true
  }
};
export default config;

Test runner config

import { defineConfig } from 'vitest/config'

export default defineConfig({
    esbuild: {
        target: "es2022",
    },
    test: {
        passWithNoTests: true,
        exclude: ["dist", "node_modules"],
        setupFiles: [
            "dotenv/config",
            "./src/polyfills.ts",
        ],
        coverage: {
            include: [
                "src/**/*.ts",
            ],
            exclude: [
                '**/*.d.ts',
                '**/node_modules/**',
                '**/vendor/**',
                '**/gen/**',
                '**/migrations/**',
                "**/.venv/**"
            ],
            thresholds: {
                branches: 50,
                functions: 60,
                lines: 50,
                statements: 50,
            },
        }
    },
});

Stryker environment

@stryker-mutator/core@8.2.6
@stryker-mutator/typescript-checker@8.2.6
@stryker-mutator/vitest-runner@8.2.6
"vitest": "^1.6.0",

Test runner environment

vitest --run src/*
npx stryker run

Your Environment

software version(s)
node 20.11.1
npm 10.2.4
Operating System MacOS 14.4.1

Add stryker.log

17:18:58 (38418) INFO ProjectReader Found 15 of 52577 file(s) to be mutated.
17:18:59 (38418) ERROR Stryker Unexpected error occurred while running Stryker SyntaxError: /Users/src/packages/memad/index.test.ts: Support for the experimental syntax 'explicitResourceManagement' isn't currently enabled (10:5):

   8 |
   9 | test(`returns the same value for the same key`, async () => {
> 10 |     await using get = memad(async (i: number) => newad(i));
     |     ^
  11 |
  12 |     await using r1 = await get(1);
  13 |     await using r2 = await get(1);
    at constructor (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:353:19)
    at TypeScriptParserMixin.raise (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:3277:19)
    at TypeScriptParserMixin.expectPlugin (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:3305:16)
    at TypeScriptParserMixin.startsAwaitUsing (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12199:14)
    at TypeScriptParserMixin.parseStatementContent (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12268:45)
    at TypeScriptParserMixin.parseStatementContent (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9132:18)
    at TypeScriptParserMixin.parseStatementLike (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12229:17)
    at TypeScriptParserMixin.parseStatementListItem (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12209:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12786:61)
    at TypeScriptParserMixin.parseBlockBody (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12779:10)
    at TypeScriptParserMixin.parseBlock (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:12767:10)
    at TypeScriptParserMixin.parseFunctionBody (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:11606:24)
    at TypeScriptParserMixin.parseArrowExpression (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:11581:10)
    at TypeScriptParserMixin.parseAsyncArrowFromCallExpression (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10778:10)
    at TypeScriptParserMixin.parseAsyncArrowFromCallExpression (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9385:18)
    at TypeScriptParserMixin.parseCoverCallAndAsyncArrowHead (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10691:27)
    at TypeScriptParserMixin.parseSubscript (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10620:19)
    at TypeScriptParserMixin.parseSubscript (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:8968:18)
    at TypeScriptParserMixin.parseSubscripts (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10593:19)
    at TypeScriptParserMixin.parseExprSubscripts (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10584:17)
    at TypeScriptParserMixin.parseUpdate (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10563:21)
    at TypeScriptParserMixin.parseMaybeUnary (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10541:23)
    at TypeScriptParserMixin.parseMaybeUnary (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9456:18)
    at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10395:61)
    at TypeScriptParserMixin.parseExprOps (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10400:23)
    at TypeScriptParserMixin.parseMaybeConditional (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10377:23)
    at TypeScriptParserMixin.parseMaybeAssign (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10338:21)
    at TypeScriptParserMixin.parseMaybeAssign (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9405:20)
    at /Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10308:39
    at TypeScriptParserMixin.allowInAnd (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:11926:12)
    at TypeScriptParserMixin.parseMaybeAssignAllowIn (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10308:17)
    at TypeScriptParserMixin.parseExprListItem (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:11686:18)
    at TypeScriptParserMixin.parseCallExpressionArguments (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10766:22)
    at TypeScriptParserMixin.parseCoverCallAndAsyncArrowHead (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10683:29)
    at TypeScriptParserMixin.parseSubscript (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10620:19)
    at TypeScriptParserMixin.parseSubscript (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:8968:18)
    at TypeScriptParserMixin.parseSubscripts (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10593:19)
    at TypeScriptParserMixin.parseExprSubscripts (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10584:17)
    at TypeScriptParserMixin.parseUpdate (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10563:21)
    at TypeScriptParserMixin.parseMaybeUnary (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10541:23)
    at TypeScriptParserMixin.parseMaybeUnary (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9456:18)
    at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10395:61)
    at TypeScriptParserMixin.parseExprOps (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10400:23)
    at TypeScriptParserMixin.parseMaybeConditional (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10377:23)
    at TypeScriptParserMixin.parseMaybeAssign (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10338:21)
    at TypeScriptParserMixin.parseMaybeAssign (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:9405:20)
    at TypeScriptParserMixin.parseExpressionBase (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10292:23)
    at /Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10288:39
    at TypeScriptParserMixin.allowInAnd (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:11921:16)
    at TypeScriptParserMixin.parseExpression (/Users/node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser/lib/index.js:10288:17) {
  code: 'BABEL_PARSE_ERROR',
  reasonCode: 'MissingPlugin',
  loc: Position { line: 10, column: 4, index: 310 },
  pos: 310,
  missingPlugin: [ 'explicitResourceManagement' ]
}
17:18:59 (38418) INFO Stryker This might be a known problem with a solution documented in our troubleshooting guide.
17:18:59 (38418) INFO Stryker You can find it at https://stryker-mutator.io/docs/stryker-js/troubleshooting/
17:18:59 (38418) INFO Stryker Still having trouble figuring out what went wrong? Try `npx stryker run --fileLogLevel trace --logLevel debug` to get some more info.
artsiommiksiuk commented 1 month ago

I'm also trying to enable https://babeljs.io/docs/babel-plugin-proposal-explicit-resource-management with .babelrc file, but it still returns the same error.

artsiommiksiuk commented 1 month ago

Okay, I figured the issue - typescript parser not has hardcoded list of babel plugins.

https://github.com/stryker-mutator/stryker-js/blob/27fccbeae778a7295a0518728c9c0c05374aa454/packages/instrumenter/src/parsers/ts-parser.ts#L41

After setting manually babel plugin in production fule (ts-parser.js which is actually running) like this:

image

Stryker started.

So, I guess the question now is to expose babel configs for ts parser the same way it's done for js.