CodeVetter
← All unpacks
CodeVetter · Repo Unpack evidence

stryker-mutator/stryker-js

Scanned commit f2a49ff024 dated 2026-09-11 — last upstream commit. Generated by codevetter 1.15.0 on 2026-10-02.

github.com/stryker-mutator/stryker-js ↗ · 2239 files · 5.3 MB

StrykerJS Professor X: For someone who hates mutants...

Deep analysis by cli:codex via the codex CLI on 2026-10-02 (431s) — every claim below links to its cited source files. Source inspection; upstream code and tests were not executed.

Overview

StrykerJS is a mutation-testing framework for developers assessing whether JavaScript and TypeScript tests detect deliberate changes to production code. It instruments multiple mutants into source files, runs baseline tests, then schedules individual mutants through configurable test runners and optional checkers. This monorepo contains the public plugin API, execution engine, language instrumenter, framework adapters, reporting tools, and integration fixtures; its distinctive mechanisms include per-test mutant coverage, incremental result reuse, and an editor-facing mutation server.

System map

The repository builds and publishes a family of Node.js packages coordinated by pnpm, Lerna, and TypeScript project references. Core owns the CLI and execution lifecycle, while the API and instrumenter define integration contracts and source transformation. Runtime work crosses parent-process, worker-process, filesystem, and optional network boundaries. Persistence consists of project copies, backups, and report files in the inspected paths.

Feature catalog

The main user surfaces are CLI commands, a programmatic mutation run, reports, and a mutation-server protocol. Users can select files and source ranges, choose framework integrations, suppress mutants, and control baseline or incremental execution. Reporter choices cover terminal feedback, local artifacts, and dashboard publication. Framework UI examples are integration targets rather than the central product interface.

Data flow

Configuration and filesystem selection establish the project model before source transformation begins. Instrumentation produces modified files and mutant metadata, while the baseline test runner supplies test results, coverage, and timing. The planner converts these inputs into early results or executable run options, and the executor streams outcomes into reporting. Reports preserve original source and test relationships, and incremental mode feeds that persisted information into later planning.

Behavior traces

The inspected flows cover CLI startup and preparation, mutation execution, incremental persistence/reuse, and server discovery/execution. These traces follow concrete function calls and preserve conditions that change the route through execution. Baseline failures stop mutation testing, while ignored or cached mutants bypass runner execution. Cleanup and asynchronous reporter completion are explicit parts of the lifecycle.

Testing signals

Tests and CI were inspected, not executed; no passing result or coverage percentage is asserted. Core uses compiled Mocha tests with Chai, Sinon, promise assertions, and snapshots. The inspected suites exercise orchestration branches, incremental reuse, HTML serialization, and real server transports, while e2e fixtures cover several frontend/framework configurations. This inventory is bounded and does not establish exhaustive coverage or the absence of additional tests.

Risk map

The inspected sensitive boundaries are imported project code, shell commands, inherited worker environments, filesystem writes, JSON-RPC, and dashboard uploads. The sandbox is a project execution directory with dependency links and an optional in-place mode. Observations here describe source behavior and review hotspots, not confirmed vulnerabilities. Partial inspection does not establish a repository-wide absence of authentication, validation, or security tests.

Extension points

The primary supported extension mechanism is a typed plugin contract for runners, checkers, reporters, and ignorers. Plugin modules contribute declarations and optional validation schemas, and typed-inject constructs their instances. Internal registries and factory functions offer separate seams for mutation operators, parsers, preprocessors, and initialization presets. These internal seams should not be confused with public plugin categories.

Contributor handoff

Begin with the affected package and its API contract, then follow the execution stage that owns the behavior. Tests and CI were inspected, not executed, and this brief is a bounded source inventory rather than a complete coverage assessment. Future executable work should use repository scripts and compile current sources before selecting tests that run from dist. Preserve cleanup, coordinate conversion, runner activation, and report compatibility when making small changes.

Languages

LanguageFilesShare of source
TypeScript88358%
JavaScript61740%
JSON372docs/config
Markdown69docs/config
HTML26docs/config
Svelte131%
Sass111%
Vue91%

Start reading here

Probable source entrypoint: packages/ — inferred from the directory tree and manifest, not the upstream docs.

Source roots

packages/ (1240 files)

Source layout — packages/

PathFiles
packages/core/88
packages/cucumber-runner/59
packages/vitest-runner/99

Repository structure

Top-level pathFiles
packages/1240
e2e/850
perf/85
docs/27
.github/10
tasks/4
.devcontainer/1
.travis/1

Docs found: CONTRIBUTING.mdREADME.mddocs/config-file.mddocs/configuration.mddocs/cucumber-runner.mddocs/disable-mutants.mddocs/getting-started.mddocs/guides/angular.mddocs/guides/create-a-plugin.mddocs/guides/legacy/stryker-3/angular.md

Package

package.json — stryker-parent, 42 declared dependencies.

@eslint/js@types/chai@types/chai-as-promised@types/chai-jest-snapshot@types/istanbul@types/karma@types/mocha@types/node@types/sinon@types/sinon-chai@types/source-map-support@typescript-eslint/utils

CI & config entrypoints

Structural health signals

Average score 8.1/10 across 96 analyzed source files; 6 hotspots surfaced.

These are deterministic review leads — size, churn, and structural signals — not proof of a bug in this project.

Recent history