From e923a3929c148cce2a8bb2db559ff1a2531b4c9d Mon Sep 17 00:00:00 2001 From: systemfsoftware-bot Date: Thu, 29 Oct 2026 17:18:15 -0400 Subject: [PATCH 1/4] build(deps): effect 4.1.0 and @effect/tsgo 0.63.0 Move effect and every @effect/* to 4.1.0 and @effect/tsgo to 0.63.0 (oxlint ~1.90.0, oxlint-tsgolint 7.0.2005, which tsgo 0.63 requires). effect 4.1.0 removed effect/Crypto, which the published stryker-js and stryker-js-vitest-runner import: migrate to effect/crypto/SecureRandom and Digest, brand Schema classes, register the MCP toolkit through the stdio transport, and regenerate the published contract documents. Claude-Session: https://claude.ai/code/session_017rX35xUAHEjVVaDKVVzubW --- .changeset/effect-4-1-crypto-migration.md | 12 + .../contract/stream.schema.json | 568 +++++---- .../stryker-js-cli-contract/oxlint.config.ts | 1 + .../src/run-event.schema.ts | 54 +- .../__fixtures__/contract-law.fixture.ts | 36 +- .../stryker-js-html-reporter/oxlint.config.ts | 1 + .../src/render-html-report.workflow.ts | 22 +- .../stryker-js-instrumenter/oxlint.config.ts | 1 + .../src/ErrorText.schema.ts | 8 +- .../src/Instrument.schema.ts | 106 +- .../src/InstrumentContext.schema.ts | 16 +- .../src/Parser.schema.ts | 22 +- .../stryker-js-instrumenter/src/Parser.ts | 2 +- .../src/admit-instrument-files.workflow.ts | 24 +- .../src/arid-code.workflow.ts | 22 +- .../directives/decode-directive.workflow.ts | 24 +- .../src/directives/fold-rule.workflow.ts | 14 +- .../src/instrument-files.cell.ts | 8 +- .../src/mutant-set-policy.workflow.ts | 22 +- .../src/place-mutants.workflow.ts | 58 +- .../src/plan-mutants.workflow.ts | 76 +- .../src/print/PrintFailed.schema.ts | 16 +- .../src/resolve-format.workflow.ts | 42 +- .../src/subsume-mutants.workflow.ts | 38 +- .../concurrency-mutant-behaviour.schema.ts | 8 +- .../conditional-test-placement.schema.ts | 10 +- ...rency-mutant-behaviour.integration.test.ts | 7 +- .../contract/report.schema.json | 6 +- .../oxlint.config.ts | 1 + .../src/Checker.schema.ts | 2 +- .../src/Evaluator.schema.ts | 8 +- .../src/Metrics.schema.ts | 2 +- .../src/Plugin.schema.ts | 36 +- .../src/ReporterEvent.schema.ts | 66 +- .../src/TestRunner.schema.ts | 20 +- .../src/TypeQuery.schema.ts | 22 +- .../src/generated/report.schema.ts | 6 +- .../oxlint.config.ts | 1 + .../src/trace-parts.schema.ts | 8 +- .../oxlint.config.ts | 1 + .../package.json | 11 +- .../src/CheckMutants.schema.ts | 6 +- .../src/CheckRound.schema.ts | 12 +- .../src/Checker.schema.ts | 2 +- .../src/CheckerCommands.schema.ts | 174 +-- .../src/Compiler.schema.ts | 90 +- .../src/FileIds.schema.ts | 2 +- .../src/ImporterShortcut.schema.ts | 14 +- .../src/Tsconfig.schema.ts | 12 +- .../src/answer-type-query.workflow.ts | 24 +- .../src/capture-alias-specifier.workflow.ts | 12 +- .../src/check-mutants.workflow.ts | 6 +- .../src/classify-candidate.workflow.ts | 6 +- .../src/classify-context-link.workflow.ts | 42 +- .../src/classify-tce.workflow.ts | 12 +- .../src/group-mutants.workflow.ts | 2 +- .../src/identify-program.workflow.ts | 32 +- .../src/override-tsconfig-options.workflow.ts | 22 +- .../src/parse-tsconfig-text.workflow.ts | 16 +- .../src/plan-diagnostic-batches.workflow.ts | 12 +- .../plan-resolution-candidates.workflow.ts | 16 +- .../src/request-affected-files.workflow.ts | 12 +- .../src/resolve-package-exports.workflow.ts | 32 +- .../src/trace-affected-files.workflow.ts | 16 +- .../stryker-js-vitest-runner/oxlint.config.ts | 1 + .../stryker-js-vitest-runner/package.json | 11 +- .../sandbox/stryker-setup.ts | 2 +- .../src/StandbyThreadsPool.schema.ts | 20 +- .../src/VitestRunner.schema.ts | 8 +- .../src/VitestRuntime.blueprint.ts | 6 +- .../src/interpret-vitest-dry-run.workflow.ts | 12 +- .../interpret-vitest-mutant-run.workflow.ts | 8 +- packages/stryker-js-vitest-runner/src/main.ts | 2 +- .../src/sort-test-files.workflow.ts | 4 +- .../src/vitest-run-command.schema.ts | 40 +- .../src/vitest-session.ts | 14 +- .../src/vitest-test-runner.ts | 11 +- .../typings/global.d.ts | 4 +- packages/stryker-js/oxlint.config.ts | 1 + .../src/Checker/Checker.blueprint.ts | 2 +- .../stryker-js/src/Checker/Checker.handle.ts | 2 +- .../stryker-js/src/Checker/Checker.schema.ts | 37 +- .../partition-checked-plans.workflow.ts | 52 +- .../Checker/warn-skipped-mutants.workflow.ts | 24 +- packages/stryker-js/src/Cli.schema.ts | 32 +- packages/stryker-js/src/Config.schema.ts | 14 +- packages/stryker-js/src/ConfigError.schema.ts | 74 +- .../src/Feedback/Feedback.schema.ts | 8 +- .../src/Feedback/record-feedback.workflow.ts | 34 +- .../stryker-js/src/Mcp/mcp-server.cell.ts | 27 +- .../stryker-js/src/Mcp/mcp-tools.schema.ts | 10 +- .../src/MutantTestPlanCommand.schema.ts | 40 +- .../stryker-js/src/MutantsError.schema.ts | 10 +- .../stryker-js/src/MutationTest.schema.ts | 14 +- .../stryker-js/src/PluginsError.schema.ts | 10 +- .../src/Reporter/plan-reporters.workflow.ts | 28 +- .../render-clear-text-report.workflow.ts | 30 +- .../Reporter/render-json-report.workflow.ts | 28 +- .../render-progress-report.workflow.ts | 40 +- .../src/Reporter/sarif-report.workflow.ts | 34 +- .../src/Rerun/admit-mutant-rerun.workflow.ts | 16 +- packages/stryker-js/src/Run.schema.ts | 4 +- .../src/RunOutcomeCommand.schema.ts | 8 +- .../src/Serve/msp-protocol.workflow.ts | 84 +- packages/stryker-js/src/Serve/msp.schema.ts | 2 +- packages/stryker-js/src/Worker.schema.ts | 42 +- ...case-sensitivity.workflow.property.test.ts | 4 +- ...e-mutation-score.workflow.property.test.ts | 2 +- ...mutator-catalogs.workflow.property.test.ts | 4 +- .../src/admit-case-probe.workflow.ts | 20 +- .../src/admit-case-sensitivity.workflow.ts | 16 +- .../src/admit-checker-answer.workflow.ts | 88 +- .../src/admit-discovered-entry.workflow.ts | 22 +- .../src/admit-file-identity.workflow.ts | 34 +- .../src/admit-file-match.workflow.ts | 22 +- .../src/admit-incremental-report.workflow.ts | 42 +- .../src/admit-mutation-test.workflow.ts | 22 +- .../src/admit-reuse-source.workflow.ts | 36 +- .../src/admit-stream-overwrite.workflow.ts | 34 +- .../src/admit-survivors-run.workflow.ts | 34 +- .../stryker-js/src/audit-drops.workflow.ts | 12 +- packages/stryker-js/src/audit.schema.ts | 38 +- .../stryker-js/src/budget-gate.workflow.ts | 40 +- .../src/build-reproducers.workflow.ts | 20 +- .../stryker-js/src/cap-survivors.workflow.ts | 28 +- .../src/checkpoint-mutants.workflow.ts | 36 +- ...assify-empty-directory-removal.workflow.ts | 24 +- .../stryker-js/src/classify-exit.workflow.ts | 44 +- .../src/classify-run-outcome.workflow.ts | 44 +- .../classify-sandbox-directory.workflow.ts | 22 +- .../src/classify-worker-exit.workflow.ts | 28 +- .../src/compare-verdicts.workflow.ts | 26 +- .../stryker-js/src/compile-glob.workflow.ts | 20 +- .../src/config/warning-enabled.workflow.ts | 24 +- .../stryker-js/src/count-runs.workflow.ts | 8 +- .../src/decode-mutator-selection.workflow.ts | 46 +- .../src/detect-dry-run-flakes.workflow.ts | 30 +- .../src/dry-run-candidates.workflow.ts | 38 +- .../stryker-js/src/dry-run-reuse.workflow.ts | 30 +- packages/stryker-js/src/dry-run.workflow.ts | 18 +- .../stryker-js/src/empty-directory.schema.ts | 16 +- .../stryker-js/src/engine-identity.schema.ts | 10 +- .../src/frame-run-event.workflow.ts | 6 +- .../src/gate-new-survivors.workflow.ts | 26 +- .../src/gate-score-break.workflow.ts | 32 +- packages/stryker-js/src/git-diff.schema.ts | 34 +- .../stryker-js/src/import-closure.schema.ts | 110 +- .../src/incremental-diff.workflow.ts | 52 +- .../interpret-dry-run-observation.workflow.ts | 38 +- .../src/interpret-dry-run-result.workflow.ts | 32 +- .../src/interpret-mutant-run.workflow.ts | 28 +- .../src/judge-mutation-score.workflow.ts | 62 +- .../src/judge-sandbox-build.workflow.ts | 14 +- .../stryker-js/src/keep-temp-dir.workflow.ts | 16 +- .../src/lockfile-closure.workflow.ts | 90 +- packages/stryker-js/src/matching.schema.ts | 2 +- .../src/materialize-mutant-plans.workflow.ts | 34 +- .../src/mutation-reporting.schema.ts | 10 +- packages/stryker-js/src/node-platform.ts | 8 +- packages/stryker-js/src/oxc-source-parser.ts | 4 +- .../src/phase-durations.workflow.ts | 30 +- .../src/plan-instrumentation.workflow.ts | 34 +- .../src/plan-mutant-tests.workflow.ts | 50 +- .../src/plan-mutator-catalogs.workflow.ts | 42 +- .../src/plan-node-modules-links.workflow.ts | 26 +- .../src/plan-plugin-load.workflow.ts | 28 +- .../stryker-js/src/plan-request.schema.ts | 8 +- .../src/plan-run-conclusion.workflow.ts | 56 +- .../src/plan-sandbox-acquisition.workflow.ts | 32 +- .../stryker-js/src/plan-shards.workflow.ts | 16 +- packages/stryker-js/src/pnpm-lock.schema.ts | 8 +- .../src/readmit-subsumed.workflow.ts | 36 +- .../src/refuse-local-mutation.workflow.ts | 32 +- .../src/render-annotations.workflow.ts | 36 +- .../src/report-from-stream.workflow.ts | 30 +- .../src/report-test-ids.workflow.ts | 10 +- .../src/reporting/run-failure.schema.ts | 4 +- .../src/reporting/verdict-envelope.schema.ts | 2 +- .../src/require-dry-run.workflow.ts | 24 +- .../src/resolve-concurrency.workflow.ts | 28 +- .../src/resolve-output-mode.workflow.ts | 34 +- .../src/rewrite-sandbox-tsconfig.workflow.ts | 27 +- .../src/route-cli-request.workflow.ts | 142 ++- .../run/admit-non-empty-project.workflow.ts | 14 +- .../src/run/describe-config-error.workflow.ts | 36 +- ...describe-config-module-failure.workflow.ts | 30 +- .../src/run/discover-config-file.workflow.ts | 58 +- packages/stryker-js/src/run/dry-run.cell.ts | 6 +- .../src/run/explain-file-skip.workflow.ts | 36 +- .../src/run/extends-step.workflow.ts | 36 +- .../src/run/plan-prepare.workflow.ts | 18 +- .../src/run/resolve-config.workflow.ts | 34 +- .../run/resolve-configured-plugin.workflow.ts | 44 +- .../src/run/select-package-entry.workflow.ts | 36 +- .../validate-options-admission.workflow.ts | 40 +- .../src/select-project-files.workflow.ts | 40 +- .../src/shard/merge-shard-reports.workflow.ts | 34 +- .../src/shard/select-shard.workflow.ts | 14 +- .../src/shard/settle-shard-child.workflow.ts | 24 +- .../src/shard/shard-merge.schema.ts | 8 +- .../stryker-js/src/shard/shard-plan.schema.ts | 10 +- .../stryker-js/src/shard/shard-run.schema.ts | 12 +- .../stryker-js/src/sort-run-plans.workflow.ts | 14 +- .../stryker-js/src/stryker-error.schema.ts | 18 +- .../stryker-js/src/stryker-package.schema.ts | 2 +- pnpm-lock.yaml | 1084 ++++++++++------- pnpm-workspace.yaml | 20 +- test/bench/src/abort-run-path.workflow.ts | 8 +- test/bench/src/bench-failure.schema.ts | 10 +- test/bench/src/bench-plan.schema.ts | 18 +- test/bench/src/choose-base.workflow.ts | 14 +- test/bench/src/leg-clock.schema.ts | 6 +- test/bench/src/main.ts | 6 +- test/bench/src/measure-leg.workflow.ts | 10 +- test/bench/src/plan-run-path.workflow.ts | 18 +- test/bench/src/prepare-side.schema.ts | 12 +- test/bench/src/run-bench.service.ts | 4 +- test/bench/src/run-path.schema.ts | 106 +- test/bench/src/select-legs.workflow.ts | 16 +- test/bench/src/settle-run-path.workflow.ts | 16 +- test/bench/src/workload-digest.service.ts | 18 +- test/checker-parity/oxlint.config.ts | 1 + .../src/DriverFailure.schema.ts | 4 +- test/checker-parity/src/Parity.schema.ts | 158 +-- .../src/assign-drift-legs.workflow.ts | 26 +- .../src/compare-sides.workflow.ts | 158 +-- test/checker-parity/src/main.ts | 1 + test/checker-parity/src/plan-legs.workflow.ts | 24 +- .../src/report-parity-outcome.workflow.ts | 56 +- .../src/reuse-cached-verdicts.workflow.ts | 26 +- .../src/select-scope.workflow.ts | 20 +- .../checker-parity/src/speed-gate.workflow.ts | 54 +- .../src/trigger-parity-lane.workflow.ts | 16 +- test/e2e-core/oxlint.config.ts | 1 + ...lacement-closure.workflow.property.test.ts | 6 +- test/e2e-core/src/annotation.schema.ts | 66 +- test/e2e-core/src/bench-report.schema.ts | 10 +- test/e2e-core/src/bench-run.schema.ts | 6 +- test/e2e-core/src/bench-summary.schema.ts | 22 +- .../e2e-core/src/catalog-resolution.schema.ts | 22 +- .../src/confirm-annotations.workflow.ts | 58 +- .../src/covering-test-files.workflow.ts | 28 +- test/e2e-core/src/install-closure.workflow.ts | 68 +- .../src/match-annotations.workflow.ts | 62 +- .../e2e-core/src/missing-fixtures.workflow.ts | 20 +- .../src/parse-annotations.workflow.ts | 10 +- .../src/placement-closure.workflow.ts | 46 +- .../src/prune-stale-entries.workflow.ts | 16 +- test/e2e-core/src/read-bench-run.workflow.ts | 18 +- .../src/render-bench-report.workflow.ts | 8 +- test/e2e-core/src/status-closure.workflow.ts | 60 +- test/e2e-core/src/summarize-bench.workflow.ts | 22 +- .../__fixtures__/placement-failure.schema.ts | 20 +- test/e2e/src/Harness/fixture-cache.service.ts | 23 +- test/e2e/src/Harness/guest-job.service.ts | 4 +- test/e2e/src/Harness/harness-layers.ts | 3 + .../src/Harness/stryker-cli-runner.service.ts | 11 +- test/e2e/src/Harness/warm-sandbox.handle.ts | 8 +- 258 files changed, 4801 insertions(+), 3438 deletions(-) create mode 100644 .changeset/effect-4-1-crypto-migration.md diff --git a/.changeset/effect-4-1-crypto-migration.md b/.changeset/effect-4-1-crypto-migration.md new file mode 100644 index 000000000..8c9d5f1f6 --- /dev/null +++ b/.changeset/effect-4-1-crypto-migration.md @@ -0,0 +1,12 @@ +--- +"@systemfsoftware/stryker-js": patch +"@systemfsoftware/stryker-js-vitest-runner": patch +"@systemfsoftware/stryker-js-typescript-checker": patch +"@systemfsoftware/stryker-js-instrumenter": patch +"@systemfsoftware/stryker-js-plugin-interface": patch +"@systemfsoftware/stryker-js-plugin-runtime": patch +"@systemfsoftware/stryker-js-cli-contract": patch +"@systemfsoftware/stryker-js-html-reporter": patch +--- + +Build on effect 4.1.0. effect 4.1.0 removed the `effect/Crypto` module, which the published stryker-js and stryker-js-vitest-runner imported, so a mutation run on effect 4.1.0 failed with ERR_MODULE_NOT_FOUND. Both packages now take random identifiers from `effect/crypto/SecureRandom` (`NodeCrypto.layerSecureRandom`), and the effect peer range is now `^4.1.0`: `effect/crypto/*` does not exist in 4.0.x. Schema classes are branded as @effect/tsgo 0.63.0 requires, the MCP server registers its toolkit through the stdio transport's `registrations` option with a middleware that provides the engine services to each request, and file identity in the case-sensitivity probe is a bigint, as effect 4.1.0 reports it. diff --git a/packages/stryker-js-cli-contract/contract/stream.schema.json b/packages/stryker-js-cli-contract/contract/stream.schema.json index 25e5c7854..a0281d31f 100644 --- a/packages/stryker-js-cli-contract/contract/stream.schema.json +++ b/packages/stryker-js-cli-contract/contract/stream.schema.json @@ -142,7 +142,8 @@ }, "total": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "shardPlan": { "anyOf": [ @@ -164,10 +165,14 @@ "type": "object", "properties": { "index": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "count": { - "type": "integer" + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 }, "predictedSeconds": { "type": "number" @@ -256,54 +261,66 @@ }, "reused": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "ran": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "refused": { "type": "object", "properties": { "semanticsChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "policyChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "runInputsChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "closureChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "closureAnalysisFailed": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "programChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "timeoutUnreproduced": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "flakyDependency": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "noPriorRecord": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "decidedPerRun": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": [ @@ -385,7 +402,8 @@ }, "index": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "startupMs": { "type": "number", @@ -426,11 +444,13 @@ "properties": { "line": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 }, "column": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 } }, "required": [ @@ -444,11 +464,13 @@ "properties": { "line": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 }, "column": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 } }, "required": [ @@ -480,11 +502,13 @@ }, "completed": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "total": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "static": { "type": "boolean" @@ -504,7 +528,8 @@ }, "testsExecuted": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "shared": { "type": "boolean" @@ -526,138 +551,134 @@ "subsumption": { "anyOf": [ { - "anyOf": [ - { - "type": "object", - "properties": { - "_tag": { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "Subsumed" + ] + }, + "rule": { + "anyOf": [ + { "type": "string", "enum": [ - "Subsumed" - ] - }, - "rule": { - "anyOf": [ - { - "type": "string", - "enum": [ - "complement" - ] - } + "complement" ] - }, - "dominators": { - "type": "array", - "minItems": 1, - "items": [ - { - "type": "string", - "pattern": "^[0-9a-f]{16}$" - } - ], - "additionalItems": { - "type": "string", - "pattern": "^[0-9a-f]{16}$" - } } - }, - "required": [ - "_tag", - "rule", - "dominators" + ] + }, + "dominators": { + "type": "array", + "minItems": 1, + "items": [ + { + "type": "string", + "pattern": "^[0-9a-f]{16}$" + } ], - "additionalProperties": true + "additionalItems": { + "type": "string", + "pattern": "^[0-9a-f]{16}$" + } + } + }, + "required": [ + "_tag", + "rule", + "dominators" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "Readmitted" + ] }, - { - "type": "object", - "properties": { - "_tag": { + "rule": { + "anyOf": [ + { "type": "string", "enum": [ - "Readmitted" + "complement" ] - }, - "rule": { - "anyOf": [ - { + } + ] + }, + "causes": { + "type": "array", + "minItems": 1, + "items": [ + { + "type": "object", + "properties": { + "dominator": { + "type": "string", + "pattern": "^[0-9a-f]{16}$" + }, + "code": { "type": "string", "enum": [ - "complement" + "dominator-ignored-at-check", + "dominator-compile-error", + "dominator-ignored-at-plan", + "dominator-remembered-without-running", + "dominator-unsettled" ] + }, + "detail": { + "type": "string" } - ] - }, - "causes": { - "type": "array", - "minItems": 1, - "items": [ - { - "type": "object", - "properties": { - "dominator": { - "type": "string", - "pattern": "^[0-9a-f]{16}$" - }, - "code": { - "type": "string", - "enum": [ - "dominator-ignored-at-check", - "dominator-compile-error", - "dominator-ignored-at-plan", - "dominator-remembered-without-running", - "dominator-unsettled" - ] - }, - "detail": { - "type": "string" - } - }, - "required": [ - "dominator", - "code", - "detail" - ], - "additionalProperties": true - } + }, + "required": [ + "dominator", + "code", + "detail" ], - "additionalItems": { - "type": "object", - "properties": { - "dominator": { - "type": "string", - "pattern": "^[0-9a-f]{16}$" - }, - "code": { - "type": "string", - "enum": [ - "dominator-ignored-at-check", - "dominator-compile-error", - "dominator-ignored-at-plan", - "dominator-remembered-without-running", - "dominator-unsettled" - ] - }, - "detail": { - "type": "string" - } - }, - "required": [ - "dominator", - "code", - "detail" - ], - "additionalProperties": true - } + "additionalProperties": true } - }, - "required": [ - "_tag", - "rule", - "causes" ], - "additionalProperties": true + "additionalItems": { + "type": "object", + "properties": { + "dominator": { + "type": "string", + "pattern": "^[0-9a-f]{16}$" + }, + "code": { + "type": "string", + "enum": [ + "dominator-ignored-at-check", + "dominator-compile-error", + "dominator-ignored-at-plan", + "dominator-remembered-without-running", + "dominator-unsettled" + ] + }, + "detail": { + "type": "string" + } + }, + "required": [ + "dominator", + "code", + "detail" + ], + "additionalProperties": true + } } - ] + }, + "required": [ + "_tag", + "rule", + "causes" + ], + "additionalProperties": true }, { "type": "null" @@ -720,13 +741,15 @@ }, "completed": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "total": { "anyOf": [ { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, { "type": "null" @@ -917,54 +940,66 @@ }, "reused": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "ran": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "refused": { "type": "object", "properties": { "semanticsChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "policyChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "runInputsChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "closureChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "closureAnalysisFailed": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "programChanged": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "timeoutUnreproduced": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "flakyDependency": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "noPriorRecord": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "decidedPerRun": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": [ @@ -998,11 +1033,13 @@ }, "equivalentToOriginal": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "duplicateAtSite": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": [ @@ -1119,35 +1156,43 @@ "properties": { "pending": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "killed": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "timeout": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "survived": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "noCoverage": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "runtimeErrors": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "compileErrors": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "ignored": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 } }, "required": [ @@ -1275,11 +1320,13 @@ "properties": { "line": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 }, "column": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 } }, "required": [ @@ -1293,11 +1340,13 @@ "properties": { "line": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 }, "column": { "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 } }, "required": [ @@ -1507,7 +1556,8 @@ "properties": { "count": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 9007199254740991 }, "costMs": { "type": "number", @@ -1592,105 +1642,101 @@ "reason": { "anyOf": [ { - "anyOf": [ - { - "type": "object", - "properties": { - "_tag": { - "type": "string", - "enum": [ - "PeerMissing" - ] - }, - "peer": { - "type": "string" - } - }, - "required": [ - "_tag", - "peer" - ], - "additionalProperties": true + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "PeerMissing" + ] }, - { - "type": "object", - "properties": { - "_tag": { - "type": "string", - "enum": [ - "PeerVersionUnsupported" - ] - }, - "peer": { - "type": "string" - }, - "detail": { - "type": "string" - } - }, - "required": [ - "_tag", - "peer", - "detail" - ], - "additionalProperties": true + "peer": { + "type": "string" + } + }, + "required": [ + "_tag", + "peer" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "PeerVersionUnsupported" + ] }, - { - "type": "object", - "properties": { - "_tag": { - "type": "string", - "enum": [ - "PeerUnrecognized" - ] - }, - "peer": { - "type": "string" - } - }, - "required": [ - "_tag", - "peer" - ], - "additionalProperties": true + "peer": { + "type": "string" }, - { - "type": "object", - "properties": { - "_tag": { - "type": "string", - "enum": [ - "InvalidContribution" - ] - }, - "detail": { - "type": "string" - } - }, - "required": [ - "_tag", - "detail" - ], - "additionalProperties": true + "detail": { + "type": "string" + } + }, + "required": [ + "_tag", + "peer", + "detail" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "PeerUnrecognized" + ] }, - { - "type": "object", - "properties": { - "_tag": { - "type": "string", - "enum": [ - "ImportFailed" - ] - }, - "cause": {} - }, - "required": [ - "_tag", - "cause" - ], - "additionalProperties": true + "peer": { + "type": "string" } - ] + }, + "required": [ + "_tag", + "peer" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "InvalidContribution" + ] + }, + "detail": { + "type": "string" + } + }, + "required": [ + "_tag", + "detail" + ], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "_tag": { + "type": "string", + "enum": [ + "ImportFailed" + ] + }, + "cause": {} + }, + "required": [ + "_tag", + "cause" + ], + "additionalProperties": true }, { "type": "null" diff --git a/packages/stryker-js-cli-contract/oxlint.config.ts b/packages/stryker-js-cli-contract/oxlint.config.ts index de5f70fe4..3b5a7d6c3 100644 --- a/packages/stryker-js-cli-contract/oxlint.config.ts +++ b/packages/stryker-js-cli-contract/oxlint.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/src/generated/**', diff --git a/packages/stryker-js-cli-contract/src/run-event.schema.ts b/packages/stryker-js-cli-contract/src/run-event.schema.ts index 60050100f..fca090b79 100644 --- a/packages/stryker-js-cli-contract/src/run-event.schema.ts +++ b/packages/stryker-js-cli-contract/src/run-event.schema.ts @@ -17,14 +17,14 @@ export const RunId = S.String.pipe( ) export type RunId = typeof RunId.Type -export class RunStarted extends S.TaggedClass()('stream', { +export class RunStarted extends S.TaggedClass()('stream', { schemaVersion: StreamSchemaVersion, runId: RunId, mode: OutputMode, signal: ModeSignal, }) {} -export class PhaseEntered extends S.TaggedClass()('phase', { +export class PhaseEntered extends S.TaggedClass()('phase', { phase: RunPhase, elapsedMs: Report.NonNegativeFinite, }) {} @@ -73,7 +73,7 @@ export const PlanProjectReuse = S.Struct({ }) export type PlanProjectReuse = typeof PlanProjectReuse.Type -export class PlanKnown extends S.TaggedClass()('plan', { +export class PlanKnown extends S.TaggedClass()('plan', { total: Report.NonNegativeInt, shardPlan: S.NullOr(ShardPlanDocument), projects: PlanProjectReuse.pipe(S.Array, S.optionalKey), @@ -82,7 +82,7 @@ export class PlanKnown extends S.TaggedClass()('plan', { export const WorkerRole = S.Literals(['testRunner', 'checker']) export type WorkerRole = typeof WorkerRole.Type -export class WorkerReported extends S.TaggedClass()('worker', { +export class WorkerReported extends S.TaggedClass()('worker', { schemaVersion: StreamSchemaVersion, role: WorkerRole, index: Report.NonNegativeInt, @@ -127,7 +127,7 @@ const subsumptionCheck = S.makeFilter( }, ) -export class RunMutantTestedEvent extends S.TaggedClass()( +export class RunMutantTestedEvent extends S.TaggedClass()( 'mutantTested', S.Struct({ ...mutantTestedFields, @@ -203,7 +203,7 @@ export const RunMutantTested: S.Codec()('tick', { +export class Heartbeat extends S.TaggedClass()('tick', { elapsedMs: Report.NonNegativeFinite, completed: Report.NonNegativeInt, total: S.NullOr(Report.NonNegativeInt), @@ -275,7 +275,7 @@ export const Budget = S.Struct({ }) export type Budget = typeof Budget.Type -export class VerdictReached extends S.TaggedClass()('verdict', { +export class VerdictReached extends S.TaggedClass()('verdict', { schemaVersion: StreamSchemaVersion, runId: RunId, mode: OutputMode, @@ -313,7 +313,7 @@ export const FormatClaimShadowingRow = S.Struct({ }) export type FormatClaimShadowingRow = typeof FormatClaimShadowingRow.Type -export class PluginsReported extends S.TaggedClass()('plugins', { +export class PluginsReported extends S.TaggedClass()('plugins', { modules: S.Array(FrameworkModuleRow), shadowings: S.Array(FormatClaimShadowingRow), }) {} @@ -326,9 +326,11 @@ export const FormatRegistryRow = S.Struct({ }) export type FormatRegistryRow = typeof FormatRegistryRow.Type -export class FormatRegistryResolved extends S.TaggedClass()('formats', { - rows: S.Array(FormatRegistryRow), -}) {} +export class FormatRegistryResolved + extends S.TaggedClass()('formats', { + rows: S.Array(FormatRegistryRow), + }) +{} export const SkippedFileRow = S.Struct({ file: S.String, @@ -337,39 +339,41 @@ export const SkippedFileRow = S.Struct({ }) export type SkippedFileRow = typeof SkippedFileRow.Type -export class SkippedReported extends S.TaggedClass()('skipped', { +export class SkippedReported extends S.TaggedClass()('skipped', { files: S.Array(SkippedFileRow), }) {} -export class ReuseReported extends S.TaggedClass()('reuse', { +export class ReuseReported extends S.TaggedClass()('reuse', { reused: Report.NonNegativeInt, ran: Report.NonNegativeInt, refused: ReuseRefusals, }) {} -export class TceReported extends S.TaggedClass()('tce', { +export class TceReported extends S.TaggedClass()('tce', { equivalentToOriginal: Report.NonNegativeInt, duplicateAtSite: Report.NonNegativeInt, }) {} -export class MutantDetailReported extends S.TaggedClass()('mutant-detail', { - id: Mutant.MutantId, - status: Mutant.MutantStatusSchema, - coveringTests: S.Array(S.String), - killedBy: S.NullOr(S.String), - reproducer: S.NullOr(S.String), -}) {} +export class MutantDetailReported + extends S.TaggedClass()('mutant-detail', { + id: Mutant.MutantId, + status: Mutant.MutantStatusSchema, + coveringTests: S.Array(S.String), + killedBy: S.NullOr(S.String), + reproducer: S.NullOr(S.String), + }) +{} export const FeedbackJudgment = S.Literals(['useful', 'not-useful']) export type FeedbackJudgment = typeof FeedbackJudgment.Type -export class FeedbackReported extends S.TaggedClass()('feedback', { +export class FeedbackReported extends S.TaggedClass()('feedback', { id: Mutant.MutantId, judgment: FeedbackJudgment, reason: S.NullOr(S.String), }) {} -export class RunFailed extends S.TaggedClass()('error', { +export class RunFailed extends S.TaggedClass()('error', { schemaVersion: StreamSchemaVersion, code: Plugin.ExitCode, error: S.String, @@ -377,7 +381,7 @@ export class RunFailed extends S.TaggedClass()('error', { reason: S.NullOr(PluginLoadFailureReason), }) {} -export class HelpRendered extends S.TaggedClass()('help', { +export class HelpRendered extends S.TaggedClass()('help', { schemaVersion: StreamSchemaVersion, code: S.Literals([0]), help: S.String, @@ -386,7 +390,7 @@ export class HelpRendered extends S.TaggedClass()('help', { export const RefusalRule = S.Literal('mutation-runs-on-main-ci') export type RefusalRule = typeof RefusalRule.Type -export class Refused extends S.TaggedClass()('refused', { +export class Refused extends S.TaggedClass()('refused', { schemaVersion: StreamSchemaVersion, rule: RefusalRule, message: S.String, diff --git a/packages/stryker-js-cli-contract/tests/__fixtures__/contract-law.fixture.ts b/packages/stryker-js-cli-contract/tests/__fixtures__/contract-law.fixture.ts index 63eccd515..b8a25174d 100644 --- a/packages/stryker-js-cli-contract/tests/__fixtures__/contract-law.fixture.ts +++ b/packages/stryker-js-cli-contract/tests/__fixtures__/contract-law.fixture.ts @@ -64,7 +64,9 @@ const releaseNextOf = (pkg: string): string => const baselineFields = { package: S.String, manifest: S.String, version: S.String } -export class NoVersionCommit extends S.TaggedError()('NoVersionCommit', baselineFields) { +export class NoVersionCommit + extends S.TaggedError()('NoVersionCommit', baselineFields) +{ readonly code = 'no-version-commit' get reason(): string { return `no commit on main's first-parent history sets "version": "${this.version}" in ${this.manifest}, so the commit that released ${this.version} cannot be found` @@ -74,10 +76,12 @@ export class NoVersionCommit extends S.TaggedError()('NoVersion } } -export class HistoryTruncated extends S.TaggedError()('HistoryTruncated', { - ...baselineFields, - boundary: S.String, -}) { +export class HistoryTruncated + extends S.TaggedError()('HistoryTruncated', { + ...baselineFields, + boundary: S.String, + }) +{ readonly code = 'history-truncated' get reason(): string { return `the history of this checkout ends at ${this.boundary}, so whether that commit set ${this.version} in ${this.manifest} cannot be read` @@ -87,10 +91,12 @@ export class HistoryTruncated extends S.TaggedError()('History } } -export class VersionUnchanged extends S.TaggedError()('VersionUnchanged', { - ...baselineFields, - commit: S.String, -}) { +export class VersionUnchanged + extends S.TaggedError()('VersionUnchanged', { + ...baselineFields, + commit: S.String, + }) +{ readonly code = 'version-unchanged' get reason(): string { return `${this.commit} rewrites the line declaring ${this.version} in ${this.manifest} while its parent already declares ${this.version}, so it cannot be told apart from the commit that released ${this.version}` @@ -100,11 +106,13 @@ export class VersionUnchanged extends S.TaggedError()('Version } } -export class VersionRollback extends S.TaggedError()('VersionRollback', { - ...baselineFields, - commit: S.String, - parentVersion: S.String, -}) { +export class VersionRollback + extends S.TaggedError()('VersionRollback', { + ...baselineFields, + commit: S.String, + parentVersion: S.String, + }) +{ readonly code = 'version-rollback' get reason(): string { return `${this.commit} moves ${this.manifest} back from ${this.parentVersion} to ${this.version}, so its documents are not the ones ${this.version} shipped` diff --git a/packages/stryker-js-html-reporter/oxlint.config.ts b/packages/stryker-js-html-reporter/oxlint.config.ts index 8e66774f5..12065c58f 100644 --- a/packages/stryker-js-html-reporter/oxlint.config.ts +++ b/packages/stryker-js-html-reporter/oxlint.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'typescript/no-unnecessary-condition': 'error', 'typescript/strict-boolean-expressions': 'error', diff --git a/packages/stryker-js-html-reporter/src/render-html-report.workflow.ts b/packages/stryker-js-html-reporter/src/render-html-report.workflow.ts index d40741c37..860bbec40 100644 --- a/packages/stryker-js-html-reporter/src/render-html-report.workflow.ts +++ b/packages/stryker-js-html-reporter/src/render-html-report.workflow.ts @@ -7,22 +7,28 @@ const RenderHtmlReportTypeId: unique symbol = Symbol.for( ) type RenderHtmlReportTypeId = typeof RenderHtmlReportTypeId -export class RenderHtmlReport extends Schema.TaggedClass()('RenderHtmlReport', { - fileName: Schema.String, - inlinedBundle: Schema.UndefinedOr(Schema.String), -}) { +export class RenderHtmlReport + extends Schema.TaggedClass()('RenderHtmlReport', { + fileName: Schema.String, + inlinedBundle: Schema.UndefinedOr(Schema.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = { fileName: 'stryker.html_report.file_name', } as const } -export class BundleInlined extends Schema.TaggedClass()('BundleInlined', { - bundle: Schema.String, -}) { +export class BundleInlined + extends Schema.TaggedClass()('BundleInlined', { + bundle: Schema.String, + }) +{ readonly [RenderHtmlReportTypeId] = RenderHtmlReportTypeId } -export class BundleFromDisk extends Schema.TaggedClass()('BundleFromDisk', {}) { +export class BundleFromDisk + extends Schema.TaggedClass()('BundleFromDisk', {}) +{ readonly [RenderHtmlReportTypeId] = RenderHtmlReportTypeId } diff --git a/packages/stryker-js-instrumenter/oxlint.config.ts b/packages/stryker-js-instrumenter/oxlint.config.ts index 1192cd184..e3fbb1089 100644 --- a/packages/stryker-js-instrumenter/oxlint.config.ts +++ b/packages/stryker-js-instrumenter/oxlint.config.ts @@ -13,5 +13,6 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [...(recommended.ignorePatterns ?? []), '**/testResources/**'], }) diff --git a/packages/stryker-js-instrumenter/src/ErrorText.schema.ts b/packages/stryker-js-instrumenter/src/ErrorText.schema.ts index 923f794d2..4b1bdb350 100644 --- a/packages/stryker-js-instrumenter/src/ErrorText.schema.ts +++ b/packages/stryker-js-instrumenter/src/ErrorText.schema.ts @@ -1,9 +1,13 @@ import * as S from 'effect/Schema' -export class ErrorText extends S.Class('ErrorText')({ text: S.NonEmptyString }) {} +export class ErrorText + extends S.Class('ErrorText')({ text: S.NonEmptyString }) +{} export type ErrorTextValue = ErrorText -export class CauseText extends S.Class('CauseText')({ text: S.NonEmptyString }) {} +export class CauseText + extends S.Class('CauseText')({ text: S.NonEmptyString }) +{} export type CauseTextValue = CauseText export interface ErrnoException extends Error { diff --git a/packages/stryker-js-instrumenter/src/Instrument.schema.ts b/packages/stryker-js-instrumenter/src/Instrument.schema.ts index 51b486128..04dbd8fff 100644 --- a/packages/stryker-js-instrumenter/src/Instrument.schema.ts +++ b/packages/stryker-js-instrumenter/src/Instrument.schema.ts @@ -5,15 +5,15 @@ import * as S from 'effect/Schema' import { MutatorNameSchema } from './directives/directive.schema.js' import type { MutatorSelection } from './Mutator.service.js' -export class InstrumentError - extends S.TaggedError('@systemfsoftware/stryker-js-instrumenter/Instrument.schema/InstrumentError')( - 'InstrumentError', - { - message: S.String, - cause: S.Defect(), - }, - ) -{ +export class InstrumentError extends S.TaggedError( + '@systemfsoftware/stryker-js-instrumenter/Instrument.schema/InstrumentError', +)( + 'InstrumentError', + { + message: S.String, + cause: S.Defect(), + }, +) { override get message(): string { return Boolean.match(this.message.length === 0, { onTrue: () => 'Instrumenter failure', @@ -50,66 +50,82 @@ export type InstrumenterOptions = Omit()('InstrumentFileSkip', { - file: S.String, - extension: S.String, - reason: S.String, -}) {} - -export class InstrumentFilesCommand extends S.TaggedClass()('InstrumentFilesCommand', { - fileCount: S.Finite, - claimedCount: S.Finite, - skipped: S.Array(InstrumentFileSkip), -}) { +export class InstrumentFileSkip + extends S.TaggedClass()('InstrumentFileSkip', { + file: S.String, + extension: S.String, + reason: S.String, + }) +{} + +export class InstrumentFilesCommand + extends S.TaggedClass()('InstrumentFilesCommand', { + fileCount: S.Finite, + claimedCount: S.Finite, + skipped: S.Array(InstrumentFileSkip), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class InstrumentResult extends S.TaggedClass()('InstrumentResult', { - files: S.Array(FileSchema), - mutants: S.Array(Mutant.Mutant), - skipped: S.Array(InstrumentFileSkip), -}) {} +export class InstrumentResult + extends S.TaggedClass()('InstrumentResult', { + files: S.Array(FileSchema), + mutants: S.Array(Mutant.Mutant), + skipped: S.Array(InstrumentFileSkip), + }) +{} export const PlacerNameSchema = S.Literals(['expression', 'statement', 'switch-case']) export type PlacerName = typeof PlacerNameSchema.Type -export class MutantsUnapplied extends S.TaggedError()('MutantsUnapplied', { - fileName: S.String, - placer: PlacerNameSchema, - mutatorNames: S.Array(MutatorNameSchema), - cause: S.Defect(), -}) { +export class MutantsUnapplied + extends S.TaggedError()('MutantsUnapplied', { + fileName: S.String, + placer: PlacerNameSchema, + mutatorNames: S.Array(MutatorNameSchema), + cause: S.Defect(), + }) +{ override get message(): string { return `Failed to apply ${this.mutatorNames.join(', ')} in ${this.fileName}` } } -export class MutantNotApplied extends S.TaggedError()('MutantNotApplied', { - fileName: S.String, - mutatorName: MutatorNameSchema, -}) { +export class MutantNotApplied + extends S.TaggedError()('MutantNotApplied', { + fileName: S.String, + mutatorName: MutatorNameSchema, + }) +{ override get message(): string { return `Could not apply the ${this.mutatorName} mutant in ${this.fileName}` } } -export class NodeWithoutSpan extends S.TaggedError()('NodeWithoutSpan', { - fileName: S.String, -}) { +export class NodeWithoutSpan + extends S.TaggedError()('NodeWithoutSpan', { + fileName: S.String, + }) +{ override get message(): string { return `Node without a span in ${this.fileName}` } } -export class MutantsUnplaced extends S.TaggedError()('MutantsUnplaced', { - fileName: S.String, - detail: S.String, -}) { +export class MutantsUnplaced + extends S.TaggedError()('MutantsUnplaced', { + fileName: S.String, + detail: S.String, + }) +{ override get message(): string { return `Mutants cannot be placed. This shouldn't happen! Unplaced mutants: ${this.detail}` } } -export class PlacementRefused extends S.TaggedError()('PlacementRefused', { - message: S.String, -}) {} +export class PlacementRefused + extends S.TaggedError()('PlacementRefused', { + message: S.String, + }) +{} diff --git a/packages/stryker-js-instrumenter/src/InstrumentContext.schema.ts b/packages/stryker-js-instrumenter/src/InstrumentContext.schema.ts index 98ce40f9c..b79d46271 100644 --- a/packages/stryker-js-instrumenter/src/InstrumentContext.schema.ts +++ b/packages/stryker-js-instrumenter/src/InstrumentContext.schema.ts @@ -2,13 +2,15 @@ import * as S from 'effect/Schema' import { Mutant } from '@systemfsoftware/stryker-js-plugin-interface' -export class InstrumenterContext extends S.Class('InstrumenterContext')({ - activeMutant: S.optional(S.String), - currentTestId: S.optional(S.String), - mutantCoverage: S.optional(Mutant.MutantCoverageSchema), - hitCount: S.optional(Mutant.HitCount), - hitLimit: S.optional(Mutant.HitCount), -}) { +export class InstrumenterContext + extends S.Class('InstrumenterContext')({ + activeMutant: S.optional(S.String), + currentTestId: S.optional(S.String), + mutantCoverage: S.optional(Mutant.MutantCoverageSchema), + hitCount: S.optional(Mutant.HitCount), + hitLimit: S.optional(Mutant.HitCount), + }) +{ static readonly NAMESPACE = '__stryker__' static readonly MUTATION_COVERAGE_OBJECT = 'mutantCoverage' static readonly ACTIVE_MUTANT = 'activeMutant' diff --git a/packages/stryker-js-instrumenter/src/Parser.schema.ts b/packages/stryker-js-instrumenter/src/Parser.schema.ts index 4ba2b65f3..45c443f17 100644 --- a/packages/stryker-js-instrumenter/src/Parser.schema.ts +++ b/packages/stryker-js-instrumenter/src/Parser.schema.ts @@ -1,17 +1,17 @@ import { Mutant } from '@systemfsoftware/stryker-js-plugin-interface' import * as S from 'effect/Schema' -export class ParseFailed - extends S.TaggedError('@systemfsoftware/stryker-js-instrumenter/Parser.schema/ParseFailed')( - 'ParseFailed', - { - fileName: S.String, - message: S.String, - location: Mutant.Position, - cause: S.Defect(), - }, - ) -{ +export class ParseFailed extends S.TaggedError( + '@systemfsoftware/stryker-js-instrumenter/Parser.schema/ParseFailed', +)( + 'ParseFailed', + { + fileName: S.String, + message: S.String, + location: Mutant.Position, + cause: S.Defect(), + }, +) { override get message(): string { return `Failed to parse ${this.fileName} at ${this.location.line}:${this.location.column}: ${this.message}` } diff --git a/packages/stryker-js-instrumenter/src/Parser.ts b/packages/stryker-js-instrumenter/src/Parser.ts index 0a6aab77d..6a76b5c32 100644 --- a/packages/stryker-js-instrumenter/src/Parser.ts +++ b/packages/stryker-js-instrumenter/src/Parser.ts @@ -35,7 +35,7 @@ export type { Oxc } const oxcModule = Effect.cached(Effect.promise(() => import('oxc-parser'))) -export const loadOxc: Effect.Effect = Effect.flatMap(oxcModule, (load) => load) +export const loadOxc: Effect.Effect = Effect.flatten(oxcModule) const parseWithOxcDataFirst = Effect.fn(SpanTaxonomy.Spans.instrumentParserParseWithOxc.name)( function*(text: string, fileName: string, lang: 'js' | 'jsx' | 'ts' | 'tsx') { diff --git a/packages/stryker-js-instrumenter/src/admit-instrument-files.workflow.ts b/packages/stryker-js-instrumenter/src/admit-instrument-files.workflow.ts index 76cb2b3d1..74ce87e07 100644 --- a/packages/stryker-js-instrumenter/src/admit-instrument-files.workflow.ts +++ b/packages/stryker-js-instrumenter/src/admit-instrument-files.workflow.ts @@ -10,19 +10,23 @@ const InstrumentFilesDecisionTypeId: unique symbol = Symbol.for( ) type InstrumentFilesDecisionTypeId = typeof InstrumentFilesDecisionTypeId -export class InstrumentFilesAdmitted extends S.TaggedClass()('InstrumentFilesAdmitted', { - fileCount: S.Finite, - skipped: S.Array(InstrumentFileSkip), -}) { +export class InstrumentFilesAdmitted + extends S.TaggedClass()('InstrumentFilesAdmitted', { + fileCount: S.Finite, + skipped: S.Array(InstrumentFileSkip), + }) +{ readonly [InstrumentFilesDecisionTypeId] = InstrumentFilesDecisionTypeId } -export class InstrumentFilesSkippedOnly extends S.TaggedClass()( - 'InstrumentFilesSkippedOnly', - { - skipped: S.Array(InstrumentFileSkip), - }, -) { +export class InstrumentFilesSkippedOnly + extends S.TaggedClass()( + 'InstrumentFilesSkippedOnly', + { + skipped: S.Array(InstrumentFileSkip), + }, + ) +{ readonly [InstrumentFilesDecisionTypeId] = InstrumentFilesDecisionTypeId } diff --git a/packages/stryker-js-instrumenter/src/arid-code.workflow.ts b/packages/stryker-js-instrumenter/src/arid-code.workflow.ts index 7a13caaa8..89173ca64 100644 --- a/packages/stryker-js-instrumenter/src/arid-code.workflow.ts +++ b/packages/stryker-js-instrumenter/src/arid-code.workflow.ts @@ -128,10 +128,12 @@ const calleeDetail = (callee: AridCallee): string => }), ) -export class AridCodeCommand extends S.TaggedClass()('AridCodeCommand', { - policy: Options.MutantSetPolicy, - frames: S.Array(AridFrameSchema), -}) { +export class AridCodeCommand + extends S.TaggedClass()('AridCodeCommand', { + policy: Options.MutantSetPolicy, + frames: S.Array(AridFrameSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -140,14 +142,16 @@ const AridCodeDecisionTypeId: unique symbol = Symbol.for( ) type AridCodeDecisionTypeId = typeof AridCodeDecisionTypeId -export class AridSuppressed extends S.TaggedClass()('AridSuppressed', { - ruleId: AridRuleId, - detail: S.String, -}) { +export class AridSuppressed + extends S.TaggedClass()('AridSuppressed', { + ruleId: AridRuleId, + detail: S.String, + }) +{ readonly [AridCodeDecisionTypeId] = AridCodeDecisionTypeId } -export class AridKept extends S.TaggedClass()('AridKept', {}) { +export class AridKept extends S.TaggedClass()('AridKept', {}) { readonly [AridCodeDecisionTypeId] = AridCodeDecisionTypeId } diff --git a/packages/stryker-js-instrumenter/src/directives/decode-directive.workflow.ts b/packages/stryker-js-instrumenter/src/directives/decode-directive.workflow.ts index dd83b2705..6ba5c625e 100644 --- a/packages/stryker-js-instrumenter/src/directives/decode-directive.workflow.ts +++ b/packages/stryker-js-instrumenter/src/directives/decode-directive.workflow.ts @@ -10,24 +10,30 @@ const DIRECTIVE_PATTERN = /^\s?Stryker (disable|restore)(?: (next-line))? ([a-zA const DEFAULT_REASON = 'Ignored using a comment' const NEXT_LINE = 'next-line' -export class DecodeDirectiveCommand extends S.TaggedClass()('DecodeDirectiveCommand', { - commentText: S.String, -}) { +export class DecodeDirectiveCommand + extends S.TaggedClass()('DecodeDirectiveCommand', { + commentText: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const DirectiveDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-instrumenter/DirectiveDecision') type DirectiveDecisionTypeId = typeof DirectiveDecisionTypeId -export class DirectiveDecoded extends S.TaggedClass()('DirectiveDecoded', { - directive: DirectiveSchema, -}) { +export class DirectiveDecoded + extends S.TaggedClass()('DirectiveDecoded', { + directive: DirectiveSchema, + }) +{ readonly [DirectiveDecisionTypeId] = DirectiveDecisionTypeId } -export class DirectiveMalformed extends S.TaggedClass()('DirectiveMalformed', { - commentText: S.String, -}) { +export class DirectiveMalformed + extends S.TaggedClass()('DirectiveMalformed', { + commentText: S.String, + }) +{ readonly [DirectiveDecisionTypeId] = DirectiveDecisionTypeId } diff --git a/packages/stryker-js-instrumenter/src/directives/fold-rule.workflow.ts b/packages/stryker-js-instrumenter/src/directives/fold-rule.workflow.ts index 2e222d8df..8b55446d2 100644 --- a/packages/stryker-js-instrumenter/src/directives/fold-rule.workflow.ts +++ b/packages/stryker-js-instrumenter/src/directives/fold-rule.workflow.ts @@ -7,23 +7,25 @@ import { type LocatedDirective, LocatedDirectiveSchema } from './directive.schem export type MutantRule = readonly LocatedDirective[] -export class FoldRuleCommand extends S.TaggedClass()('FoldRuleCommand', { - rule: S.Array(LocatedDirectiveSchema), - directive: LocatedDirectiveSchema, -}) { +export class FoldRuleCommand + extends S.TaggedClass()('FoldRuleCommand', { + rule: S.Array(LocatedDirectiveSchema), + directive: LocatedDirectiveSchema, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const RuleFoldTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-instrumenter/RuleFold') type RuleFoldTypeId = typeof RuleFoldTypeId -export class DisableFolded extends S.TaggedClass()('DisableFolded', { +export class DisableFolded extends S.TaggedClass()('DisableFolded', { rule: S.Array(LocatedDirectiveSchema), }) { readonly [RuleFoldTypeId] = RuleFoldTypeId } -export class RestoreFolded extends S.TaggedClass()('RestoreFolded', { +export class RestoreFolded extends S.TaggedClass()('RestoreFolded', { rule: S.Array(LocatedDirectiveSchema), }) { readonly [RuleFoldTypeId] = RuleFoldTypeId diff --git a/packages/stryker-js-instrumenter/src/instrument-files.cell.ts b/packages/stryker-js-instrumenter/src/instrument-files.cell.ts index 2228d2a98..10f861b29 100644 --- a/packages/stryker-js-instrumenter/src/instrument-files.cell.ts +++ b/packages/stryker-js-instrumenter/src/instrument-files.cell.ts @@ -12,6 +12,7 @@ import { type InstrumenterOptions, InstrumentError, InstrumentFilesCommand, + InstrumentFileSkip, InstrumentResult, } from './Instrument.schema.js' import { PrintFailed } from './print/PrintFailed.schema.js' @@ -34,6 +35,9 @@ type InstrumentFilesRaw = typeof InstrumentFilesCommand.Encoded & { readonly mutants: readonly Mutant.Mutant[] } +const skippedOf = (raw: InstrumentFilesRaw): readonly InstrumentFileSkip[] => + raw.skipped.map(({ extension, file, reason }) => InstrumentFileSkip.make({ extension, file, reason })) + const printedFile = ( raw: InstrumentFilesRaw, { file, ast }: ParsedFile, @@ -60,12 +64,12 @@ const instrumentedResult = (raw: InstrumentFilesRaw): Effect.Effect - InstrumentResult.make({ files: [], mutants: [], skipped: [...raw.skipped] }) + InstrumentResult.make({ files: [], mutants: [], skipped: skippedOf(raw) }) const readInstrumentFiles = Effect.fn(SpanTaxonomy.Spans.instrumentReadFiles.name)(function*( input: InstrumentFilesInput, diff --git a/packages/stryker-js-instrumenter/src/mutant-set-policy.workflow.ts b/packages/stryker-js-instrumenter/src/mutant-set-policy.workflow.ts index 751c43df6..61f4d39f4 100644 --- a/packages/stryker-js-instrumenter/src/mutant-set-policy.workflow.ts +++ b/packages/stryker-js-instrumenter/src/mutant-set-policy.workflow.ts @@ -15,10 +15,12 @@ export type MutantSetFacts = typeof MutantSetFactsSchema.Type export const MutantSetRuleId = S.Literals(['equivalent-to-original', 'duplicate-at-site']) export type MutantSetRuleId = typeof MutantSetRuleId.Type -export class MutantSetPolicyCommand extends S.TaggedClass()('MutantSetPolicyCommand', { - policy: Options.MutantSetPolicy, - candidates: S.Array(MutantSetFactsSchema), -}) { +export class MutantSetPolicyCommand + extends S.TaggedClass()('MutantSetPolicyCommand', { + policy: Options.MutantSetPolicy, + candidates: S.Array(MutantSetFactsSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -27,14 +29,16 @@ const MutantSetOutcomeTypeId: unique symbol = Symbol.for( ) type MutantSetOutcomeTypeId = typeof MutantSetOutcomeTypeId -export class MutantSuppressed extends S.TaggedClass()('MutantSuppressed', { - ruleId: MutantSetRuleId, - detail: S.String, -}) { +export class MutantSuppressed + extends S.TaggedClass()('MutantSuppressed', { + ruleId: MutantSetRuleId, + detail: S.String, + }) +{ readonly [MutantSetOutcomeTypeId] = MutantSetOutcomeTypeId } -export class MutantKept extends S.TaggedClass()('MutantKept', {}) { +export class MutantKept extends S.TaggedClass()('MutantKept', {}) { readonly [MutantSetOutcomeTypeId] = MutantSetOutcomeTypeId } diff --git a/packages/stryker-js-instrumenter/src/place-mutants.workflow.ts b/packages/stryker-js-instrumenter/src/place-mutants.workflow.ts index f06f9b57a..41d7fa493 100644 --- a/packages/stryker-js-instrumenter/src/place-mutants.workflow.ts +++ b/packages/stryker-js-instrumenter/src/place-mutants.workflow.ts @@ -29,11 +29,13 @@ const PlacedMutantSchema = S.Struct({ }) export type PlacedMutant = typeof PlacedMutantSchema.Type -export class PlaceMutantsCommand extends S.TaggedClass()('PlaceMutantsCommand', { - fileName: S.String, - facts: PlacementFactsSchema, - mutants: S.Array(PlacedMutantSchema), -}) { +export class PlaceMutantsCommand + extends S.TaggedClass()('PlaceMutantsCommand', { + fileName: S.String, + facts: PlacementFactsSchema, + mutants: S.Array(PlacedMutantSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -42,24 +44,28 @@ const PlacementDecisionTypeId: unique symbol = Symbol.for( ) type PlacementDecisionTypeId = typeof PlacementDecisionTypeId -export class ExpressionSite extends S.TaggedClass()('ExpressionSite', { - fileName: S.String, - mutantIds: S.Array(Mutant.MutantId), -}) { +export class ExpressionSite + extends S.TaggedClass()('ExpressionSite', { + fileName: S.String, + mutantIds: S.Array(Mutant.MutantId), + }) +{ readonly [PlacementDecisionTypeId] = PlacementDecisionTypeId } -export class StatementSite extends S.TaggedClass()('StatementSite', { +export class StatementSite extends S.TaggedClass()('StatementSite', { fileName: S.String, mutantIds: S.Array(Mutant.MutantId), }) { readonly [PlacementDecisionTypeId] = PlacementDecisionTypeId } -export class SwitchCaseSite extends S.TaggedClass()('SwitchCaseSite', { - fileName: S.String, - mutantIds: S.Array(Mutant.MutantId), -}) { +export class SwitchCaseSite + extends S.TaggedClass()('SwitchCaseSite', { + fileName: S.String, + mutantIds: S.Array(Mutant.MutantId), + }) +{ readonly [PlacementDecisionTypeId] = PlacementDecisionTypeId } @@ -69,21 +75,25 @@ export type PlacementDecision = EditSite const ExpectedKindSchema = S.Literals(['an expression', 'a statement', 'a switch case']) type ExpectedKind = typeof ExpectedKindSchema.Type -export class MutantKindMismatch extends S.TaggedError()('MutantKindMismatch', { - fileName: S.String, - placer: PlacerNameSchema, - mutantId: Mutant.MutantId, - mutatorName: MutatorNameSchema, - expected: ExpectedKindSchema, -}) { +export class MutantKindMismatch + extends S.TaggedError()('MutantKindMismatch', { + fileName: S.String, + placer: PlacerNameSchema, + mutantId: Mutant.MutantId, + mutatorName: MutatorNameSchema, + expected: ExpectedKindSchema, + }) +{ override get message(): string { return `Expected ${this.expected} for mutant ${this.mutantId} (${this.mutatorName}) in ${this.fileName}` } } -export class NoPlacerClaimsNode extends S.TaggedError()('NoPlacerClaimsNode', { - fileName: S.String, -}) { +export class NoPlacerClaimsNode + extends S.TaggedError()('NoPlacerClaimsNode', { + fileName: S.String, + }) +{ override get message(): string { return `No placer claims the node in ${this.fileName}` } diff --git a/packages/stryker-js-instrumenter/src/plan-mutants.workflow.ts b/packages/stryker-js-instrumenter/src/plan-mutants.workflow.ts index 4f1b533d9..4ccfd2bbf 100644 --- a/packages/stryker-js-instrumenter/src/plan-mutants.workflow.ts +++ b/packages/stryker-js-instrumenter/src/plan-mutants.workflow.ts @@ -75,58 +75,68 @@ const PlannedMutantSchema = S.Struct({ }) export type PlannedMutant = typeof PlannedMutantSchema.Type -export class PlanMutantsCommand extends S.TaggedClass()('PlanMutantsCommand', { - fileName: S.String, - offset: ScriptOrigin, - line: Mutant.Line, - mutatorNames: S.Array(MutatorNameSchema), - excludedMutations: S.Array(MutatorNameSchema), - rule: S.Array(LocatedDirectiveSchema), - directives: S.Array(LocatedDirectiveSchema), - candidates: S.Array(MutantCandidateSchema), - site: SubsumptionSite, - mutantSetPolicy: Options.MutantSetPolicy, -}) { +export class PlanMutantsCommand + extends S.TaggedClass()('PlanMutantsCommand', { + fileName: S.String, + offset: ScriptOrigin, + line: Mutant.Line, + mutatorNames: S.Array(MutatorNameSchema), + excludedMutations: S.Array(MutatorNameSchema), + rule: S.Array(LocatedDirectiveSchema), + directives: S.Array(LocatedDirectiveSchema), + candidates: S.Array(MutantCandidateSchema), + site: SubsumptionSite, + mutantSetPolicy: Options.MutantSetPolicy, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const MutantPlanTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-instrumenter/MutantPlan') type MutantPlanTypeId = typeof MutantPlanTypeId -export class MutantsPlanned extends S.TaggedClass()('MutantsPlanned', { - mutants: S.Array(PlannedMutantSchema), - placeableIds: S.Array(Mutant.MutantId), - warnings: S.Array(S.String), -}) { +export class MutantsPlanned + extends S.TaggedClass()('MutantsPlanned', { + mutants: S.Array(PlannedMutantSchema), + placeableIds: S.Array(Mutant.MutantId), + warnings: S.Array(S.String), + }) +{ readonly [MutantPlanTypeId] = MutantPlanTypeId } -export class MutantsFullyIgnored extends S.TaggedClass()('MutantsFullyIgnored', { - mutants: S.Array(PlannedMutantSchema), - warnings: S.Array(S.String), -}) { +export class MutantsFullyIgnored + extends S.TaggedClass()('MutantsFullyIgnored', { + mutants: S.Array(PlannedMutantSchema), + warnings: S.Array(S.String), + }) +{ readonly [MutantPlanTypeId] = MutantPlanTypeId } export type MutantPlan = MutantsPlanned | MutantsFullyIgnored -export class MutantWithoutLocation extends S.TaggedError()('MutantWithoutLocation', { - fileName: S.String, - mutatorName: MutatorNameSchema, -}) { +export class MutantWithoutLocation + extends S.TaggedError()('MutantWithoutLocation', { + fileName: S.String, + mutatorName: MutatorNameSchema, + }) +{ override get message(): string { return `Mutant without a source location: ${this.mutatorName} in ${this.fileName}` } } -export class IgnorerAnsweredWithoutReason extends S.TaggedError()( - 'IgnorerAnsweredWithoutReason', - { - fileName: S.String, - mutantId: Mutant.MutantId, - ignorerName: S.String, - }, -) { +export class IgnorerAnsweredWithoutReason + extends S.TaggedError()( + 'IgnorerAnsweredWithoutReason', + { + fileName: S.String, + mutantId: Mutant.MutantId, + ignorerName: S.String, + }, + ) +{ override get message(): string { return `Ignorer "${this.ignorerName}" ignored mutant ${this.mutantId} in ${this.fileName} without a reason. Make its \`shouldIgnore\` return a non-empty reason string, or \`undefined\` to keep the mutant.` } diff --git a/packages/stryker-js-instrumenter/src/print/PrintFailed.schema.ts b/packages/stryker-js-instrumenter/src/print/PrintFailed.schema.ts index 9ab028659..2477d8e2e 100644 --- a/packages/stryker-js-instrumenter/src/print/PrintFailed.schema.ts +++ b/packages/stryker-js-instrumenter/src/print/PrintFailed.schema.ts @@ -1,10 +1,10 @@ import * as S from 'effect/Schema' -export class PrintFailed - extends S.TaggedError('@systemfsoftware/stryker-js-instrumenter/print/PrintFailed.schema/PrintFailed')( - 'PrintFailed', - { - message: S.String, - }, - ) -{} +export class PrintFailed extends S.TaggedError( + '@systemfsoftware/stryker-js-instrumenter/print/PrintFailed.schema/PrintFailed', +)( + 'PrintFailed', + { + message: S.String, + }, +) {} diff --git a/packages/stryker-js-instrumenter/src/resolve-format.workflow.ts b/packages/stryker-js-instrumenter/src/resolve-format.workflow.ts index 09a39d4f8..c75487c6c 100644 --- a/packages/stryker-js-instrumenter/src/resolve-format.workflow.ts +++ b/packages/stryker-js-instrumenter/src/resolve-format.workflow.ts @@ -13,12 +13,14 @@ const FormatClaimSchema = S.Struct({ type FormatClaimInput = typeof FormatClaimSchema.Type -export class FormatResolutionCommand extends S.TaggedClass()('FormatResolutionCommand', { - fileName: S.String, - extension: S.String, - formatId: S.optional(S.String), - claims: S.Array(FormatClaimSchema), -}) { +export class FormatResolutionCommand + extends S.TaggedClass()('FormatResolutionCommand', { + fileName: S.String, + extension: S.String, + formatId: S.optional(S.String), + claims: S.Array(FormatClaimSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -27,16 +29,18 @@ const FormatResolutionTypeId: unique symbol = Symbol.for( ) type FormatResolutionTypeId = typeof FormatResolutionTypeId -export class FormatAssigned extends S.TaggedClass()('FormatAssigned', { - fileName: S.String, - formatId: S.String, - language: S.String, - kind: S.Literals(['script', 'embedded']), -}) { +export class FormatAssigned + extends S.TaggedClass()('FormatAssigned', { + fileName: S.String, + formatId: S.String, + language: S.String, + kind: S.Literals(['script', 'embedded']), + }) +{ readonly [FormatResolutionTypeId] = FormatResolutionTypeId } -export class FormatSkipped extends S.TaggedClass()('FormatSkipped', { +export class FormatSkipped extends S.TaggedClass()('FormatSkipped', { fileName: S.String, extension: S.String, reason: S.String, @@ -46,11 +50,13 @@ export class FormatSkipped extends S.TaggedClass()('FormatSkipped export type FormatResolutionDecision = FormatAssigned | FormatSkipped -export class FormatOverrideUnclaimed extends S.TaggedError()('FormatOverrideUnclaimed', { - fileName: S.String, - formatId: S.String, - reason: S.String, -}) { +export class FormatOverrideUnclaimed + extends S.TaggedError()('FormatOverrideUnclaimed', { + fileName: S.String, + formatId: S.String, + reason: S.String, + }) +{ override get message(): string { return `Cannot instrument ${this.fileName}: ${this.reason}` } diff --git a/packages/stryker-js-instrumenter/src/subsume-mutants.workflow.ts b/packages/stryker-js-instrumenter/src/subsume-mutants.workflow.ts index 1b9f681ea..969f27fc0 100644 --- a/packages/stryker-js-instrumenter/src/subsume-mutants.workflow.ts +++ b/packages/stryker-js-instrumenter/src/subsume-mutants.workflow.ts @@ -17,20 +17,26 @@ const COMPLEMENT_ROWS: Readonly< '>=': { complement: '<', dominator: '>' }, } -export class RelationalSite extends S.TaggedClass()('RelationalSite', { - operator: RelationalOperator, -}) {} +export class RelationalSite + extends S.TaggedClass()('RelationalSite', { + operator: RelationalOperator, + }) +{} -export class OtherSite extends S.TaggedClass()('OtherSite', {}) {} +export class OtherSite extends S.TaggedClass()('OtherSite', {}) {} export const SubsumptionSite = S.Union([RelationalSite, OtherSite]) export type SubsumptionSite = typeof SubsumptionSite.Type -export class OrderingOperator extends S.TaggedClass()('OrderingOperator', { - operator: RelationalOperator, -}) {} +export class OrderingOperator + extends S.TaggedClass()('OrderingOperator', { + operator: RelationalOperator, + }) +{} -export class OtherReplacement extends S.TaggedClass()('OtherReplacement', {}) {} +export class OtherReplacement + extends S.TaggedClass()('OtherReplacement', {}) +{} export const SubsumptionReplacement = S.Union([OrderingOperator, OtherReplacement]) export type SubsumptionReplacement = typeof SubsumptionReplacement.Type @@ -45,11 +51,13 @@ export const SubsumptionCandidateSchema = S.Struct({ }) export type SubsumptionCandidate = typeof SubsumptionCandidateSchema.Type -export class SubsumeMutantsCommand extends S.TaggedClass()('SubsumeMutantsCommand', { - policy: Options.MutantSetPolicy, - site: SubsumptionSite, - candidates: S.Array(SubsumptionCandidateSchema), -}) { +export class SubsumeMutantsCommand + extends S.TaggedClass()('SubsumeMutantsCommand', { + policy: Options.MutantSetPolicy, + site: SubsumptionSite, + candidates: S.Array(SubsumptionCandidateSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -58,11 +66,11 @@ const SubsumptionDecisionTypeId: unique symbol = Symbol.for( ) type SubsumptionDecisionTypeId = typeof SubsumptionDecisionTypeId -export class Unaffected extends S.TaggedClass()('Unaffected', {}) { +export class Unaffected extends S.TaggedClass()('Unaffected', {}) { readonly [SubsumptionDecisionTypeId] = SubsumptionDecisionTypeId } -export class Subsumed extends S.TaggedClass()('Subsumed', { +export class Subsumed extends S.TaggedClass()('Subsumed', { rule: S.Literal('complement'), dominators: S.NonEmptyArray(Mutant.MutantId), }) { diff --git a/packages/stryker-js-instrumenter/tests/__fixtures__/concurrency-mutant-behaviour.schema.ts b/packages/stryker-js-instrumenter/tests/__fixtures__/concurrency-mutant-behaviour.schema.ts index 982b0e24d..1fbc74760 100644 --- a/packages/stryker-js-instrumenter/tests/__fixtures__/concurrency-mutant-behaviour.schema.ts +++ b/packages/stryker-js-instrumenter/tests/__fixtures__/concurrency-mutant-behaviour.schema.ts @@ -1,5 +1,7 @@ import * as S from 'effect/Schema' -export class FixtureImportError extends S.TaggedError()('FixtureImportError', { - url: S.String, -}) {} +export class FixtureImportError + extends S.TaggedError()('FixtureImportError', { + url: S.String, + }) +{} diff --git a/packages/stryker-js-instrumenter/tests/__fixtures__/conditional-test-placement.schema.ts b/packages/stryker-js-instrumenter/tests/__fixtures__/conditional-test-placement.schema.ts index 0d184c727..09420cbd0 100644 --- a/packages/stryker-js-instrumenter/tests/__fixtures__/conditional-test-placement.schema.ts +++ b/packages/stryker-js-instrumenter/tests/__fixtures__/conditional-test-placement.schema.ts @@ -1,6 +1,8 @@ import * as S from 'effect/Schema' -export class PlacementHarnessError extends S.TaggedError()('PlacementHarnessError', { - message: S.String, - cause: S.Defect(), -}) {} +export class PlacementHarnessError + extends S.TaggedError()('PlacementHarnessError', { + message: S.String, + cause: S.Defect(), + }) +{} diff --git a/packages/stryker-js-instrumenter/tests/concurrency-mutant-behaviour.integration.test.ts b/packages/stryker-js-instrumenter/tests/concurrency-mutant-behaviour.integration.test.ts index 8d41f3466..059528209 100644 --- a/packages/stryker-js-instrumenter/tests/concurrency-mutant-behaviour.integration.test.ts +++ b/packages/stryker-js-instrumenter/tests/concurrency-mutant-behaviour.integration.test.ts @@ -248,14 +248,11 @@ const freePermits = (sem: Semaphore.Semaphore): Effect.Effect => { Semaphore.takeIfAvailable(sem, 1), (tookOne) => (tookOne ? drain(taken + 1) : Effect.succeed(taken)), ) - return Effect.flatMap(drain(0), (free) => Effect.as(Semaphore.release(sem, free), free)) + return Effect.tap(drain(0), (free) => Semaphore.release(sem, free)) } const suspendingInner = (started: Deferred.Deferred, gate: Deferred.Deferred): Effect.Effect => - Effect.flatMap( - Deferred.succeed(started, undefined), - () => Effect.map(Deferred.await(gate), () => RESULT), - ) + Effect.as(Effect.andThen(Deferred.succeed(started, undefined), Deferred.await(gate)), RESULT) interface RefCase { readonly start: number diff --git a/packages/stryker-js-plugin-interface/contract/report.schema.json b/packages/stryker-js-plugin-interface/contract/report.schema.json index 27b8fc7e6..b3ee225af 100644 --- a/packages/stryker-js-plugin-interface/contract/report.schema.json +++ b/packages/stryker-js-plugin-interface/contract/report.schema.json @@ -65,14 +65,16 @@ 4 ], "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 }, "column": { "examples": [ 3 ], "type": "integer", - "minimum": 1 + "minimum": 1, + "maximum": 9007199254740991 } }, "required": [ diff --git a/packages/stryker-js-plugin-interface/oxlint.config.ts b/packages/stryker-js-plugin-interface/oxlint.config.ts index de5f70fe4..3b5a7d6c3 100644 --- a/packages/stryker-js-plugin-interface/oxlint.config.ts +++ b/packages/stryker-js-plugin-interface/oxlint.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/src/generated/**', diff --git a/packages/stryker-js-plugin-interface/src/Checker.schema.ts b/packages/stryker-js-plugin-interface/src/Checker.schema.ts index 902a99ed7..43c9fb6ab 100644 --- a/packages/stryker-js-plugin-interface/src/Checker.schema.ts +++ b/packages/stryker-js-plugin-interface/src/Checker.schema.ts @@ -43,7 +43,7 @@ export type CheckAnswer = typeof CheckAnswerSchema.Type export const CheckStatus = S.Literals(CheckResultSchema.discriminants) export type CheckStatus = typeof CheckStatus.Type -export class CheckerFailed extends S.TaggedError()('CheckerFailed', { +export class CheckerFailed extends S.TaggedError()('CheckerFailed', { cause: S.String, checkerName: S.String, mutantIds: S.Array(MutantId), diff --git a/packages/stryker-js-plugin-interface/src/Evaluator.schema.ts b/packages/stryker-js-plugin-interface/src/Evaluator.schema.ts index 519c163bc..1e4db4db5 100644 --- a/packages/stryker-js-plugin-interface/src/Evaluator.schema.ts +++ b/packages/stryker-js-plugin-interface/src/Evaluator.schema.ts @@ -1,8 +1,10 @@ import * as S from 'effect/Schema' -export class EvaluatorFailed extends S.TaggedError()('EvaluatorFailed', { - cause: S.Unknown, -}) { +export class EvaluatorFailed + extends S.TaggedError()('EvaluatorFailed', { + cause: S.Unknown, + }) +{ override get message(): string { return 'Evaluator failed' } diff --git a/packages/stryker-js-plugin-interface/src/Metrics.schema.ts b/packages/stryker-js-plugin-interface/src/Metrics.schema.ts index 2850ef20c..eed26ae89 100644 --- a/packages/stryker-js-plugin-interface/src/Metrics.schema.ts +++ b/packages/stryker-js-plugin-interface/src/Metrics.schema.ts @@ -37,7 +37,7 @@ const scorePercentageOf = (counts: { readonly counted: number }): Option.Option => counts.counted > 0 ? Option.some((counts.detected / counts.counted) * 100) : Option.none() -export class Metrics extends S.Class('Metrics')({ +export class Metrics extends S.Class('Metrics')({ pending: NonNegativeInt, killed: NonNegativeInt, timeout: NonNegativeInt, diff --git a/packages/stryker-js-plugin-interface/src/Plugin.schema.ts b/packages/stryker-js-plugin-interface/src/Plugin.schema.ts index 449c056b7..47f8b401e 100644 --- a/packages/stryker-js-plugin-interface/src/Plugin.schema.ts +++ b/packages/stryker-js-plugin-interface/src/Plugin.schema.ts @@ -43,27 +43,31 @@ export type ReporterEventBatch = typeof ReporterEventBatch.Type export const ReporterAck = S.Void export const ReporterDrained = S.Void -export class BoundaryPayloadRejected extends S.TaggedError()( - 'BoundaryPayloadRejected', - { - pluginName: S.String, - method: S.String, - cause: S.String, - }, -) { +export class BoundaryPayloadRejected + extends S.TaggedError()( + 'BoundaryPayloadRejected', + { + pluginName: S.String, + method: S.String, + cause: S.String, + }, + ) +{ override get message(): string { return `Plugin "${this.pluginName}" rejected the payload for ${this.method}: ${this.cause}` } } -export class BoundaryUnrecognizedSignal extends S.TaggedError()( - 'BoundaryUnrecognizedSignal', - { - pluginName: S.String, - method: S.String, - signal: S.String, - }, -) { +export class BoundaryUnrecognizedSignal + extends S.TaggedError()( + 'BoundaryUnrecognizedSignal', + { + pluginName: S.String, + method: S.String, + signal: S.String, + }, + ) +{ override get message(): string { return `Plugin "${this.pluginName}" sent an unrecognized signal "${this.signal}" for ${this.method}` } diff --git a/packages/stryker-js-plugin-interface/src/ReporterEvent.schema.ts b/packages/stryker-js-plugin-interface/src/ReporterEvent.schema.ts index f6a0531dc..d51eb7ed8 100644 --- a/packages/stryker-js-plugin-interface/src/ReporterEvent.schema.ts +++ b/packages/stryker-js-plugin-interface/src/ReporterEvent.schema.ts @@ -25,22 +25,26 @@ export const ReporterPlanDescriptorSchema = S.Struct({ }) export type ReporterPlanDescriptor = typeof ReporterPlanDescriptorSchema.Type -export class DryRunCompleted extends S.TaggedClass()('dryRunCompleted', { - timing: RunTimingSchema, - capabilities: TestRunnerCapabilitiesSchema, - testCount: NonNegativeInt, - tests: S.Array(TestResultSchema), -}) {} - -export class MutationTestingPlanReady extends S.TaggedClass()( - 'mutationTestingPlanReady', - { - total: NonNegativeInt, - plans: S.Array(ReporterPlanDescriptorSchema), - }, -) {} - -export class MutantTested extends S.TaggedClass()('mutantTested', { +export class DryRunCompleted + extends S.TaggedClass()('dryRunCompleted', { + timing: RunTimingSchema, + capabilities: TestRunnerCapabilitiesSchema, + testCount: NonNegativeInt, + tests: S.Array(TestResultSchema), + }) +{} + +export class MutationTestingPlanReady + extends S.TaggedClass()( + 'mutationTestingPlanReady', + { + total: NonNegativeInt, + plans: S.Array(ReporterPlanDescriptorSchema), + }, + ) +{} + +export class MutantTested extends S.TaggedClass()('mutantTested', { id: MutantId, status: MutantStatusSchema, fileName: CanonicalFileName, @@ -51,14 +55,16 @@ export class MutantTested extends S.TaggedClass()('mutantTested', total: NonNegativeInt, }) {} -export class MutationTestReportReady extends S.TaggedClass()( - 'mutationTestReportReady', - { - report: MutationTestResult, - metrics: MetricsResultSchema, - static: S.optional(StaticClassSummarySchema), - }, -) {} +export class MutationTestReportReady + extends S.TaggedClass()( + 'mutationTestReportReady', + { + report: MutationTestResult, + metrics: MetricsResultSchema, + static: S.optional(StaticClassSummarySchema), + }, + ) +{} export const ReporterEventUnion = S.Union([ DryRunCompleted, @@ -87,11 +93,13 @@ export type ReporterFactory = ( init: ReporterInit, ) => (events: AsyncIterable) => Effect.Effect -export class ReporterFailed extends S.TaggedError()('ReporterFailed', { - cause: S.String, - event: ReporterEventKind, - reporterName: S.String, -}) { +export class ReporterFailed + extends S.TaggedError()('ReporterFailed', { + cause: S.String, + event: ReporterEventKind, + reporterName: S.String, + }) +{ override get message(): string { return `Reporter "${this.reporterName}" failed while handling ${this.event}: ${this.cause}` } diff --git a/packages/stryker-js-plugin-interface/src/TestRunner.schema.ts b/packages/stryker-js-plugin-interface/src/TestRunner.schema.ts index 372f63028..1031580c6 100644 --- a/packages/stryker-js-plugin-interface/src/TestRunner.schema.ts +++ b/packages/stryker-js-plugin-interface/src/TestRunner.schema.ts @@ -71,10 +71,14 @@ export const MutantRunResultSchema = S.Union([ S.Struct({ status: S.Literal('error'), errorMessage: S.String }), ]) -export class MutantRunStarted extends S.TaggedClass()('MutantRunStarted', {}) {} +export class MutantRunStarted + extends S.TaggedClass()('MutantRunStarted', {}) +{} export class MutantRunSettled - extends S.TaggedClass()('MutantRunSettled', { result: MutantRunResultSchema }) + extends S.TaggedClass()('MutantRunSettled', { + result: MutantRunResultSchema, + }) {} export const MutantRunEventSchema = S.Union([MutantRunStarted, MutantRunSettled]) @@ -93,11 +97,13 @@ export const TestRunnerCapabilitiesSchema = S.Struct({ reloadEnvironment: S.Boolean, }) -export class TestRunnerFailed extends S.TaggedError()('TestRunnerFailed', { - cause: S.String, - phase: S.Literals(['capabilities', 'dispose', 'dryRun', 'init', 'mutantRun']), - runnerName: S.String, -}) { +export class TestRunnerFailed + extends S.TaggedError()('TestRunnerFailed', { + cause: S.String, + phase: S.Literals(['capabilities', 'dispose', 'dryRun', 'init', 'mutantRun']), + runnerName: S.String, + }) +{ override get message(): string { return `Test runner "${this.runnerName}" failed during ${this.phase}: ${this.cause}` } diff --git a/packages/stryker-js-plugin-interface/src/TypeQuery.schema.ts b/packages/stryker-js-plugin-interface/src/TypeQuery.schema.ts index 7d437a877..096faab76 100644 --- a/packages/stryker-js-plugin-interface/src/TypeQuery.schema.ts +++ b/packages/stryker-js-plugin-interface/src/TypeQuery.schema.ts @@ -61,18 +61,22 @@ export type UnknownReason = typeof UnknownReason.Type export const TypeAnswerTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-plugin-interface/TypeAnswer') export type TypeAnswerTypeId = typeof TypeAnswerTypeId -export class Assignable extends S.TaggedClass()('Assignable', { candidateType: S.String }) { +export class Assignable + extends S.TaggedClass()('Assignable', { candidateType: S.String }) +{ readonly [TypeAnswerTypeId] = TypeAnswerTypeId } -export class NotAssignable extends S.TaggedClass()('NotAssignable', { +export class NotAssignable extends S.TaggedClass()('NotAssignable', { candidateType: S.String, contextualType: S.String, }) { readonly [TypeAnswerTypeId] = TypeAnswerTypeId } -export class Unknown extends S.TaggedClass()('Unknown', { reason: UnknownReason }) { +export class Unknown + extends S.TaggedClass()('Unknown', { reason: UnknownReason }) +{ readonly [TypeAnswerTypeId] = TypeAnswerTypeId } @@ -121,11 +125,13 @@ export type TypeQueryResponse = typeof TypeQueryResponse.Type export const TypeQueryRefusedReason = S.Literals(['unsupported-version', 'project-open-failed']) export type TypeQueryRefusedReason = typeof TypeQueryRefusedReason.Type -export class TypeQueryRefused extends S.TaggedError()('TypeQueryRefused', { - version: S.Int, - reason: TypeQueryRefusedReason, - nextAction: S.String, -}) { +export class TypeQueryRefused + extends S.TaggedError()('TypeQueryRefused', { + version: S.Int, + reason: TypeQueryRefusedReason, + nextAction: S.String, + }) +{ override get message(): string { return `${this.reason}: ${this.nextAction}` } diff --git a/packages/stryker-js-plugin-interface/src/generated/report.schema.ts b/packages/stryker-js-plugin-interface/src/generated/report.schema.ts index 6a5ca943f..00ced67a4 100644 --- a/packages/stryker-js-plugin-interface/src/generated/report.schema.ts +++ b/packages/stryker-js-plugin-interface/src/generated/report.schema.ts @@ -6,7 +6,7 @@ import { type MutantStatus, MutantStatusSchema } from '../Mutant.schema.js' export const Position = Schema.StructWithRest(Schema.Struct({ "line": Schema.Finite.annotate({ "examples": [4] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })), "column": Schema.Finite.annotate({ "examples": [3] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(1).annotate({ "expected": "a value greater than or equal to 1" })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "Position", "description": "Position of a mutation. Both line and column start at one.", "identifier": "position" }) export type Position = { readonly "line": number, readonly "column": number } & { readonly [x: string]: Schema.Json } -export const Thresholds = Schema.StructWithRest(Schema.Struct({ "high": Schema.Finite.annotate({ "description": "Higher bound threshold.", "examples": [80] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), "low": Schema.Finite.annotate({ "description": "Lower bound threshold.", "examples": [60] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), "break": Schema.optionalKey(Schema.Union([Schema.Finite.check(Schema.isFinite().annotate({ "expected": "a finite number" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), Schema.Null]).annotate({ "description": "The mutation score below which the run breaks. Null disables the break." })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "Thresholds", "description": "Thresholds for the status of the reported application.", "identifier": "thresholds" }) +export const Thresholds = Schema.StructWithRest(Schema.Struct({ "high": Schema.Finite.annotate({ "description": "Higher bound threshold.", "examples": [80] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), "low": Schema.Finite.annotate({ "description": "Lower bound threshold.", "examples": [60] }).check(Schema.isInt().annotate({ "expected": "an integer" })).check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), "break": Schema.optionalKey(Schema.Union([Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0).annotate({ "expected": "a value greater than or equal to 0" })).check(Schema.isLessThanOrEqualTo(100).annotate({ "expected": "a value less than or equal to 100" })), Schema.Null]).annotate({ "description": "The mutation score below which the run breaks. Null disables the break." })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "Thresholds", "description": "Thresholds for the status of the reported application.", "identifier": "thresholds" }) export type Thresholds = { readonly "high": number, readonly "low": number, readonly "break"?: number | null } & { readonly [x: string]: Schema.Json } export const PerformanceStatistics = Schema.StructWithRest(Schema.Struct({ "setup": Schema.Finite.annotate({ "description": "Time it took to run the setup phase in milliseconds." }).check(Schema.isFinite().annotate({ "expected": "a finite number" })), "initialRun": Schema.Finite.annotate({ "description": "Time it took to run the initial test phase (dry-run) in milliseconds." }).check(Schema.isFinite().annotate({ "expected": "a finite number" })), "mutation": Schema.Finite.annotate({ "description": "Time it took to run the mutation test phase in milliseconds." }).check(Schema.isFinite().annotate({ "expected": "a finite number" })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "PerformanceStatistics", "description": "The performance statistics per phase. Total time should be roughly equal to the sum of all these.", "identifier": "performanceStatistics" }) @@ -21,7 +21,7 @@ export type Dependencies = { readonly [x: string]: string } export const OSInformation = Schema.StructWithRest(Schema.Struct({ "description": Schema.optionalKey(Schema.String.annotate({ "description": "Human-readable description of the OS", "examples": ["Windows 10 Pro", "Debian Buster", "Ubuntu 20.04.1 LTS"] })), "platform": Schema.String.annotate({ "description": "Platform identifier", "examples": ["linux", "win32"] }), "version": Schema.optionalKey(Schema.String.annotate({ "description": "Version of the OS or distribution", "examples": ["10.0.19041"] })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "OSInformation", "identifier": "oSInformation" }) export type OSInformation = { readonly "description"?: string, readonly "platform": string, readonly "version"?: string } & { readonly [x: string]: Schema.Json } -export const CpuInformation = Schema.StructWithRest(Schema.Struct({ "baseClock": Schema.optionalKey(Schema.Finite.annotate({ "description": "Clock speed in MHz" }).check(Schema.isFinite().annotate({ "expected": "a finite number" }))), "logicalCores": Schema.Finite.check(Schema.isFinite().annotate({ "expected": "a finite number" })), "model": Schema.optionalKey(Schema.String.annotate({ "examples": ["Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz"] })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "CpuInformation", "identifier": "cpuInformation" }) +export const CpuInformation = Schema.StructWithRest(Schema.Struct({ "baseClock": Schema.optionalKey(Schema.Finite.annotate({ "description": "Clock speed in MHz" }).check(Schema.isFinite().annotate({ "expected": "a finite number" }))), "logicalCores": Schema.Finite, "model": Schema.optionalKey(Schema.String.annotate({ "examples": ["Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz"] })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "CpuInformation", "identifier": "cpuInformation" }) export type CpuInformation = { readonly "baseClock"?: number, readonly "logicalCores": number, readonly "model"?: string } & { readonly [x: string]: Schema.Json } export const RamInformation = Schema.StructWithRest(Schema.Struct({ "total": Schema.Finite.annotate({ "description": "The total RAM of the system that performed mutation testing in MB." }).check(Schema.isFinite().annotate({ "expected": "a finite number" })) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "RamInformation", "identifier": "ramInformation" }) @@ -57,5 +57,5 @@ export type FileResultDictionary = { readonly [x: string]: FileResult } export const TestFileDefinitionDictionary = Schema.Record(Schema.String, TestFile).annotate({ "title": "TestFileDefinitionDictionary", "description": "Test file definitions by file path OR class name.", "identifier": "testFileDefinitionDictionary" }) export type TestFileDefinitionDictionary = { readonly [x: string]: TestFile } -export const MutationTestResult = Schema.StructWithRest(Schema.Struct({ "config": Schema.optionalKey(Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" })).annotate({ "description": "Free-format object that represents the configuration used to run mutation testing." })), "schemaVersion": Schema.String.annotate({ "description": "Major version of this report. Used for compatibility.", "examples": ["1", "2.0", "2.0.0"] }).check(Schema.isPattern(new RegExp("^([1-2])(\\.(([1-9]\\d*)|0)){0,2}$", "u")).annotate({ "expected": "a string matching the RegExp ^([1-2])(\\.(([1-9]\\d*)|0)){0,2}$" })), "files": FileResultDictionary, "testFiles": Schema.optionalKey(TestFileDefinitionDictionary), "thresholds": Thresholds, "projectRoot": Schema.optionalKey(Schema.String.annotate({ "description": "The optional location of the project root.", "examples": ["C:\\Projects\\project-under-test", "/home/user/projects/project-under-test"] })), "performance": Schema.optionalKey(PerformanceStatistics), "framework": Schema.optionalKey(FrameworkInformation), "system": Schema.optionalKey(SystemInformation) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "MutationTestResult", "description": "Schema for a mutation testing report." }) +export const MutationTestResult = Schema.StructWithRest(Schema.Struct({ "config": Schema.optionalKey(Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" })).annotate({ "description": "Free-format object that represents the configuration used to run mutation testing." })), "schemaVersion": Schema.String.annotate({ "description": "Major version of this report. Used for compatibility.", "examples": ["1", "2.0", "2.0.0"] }).check(Schema.isPattern(new globalThis.RegExp("^([1-2])(\\.(([1-9]\\d*)|0)){0,2}$", "u")).annotate({ "expected": "a string matching the RegExp ^([1-2])(\\.(([1-9]\\d*)|0)){0,2}$" })), "files": FileResultDictionary, "testFiles": Schema.optionalKey(TestFileDefinitionDictionary), "thresholds": Thresholds, "projectRoot": Schema.optionalKey(Schema.String.annotate({ "description": "The optional location of the project root.", "examples": ["C:\\Projects\\project-under-test", "/home/user/projects/project-under-test"] })), "performance": Schema.optionalKey(PerformanceStatistics), "framework": Schema.optionalKey(FrameworkInformation), "system": Schema.optionalKey(SystemInformation) }), [Schema.Record(Schema.String, Schema.Json.annotate({ "expected": "JSON value" }))]).annotate({ "title": "MutationTestResult", "description": "Schema for a mutation testing report." }) export type MutationTestResult = { readonly "config"?: { readonly [x: string]: Schema.Json }, readonly "schemaVersion": string, readonly "files": FileResultDictionary, readonly "testFiles"?: TestFileDefinitionDictionary, readonly "thresholds": Thresholds, readonly "projectRoot"?: string, readonly "performance"?: PerformanceStatistics, readonly "framework"?: FrameworkInformation, readonly "system"?: SystemInformation } & { readonly [x: string]: Schema.Json } diff --git a/packages/stryker-js-plugin-runtime/oxlint.config.ts b/packages/stryker-js-plugin-runtime/oxlint.config.ts index e0f324fee..6ec6f90fa 100644 --- a/packages/stryker-js-plugin-runtime/oxlint.config.ts +++ b/packages/stryker-js-plugin-runtime/oxlint.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'effecttsgo/unstable-api-usage': 'off', diff --git a/packages/stryker-js-plugin-runtime/src/trace-parts.schema.ts b/packages/stryker-js-plugin-runtime/src/trace-parts.schema.ts index a8f26b900..3c7c9cf26 100644 --- a/packages/stryker-js-plugin-runtime/src/trace-parts.schema.ts +++ b/packages/stryker-js-plugin-runtime/src/trace-parts.schema.ts @@ -5,9 +5,11 @@ import * as SchemaTransformation from 'effect/SchemaTransformation' import { Trace } from '@systemfsoftware/stryker-js-plugin-interface' -export class TraceContextUnavailable extends S.TaggedError()('TraceContextUnavailable', { - reason: S.Literals(['invalid-span-context', 'undecodable-parts']), -}) { +export class TraceContextUnavailable + extends S.TaggedError()('TraceContextUnavailable', { + reason: S.Literals(['invalid-span-context', 'undecodable-parts']), + }) +{ override get message(): string { return Match.value(this.reason).pipe( Match.when('invalid-span-context', () => 'Cannot read trace context: the span context is invalid'), diff --git a/packages/stryker-js-typescript-checker/oxlint.config.ts b/packages/stryker-js-typescript-checker/oxlint.config.ts index abbab414f..64cf440e5 100644 --- a/packages/stryker-js-typescript-checker/oxlint.config.ts +++ b/packages/stryker-js-typescript-checker/oxlint.config.ts @@ -3,6 +3,7 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'effecttsgo/unstable-api-usage': 'off', 'typescript/no-unnecessary-condition': 'error', diff --git a/packages/stryker-js-typescript-checker/package.json b/packages/stryker-js-typescript-checker/package.json index d22113eeb..0d0182d84 100644 --- a/packages/stryker-js-typescript-checker/package.json +++ b/packages/stryker-js-typescript-checker/package.json @@ -89,9 +89,9 @@ "vitest": "catalog:" }, "inlinedDependencies": { - "@effect/opentelemetry": "4.0.0", - "@effect/platform-node": "4.0.0", - "@effect/platform-node-shared": "4.0.0", + "@effect/opentelemetry": "4.1.0", + "@effect/platform-node": "4.1.0", + "@effect/platform-node-shared": "4.1.0", "@eslint-community/regexpp": "4.12.2", "@jsr/std__jsonc": "1.0.2", "@noble/hashes": "2.4.0", @@ -110,9 +110,8 @@ "@opentelemetry/sdk-trace-node": "2.11.0", "@opentelemetry/semantic-conventions": "1.43.0", "@systemfsoftware/effect-cell-types": "12.0.0", - "effect": "4.0.0", - "oxc-parser": "0.150.0", - "ws": "8.22.0" + "effect": "4.1.0", + "oxc-parser": "0.150.0" }, "publishConfig": { "access": "public", diff --git a/packages/stryker-js-typescript-checker/src/CheckMutants.schema.ts b/packages/stryker-js-typescript-checker/src/CheckMutants.schema.ts index aeb06b04b..ed3b2685a 100644 --- a/packages/stryker-js-typescript-checker/src/CheckMutants.schema.ts +++ b/packages/stryker-js-typescript-checker/src/CheckMutants.schema.ts @@ -18,7 +18,7 @@ export const SourceFileSchema = S.NonEmptyString.pipe(S.check(S.isPattern(/\.[^. export const DiagnosticSeveritySchema = S.Literals(['error', 'warning', 'suggestion', 'message']) export type DiagnosticSeverity = S.Schema.Type -export class DiagnosticLine extends S.Class('DiagnosticLine')({ +export class DiagnosticLine extends S.Class('DiagnosticLine')({ fileName: S.optional(SourceFileSchema), position: S.String, severity: DiagnosticSeveritySchema, @@ -36,13 +36,13 @@ export interface NodeDecodedShape { readonly children: readonly NodeDecodedShape[] } -export class MutantVerdict extends S.Class('MutantVerdict')({ +export class MutantVerdict extends S.Class('MutantVerdict')({ id: Mutant.MutantId, diagnostics: S.Array(DiagnosticLine), tce: S.optional(TceOutcome), }) {} -export class CheckMutantsInput extends S.TaggedClass()( +export class CheckMutantsInput extends S.TaggedClass()( 'CheckMutantsInput', { mutants: S.Array(Checker.CheckerMutantWire), diff --git a/packages/stryker-js-typescript-checker/src/CheckRound.schema.ts b/packages/stryker-js-typescript-checker/src/CheckRound.schema.ts index d21aab98d..ece4f28a1 100644 --- a/packages/stryker-js-typescript-checker/src/CheckRound.schema.ts +++ b/packages/stryker-js-typescript-checker/src/CheckRound.schema.ts @@ -5,13 +5,13 @@ import * as S from 'effect/Schema' const RoundsTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/CheckRounds') type RoundsTypeId = typeof RoundsTypeId -export class SoloRound extends S.TaggedClass()('SoloRound', { +export class SoloRound extends S.TaggedClass()('SoloRound', { id: Mutant.MutantId, }) { readonly [RoundsTypeId] = RoundsTypeId } -export class SharedRound extends S.TaggedClass()('SharedRound', { +export class SharedRound extends S.TaggedClass()('SharedRound', { ids: S.Array(Mutant.MutantId).check(S.isMinLength(2)), }) { readonly [RoundsTypeId] = RoundsTypeId @@ -34,11 +34,15 @@ const ConclusionTypeId: unique symbol = Symbol.for( ) type ConclusionTypeId = typeof ConclusionTypeId -export class SharedRoundKept extends S.TaggedClass()('SharedRoundKept', {}) { +export class SharedRoundKept + extends S.TaggedClass()('SharedRoundKept', {}) +{ readonly [ConclusionTypeId] = ConclusionTypeId } -export class SharedRoundRedone extends S.TaggedClass()('SharedRoundRedone', {}) { +export class SharedRoundRedone + extends S.TaggedClass()('SharedRoundRedone', {}) +{ readonly [ConclusionTypeId] = ConclusionTypeId } diff --git a/packages/stryker-js-typescript-checker/src/Checker.schema.ts b/packages/stryker-js-typescript-checker/src/Checker.schema.ts index b6e506be6..0cce1fd0d 100644 --- a/packages/stryker-js-typescript-checker/src/Checker.schema.ts +++ b/packages/stryker-js-typescript-checker/src/Checker.schema.ts @@ -29,7 +29,7 @@ export const readsEditSites = (importerCheck: ImporterCheck): boolean => importe // ── command ──────────────────────────────────────────────────────────────── -export class CheckMutantsCommand extends S.TaggedClass()( +export class CheckMutantsCommand extends S.TaggedClass()( 'CheckMutantsCommand', { mutants: S.Array(Checker.CheckerMutantWire), diff --git a/packages/stryker-js-typescript-checker/src/CheckerCommands.schema.ts b/packages/stryker-js-typescript-checker/src/CheckerCommands.schema.ts index 2c5a9a5ce..f8e1c9c62 100644 --- a/packages/stryker-js-typescript-checker/src/CheckerCommands.schema.ts +++ b/packages/stryker-js-typescript-checker/src/CheckerCommands.schema.ts @@ -10,90 +10,106 @@ import { TsConfigDocumentSchema } from './Tsconfig.schema.js' const MutantBound = S.Int.pipe(S.check(S.isGreaterThanOrEqualTo(1))) export type MutantBoundType = typeof MutantBound.Type -export class GroupMutantsCommand extends S.TaggedClass()('GroupMutantsCommand', { - mutants: S.Array(Checker.CheckerMutantWire), - bound: MutantBound, -}) { +export class GroupMutantsCommand + extends S.TaggedClass()('GroupMutantsCommand', { + mutants: S.Array(Checker.CheckerMutantWire), + bound: MutantBound, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class TraceAffectedFilesCommand extends S.TaggedClass()( - 'TraceAffectedFilesCommand', - { - importsByFile: S.Record(S.String, S.Array(S.String)), - mutatedFileNames: S.Array(S.String), - }, -) { +export class TraceAffectedFilesCommand + extends S.TaggedClass()( + 'TraceAffectedFilesCommand', + { + importsByFile: S.Record(S.String, S.Array(S.String)), + mutatedFileNames: S.Array(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { mutatedFileNames: 'stryker.typescript_checker.mutated_files', } as const } -export class RequestAffectedFilesCommand extends S.TaggedClass()( - 'RequestAffectedFilesCommand', - { - affectedFileNames: S.Array(S.String), - presentFileNames: S.Array(S.String), - }, -) { +export class RequestAffectedFilesCommand + extends S.TaggedClass()( + 'RequestAffectedFilesCommand', + { + affectedFileNames: S.Array(S.String), + presentFileNames: S.Array(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { affectedFileNames: 'stryker.typescript_checker.affected_files', } as const } -export class PlanDiagnosticBatchesCommand extends S.TaggedClass()( - 'PlanDiagnosticBatchesCommand', - { - fileNames: S.Array(S.String), - }, -) { +export class PlanDiagnosticBatchesCommand + extends S.TaggedClass()( + 'PlanDiagnosticBatchesCommand', + { + fileNames: S.Array(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { fileNames: 'stryker.typescript_checker.requested_files', } as const } -export class CaptureAliasSpecifierCommand extends S.TaggedClass()( - 'CaptureAliasSpecifierCommand', - { - pattern: S.String, - specifier: S.String, - }, -) { +export class CaptureAliasSpecifierCommand + extends S.TaggedClass()( + 'CaptureAliasSpecifierCommand', + { + pattern: S.String, + specifier: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { specifier: 'stryker.typescript_checker.specifier', } as const } -export class PlanResolutionCandidatesCommand extends S.TaggedClass()( - 'PlanResolutionCandidatesCommand', - { - resolved: S.String, - extension: S.String, - }, -) { +export class PlanResolutionCandidatesCommand + extends S.TaggedClass()( + 'PlanResolutionCandidatesCommand', + { + resolved: S.String, + extension: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { resolved: 'stryker.typescript_checker.resolved_file', } as const } -export class OverrideTsconfigOptionsCommand extends S.TaggedClass()( - 'OverrideTsconfigOptionsCommand', - { - document: TsConfigDocumentSchema, - buildMode: S.Boolean, - }, -) { +export class OverrideTsconfigOptionsCommand + extends S.TaggedClass()( + 'OverrideTsconfigOptionsCommand', + { + document: TsConfigDocumentSchema, + buildMode: S.Boolean, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { buildMode: 'stryker.typescript_checker.build_mode', } as const } -export class ParseTsconfigTextCommand extends S.TaggedClass()( - 'ParseTsconfigTextCommand', - { - text: S.String, - }, -) { +export class ParseTsconfigTextCommand + extends S.TaggedClass()( + 'ParseTsconfigTextCommand', + { + text: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -178,16 +194,18 @@ export type CandidateBodyText = typeof CandidateBodyText.Type export const CandidateFacts = S.Union([CandidateNotContextFree, CandidateMissing, CandidateTyped, CandidateBodyText]) export type CandidateFacts = typeof CandidateFacts.Type -export class ClassifyCandidateCommand extends S.TaggedClass()( - 'ClassifyCandidateCommand', - { - text: S.String, - }, -) { +export class ClassifyCandidateCommand + extends S.TaggedClass()( + 'ClassifyCandidateCommand', + { + text: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class AnswerTypeQueryCommand extends S.TaggedClass()( +export class AnswerTypeQueryCommand extends S.TaggedClass()( 'AnswerTypeQueryCommand', { site: SiteFacts, @@ -197,23 +215,27 @@ export class AnswerTypeQueryCommand extends S.TaggedClass()( - 'DecideImporterShortcutCommand', - { - original: EditSiteFacts, - mutated: EditSiteFacts, - compiledElsewhere: S.Boolean, - }, -) { +export class DecideImporterShortcutCommand + extends S.TaggedClass()( + 'DecideImporterShortcutCommand', + { + original: EditSiteFacts, + mutated: EditSiteFacts, + compiledElsewhere: S.Boolean, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ConcludeSharedRoundCommand extends S.TaggedClass()( - 'ConcludeSharedRoundCommand', - { - decisions: ImporterShortcutDecision.pipe(S.Option, S.Array), - }, -) { +export class ConcludeSharedRoundCommand + extends S.TaggedClass()( + 'ConcludeSharedRoundCommand', + { + decisions: ImporterShortcutDecision.pipe(S.Option, S.Array), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -235,9 +257,11 @@ const roundCandidateIdsAreDistinct = S.makeFilter( { arbitraryConstraint: { uniqueBy: (candidate: RoundCandidate) => candidate.id } }, ) -export class PlanCheckRoundsCommand extends S.TaggedClass()('PlanCheckRoundsCommand', { - candidates: S.Array(RoundCandidate).check(roundCandidateIdsAreDistinct), -}) { +export class PlanCheckRoundsCommand + extends S.TaggedClass()('PlanCheckRoundsCommand', { + candidates: S.Array(RoundCandidate).check(roundCandidateIdsAreDistinct), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js-typescript-checker/src/Compiler.schema.ts b/packages/stryker-js-typescript-checker/src/Compiler.schema.ts index dbbc3ca3a..31fe118d2 100644 --- a/packages/stryker-js-typescript-checker/src/Compiler.schema.ts +++ b/packages/stryker-js-typescript-checker/src/Compiler.schema.ts @@ -10,35 +10,41 @@ import * as Match from 'effect/Match' import { TsConfigNotFoundError, TsConfigParseError } from './Tsconfig.schema.js' /** The installed TypeScript version is below the supported floor. */ -export class UnsupportedTypeScriptVersionError extends S.TaggedError()( - 'UnsupportedTypeScriptVersionError', - { - version: S.String, - }, -) { +export class UnsupportedTypeScriptVersionError + extends S.TaggedError()( + 'UnsupportedTypeScriptVersionError', + { + version: S.String, + }, + ) +{ override get message(): string { return `@systemfsoftware/stryker-js-typescript-checker only supports typescript@7.0.0 or higher. Found typescript@${this.version}` } } /** Requested file is not present in the hybrid in-memory file map. */ -export class HybridFileNotFoundError extends S.TaggedError()( - 'HybridFileNotFoundError', - { - fileName: S.String, - }, -) { +export class HybridFileNotFoundError + extends S.TaggedError()( + 'HybridFileNotFoundError', + { + fileName: S.String, + }, + ) +{ override get message(): string { return `'${this.fileName}' is part of your TypeScript project but could not be found on disk` } } -export class HybridMutantOutsideFileError extends S.TaggedError()( - 'HybridMutantOutsideFileError', - { - fileName: S.String, - }, -) { +export class HybridMutantOutsideFileError + extends S.TaggedError()( + 'HybridMutantOutsideFileError', + { + fileName: S.String, + }, + ) +{ override get message(): string { return `A mutant's location falls outside '${this.fileName}'` } @@ -49,17 +55,19 @@ export class HybridMutantOutsideFileError extends S.TaggedError()('CompilerFailed', { - reason: S.Literals([ - 'not-initialized', - 'no-projects', - 'unknown-file-node', - 'file-not-in-project', - 'mutant-outside-file', - 'program-digest-unavailable', - ]), - subject: S.optional(S.String), -}) { +export class CompilerFailed + extends S.TaggedError()('CompilerFailed', { + reason: S.Literals([ + 'not-initialized', + 'no-projects', + 'unknown-file-node', + 'file-not-in-project', + 'mutant-outside-file', + 'program-digest-unavailable', + ]), + subject: S.optional(S.String), + }) +{ override get message(): string { return Match.value(this.reason).pipe( Match.when('not-initialized', () => 'The TypeScript compiler was used before it was initialized'), @@ -85,9 +93,11 @@ export class CompilerFailed extends S.TaggedError()('CompilerFai } } -export class InvalidCheckerOptions extends S.TaggedError()('InvalidCheckerOptions', { - detail: S.String, -}) { +export class InvalidCheckerOptions + extends S.TaggedError()('InvalidCheckerOptions', { + detail: S.String, + }) +{ readonly code = 'invalid-checker-options' as const readonly nextAction = "Set typescriptChecker.importerCheck to 'location-rule' or 'always', or remove it, and remove every other key from the typescriptChecker block" @@ -97,9 +107,11 @@ export class InvalidCheckerOptions extends S.TaggedError( } } -export class DuplicateMutantIds extends S.TaggedError()('DuplicateMutantIds', { - detail: S.String, -}) { +export class DuplicateMutantIds + extends S.TaggedError()('DuplicateMutantIds', { + detail: S.String, + }) +{ readonly code = 'duplicate-mutant-ids' as const readonly nextAction = 'Send each mutant id once per check call' @@ -108,9 +120,11 @@ export class DuplicateMutantIds extends S.TaggedError()('Dup } } -export class DryRunCompileErrors extends S.TaggedError()('DryRunCompileErrors', { - text: S.String, -}) { +export class DryRunCompileErrors + extends S.TaggedError()('DryRunCompileErrors', { + text: S.String, + }) +{ override get message(): string { return `Typescript error(s) found in dry run compilation: ${this.text}` } diff --git a/packages/stryker-js-typescript-checker/src/FileIds.schema.ts b/packages/stryker-js-typescript-checker/src/FileIds.schema.ts index 2bcb03e60..2571d60b9 100644 --- a/packages/stryker-js-typescript-checker/src/FileIds.schema.ts +++ b/packages/stryker-js-typescript-checker/src/FileIds.schema.ts @@ -16,7 +16,7 @@ export type FileMutant = typeof FileMutant.Type export const FileMutants = S.Array(FileMutant) export type FileMutants = typeof FileMutants.Type -export class FileIds extends S.TaggedClass()('FileIds', { +export class FileIds extends S.TaggedClass()('FileIds', { fileName: S.String, ids: S.NonEmptyArray(Mutant.MutantId), }) { diff --git a/packages/stryker-js-typescript-checker/src/ImporterShortcut.schema.ts b/packages/stryker-js-typescript-checker/src/ImporterShortcut.schema.ts index 4eac4e6e7..b3c8e61fb 100644 --- a/packages/stryker-js-typescript-checker/src/ImporterShortcut.schema.ts +++ b/packages/stryker-js-typescript-checker/src/ImporterShortcut.schema.ts @@ -24,14 +24,18 @@ const ImporterShortcutTypeId: unique symbol = Symbol.for( ) type ImporterShortcutTypeId = typeof ImporterShortcutTypeId -export class ShortcutTaken extends S.TaggedClass()('ShortcutTaken', {}) { +export class ShortcutTaken + extends S.TaggedClass()('ShortcutTaken', {}) +{ readonly [ImporterShortcutTypeId] = ImporterShortcutTypeId } -export class ImportersRechecked extends S.TaggedClass()('ImportersRechecked', { - clause: ShortcutClause, - tree: ShortcutTree, -}) { +export class ImportersRechecked + extends S.TaggedClass()('ImportersRechecked', { + clause: ShortcutClause, + tree: ShortcutTree, + }) +{ readonly [ImporterShortcutTypeId] = ImporterShortcutTypeId } diff --git a/packages/stryker-js-typescript-checker/src/Tsconfig.schema.ts b/packages/stryker-js-typescript-checker/src/Tsconfig.schema.ts index 84ed156c2..6add42b5d 100644 --- a/packages/stryker-js-typescript-checker/src/Tsconfig.schema.ts +++ b/packages/stryker-js-typescript-checker/src/Tsconfig.schema.ts @@ -6,16 +6,18 @@ import * as HashSet from 'effect/HashSet' import * as Option from 'effect/Option' import * as Rec from 'effect/Record' -export class TsConfigParseError extends S.TaggedError()('TsConfigParseError', { - file: S.String, - reason: S.String, -}) { +export class TsConfigParseError + extends S.TaggedError()('TsConfigParseError', { + file: S.String, + reason: S.String, + }) +{ override get message(): string { return `Could not parse tsconfig file '${this.file}': ${this.reason}` } } -export class TsConfigNotFoundError extends S.TaggedError()( +export class TsConfigNotFoundError extends S.TaggedError()( 'TsConfigNotFoundError', { file: S.String, diff --git a/packages/stryker-js-typescript-checker/src/answer-type-query.workflow.ts b/packages/stryker-js-typescript-checker/src/answer-type-query.workflow.ts index f3c6e1936..ae7d73129 100644 --- a/packages/stryker-js-typescript-checker/src/answer-type-query.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/answer-type-query.workflow.ts @@ -19,22 +19,26 @@ import { const AnswerTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/AnswerDecision') type AnswerTypeId = typeof AnswerTypeId -export class AnswerAssignable extends S.TaggedClass()('AnswerAssignable', { - candidateType: S.String, -}) { +export class AnswerAssignable + extends S.TaggedClass()('AnswerAssignable', { + candidateType: S.String, + }) +{ readonly [AnswerTypeId] = AnswerTypeId } -export class AnswerNotAssignable extends S.TaggedClass()('AnswerNotAssignable', { - candidateType: S.String, - contextualType: S.String, -}) { +export class AnswerNotAssignable + extends S.TaggedClass()('AnswerNotAssignable', { + candidateType: S.String, + contextualType: S.String, + }) +{ readonly [AnswerTypeId] = AnswerTypeId } -export class AnswerUnknown - extends S.TaggedClass()('AnswerUnknown', { reason: TypeQuery.UnknownReason }) -{ +export class AnswerUnknown extends S.TaggedClass()('AnswerUnknown', { + reason: TypeQuery.UnknownReason, +}) { readonly [AnswerTypeId] = AnswerTypeId } diff --git a/packages/stryker-js-typescript-checker/src/capture-alias-specifier.workflow.ts b/packages/stryker-js-typescript-checker/src/capture-alias-specifier.workflow.ts index ab3991b1e..f1c938801 100644 --- a/packages/stryker-js-typescript-checker/src/capture-alias-specifier.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/capture-alias-specifier.workflow.ts @@ -9,13 +9,17 @@ import { CaptureAliasSpecifierCommand } from './CheckerCommands.schema.js' const CaptureTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/AliasCapture') type CaptureTypeId = typeof CaptureTypeId -export class AliasSpecifierCaptured extends S.TaggedClass()('AliasSpecifierCaptured', { - capture: S.String, -}) { +export class AliasSpecifierCaptured + extends S.TaggedClass()('AliasSpecifierCaptured', { + capture: S.String, + }) +{ readonly [CaptureTypeId] = CaptureTypeId } -export class AliasSpecifierUnmatched extends S.TaggedClass()('AliasSpecifierUnmatched', {}) { +export class AliasSpecifierUnmatched + extends S.TaggedClass()('AliasSpecifierUnmatched', {}) +{ readonly [CaptureTypeId] = CaptureTypeId } diff --git a/packages/stryker-js-typescript-checker/src/check-mutants.workflow.ts b/packages/stryker-js-typescript-checker/src/check-mutants.workflow.ts index 7756c0e3a..65f1cf49b 100644 --- a/packages/stryker-js-typescript-checker/src/check-mutants.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/check-mutants.workflow.ts @@ -12,20 +12,20 @@ import { CheckMutantsInput, type DiagnosticDecoded, type TceOutcome } from './Ch const CheckTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/CheckOutcome') type CheckTypeId = typeof CheckTypeId -export class MutantPassed extends S.TaggedClass()('MutantPassed', { +export class MutantPassed extends S.TaggedClass()('MutantPassed', { id: Mutant.MutantId, }) { readonly [CheckTypeId] = CheckTypeId } -export class MutantFailed extends S.TaggedClass()('MutantFailed', { +export class MutantFailed extends S.TaggedClass()('MutantFailed', { id: Mutant.MutantId, reason: S.String, }) { readonly [CheckTypeId] = CheckTypeId } -export class MutantIgnored extends S.TaggedClass()('MutantIgnored', { +export class MutantIgnored extends S.TaggedClass()('MutantIgnored', { id: Mutant.MutantId, reason: S.String, }) { diff --git a/packages/stryker-js-typescript-checker/src/classify-candidate.workflow.ts b/packages/stryker-js-typescript-checker/src/classify-candidate.workflow.ts index 3331f7209..879b7c52f 100644 --- a/packages/stryker-js-typescript-checker/src/classify-candidate.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/classify-candidate.workflow.ts @@ -11,11 +11,13 @@ const ContextFreenessTypeId: unique symbol = Symbol.for( ) type ContextFreenessTypeId = typeof ContextFreenessTypeId -export class ContextFree extends S.TaggedClass()('ContextFree', {}) { +export class ContextFree extends S.TaggedClass()('ContextFree', {}) { readonly [ContextFreenessTypeId] = ContextFreenessTypeId } -export class NotContextFree extends S.TaggedClass()('NotContextFree', {}) { +export class NotContextFree + extends S.TaggedClass()('NotContextFree', {}) +{ readonly [ContextFreenessTypeId] = ContextFreenessTypeId } diff --git a/packages/stryker-js-typescript-checker/src/classify-context-link.workflow.ts b/packages/stryker-js-typescript-checker/src/classify-context-link.workflow.ts index 87406c9f6..840e6be4b 100644 --- a/packages/stryker-js-typescript-checker/src/classify-context-link.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/classify-context-link.workflow.ts @@ -40,41 +40,49 @@ export type LeftOperandMember = typeof LeftOperandMember.Type export const ReturnTarget = S.Literals(['none', 'annotated', 'unannotated-expression', 'unannotated-declaration']) export type ReturnTarget = typeof ReturnTarget.Type -export class ClassifyContextLinkCommand extends S.TaggedClass()( - 'ClassifyContextLinkCommand', - { - parentKind: S.Enum(SyntaxKind), - slot: ContextSlot, - operator: S.Enum(SyntaxKind), - constAssertion: S.Boolean, - annotated: S.Boolean, - returnTarget: ReturnTarget, - leftOperand: S.Array(LeftOperandMember), - }, -) { +export class ClassifyContextLinkCommand + extends S.TaggedClass()( + 'ClassifyContextLinkCommand', + { + parentKind: S.Enum(SyntaxKind), + slot: ContextSlot, + operator: S.Enum(SyntaxKind), + constAssertion: S.Boolean, + annotated: S.Boolean, + returnTarget: ReturnTarget, + leftOperand: S.Array(LeftOperandMember), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const ContextLinkTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/ContextLink') type ContextLinkTypeId = typeof ContextLinkTypeId -export class LinkClimb extends S.TaggedClass()('LinkClimb', {}) { +export class LinkClimb extends S.TaggedClass()('LinkClimb', {}) { readonly [ContextLinkTypeId] = ContextLinkTypeId } -export class LinkClimbFunction extends S.TaggedClass()('LinkClimbFunction', {}) { +export class LinkClimbFunction + extends S.TaggedClass()('LinkClimbFunction', {}) +{ readonly [ContextLinkTypeId] = ContextLinkTypeId } -export class LinkDeclared extends S.TaggedClass()('LinkDeclared', {}) { +export class LinkDeclared extends S.TaggedClass()('LinkDeclared', {}) { readonly [ContextLinkTypeId] = ContextLinkTypeId } -export class LinkCallArgument extends S.TaggedClass()('LinkCallArgument', {}) { +export class LinkCallArgument + extends S.TaggedClass()('LinkCallArgument', {}) +{ readonly [ContextLinkTypeId] = ContextLinkTypeId } -export class LinkUnenforced extends S.TaggedClass()('LinkUnenforced', {}) { +export class LinkUnenforced + extends S.TaggedClass()('LinkUnenforced', {}) +{ readonly [ContextLinkTypeId] = ContextLinkTypeId } diff --git a/packages/stryker-js-typescript-checker/src/classify-tce.workflow.ts b/packages/stryker-js-typescript-checker/src/classify-tce.workflow.ts index d3c5a63fd..601e87eb4 100644 --- a/packages/stryker-js-typescript-checker/src/classify-tce.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/classify-tce.workflow.ts @@ -34,17 +34,19 @@ const candidateIdsAreDistinct = S.makeFilter( const DistinctCandidates = S.Array(TceCandidate).check(candidateIdsAreDistinct) -export class TceDecision extends S.TaggedClass()('TceDecision', { +export class TceDecision extends S.TaggedClass()('TceDecision', { id: S.String, classification: TceClassification, }) { readonly [TceDecisionTypeId] = TceDecisionTypeId } -export class ClassifyTceCommand extends S.TaggedClass()('ClassifyTceCommand', { - originalEmit: S.String, - candidates: DistinctCandidates, -}) { +export class ClassifyTceCommand + extends S.TaggedClass()('ClassifyTceCommand', { + originalEmit: S.String, + candidates: DistinctCandidates, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js-typescript-checker/src/group-mutants.workflow.ts b/packages/stryker-js-typescript-checker/src/group-mutants.workflow.ts index 7b65f7015..2491f97b3 100644 --- a/packages/stryker-js-typescript-checker/src/group-mutants.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/group-mutants.workflow.ts @@ -11,7 +11,7 @@ import { fileIdsOf } from './FileIds.schema.js' const GroupingTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/Grouping') type GroupingTypeId = typeof GroupingTypeId -export class MutantGroup extends S.TaggedClass()('MutantGroup', { +export class MutantGroup extends S.TaggedClass()('MutantGroup', { ids: S.Array(S.String), }) { readonly [GroupingTypeId] = GroupingTypeId diff --git a/packages/stryker-js-typescript-checker/src/identify-program.workflow.ts b/packages/stryker-js-typescript-checker/src/identify-program.workflow.ts index fcb80a78f..b61e855f8 100644 --- a/packages/stryker-js-typescript-checker/src/identify-program.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/identify-program.workflow.ts @@ -5,28 +5,34 @@ import * as S from 'effect/Schema' import { ProgramFile, programKeyOf } from './program-digest.schema.js' -export class IdentifyProgramCommand extends S.TaggedClass()('IdentifyProgramCommand', { - typescriptVersion: S.String, - checkerVersion: S.String, - checkerOptionsJson: S.String, - sourceFiles: S.Array(ProgramFile), - tsconfigs: S.Array(ProgramFile), -}) { +export class IdentifyProgramCommand + extends S.TaggedClass()('IdentifyProgramCommand', { + typescriptVersion: S.String, + checkerVersion: S.String, + checkerOptionsJson: S.String, + sourceFiles: S.Array(ProgramFile), + tsconfigs: S.Array(ProgramFile), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const IdentifyTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/IdentifyProgram') type IdentifyTypeId = typeof IdentifyTypeId -export class ProgramIdentified extends S.TaggedClass()('ProgramIdentified', { - key: S.String, -}) { +export class ProgramIdentified + extends S.TaggedClass()('ProgramIdentified', { + key: S.String, + }) +{ readonly [IdentifyTypeId] = IdentifyTypeId } -export class ProgramUnidentified extends S.TaggedClass()('ProgramUnidentified', { - reason: S.String, -}) { +export class ProgramUnidentified + extends S.TaggedClass()('ProgramUnidentified', { + reason: S.String, + }) +{ readonly [IdentifyTypeId] = IdentifyTypeId } diff --git a/packages/stryker-js-typescript-checker/src/override-tsconfig-options.workflow.ts b/packages/stryker-js-typescript-checker/src/override-tsconfig-options.workflow.ts index 94b16a5f5..6b68f3513 100644 --- a/packages/stryker-js-typescript-checker/src/override-tsconfig-options.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/override-tsconfig-options.workflow.ts @@ -10,18 +10,22 @@ import type { TsConfigCompilerOptions, TsConfigDocument } from './Tsconfig.schem const OverrideTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/TsconfigOverride') type OverrideTypeId = typeof OverrideTypeId -export class ProjectReferencesOverride extends S.TaggedClass()( - 'ProjectReferencesOverride', - { - text: S.String, - }, -) { +export class ProjectReferencesOverride + extends S.TaggedClass()( + 'ProjectReferencesOverride', + { + text: S.String, + }, + ) +{ readonly [OverrideTypeId] = OverrideTypeId } -export class SingleProjectOverride extends S.TaggedClass()('SingleProjectOverride', { - text: S.String, -}) { +export class SingleProjectOverride + extends S.TaggedClass()('SingleProjectOverride', { + text: S.String, + }) +{ readonly [OverrideTypeId] = OverrideTypeId } diff --git a/packages/stryker-js-typescript-checker/src/parse-tsconfig-text.workflow.ts b/packages/stryker-js-typescript-checker/src/parse-tsconfig-text.workflow.ts index a2a97798d..ae4a174b8 100644 --- a/packages/stryker-js-typescript-checker/src/parse-tsconfig-text.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/parse-tsconfig-text.workflow.ts @@ -15,15 +15,19 @@ const TsconfigTextTypeId: unique symbol = Symbol.for( ) type TsconfigTextTypeId = typeof TsconfigTextTypeId -export class TsconfigParsed extends S.TaggedClass()('TsconfigParsed', { - document: TsConfigDocumentSchema, -}) { +export class TsconfigParsed + extends S.TaggedClass()('TsconfigParsed', { + document: TsConfigDocumentSchema, + }) +{ readonly [TsconfigTextTypeId] = TsconfigTextTypeId } -export class TsconfigRefused extends S.TaggedClass()('TsconfigRefused', { - reason: S.String, -}) { +export class TsconfigRefused + extends S.TaggedClass()('TsconfigRefused', { + reason: S.String, + }) +{ readonly [TsconfigTextTypeId] = TsconfigTextTypeId } diff --git a/packages/stryker-js-typescript-checker/src/plan-diagnostic-batches.workflow.ts b/packages/stryker-js-typescript-checker/src/plan-diagnostic-batches.workflow.ts index 8dcbc76c2..d4475f102 100644 --- a/packages/stryker-js-typescript-checker/src/plan-diagnostic-batches.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/plan-diagnostic-batches.workflow.ts @@ -11,13 +11,17 @@ const DiagnosticBatchSize = 64 const BatchesTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/DiagnosticBatches') type BatchesTypeId = typeof BatchesTypeId -export class DiagnosticBatchesPlanned extends S.TaggedClass()('DiagnosticBatchesPlanned', { - batches: S.String.pipe(S.Array, S.Array), -}) { +export class DiagnosticBatchesPlanned + extends S.TaggedClass()('DiagnosticBatchesPlanned', { + batches: S.String.pipe(S.Array, S.Array), + }) +{ readonly [BatchesTypeId] = BatchesTypeId } -export class NoDiagnosticBatches extends S.TaggedClass()('NoDiagnosticBatches', {}) { +export class NoDiagnosticBatches + extends S.TaggedClass()('NoDiagnosticBatches', {}) +{ readonly [BatchesTypeId] = BatchesTypeId } diff --git a/packages/stryker-js-typescript-checker/src/plan-resolution-candidates.workflow.ts b/packages/stryker-js-typescript-checker/src/plan-resolution-candidates.workflow.ts index e962e3f2c..5ee24cf0f 100644 --- a/packages/stryker-js-typescript-checker/src/plan-resolution-candidates.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/plan-resolution-candidates.workflow.ts @@ -10,15 +10,19 @@ const ExtensionlessTypeId: unique symbol = Symbol.for( ) type ExtensionlessTypeId = typeof ExtensionlessTypeId -export class ExtensionNamedPath extends S.TaggedClass()('ExtensionNamedPath', { - candidates: S.Array(S.String), -}) { +export class ExtensionNamedPath + extends S.TaggedClass()('ExtensionNamedPath', { + candidates: S.Array(S.String), + }) +{ readonly [ExtensionlessTypeId] = ExtensionlessTypeId } -export class ExtensionlessPath extends S.TaggedClass()('ExtensionlessPath', { - candidates: S.Array(S.String), -}) { +export class ExtensionlessPath + extends S.TaggedClass()('ExtensionlessPath', { + candidates: S.Array(S.String), + }) +{ readonly [ExtensionlessTypeId] = ExtensionlessTypeId } diff --git a/packages/stryker-js-typescript-checker/src/request-affected-files.workflow.ts b/packages/stryker-js-typescript-checker/src/request-affected-files.workflow.ts index a54c484c5..20324937a 100644 --- a/packages/stryker-js-typescript-checker/src/request-affected-files.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/request-affected-files.workflow.ts @@ -10,13 +10,17 @@ import { RequestAffectedFilesCommand } from './CheckerCommands.schema.js' const RequestTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/RequestAffectedFiles') type RequestTypeId = typeof RequestTypeId -export class AffectedFilesRequested extends S.TaggedClass()('AffectedFilesRequested', { - fileNames: S.Array(S.String), -}) { +export class AffectedFilesRequested + extends S.TaggedClass()('AffectedFilesRequested', { + fileNames: S.Array(S.String), + }) +{ readonly [RequestTypeId] = RequestTypeId } -export class NoAffectedFileRequested extends S.TaggedClass()('NoAffectedFileRequested', {}) { +export class NoAffectedFileRequested + extends S.TaggedClass()('NoAffectedFileRequested', {}) +{ readonly [RequestTypeId] = RequestTypeId } diff --git a/packages/stryker-js-typescript-checker/src/resolve-package-exports.workflow.ts b/packages/stryker-js-typescript-checker/src/resolve-package-exports.workflow.ts index 44519055d..8143a5a23 100644 --- a/packages/stryker-js-typescript-checker/src/resolve-package-exports.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/resolve-package-exports.workflow.ts @@ -14,29 +14,35 @@ const PackageExportsTypeId: unique symbol = Symbol.for( ) type PackageExportsTypeId = typeof PackageExportsTypeId -export class ResolvePackageExportsCommand extends S.TaggedClass()( - 'ResolvePackageExportsCommand', - { - exports: S.Json, - subpath: S.String, - }, -) { +export class ResolvePackageExportsCommand + extends S.TaggedClass()( + 'ResolvePackageExportsCommand', + { + exports: S.Json, + subpath: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class PackageExportsResolved extends S.TaggedClass()('PackageExportsResolved', { - targets: S.Array(S.String), - terminal: S.Boolean, -}) { +export class PackageExportsResolved + extends S.TaggedClass()('PackageExportsResolved', { + targets: S.Array(S.String), + terminal: S.Boolean, + }) +{ readonly [PackageExportsTypeId] = PackageExportsTypeId } -export class PackageExportsExcluded extends S.TaggedClass()('PackageExportsExcluded', {}) { +export class PackageExportsExcluded + extends S.TaggedClass()('PackageExportsExcluded', {}) +{ readonly [PackageExportsTypeId] = PackageExportsTypeId } export class PackageExportsUnresolved - extends S.TaggedClass()('PackageExportsUnresolved', {}) + extends S.TaggedClass()('PackageExportsUnresolved', {}) { readonly [PackageExportsTypeId] = PackageExportsTypeId } diff --git a/packages/stryker-js-typescript-checker/src/trace-affected-files.workflow.ts b/packages/stryker-js-typescript-checker/src/trace-affected-files.workflow.ts index faed00984..82d1c2de9 100644 --- a/packages/stryker-js-typescript-checker/src/trace-affected-files.workflow.ts +++ b/packages/stryker-js-typescript-checker/src/trace-affected-files.workflow.ts @@ -12,15 +12,19 @@ import { TraceAffectedFilesCommand } from './CheckerCommands.schema.js' const TraceTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-typescript-checker/TraceAffectedFiles') type TraceTypeId = typeof TraceTypeId -export class MutatedFileAffected extends S.TaggedClass()('MutatedFileAffected', { - fileName: S.String, -}) { +export class MutatedFileAffected + extends S.TaggedClass()('MutatedFileAffected', { + fileName: S.String, + }) +{ readonly [TraceTypeId] = TraceTypeId } -export class DependentFileAffected extends S.TaggedClass()('DependentFileAffected', { - fileName: S.String, -}) { +export class DependentFileAffected + extends S.TaggedClass()('DependentFileAffected', { + fileName: S.String, + }) +{ readonly [TraceTypeId] = TraceTypeId } diff --git a/packages/stryker-js-vitest-runner/oxlint.config.ts b/packages/stryker-js-vitest-runner/oxlint.config.ts index 4634d8db6..0aa3c0891 100644 --- a/packages/stryker-js-vitest-runner/oxlint.config.ts +++ b/packages/stryker-js-vitest-runner/oxlint.config.ts @@ -13,6 +13,7 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, overrides: [ + { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: [userProjectSetupFile], rules: { diff --git a/packages/stryker-js-vitest-runner/package.json b/packages/stryker-js-vitest-runner/package.json index 803d98b7c..23fd1937c 100644 --- a/packages/stryker-js-vitest-runner/package.json +++ b/packages/stryker-js-vitest-runner/package.json @@ -97,9 +97,9 @@ } }, "inlinedDependencies": { - "@effect/opentelemetry": "4.0.0", - "@effect/platform-node": "4.0.0", - "@effect/platform-node-shared": "4.0.0", + "@effect/opentelemetry": "4.1.0", + "@effect/platform-node": "4.1.0", + "@effect/platform-node-shared": "4.1.0", "@eslint-community/regexpp": "4.12.2", "@noble/hashes": "2.4.0", "@opentelemetry/api": "1.9.1", @@ -117,8 +117,7 @@ "@opentelemetry/sdk-trace-node": "2.11.0", "@opentelemetry/semantic-conventions": "1.43.0", "@systemfsoftware/effect-cell-types": "12.0.0", - "effect": "4.0.0", - "oxc-parser": "0.150.0", - "ws": "8.22.0" + "effect": "4.1.0", + "oxc-parser": "0.150.0" } } diff --git a/packages/stryker-js-vitest-runner/sandbox/stryker-setup.ts b/packages/stryker-js-vitest-runner/sandbox/stryker-setup.ts index f36c16a40..db4585739 100644 --- a/packages/stryker-js-vitest-runner/sandbox/stryker-setup.ts +++ b/packages/stryker-js-vitest-runner/sandbox/stryker-setup.ts @@ -8,7 +8,7 @@ const globalNamespace = inject('globalNamespace') as '__stryker__' | '__stryker2 const mutantActivation = inject('mutantActivation') as 'runtime' | 'static' | undefined const mode = inject('mode') as 'dry-run' | 'mutant' -const ns: Types.Mutable = globalThis[globalNamespace] ?? +const ns: Types.Mutable> = globalThis[globalNamespace] ?? (globalThis[globalNamespace] = {}) interface SuiteWithTaskMeta { diff --git a/packages/stryker-js-vitest-runner/src/StandbyThreadsPool.schema.ts b/packages/stryker-js-vitest-runner/src/StandbyThreadsPool.schema.ts index 9c3cda528..0075fe1e6 100644 --- a/packages/stryker-js-vitest-runner/src/StandbyThreadsPool.schema.ts +++ b/packages/stryker-js-vitest-runner/src/StandbyThreadsPool.schema.ts @@ -1,13 +1,17 @@ import * as S from 'effect/Schema' -export class StandbyThreadDied extends S.TaggedError()('StandbyThreadDied', { - cause: S.Unknown, - message: S.String, -}) {} +export class StandbyThreadDied + extends S.TaggedError()('StandbyThreadDied', { + cause: S.Unknown, + message: S.String, + }) +{} -export class StandbyThreadStopFailed extends S.TaggedError()('StandbyThreadStopFailed', { - cause: S.Unknown, - message: S.String, -}) {} +export class StandbyThreadStopFailed + extends S.TaggedError()('StandbyThreadStopFailed', { + cause: S.Unknown, + message: S.String, + }) +{} export type StandbyPoolFailed = StandbyThreadDied | StandbyThreadStopFailed diff --git a/packages/stryker-js-vitest-runner/src/VitestRunner.schema.ts b/packages/stryker-js-vitest-runner/src/VitestRunner.schema.ts index bc921b527..4189d8fa2 100644 --- a/packages/stryker-js-vitest-runner/src/VitestRunner.schema.ts +++ b/packages/stryker-js-vitest-runner/src/VitestRunner.schema.ts @@ -29,9 +29,11 @@ export interface RunFilter { priorKillerTestIds?: string[] } -export class CoverageDecodeFailed extends S.TaggedError()('CoverageDecodeFailed', { - cause: S.Unknown, -}) { +export class CoverageDecodeFailed + extends S.TaggedError()('CoverageDecodeFailed', { + cause: S.Unknown, + }) +{ override get message(): string { return 'Failed to decode coverage data' } diff --git a/packages/stryker-js-vitest-runner/src/VitestRuntime.blueprint.ts b/packages/stryker-js-vitest-runner/src/VitestRuntime.blueprint.ts index 1edffbb8c..e57e5e314 100644 --- a/packages/stryker-js-vitest-runner/src/VitestRuntime.blueprint.ts +++ b/packages/stryker-js-vitest-runner/src/VitestRuntime.blueprint.ts @@ -4,7 +4,7 @@ import { BaseSequencer, createVitest as createVitestOriginal, type TestSpecifica import { Blueprint } from '@systemfsoftware/effect-cell-types' import { ErrorText } from '@systemfsoftware/stryker-js-instrumenter' import { TestRunner } from '@systemfsoftware/stryker-js-plugin-interface' -import * as Crypto from 'effect/Crypto' +import * as SecureRandom from 'effect/crypto/SecureRandom' import * as Effect from 'effect/Effect' import * as FileSystem from 'effect/FileSystem' import * as Match from 'effect/Match' @@ -222,7 +222,7 @@ export interface VitestRuntimeInput { readonly bail: number readonly setupFilePath: string | undefined readonly resolver: VitestResolver - readonly crypto: Crypto.Crypto + readonly crypto: SecureRandom.SecureRandom['Service'] readonly fileSystem: FileSystem.FileSystem readonly path: Path.Path readonly lifetime: Scope.Scope @@ -378,7 +378,7 @@ const acquire: (input: VitestRuntimeInput) => Effect.Effect path.fromFileUrl(STRYKER_SETUP_URL).pipe(Effect.mapError(failRuntime('init'))), diff --git a/packages/stryker-js-vitest-runner/src/interpret-vitest-dry-run.workflow.ts b/packages/stryker-js-vitest-runner/src/interpret-vitest-dry-run.workflow.ts index d1c6803ae..7e460d180 100644 --- a/packages/stryker-js-vitest-runner/src/interpret-vitest-dry-run.workflow.ts +++ b/packages/stryker-js-vitest-runner/src/interpret-vitest-dry-run.workflow.ts @@ -9,16 +9,18 @@ import { VitestDryRunCommand } from './vitest-run-command.schema.js' const VitestDryRunTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-vitest-runner/VitestDryRun') type VitestDryRunTypeId = typeof VitestDryRunTypeId -export class DryRunComplete extends S.TaggedClass()('Complete', { +export class DryRunComplete extends S.TaggedClass()('Complete', { tests: S.Array(TestRunner.TestResultSchema), }) { readonly [VitestDryRunTypeId] = VitestDryRunTypeId } -export class DryRunExternalError extends S.TaggedClass()('Error', { - tests: S.Array(TestRunner.TestResultSchema), - errorMessage: S.String, -}) { +export class DryRunExternalError + extends S.TaggedClass()('Error', { + tests: S.Array(TestRunner.TestResultSchema), + errorMessage: S.String, + }) +{ readonly [VitestDryRunTypeId] = VitestDryRunTypeId } diff --git a/packages/stryker-js-vitest-runner/src/interpret-vitest-mutant-run.workflow.ts b/packages/stryker-js-vitest-runner/src/interpret-vitest-mutant-run.workflow.ts index 3e60cd98c..67e6e1e8f 100644 --- a/packages/stryker-js-vitest-runner/src/interpret-vitest-mutant-run.workflow.ts +++ b/packages/stryker-js-vitest-runner/src/interpret-vitest-mutant-run.workflow.ts @@ -39,7 +39,7 @@ const isNamedTrap = (command: VitestMutantRunCommand): boolean => const VitestMutantRunTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-vitest-runner/VitestMutantRun') type VitestMutantRunTypeId = typeof VitestMutantRunTypeId -export class MutantKilled extends S.TaggedClass()('Killed', { +export class MutantKilled extends S.TaggedClass()('Killed', { tests: S.Array(TestRunner.TestResultSchema), killerIds: S.String.pipe(S.Array, S.optional), failureMessage: S.optional(S.String), @@ -48,21 +48,21 @@ export class MutantKilled extends S.TaggedClass()('Killed', { readonly [VitestMutantRunTypeId] = VitestMutantRunTypeId } -export class MutantSurvived extends S.TaggedClass()('Survived', { +export class MutantSurvived extends S.TaggedClass()('Survived', { tests: S.Array(TestRunner.TestResultSchema), executedTests: S.Array(TestRunner.ExecutedTestSchema), }) { readonly [VitestMutantRunTypeId] = VitestMutantRunTypeId } -export class MutantTimeout extends S.TaggedClass()('Timeout', { +export class MutantTimeout extends S.TaggedClass()('Timeout', { tests: S.Array(TestRunner.TestResultSchema), reason: S.optional(S.String), }) { readonly [VitestMutantRunTypeId] = VitestMutantRunTypeId } -export class MutantDryError extends S.TaggedClass()('Error', { +export class MutantDryError extends S.TaggedClass()('Error', { tests: S.Array(TestRunner.TestResultSchema), errorMessage: S.optional(S.String), }) { diff --git a/packages/stryker-js-vitest-runner/src/main.ts b/packages/stryker-js-vitest-runner/src/main.ts index 6856dcff9..968171e52 100644 --- a/packages/stryker-js-vitest-runner/src/main.ts +++ b/packages/stryker-js-vitest-runner/src/main.ts @@ -1,6 +1,6 @@ import * as NodeSdk from '@effect/opentelemetry/NodeSdk' import { NodeFileSystem, NodePath, NodeSocketServer } from '@effect/platform-node' -import { layer as NodeCryptoLayer } from '@effect/platform-node/NodeCrypto' +import { layerSecureRandom as NodeCryptoLayer } from '@effect/platform-node/NodeCrypto' import * as NodeRuntime from '@effect/platform-node/NodeRuntime' import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base' diff --git a/packages/stryker-js-vitest-runner/src/sort-test-files.workflow.ts b/packages/stryker-js-vitest-runner/src/sort-test-files.workflow.ts index 7da0a491a..ee22531d1 100644 --- a/packages/stryker-js-vitest-runner/src/sort-test-files.workflow.ts +++ b/packages/stryker-js-vitest-runner/src/sort-test-files.workflow.ts @@ -7,13 +7,13 @@ import * as S from 'effect/Schema' const FileOrderTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js-vitest-runner/FileOrder') type FileOrderTypeId = typeof FileOrderTypeId -export class TestFileOrder extends S.TaggedClass()('TestFileOrder', { +export class TestFileOrder extends S.TaggedClass()('TestFileOrder', { moduleId: S.String, }) { readonly [FileOrderTypeId] = FileOrderTypeId } -export class SortTestFiles extends S.TaggedClass()('SortTestFiles', { +export class SortTestFiles extends S.TaggedClass()('SortTestFiles', { order: S.Array(S.String), files: S.Array(S.String), priority: S.Array(S.String), diff --git a/packages/stryker-js-vitest-runner/src/vitest-run-command.schema.ts b/packages/stryker-js-vitest-runner/src/vitest-run-command.schema.ts index bcb4618d1..a5e9d27f5 100644 --- a/packages/stryker-js-vitest-runner/src/vitest-run-command.schema.ts +++ b/packages/stryker-js-vitest-runner/src/vitest-run-command.schema.ts @@ -29,29 +29,33 @@ export const VitestTestRun = S.Struct({ }) export type VitestTestRun = S.Schema.Type -export class VitestDryRunCommand extends S.TaggedClass()('VitestDryRunCommand', { - projectRoot: S.String, - tests: S.Array(TestRunner.TestResultSchema), - hasExternalError: S.Boolean, - externalErrorText: S.String, -}) { +export class VitestDryRunCommand + extends S.TaggedClass()('VitestDryRunCommand', { + projectRoot: S.String, + tests: S.Array(TestRunner.TestResultSchema), + hasExternalError: S.Boolean, + externalErrorText: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { projectRoot: 'stryker.vitest.project_root', } as const } -export class VitestMutantRunCommand extends S.TaggedClass()('VitestMutantRunCommand', { - tests: S.Array(TestRunner.TestResultSchema), - hasExternalError: S.Boolean, - externalErrorText: S.String, - hitCount: S.optional(Report.NonNegativeInt), - hitLimit: S.optional(Report.NonNegativeInt), - reportAllKillers: S.Boolean, - activeMutantId: Mutant.MutantId, - activeMutantFileName: Mutant.CanonicalFileName, - timeoutTrapFile: S.optional(S.String), - timeoutTrapMutantId: S.optional(Mutant.MutantId), -}) { +export class VitestMutantRunCommand + extends S.TaggedClass()('VitestMutantRunCommand', { + tests: S.Array(TestRunner.TestResultSchema), + hasExternalError: S.Boolean, + externalErrorText: S.String, + hitCount: S.optional(Report.NonNegativeInt), + hitLimit: S.optional(Report.NonNegativeInt), + reportAllKillers: S.Boolean, + activeMutantId: Mutant.MutantId, + activeMutantFileName: Mutant.CanonicalFileName, + timeoutTrapFile: S.optional(S.String), + timeoutTrapMutantId: S.optional(Mutant.MutantId), + }) +{ static readonly [Workflow.InstrumentationBrand] = { activeMutantId: 'stryker.vitest.active_mutant_id', reportAllKillers: 'stryker.vitest.report_all_killers', diff --git a/packages/stryker-js-vitest-runner/src/vitest-session.ts b/packages/stryker-js-vitest-runner/src/vitest-session.ts index ffa64679b..e7056cc3a 100644 --- a/packages/stryker-js-vitest-runner/src/vitest-session.ts +++ b/packages/stryker-js-vitest-runner/src/vitest-session.ts @@ -1,7 +1,7 @@ import { ErrorText, Instrument } from '@systemfsoftware/stryker-js-instrumenter' import { Options, TestRunner } from '@systemfsoftware/stryker-js-plugin-interface' import * as Boolean from 'effect/Boolean' -import * as Crypto from 'effect/Crypto' +import * as SecureRandom from 'effect/crypto/SecureRandom' import * as Effect from 'effect/Effect' import * as FileSystem from 'effect/FileSystem' import * as Layer from 'effect/Layer' @@ -71,7 +71,7 @@ const buildRuntime = ( input: VitestSessionInput, created: Ref.Ref, platform: { - readonly crypto: Crypto.Crypto + readonly crypto: SecureRandom.SecureRandom['Service'] readonly fileSystem: FileSystem.FileSystem readonly path: Path.Path readonly lifetime: Scope.Scope @@ -100,9 +100,13 @@ const namespaceOf = (input: VitestSessionInput): StrykerNamespace => export const make = ( input: VitestSessionInput, -): Effect.Effect => +): Effect.Effect< + VitestSessionShape, + never, + SecureRandom.SecureRandom | FileSystem.FileSystem | Path.Path | Scope.Scope +> => Effect.gen(function*() { - const crypto = yield* Crypto.Crypto + const crypto = yield* SecureRandom.SecureRandom const fs = yield* FileSystem.FileSystem const path = yield* Path.Path const lifetime = yield* Scope.Scope @@ -118,5 +122,5 @@ export const make = ( export const layer = ( input: VitestSessionInput, -): Layer.Layer => +): Layer.Layer => Layer.effect(VitestSession, make(input)) diff --git a/packages/stryker-js-vitest-runner/src/vitest-test-runner.ts b/packages/stryker-js-vitest-runner/src/vitest-test-runner.ts index d3d6d9417..17cc2f409 100644 --- a/packages/stryker-js-vitest-runner/src/vitest-test-runner.ts +++ b/packages/stryker-js-vitest-runner/src/vitest-test-runner.ts @@ -4,7 +4,7 @@ import { ErrorText, Instrument } from '@systemfsoftware/stryker-js-instrumenter' import { Mutant, TestRunner } from '@systemfsoftware/stryker-js-plugin-interface' import * as Boolean from 'effect/Boolean' import * as Context from 'effect/Context' -import * as Crypto from 'effect/Crypto' +import * as SecureRandom from 'effect/crypto/SecureRandom' import * as Deferred from 'effect/Deferred' import * as Effect from 'effect/Effect' import * as FileSystem from 'effect/FileSystem' @@ -185,8 +185,11 @@ const mergeCoverage = (to: Mutant.CoverageData, from: Mutant.CoverageData): Muta export const layer = ( input: VitestSessionInput, -): Layer.Layer => - Layer.effect(TestRunner.TestRunner, make(input)) +): Layer.Layer< + TestRunner.TestRunner, + never, + VitestSession | SecureRandom.SecureRandom | FileSystem.FileSystem | Path.Path +> => Layer.effect(TestRunner.TestRunner, make(input)) export const make = Effect.fn(SpanTaxonomy.Spans.vitestRunnerMake.name)(function*(input: VitestSessionInput) { const session = yield* VitestSession @@ -230,7 +233,7 @@ export const make = Effect.fn(SpanTaxonomy.Spans.vitestRunnerMake.name)(function const normalized = normalizeCoverage(coverage, projectRoot, pathService) return S.decodeEffect(Mutant.MutantCoverageSchema)(normalized).pipe( Effect.mapError((cause) => new CoverageDecodeFailed({ cause })), - Effect.map(() => normalized), + Effect.as(normalized), ) } diff --git a/packages/stryker-js-vitest-runner/typings/global.d.ts b/packages/stryker-js-vitest-runner/typings/global.d.ts index 53ceb1ea0..585bc4132 100644 --- a/packages/stryker-js-vitest-runner/typings/global.d.ts +++ b/packages/stryker-js-vitest-runner/typings/global.d.ts @@ -1,9 +1,9 @@ // Use "var" instead of let, otherwise we are not expanding the `globalThis` declare var __stryker__: - | import('@systemfsoftware/stryker-js-instrumenter').Instrument.InstrumenterContext + | Omit | undefined declare var __stryker2__: - | import('@systemfsoftware/stryker-js-instrumenter').Instrument.InstrumenterContext + | Omit | undefined declare var strykerGlobalNamespaceName: '__stryker__' | '__stryker2__' declare var strykerDryRun: boolean diff --git a/packages/stryker-js/oxlint.config.ts b/packages/stryker-js/oxlint.config.ts index 9afc397f8..bf52b1e18 100644 --- a/packages/stryker-js/oxlint.config.ts +++ b/packages/stryker-js/oxlint.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ 'typescript/no-non-null-assertion': 'error', 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, + overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/testResources/**', diff --git a/packages/stryker-js/src/Checker/Checker.blueprint.ts b/packages/stryker-js/src/Checker/Checker.blueprint.ts index 68ad81779..db1f5f436 100644 --- a/packages/stryker-js/src/Checker/Checker.blueprint.ts +++ b/packages/stryker-js/src/Checker/Checker.blueprint.ts @@ -68,7 +68,7 @@ const acquire = Effect.fnUntraced(function*(spec: CheckerSpec) { Match.exhaustive, ) ), - Effect.tapError(() => Metric.update(checkerProcessCrashes, 1)), + Effect.trackErrors(checkerProcessCrashes, () => 1), ) return serviceOf(makeCheckerHandle(client)) }) diff --git a/packages/stryker-js/src/Checker/Checker.handle.ts b/packages/stryker-js/src/Checker/Checker.handle.ts index c2003b791..cc9c9ff0e 100644 --- a/packages/stryker-js/src/Checker/Checker.handle.ts +++ b/packages/stryker-js/src/Checker/Checker.handle.ts @@ -107,7 +107,7 @@ const recordCheckerCall = ( Match.exhaustive, ) ), - Effect.tap(([duration]) => Metric.update(checkerDuration, duration)), + Effect.trackSuccesses(checkerDuration, ([duration]) => duration), Effect.map(([, result]) => result), Effect.mapError((error) => Match.value(error).pipe( diff --git a/packages/stryker-js/src/Checker/Checker.schema.ts b/packages/stryker-js/src/Checker/Checker.schema.ts index c7e64c2bd..6af80f4b0 100644 --- a/packages/stryker-js/src/Checker/Checker.schema.ts +++ b/packages/stryker-js/src/Checker/Checker.schema.ts @@ -8,11 +8,13 @@ import * as Result from 'effect/Result' import * as S from 'effect/Schema' import * as SchemaTransformation from 'effect/SchemaTransformation' -export class UndescribableMutant extends S.TaggedError()('UndescribableMutant', { - id: Mutant.MutantId, - fileName: Mutant.CanonicalFileName, - reason: S.String, -}) { +export class UndescribableMutant + extends S.TaggedError()('UndescribableMutant', { + id: Mutant.MutantId, + fileName: Mutant.CanonicalFileName, + reason: S.String, + }) +{ override get message(): string { return `Mutant ${this.id} in ${this.fileName} cannot be described to a checker: ${this.reason}` } @@ -52,9 +54,12 @@ const DescriptionCandidate = S.Struct({ * `id` and `fileName` name it when it is refused. */ export class DescribeCheckerMutantsCommand - extends S.TaggedClass()('DescribeCheckerMutantsCommand', { - candidates: S.Array(DescriptionCandidate), - }) + extends S.TaggedClass()( + 'DescribeCheckerMutantsCommand', + { + candidates: S.Array(DescriptionCandidate), + }, + ) { static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -62,15 +67,19 @@ export class DescribeCheckerMutantsCommand const MutantDescriptionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutantDescription') type MutantDescriptionTypeId = typeof MutantDescriptionTypeId -export class MutantDescribed extends S.TaggedClass()('MutantDescribed', { - wire: Checker.CheckerMutantWire, -}) { +export class MutantDescribed + extends S.TaggedClass()('MutantDescribed', { + wire: Checker.CheckerMutantWire, + }) +{ readonly [MutantDescriptionTypeId] = MutantDescriptionTypeId } -export class MutantUndescribable extends S.TaggedClass()('MutantUndescribable', { - undescribable: UndescribableMutant, -}) { +export class MutantUndescribable + extends S.TaggedClass()('MutantUndescribable', { + undescribable: UndescribableMutant, + }) +{ readonly [MutantDescriptionTypeId] = MutantDescriptionTypeId } diff --git a/packages/stryker-js/src/Checker/partition-checked-plans.workflow.ts b/packages/stryker-js/src/Checker/partition-checked-plans.workflow.ts index 8289614bb..4bb368230 100644 --- a/packages/stryker-js/src/Checker/partition-checked-plans.workflow.ts +++ b/packages/stryker-js/src/Checker/partition-checked-plans.workflow.ts @@ -18,39 +18,47 @@ const IgnoredCheckResultSchema = S.Struct({ reason: Mutant.IgnoreStatusReasonText, }) -export class CheckedPlanPassed extends S.TaggedClass()('CheckedPlanPassed', { - mutantId: Mutant.MutantId, - entryIndex: S.Int, -}) { +export class CheckedPlanPassed + extends S.TaggedClass()('CheckedPlanPassed', { + mutantId: Mutant.MutantId, + entryIndex: S.Int, + }) +{ readonly [CheckedPlanTypeId] = CheckedPlanTypeId } -export class CheckedPlanFailed extends S.TaggedClass()('CheckedPlanFailed', { - mutantId: Mutant.MutantId, - entryIndex: S.Int, - reason: S.String, - result: FailedCheckResultSchema, -}) { +export class CheckedPlanFailed + extends S.TaggedClass()('CheckedPlanFailed', { + mutantId: Mutant.MutantId, + entryIndex: S.Int, + reason: S.String, + result: FailedCheckResultSchema, + }) +{ readonly [CheckedPlanTypeId] = CheckedPlanTypeId } -export class CheckedPlanIgnored extends S.TaggedClass()('CheckedPlanIgnored', { - mutantId: Mutant.MutantId, - entryIndex: S.Int, - reason: Mutant.IgnoreStatusReasonText, - result: IgnoredCheckResultSchema, -}) { +export class CheckedPlanIgnored + extends S.TaggedClass()('CheckedPlanIgnored', { + mutantId: Mutant.MutantId, + entryIndex: S.Int, + reason: Mutant.IgnoreStatusReasonText, + result: IgnoredCheckResultSchema, + }) +{ readonly [CheckedPlanTypeId] = CheckedPlanTypeId } export type CheckedPlanDecision = CheckedPlanPassed | CheckedPlanFailed | CheckedPlanIgnored -export class PartitionCheckedPlansCommand extends S.TaggedClass()( - 'PartitionCheckedPlansCommand', - { - checked: S.Array(S.Tuple([Mutant.MutantId, Checker.CheckResultSchema])), - }, -) { +export class PartitionCheckedPlansCommand + extends S.TaggedClass()( + 'PartitionCheckedPlansCommand', + { + checked: S.Array(S.Tuple([Mutant.MutantId, Checker.CheckResultSchema])), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Checker/warn-skipped-mutants.workflow.ts b/packages/stryker-js/src/Checker/warn-skipped-mutants.workflow.ts index cefda9fb4..13741b4b5 100644 --- a/packages/stryker-js/src/Checker/warn-skipped-mutants.workflow.ts +++ b/packages/stryker-js/src/Checker/warn-skipped-mutants.workflow.ts @@ -12,25 +12,31 @@ const SKIPPED_IDS_IN_WARNING = 5 const SkipWarningTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/SkipWarning') type SkipWarningTypeId = typeof SkipWarningTypeId -export class WarnSkippedMutantsCommand extends S.TaggedClass()('WarnSkippedMutantsCommand', { - checkerName: S.String, - skipped: S.Array(UndescribableMutant), -}) { +export class WarnSkippedMutantsCommand + extends S.TaggedClass()('WarnSkippedMutantsCommand', { + checkerName: S.String, + skipped: S.Array(UndescribableMutant), + }) +{ static readonly [Workflow.InstrumentationBrand] = { checkerName: 'stryker.checker.name', } as const } -export class NoMutantSkipped extends S.TaggedClass()('NoMutantSkipped', {}) { +export class NoMutantSkipped + extends S.TaggedClass()('NoMutantSkipped', {}) +{ readonly [SkipWarningTypeId] = SkipWarningTypeId } const SkippedCount = S.Int.pipe(S.check(S.isGreaterThanOrEqualTo(1))) -export class MutantsSkippedWarned extends S.TaggedClass()('MutantsSkippedWarned', { - skipped: SkippedCount, - warning: S.String, -}) { +export class MutantsSkippedWarned + extends S.TaggedClass()('MutantsSkippedWarned', { + skipped: SkippedCount, + warning: S.String, + }) +{ readonly [SkipWarningTypeId] = SkipWarningTypeId } diff --git a/packages/stryker-js/src/Cli.schema.ts b/packages/stryker-js/src/Cli.schema.ts index 816ff0664..c7e0b8011 100644 --- a/packages/stryker-js/src/Cli.schema.ts +++ b/packages/stryker-js/src/Cli.schema.ts @@ -128,20 +128,22 @@ export type CliRequest = | FeedbackRouteRequest | McpRouteRequest -export class CliRouteCommand extends S.TaggedClass()('CliRouteCommand', { - route: S.Union([ - S.TaggedStruct('help', {}), - MergeRequestSchema, - RunRequestSchema, - CompareRequestSchema, - GateRequestSchema, - AnnotateRequestSchema, - PlanRequestSchema, - AuditRequestSchema, - ServeRouteRequestSchema, - FeedbackRouteRequestSchema, - McpRouteRequestSchema, - ]), -}) { +export class CliRouteCommand + extends S.TaggedClass()('CliRouteCommand', { + route: S.Union([ + S.TaggedStruct('help', {}), + MergeRequestSchema, + RunRequestSchema, + CompareRequestSchema, + GateRequestSchema, + AnnotateRequestSchema, + PlanRequestSchema, + AuditRequestSchema, + ServeRouteRequestSchema, + FeedbackRouteRequestSchema, + McpRouteRequestSchema, + ]), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Config.schema.ts b/packages/stryker-js/src/Config.schema.ts index 5b7a10c0b..02912f959 100644 --- a/packages/stryker-js/src/Config.schema.ts +++ b/packages/stryker-js/src/Config.schema.ts @@ -14,17 +14,19 @@ export const ImportedModuleSchema = S.Struct({ default: S.optional(S.Unknown), }) -export class ReadConfigCommand extends S.TaggedClass()('ReadConfigCommand', { - cliOptions: S.Record(S.String, S.Unknown), - basePath: S.String, -}) {} +export class ReadConfigCommand + extends S.TaggedClass()('ReadConfigCommand', { + cliOptions: S.Record(S.String, S.Unknown), + basePath: S.String, + }) +{} -export class MergeCommand extends S.TaggedClass()('MergeCommand', { +export class MergeCommand extends S.TaggedClass()('MergeCommand', { base: S.Record(S.String, S.Unknown), overrides: S.Record(S.String, S.Unknown), }) {} -export class MergeResult extends S.TaggedClass()('MergeResult', { +export class MergeResult extends S.TaggedClass()('MergeResult', { merged: S.Record(S.String, S.Unknown), }) {} diff --git a/packages/stryker-js/src/ConfigError.schema.ts b/packages/stryker-js/src/ConfigError.schema.ts index 7e4d1330a..1c67fb926 100644 --- a/packages/stryker-js/src/ConfigError.schema.ts +++ b/packages/stryker-js/src/ConfigError.schema.ts @@ -22,12 +22,14 @@ const causeMessagesOf = (value: A, depth: number): ReadonlyArray => const causeTextOf = (cause: A): Option.Option => Option.liftPredicate(causeMessagesOf(cause, CAUSE_DEPTH).join(': '), S.is(S.NonEmptyString)) -export class ConfigFileNotFoundError extends S.TaggedError()( - 'ConfigFileNotFoundError', - { - file: S.String, - }, -) { +export class ConfigFileNotFoundError + extends S.TaggedError()( + 'ConfigFileNotFoundError', + { + file: S.String, + }, + ) +{ readonly exitClass = 'ConfigError' as const override get message(): string { @@ -35,13 +37,15 @@ export class ConfigFileNotFoundError extends S.TaggedError()( - 'ConfigFileUnsupportedError', - { - file: S.String, - hint: S.String, - }, -) { +export class ConfigFileUnsupportedError + extends S.TaggedError()( + 'ConfigFileUnsupportedError', + { + file: S.String, + hint: S.String, + }, + ) +{ readonly exitClass = 'ConfigError' as const override get message(): string { @@ -49,13 +53,15 @@ export class ConfigFileUnsupportedError extends S.TaggedError()( - 'ConfigFileUnreadableError', - { - file: S.String, - cause: S.Unknown, - }, -) { +export class ConfigFileUnreadableError + extends S.TaggedError()( + 'ConfigFileUnreadableError', + { + file: S.String, + cause: S.Unknown, + }, + ) +{ readonly exitClass = 'ConfigError' as const override get message(): string { @@ -66,7 +72,7 @@ export class ConfigFileUnreadableError extends S.TaggedError()( +export class ConfigFileInvalidError extends S.TaggedError()( 'ConfigFileInvalidError', { file: S.String, @@ -80,23 +86,27 @@ export class ConfigFileInvalidError extends S.TaggedError()('ConfigFactoryFailed', { - message: S.String, - cause: S.Defect(), -}) { +export class ConfigFactoryFailed + extends S.TaggedError()('ConfigFactoryFailed', { + message: S.String, + cause: S.Defect(), + }) +{ readonly exitClass = 'ConfigError' as const } -export class ConfigModuleUnloadable extends S.TaggedError()('ConfigModuleUnloadable', { - message: S.String, - code: S.String, - file: S.String, - cause: S.Defect(), -}) { +export class ConfigModuleUnloadable + extends S.TaggedError()('ConfigModuleUnloadable', { + message: S.String, + code: S.String, + file: S.String, + cause: S.Defect(), + }) +{ readonly exitClass = 'ConfigError' as const } -export class ConfigError extends S.TaggedError()('ConfigError', { +export class ConfigError extends S.TaggedError()('ConfigError', { message: S.String, }) { readonly exitClass = 'ConfigError' as const diff --git a/packages/stryker-js/src/Feedback/Feedback.schema.ts b/packages/stryker-js/src/Feedback/Feedback.schema.ts index 2f38eb4ad..fa4a8ea37 100644 --- a/packages/stryker-js/src/Feedback/Feedback.schema.ts +++ b/packages/stryker-js/src/Feedback/Feedback.schema.ts @@ -1,8 +1,10 @@ import * as S from 'effect/Schema' -export class FeedbackUnusable extends S.TaggedError()('FeedbackUnusable', { - reason: S.String, -}) { +export class FeedbackUnusable + extends S.TaggedError()('FeedbackUnusable', { + reason: S.String, + }) +{ override get message(): string { return `Cannot record feedback: ${this.reason}` } diff --git a/packages/stryker-js/src/Feedback/record-feedback.workflow.ts b/packages/stryker-js/src/Feedback/record-feedback.workflow.ts index c247b29ab..d154b4157 100644 --- a/packages/stryker-js/src/Feedback/record-feedback.workflow.ts +++ b/packages/stryker-js/src/Feedback/record-feedback.workflow.ts @@ -9,29 +9,35 @@ import * as S from 'effect/Schema' const RecordFeedbackTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/RecordFeedbackDecision') type RecordFeedbackTypeId = typeof RecordFeedbackTypeId -export class FeedbackRecorded extends S.TaggedClass()('FeedbackRecorded', { - id: Mutant.MutantId, - judgment: RunEvent.FeedbackJudgment, - reason: S.NullOr(S.String), -}) { +export class FeedbackRecorded + extends S.TaggedClass()('FeedbackRecorded', { + id: Mutant.MutantId, + judgment: RunEvent.FeedbackJudgment, + reason: S.NullOr(S.String), + }) +{ readonly [RecordFeedbackTypeId] = RecordFeedbackTypeId } -export class FeedbackRefused extends S.TaggedClass()('FeedbackRefused', { - id: Mutant.MutantId, -}) { +export class FeedbackRefused + extends S.TaggedClass()('FeedbackRefused', { + id: Mutant.MutantId, + }) +{ readonly [RecordFeedbackTypeId] = RecordFeedbackTypeId } export const RecordFeedbackDecision = S.Union([FeedbackRecorded, FeedbackRefused]) export type RecordFeedbackDecision = typeof RecordFeedbackDecision.Type -export class RecordFeedbackCommand extends S.Class('RecordFeedbackCommand')({ - id: Mutant.MutantId, - judgment: RunEvent.FeedbackJudgment, - reason: S.NullOr(S.String), - knownIds: S.Array(Mutant.MutantId), -}) { +export class RecordFeedbackCommand + extends S.Class('RecordFeedbackCommand')({ + id: Mutant.MutantId, + judgment: RunEvent.FeedbackJudgment, + reason: S.NullOr(S.String), + knownIds: S.Array(Mutant.MutantId), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Mcp/mcp-server.cell.ts b/packages/stryker-js/src/Mcp/mcp-server.cell.ts index bf433c1d3..2b50a3f9c 100644 --- a/packages/stryker-js/src/Mcp/mcp-server.cell.ts +++ b/packages/stryker-js/src/Mcp/mcp-server.cell.ts @@ -206,16 +206,23 @@ const handlers = (basePath: string) => recordFeedbackCell({ basePath, id, judgment, reason: reason ?? null }), }) +const provideEngineToRequests = McpServer.middleware<{ provides: EnginePorts }>()( + Effect.map( + Effect.context(), + (context) => (effect) => Effect.provideContext(effect, context), + ), +) + export const mcpServerLayer = ({ basePath }: McpServerOptions) => - Layer.merge( - McpServer.layerStdio({ - name: 'stryker', - version: StrykerPackage.version, - instructions: MCP_SERVER_INSTRUCTIONS, - protocols: [McpProtocol.v2025_06_18], - }), - McpServer.toolkit(mcpToolkit), - ).pipe( - Layer.provide(handlers(basePath)), + McpServer.layerStdio({ + name: 'stryker', + version: StrykerPackage.version, + instructions: MCP_SERVER_INSTRUCTIONS, + protocols: [McpProtocol.v2025_06_18], + registrations: McpServer.toolkit(mcpToolkit).pipe( + Layer.provide(provideEngineToRequests.layer), + Layer.provide(handlers(basePath)), + ), + }).pipe( Layer.provide(MachineConsole.layer), ) diff --git a/packages/stryker-js/src/Mcp/mcp-tools.schema.ts b/packages/stryker-js/src/Mcp/mcp-tools.schema.ts index 33b372b48..48b97ab45 100644 --- a/packages/stryker-js/src/Mcp/mcp-tools.schema.ts +++ b/packages/stryker-js/src/Mcp/mcp-tools.schema.ts @@ -14,15 +14,17 @@ export const MutantDetail = S.Struct({ export type MutantDetail = typeof MutantDetail.Type -export class MutantUnusable extends S.TaggedError()('MutantUnusable', { - id: Mutant.MutantId, -}) { +export class MutantUnusable + extends S.TaggedError()('MutantUnusable', { + id: Mutant.MutantId, + }) +{ override get message(): string { return `No mutant ${this.id} in the finished mutation report; run \`stryker run\` first, or read a known id from list_survivors.` } } -export class RerunUnusable extends S.TaggedError()('RerunUnusable', { +export class RerunUnusable extends S.TaggedError()('RerunUnusable', { id: Mutant.MutantId, reason: S.String, }) { diff --git a/packages/stryker-js/src/MutantTestPlanCommand.schema.ts b/packages/stryker-js/src/MutantTestPlanCommand.schema.ts index 77272fee6..c13ab1c0c 100644 --- a/packages/stryker-js/src/MutantTestPlanCommand.schema.ts +++ b/packages/stryker-js/src/MutantTestPlanCommand.schema.ts @@ -3,25 +3,27 @@ import { Mutant } from '@systemfsoftware/stryker-js-plugin-interface' import { Options, Report, TestRunner } from '@systemfsoftware/stryker-js-plugin-interface' import * as S from 'effect/Schema' -export class MutantTestPlanCommand extends S.TaggedClass()('MutantTestPlanCommand', { - mutants: S.Array(Mutant.Mutant), - timeOverheadMS: Report.NonNegativeFinite, - timeSpentAllTests: Report.NonNegativeFinite, - globalTestFilter: S.String.pipe(S.Array, S.optional), - hitsByMutantId: S.Record(Mutant.MutantId, Report.NonNegativeInt), - staticCoverage: S.optional(S.Record(Mutant.MutantId, Report.NonNegativeInt)), - testsByMutantId: S.Record(Mutant.MutantId, S.Array(TestRunner.TestId)), - priorKilledByByMutantId: S.optional(S.Record(Mutant.MutantId, S.Array(TestRunner.TestId))), - testTimeById: S.Record(TestRunner.TestId, Report.NonNegativeFinite), - options: S.Struct({ - coverageAnalysis: Options.CoverageAnalysisMode, - disableBail: S.Boolean, - timeoutMS: Report.NonNegativeFinite, - timeoutFactor: Report.NonNegativeFinite, - ignoreStatic: S.Boolean, - }), - sandboxFileByName: S.Record(S.String, S.String), -}) { +export class MutantTestPlanCommand + extends S.TaggedClass()('MutantTestPlanCommand', { + mutants: S.Array(Mutant.Mutant), + timeOverheadMS: Report.NonNegativeFinite, + timeSpentAllTests: Report.NonNegativeFinite, + globalTestFilter: S.String.pipe(S.Array, S.optional), + hitsByMutantId: S.Record(Mutant.MutantId, Report.NonNegativeInt), + staticCoverage: S.optional(S.Record(Mutant.MutantId, Report.NonNegativeInt)), + testsByMutantId: S.Record(Mutant.MutantId, S.Array(TestRunner.TestId)), + priorKilledByByMutantId: S.optional(S.Record(Mutant.MutantId, S.Array(TestRunner.TestId))), + testTimeById: S.Record(TestRunner.TestId, Report.NonNegativeFinite), + options: S.Struct({ + coverageAnalysis: Options.CoverageAnalysisMode, + disableBail: S.Boolean, + timeoutMS: Report.NonNegativeFinite, + timeoutFactor: Report.NonNegativeFinite, + ignoreStatic: S.Boolean, + }), + sandboxFileByName: S.Record(S.String, S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = { timeOverheadMS: 'stryker.mutant_test_plan.time_overhead_ms', timeSpentAllTests: 'stryker.mutant_test_plan.time_spent_all_tests_ms', diff --git a/packages/stryker-js/src/MutantsError.schema.ts b/packages/stryker-js/src/MutantsError.schema.ts index cf79919a9..807fb5cf2 100644 --- a/packages/stryker-js/src/MutantsError.schema.ts +++ b/packages/stryker-js/src/MutantsError.schema.ts @@ -1,7 +1,9 @@ import { Mutant } from '@systemfsoftware/stryker-js-plugin-interface' import { Schema as S } from 'effect' -export class UnknownPlannedMutant extends S.TaggedError()('UnknownPlannedMutant', { - mutantId: Mutant.MutantId, - message: S.String, -}) {} +export class UnknownPlannedMutant + extends S.TaggedError()('UnknownPlannedMutant', { + mutantId: Mutant.MutantId, + message: S.String, + }) +{} diff --git a/packages/stryker-js/src/MutationTest.schema.ts b/packages/stryker-js/src/MutationTest.schema.ts index a98d6b5ce..5fdaa76b3 100644 --- a/packages/stryker-js/src/MutationTest.schema.ts +++ b/packages/stryker-js/src/MutationTest.schema.ts @@ -1,12 +1,14 @@ import { Workflow } from '@systemfsoftware/effect-cell-types' import * as S from 'effect/Schema' -export class MutationTestCommand extends S.TaggedClass()('MutationTestCommand', { - dryRunOnly: S.Boolean, - allowEmpty: S.Boolean, - testCount: S.Finite, - isZero: S.Boolean, -}) { +export class MutationTestCommand + extends S.TaggedClass()('MutationTestCommand', { + dryRunOnly: S.Boolean, + allowEmpty: S.Boolean, + testCount: S.Finite, + isZero: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = { dryRunOnly: 'stryker.mutation_test.dry_run_only', allowEmpty: 'stryker.mutation_test.allow_empty', diff --git a/packages/stryker-js/src/PluginsError.schema.ts b/packages/stryker-js/src/PluginsError.schema.ts index aed28d19a..9e09622d9 100644 --- a/packages/stryker-js/src/PluginsError.schema.ts +++ b/packages/stryker-js/src/PluginsError.schema.ts @@ -3,9 +3,11 @@ import { Schema as S } from 'effect' import { RunEvent } from '@systemfsoftware/stryker-js-cli-contract' import { Plugin } from '@systemfsoftware/stryker-js-plugin-interface' -export class PluginNotFoundError extends S.TaggedError()('PluginNotFoundError', { - descriptor: S.String, -}) { +export class PluginNotFoundError + extends S.TaggedError()('PluginNotFoundError', { + descriptor: S.String, + }) +{ readonly exitClass = 'ConfigError' as const override get message(): string { @@ -24,7 +26,7 @@ const FAILURE_EXIT_CLASS: Record()( +export class PluginLoadRefusedError extends S.TaggedError()( 'PluginLoadRefusedError', { descriptor: S.String, diff --git a/packages/stryker-js/src/Reporter/plan-reporters.workflow.ts b/packages/stryker-js/src/Reporter/plan-reporters.workflow.ts index 0ef300a87..0bbd1c95b 100644 --- a/packages/stryker-js/src/Reporter/plan-reporters.workflow.ts +++ b/packages/stryker-js/src/Reporter/plan-reporters.workflow.ts @@ -29,25 +29,31 @@ const machineReportersFrom = (configured: readonly string[], stdout: readonly st }) } -export class ReporterPlanCommand extends S.TaggedClass()('ReporterPlanCommand', { - configured: S.Array(S.String), - stdout: S.Array(S.String), - mode: OutputMode.OutputMode, -}) { +export class ReporterPlanCommand + extends S.TaggedClass()('ReporterPlanCommand', { + configured: S.Array(S.String), + stdout: S.Array(S.String), + mode: OutputMode.OutputMode, + }) +{ static readonly [Workflow.InstrumentationBrand] = { mode: 'stryker.reporter_plan.mode', } as const } -export class HumanReporters extends S.TaggedClass()('HumanReporters', { - reporters: S.Array(S.String), -}) { +export class HumanReporters + extends S.TaggedClass()('HumanReporters', { + reporters: S.Array(S.String), + }) +{ readonly [ReporterPlanTypeId] = ReporterPlanTypeId } -export class MachineReporters extends S.TaggedClass()('MachineReporters', { - reporters: S.Array(S.String), -}) { +export class MachineReporters + extends S.TaggedClass()('MachineReporters', { + reporters: S.Array(S.String), + }) +{ readonly [ReporterPlanTypeId] = ReporterPlanTypeId } diff --git a/packages/stryker-js/src/Reporter/render-clear-text-report.workflow.ts b/packages/stryker-js/src/Reporter/render-clear-text-report.workflow.ts index e6e6bca1d..70881f36c 100644 --- a/packages/stryker-js/src/Reporter/render-clear-text-report.workflow.ts +++ b/packages/stryker-js/src/Reporter/render-clear-text-report.workflow.ts @@ -52,26 +52,30 @@ export const ClearTextRenderOptions = S.Struct({ }) export type ClearTextRenderOptions = typeof ClearTextRenderOptions.Type -export class ClearTextReportCommand extends S.TaggedClass()('ClearTextReportCommand', { - reported: S.optional(Report.MutationTestResult), - computed: S.optional(Report.MetricsResultSchema), - static: S.optional(Report.StaticClassSummarySchema), - render: ClearTextRenderOptions, - rendered: S.Boolean, -}) { +export class ClearTextReportCommand + extends S.TaggedClass()('ClearTextReportCommand', { + reported: S.optional(Report.MutationTestResult), + computed: S.optional(Report.MetricsResultSchema), + static: S.optional(Report.StaticClassSummarySchema), + render: ClearTextRenderOptions, + rendered: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = { rendered: 'stryker.report.render' } as const } -export class ClearTextReportRendered extends S.TaggedClass()('ClearTextReportRendered', { - stdout: S.Array(ReportChunkSchema), - diagnostics: S.Array(ReportChunkSchema), - stderr: S.Array(ReportChunkSchema), -}) { +export class ClearTextReportRendered + extends S.TaggedClass()('ClearTextReportRendered', { + stdout: S.Array(ReportChunkSchema), + diagnostics: S.Array(ReportChunkSchema), + stderr: S.Array(ReportChunkSchema), + }) +{ readonly [ClearTextReportTypeId] = ClearTextReportTypeId } export class ClearTextReportSuppressed - extends S.TaggedClass()('ClearTextReportSuppressed', {}) + extends S.TaggedClass()('ClearTextReportSuppressed', {}) { readonly [ClearTextReportTypeId] = ClearTextReportTypeId } diff --git a/packages/stryker-js/src/Reporter/render-json-report.workflow.ts b/packages/stryker-js/src/Reporter/render-json-report.workflow.ts index 0d7588804..f1d53302a 100644 --- a/packages/stryker-js/src/Reporter/render-json-report.workflow.ts +++ b/packages/stryker-js/src/Reporter/render-json-report.workflow.ts @@ -10,23 +10,29 @@ export const JsonReporterName = S.Literal('json') const JsonReportTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/JsonReport') type JsonReportTypeId = typeof JsonReportTypeId -export class JsonReportCommand extends S.TaggedClass()('JsonReportCommand', { - reported: S.optional(Report.MutationTestResult), - rendered: S.Boolean, - debug: S.Boolean, - fileName: S.String, -}) { +export class JsonReportCommand + extends S.TaggedClass()('JsonReportCommand', { + reported: S.optional(Report.MutationTestResult), + rendered: S.Boolean, + debug: S.Boolean, + fileName: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { rendered: 'stryker.report.render' } as const } -export class JsonReportRendered extends S.TaggedClass()('JsonReportRendered', { - report: Report.MutationTestResult, - announceFileName: S.Option(S.String), -}) { +export class JsonReportRendered + extends S.TaggedClass()('JsonReportRendered', { + report: Report.MutationTestResult, + announceFileName: S.Option(S.String), + }) +{ readonly [JsonReportTypeId] = JsonReportTypeId } -export class JsonReportSuppressed extends S.TaggedClass()('JsonReportSuppressed', {}) { +export class JsonReportSuppressed + extends S.TaggedClass()('JsonReportSuppressed', {}) +{ readonly [JsonReportTypeId] = JsonReportTypeId } diff --git a/packages/stryker-js/src/Reporter/render-progress-report.workflow.ts b/packages/stryker-js/src/Reporter/render-progress-report.workflow.ts index abafa5091..dac9d2726 100644 --- a/packages/stryker-js/src/Reporter/render-progress-report.workflow.ts +++ b/packages/stryker-js/src/Reporter/render-progress-report.workflow.ts @@ -47,31 +47,39 @@ export const ProgressStateSchema = S.Struct({ }) export type ProgressState = typeof ProgressStateSchema.Type -export class ProgressReportCommand extends S.TaggedClass()('ProgressReportCommand', { - state: ProgressStateSchema, - event: S.UndefinedOr(Reporter.ReporterEventUnion), - now: S.Finite, -}) { +export class ProgressReportCommand + extends S.TaggedClass()('ProgressReportCommand', { + state: ProgressStateSchema, + event: S.UndefinedOr(Reporter.ReporterEventUnion), + now: S.Finite, + }) +{ static readonly [Workflow.InstrumentationBrand] = { now: 'stryker.report.rendered' } as const } -export class ProgressBarTick extends S.TaggedClass()('ProgressBarTick', { - chunk: S.String, - state: ProgressStateSchema, -}) { +export class ProgressBarTick + extends S.TaggedClass()('ProgressBarTick', { + chunk: S.String, + state: ProgressStateSchema, + }) +{ readonly [ProgressReportTypeId] = ProgressReportTypeId } -export class ProgressLineBreak extends S.TaggedClass()('ProgressLineBreak', { - chunk: S.String, - state: ProgressStateSchema, -}) { +export class ProgressLineBreak + extends S.TaggedClass()('ProgressLineBreak', { + chunk: S.String, + state: ProgressStateSchema, + }) +{ readonly [ProgressReportTypeId] = ProgressReportTypeId } -export class ProgressChunkSuppressed extends S.TaggedClass()('ProgressChunkSuppressed', { - state: ProgressStateSchema, -}) { +export class ProgressChunkSuppressed + extends S.TaggedClass()('ProgressChunkSuppressed', { + state: ProgressStateSchema, + }) +{ readonly [ProgressReportTypeId] = ProgressReportTypeId } diff --git a/packages/stryker-js/src/Reporter/sarif-report.workflow.ts b/packages/stryker-js/src/Reporter/sarif-report.workflow.ts index 6de592098..9d4a19ac8 100644 --- a/packages/stryker-js/src/Reporter/sarif-report.workflow.ts +++ b/packages/stryker-js/src/Reporter/sarif-report.workflow.ts @@ -89,20 +89,26 @@ type SarifResult = typeof SarifResultSchema.Type const SarifReportTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/SarifReportDecision') type SarifReportTypeId = typeof SarifReportTypeId -export class SarifReportRendered extends S.TaggedClass()('SarifReportRendered', { - log: SarifLogSchema, -}) { +export class SarifReportRendered + extends S.TaggedClass()('SarifReportRendered', { + log: SarifLogSchema, + }) +{ readonly [SarifReportTypeId] = SarifReportTypeId } -export class SarifReportTruncated extends S.TaggedClass()('SarifReportTruncated', { - log: SarifLogSchema, - omitted: S.Natural, -}) { +export class SarifReportTruncated + extends S.TaggedClass()('SarifReportTruncated', { + log: SarifLogSchema, + omitted: S.Natural, + }) +{ readonly [SarifReportTypeId] = SarifReportTypeId } -export class SarifReportSuppressed extends S.TaggedClass()('SarifReportSuppressed', {}) { +export class SarifReportSuppressed + extends S.TaggedClass()('SarifReportSuppressed', {}) +{ readonly [SarifReportTypeId] = SarifReportTypeId } @@ -118,11 +124,13 @@ export type SarifReported = typeof SarifReported.Type export const SarifNotReported = S.TaggedStruct('SarifNotReported', {}) export type SarifNotReported = typeof SarifNotReported.Type -export class SarifReportCommand extends S.TaggedClass()('SarifReportCommand', { - reported: S.Union([SarifReported, SarifNotReported]), - tool: SarifToolSchema, - maxResults: S.Natural, -}) { +export class SarifReportCommand + extends S.TaggedClass()('SarifReportCommand', { + reported: S.Union([SarifReported, SarifNotReported]), + tool: SarifToolSchema, + maxResults: S.Natural, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Rerun/admit-mutant-rerun.workflow.ts b/packages/stryker-js/src/Rerun/admit-mutant-rerun.workflow.ts index 1fcefd92e..3456c9857 100644 --- a/packages/stryker-js/src/Rerun/admit-mutant-rerun.workflow.ts +++ b/packages/stryker-js/src/Rerun/admit-mutant-rerun.workflow.ts @@ -13,22 +13,24 @@ export const PriorMutantShape = S.Struct({ relativeFileName: S.String, }) -export class AdmitMutantRerunCommand extends S.Class('AdmitMutantRerunCommand')({ - ids: S.Array(Mutant.MutantId), - priorMutants: S.Array(PriorMutantShape), - priorReportPath: S.String, -}) { +export class AdmitMutantRerunCommand + extends S.Class('AdmitMutantRerunCommand')({ + ids: S.Array(Mutant.MutantId), + priorMutants: S.Array(PriorMutantShape), + priorReportPath: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class RerunAdmitted extends S.TaggedClass()('RerunAdmitted', { +export class RerunAdmitted extends S.TaggedClass()('RerunAdmitted', { ids: S.Array(Mutant.MutantId), mutateSpans: S.Array(S.String), }) { readonly [MutantRerunTypeId] = MutantRerunTypeId } -export class RerunRefused extends S.TaggedClass()('RerunRefused', { +export class RerunRefused extends S.TaggedClass()('RerunRefused', { exitClass: S.Literal('ConfigError'), unknownIds: S.Array(Mutant.MutantId), reason: S.String, diff --git a/packages/stryker-js/src/Run.schema.ts b/packages/stryker-js/src/Run.schema.ts index 11bf395e0..dc8d5b2a9 100644 --- a/packages/stryker-js/src/Run.schema.ts +++ b/packages/stryker-js/src/Run.schema.ts @@ -4,7 +4,7 @@ import * as S from 'effect/Schema' const TypeId = '~stryker/mutation-run/StageError' as const -export class StageError extends S.TaggedError(TypeId)('StageError', { +export class StageError extends S.TaggedError(TypeId)('StageError', { stage: S.Literals(['prepare', 'instrument', 'dryRun', 'dryRunNoTests', 'mutationTest']), reason: S.String, cause: S.optional(S.Defect()), @@ -36,7 +36,7 @@ const STAGE_PRESENTATION: Record< mutationTest: { label: 'Mutation testing', exitClass: 'RuntimeError' }, } -export class PrepareError extends S.TaggedError()('PrepareError', { +export class PrepareError extends S.TaggedError()('PrepareError', { stage: S.Literal('prepare'), reason: S.String, }) { diff --git a/packages/stryker-js/src/RunOutcomeCommand.schema.ts b/packages/stryker-js/src/RunOutcomeCommand.schema.ts index c31e11ab7..b109871d1 100644 --- a/packages/stryker-js/src/RunOutcomeCommand.schema.ts +++ b/packages/stryker-js/src/RunOutcomeCommand.schema.ts @@ -68,8 +68,10 @@ export type RunClassedObservation = typeof RunClassedObservation.Type export type RunGenericFailureObservation = typeof RunGenericFailureObservation.Type export type RunRefusedObservation = typeof RunRefusedObservation.Type -export class RunOutcomeCommand extends S.TaggedClass()('RunOutcomeCommand', { - observation: RunOutcomeObservation, -}) { +export class RunOutcomeCommand + extends S.TaggedClass()('RunOutcomeCommand', { + observation: RunOutcomeObservation, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Serve/msp-protocol.workflow.ts b/packages/stryker-js/src/Serve/msp-protocol.workflow.ts index 73db1c85e..2efe41df6 100644 --- a/packages/stryker-js/src/Serve/msp-protocol.workflow.ts +++ b/packages/stryker-js/src/Serve/msp-protocol.workflow.ts @@ -19,52 +19,66 @@ import { const MspDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MspDecision') type MspDecisionTypeId = typeof MspDecisionTypeId -export class MspConfigureRequested extends S.TaggedClass()('MspConfigureRequested', { - id: JsonRpcId, - configFilePath: S.optionalKey(S.String), -}) { +export class MspConfigureRequested + extends S.TaggedClass()('MspConfigureRequested', { + id: JsonRpcId, + configFilePath: S.optionalKey(S.String), + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspDiscoverRequested extends S.TaggedClass()('MspDiscoverRequested', { - id: JsonRpcId, - params: DiscoverParams, -}) { +export class MspDiscoverRequested + extends S.TaggedClass()('MspDiscoverRequested', { + id: JsonRpcId, + params: DiscoverParams, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspMutationTestRequested extends S.TaggedClass()('MspMutationTestRequested', { - id: JsonRpcId, - params: MutationTestParams, -}) { +export class MspMutationTestRequested + extends S.TaggedClass()('MspMutationTestRequested', { + id: JsonRpcId, + params: MutationTestParams, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspMethodNotFound extends S.TaggedClass()('MspMethodNotFound', { - id: JsonRpcId, - method: S.String, -}) { +export class MspMethodNotFound + extends S.TaggedClass()('MspMethodNotFound', { + id: JsonRpcId, + method: S.String, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspInvalidParams extends S.TaggedClass()('MspInvalidParams', { - id: JsonRpcId, - method: S.String, - issue: S.String, -}) { +export class MspInvalidParams + extends S.TaggedClass()('MspInvalidParams', { + id: JsonRpcId, + method: S.String, + issue: S.String, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspRequestBusy extends S.TaggedClass()('MspRequestBusy', { - id: JsonRpcId, - method: S.String, -}) { +export class MspRequestBusy + extends S.TaggedClass()('MspRequestBusy', { + id: JsonRpcId, + method: S.String, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } -export class MspNotificationIgnored extends S.TaggedClass()('MspNotificationIgnored', { - method: S.String, -}) { +export class MspNotificationIgnored + extends S.TaggedClass()('MspNotificationIgnored', { + method: S.String, + }) +{ readonly [MspDecisionTypeId] = MspDecisionTypeId } @@ -77,12 +91,14 @@ export type MspDecision = | MspRequestBusy | MspNotificationIgnored -export class MspRequestCommand extends S.TaggedClass()('MspRequestCommand', { - id: S.optionalKey(JsonRpcId), - method: S.String, - params: S.optionalKey(S.Json), - busy: S.Boolean, -}) { +export class MspRequestCommand + extends S.TaggedClass()('MspRequestCommand', { + id: S.optionalKey(JsonRpcId), + method: S.String, + params: S.optionalKey(S.Json), + busy: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/Serve/msp.schema.ts b/packages/stryker-js/src/Serve/msp.schema.ts index 165cad093..74d8872cd 100644 --- a/packages/stryker-js/src/Serve/msp.schema.ts +++ b/packages/stryker-js/src/Serve/msp.schema.ts @@ -26,7 +26,7 @@ import * as Option from 'effect/Option' import * as Result from 'effect/Result' import * as S from 'effect/Schema' -export class ServeError extends S.TaggedError()('ServeError', { +export class ServeError extends S.TaggedError()('ServeError', { reason: S.String, cause: S.optionalKey(S.Unknown), }) { diff --git a/packages/stryker-js/src/Worker.schema.ts b/packages/stryker-js/src/Worker.schema.ts index a7bbdf2a4..8625c20bb 100644 --- a/packages/stryker-js/src/Worker.schema.ts +++ b/packages/stryker-js/src/Worker.schema.ts @@ -9,11 +9,13 @@ import { Match, Schema as S } from 'effect' * Method threw — the worker stayed up. Distinct from a crash: the pool * retires a crashed worker but not one whose method rejected. */ -export class WorkerMethodError extends S.TaggedError()('WorkerMethodError', { - message: S.String, - name: S.optional(S.String), - stack: S.optional(S.String), -}) {} +export class WorkerMethodError + extends S.TaggedError()('WorkerMethodError', { + message: S.String, + errorName: S.optional(S.String), + stack: S.optional(S.String), + }) +{} // --------------------------------------------------------------------------- // Process exit — crash discriminants @@ -41,14 +43,16 @@ export type ChildExit = typeof ChildExit.Type const WorkerExitTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/WorkerExit') type WorkerExitTypeId = typeof WorkerExitTypeId -export class ChildProcessCrashedError extends S.TaggedError()( - 'ChildProcessCrashedError', - { - pid: ProcessId, - exit: ChildExit, - cause: S.optional(S.String), - }, -) { +export class ChildProcessCrashedError + extends S.TaggedError()( + 'ChildProcessCrashedError', + { + pid: ProcessId, + exit: ChildExit, + cause: S.optional(S.String), + }, + ) +{ readonly [WorkerExitTypeId] = WorkerExitTypeId readonly exitClass = 'InternalError' as const @@ -61,10 +65,12 @@ export class ChildProcessCrashedError extends S.TaggedError()('OutOfMemoryError', { - pid: ProcessId, - exitCode: ChildExitCode, -}) { +export class OutOfMemoryError + extends S.TaggedError()('OutOfMemoryError', { + pid: ProcessId, + exitCode: ChildExitCode, + }) +{ readonly [WorkerExitTypeId] = WorkerExitTypeId readonly exitClass = 'RuntimeError' as const @@ -77,7 +83,7 @@ export type WorkerExit = ChildProcessCrashedError | OutOfMemoryError export type WorkerBootError = WorkerExit | WorkerBootTimeoutError -export class WorkerBootTimeoutError extends S.TaggedError()( +export class WorkerBootTimeoutError extends S.TaggedError()( 'WorkerBootTimeoutError', { pid: ProcessId, diff --git a/packages/stryker-js/src/__tests__/admit-case-sensitivity.workflow.property.test.ts b/packages/stryker-js/src/__tests__/admit-case-sensitivity.workflow.property.test.ts index 30e122691..7993e76ee 100644 --- a/packages/stryker-js/src/__tests__/admit-case-sensitivity.workflow.property.test.ts +++ b/packages/stryker-js/src/__tests__/admit-case-sensitivity.workflow.property.test.ts @@ -12,7 +12,7 @@ type Probe = CaseSensitivityCommand['probes'][number] const tagOf = (subject: typeof admitCaseSensitivity, probes: ReadonlyArray) => Result.getOrUndefined(subject(CaseSensitivityCommand.make({ probes })))?._tag -const another = (value: number) => value === 1 ? 2 : 1 +const another = (value: bigint) => value === 1n ? 2n : 1n const reachingItself = (probe: Probe): Probe => ({ own: probe.own, @@ -69,7 +69,7 @@ describe('admitCaseSensitivity', () => { { of: [commandArb], subject: admitCaseSensitivity }, (subject, [command]) => foldedPlus(subject, command, (first) => { - const ino = Option.getOrElse(first.own.ino, () => 0) + const ino = Option.getOrElse(first.own.ino, () => 0n) return { own: { dev: first.own.dev, ino: Option.some(ino) }, swapped: { _tag: 'SwappedFound', identity: { dev: first.own.dev, ino: Option.some(another(ino)) } }, diff --git a/packages/stryker-js/src/__tests__/judge-mutation-score.workflow.property.test.ts b/packages/stryker-js/src/__tests__/judge-mutation-score.workflow.property.test.ts index 3efa4ec13..e798ae748 100644 --- a/packages/stryker-js/src/__tests__/judge-mutation-score.workflow.property.test.ts +++ b/packages/stryker-js/src/__tests__/judge-mutation-score.workflow.property.test.ts @@ -11,7 +11,7 @@ type BreakThreshold = JudgeMutationScoreCommand['breakingThreshold'] const thresholdExceeds = (percentage: number, threshold: number): boolean => Math.sign(threshold - percentage) === 1 const expectedJudgement = (score: Report.MutationScore, breakingThreshold: BreakThreshold): object => - Report.MutationScore.match(score, { + Report.MutationScore.match(score, { Scored: ({ percentage }) => Match.valueTags(breakingThreshold, { NoBreakThreshold: () => ({ _tag: 'ScoredWithoutThreshold', percentage, exitClass: null }), diff --git a/packages/stryker-js/src/__tests__/plan-mutator-catalogs.workflow.property.test.ts b/packages/stryker-js/src/__tests__/plan-mutator-catalogs.workflow.property.test.ts index 8028b9870..c3e243754 100644 --- a/packages/stryker-js/src/__tests__/plan-mutator-catalogs.workflow.property.test.ts +++ b/packages/stryker-js/src/__tests__/plan-mutator-catalogs.workflow.property.test.ts @@ -97,7 +97,7 @@ describe('planMutatorCatalogs', () => { const result = subject(PlanMutatorCatalogsCommand.make({ stock, providers: [provider] })) return Result.isFailure(result) && S.is(MutatorCatalogRefused)(result.failure) && result.failure.reason === 'UnownedName' && - result.failure.name === `${foreign}/Probe` && + result.failure.mutatorName === `${foreign}/Probe` && JSON.stringify(result.failure.modules) === JSON.stringify(['module-a']) }, ) @@ -110,7 +110,7 @@ describe('planMutatorCatalogs', () => { const result = subject(PlanMutatorCatalogsCommand.make({ stock, providers: [provider] })) return Result.isFailure(result) && S.is(MutatorCatalogRefused)(result.failure) && result.failure.reason === 'StockName' && - result.failure.name === stockName + result.failure.mutatorName === stockName }, ) }) diff --git a/packages/stryker-js/src/admit-case-probe.workflow.ts b/packages/stryker-js/src/admit-case-probe.workflow.ts index cf2125ec6..55c2e7996 100644 --- a/packages/stryker-js/src/admit-case-probe.workflow.ts +++ b/packages/stryker-js/src/admit-case-probe.workflow.ts @@ -18,19 +18,25 @@ const swapCase = (name: string) => const swapsCaseCleanly = (name: string) => Boolean.every([swapCase(name) !== name, swapCase(swapCase(name)) === name]) -export class CaseProbeCommand extends S.TaggedClass()('CaseProbeCommand', { - names: S.Array(S.String), -}) { +export class CaseProbeCommand + extends S.TaggedClass()('CaseProbeCommand', { + names: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class CaseProbePairs extends S.TaggedClass()('CaseProbePairs', { - pairs: S.NonEmptyArray(S.Struct({ name: S.String, swapped: S.String })), -}) { +export class CaseProbePairs + extends S.TaggedClass()('CaseProbePairs', { + pairs: S.NonEmptyArray(S.Struct({ name: S.String, swapped: S.String })), + }) +{ readonly [CaseProbeTypeId] = CaseProbeTypeId } -export class NoCaseToProbe extends S.TaggedClass()('NoCaseToProbe', {}) { +export class NoCaseToProbe + extends S.TaggedClass()('NoCaseToProbe', {}) +{ readonly [CaseProbeTypeId] = CaseProbeTypeId } diff --git a/packages/stryker-js/src/admit-case-sensitivity.workflow.ts b/packages/stryker-js/src/admit-case-sensitivity.workflow.ts index 3b089575f..4c2775908 100644 --- a/packages/stryker-js/src/admit-case-sensitivity.workflow.ts +++ b/packages/stryker-js/src/admit-case-sensitivity.workflow.ts @@ -8,7 +8,7 @@ import * as S from 'effect/Schema' const CaseSensitivityTypeId = Symbol.for('@systemfsoftware/stryker-js/CaseSensitivityDecision') type CaseSensitivityTypeId = typeof CaseSensitivityTypeId -const FileIdentity = S.Struct({ dev: S.Finite, ino: S.Option(S.Finite) }) +const FileIdentity = S.Struct({ dev: S.BigInt, ino: S.Option(S.BigInt) }) type FileIdentity = typeof FileIdentity.Type const SwappedMissing = S.TaggedStruct('SwappedMissing', {}) @@ -20,17 +20,21 @@ const SwappedName = S.Union([SwappedMissing, SwappedFound]) const CaseProbeResult = S.Struct({ own: FileIdentity, swapped: SwappedName }) type CaseProbeResult = typeof CaseProbeResult.Type -export class CaseSensitivityCommand extends S.TaggedClass()('CaseSensitivityCommand', { - probes: S.Array(CaseProbeResult), -}) { +export class CaseSensitivityCommand + extends S.TaggedClass()('CaseSensitivityCommand', { + probes: S.Array(CaseProbeResult), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class CaseToldApart extends S.TaggedClass()('CaseToldApart', {}) { +export class CaseToldApart + extends S.TaggedClass()('CaseToldApart', {}) +{ readonly [CaseSensitivityTypeId] = CaseSensitivityTypeId } -export class CaseFolded extends S.TaggedClass()('CaseFolded', {}) { +export class CaseFolded extends S.TaggedClass()('CaseFolded', {}) { readonly [CaseSensitivityTypeId] = CaseSensitivityTypeId } diff --git a/packages/stryker-js/src/admit-checker-answer.workflow.ts b/packages/stryker-js/src/admit-checker-answer.workflow.ts index 5cb7ff037..ba521e139 100644 --- a/packages/stryker-js/src/admit-checker-answer.workflow.ts +++ b/packages/stryker-js/src/admit-checker-answer.workflow.ts @@ -7,15 +7,17 @@ import * as Option from 'effect/Option' import * as Result from 'effect/Result' import * as S from 'effect/Schema' -export class CheckerAnsweredUnrequested extends S.TaggedError()( - 'CheckerAnsweredUnrequested', - { - checkerName: S.String, - phase: S.Literals(['check', 'group']), - unrequestedIds: S.Array(S.String), - requestedIds: S.Array(S.String), - }, -) { +export class CheckerAnsweredUnrequested + extends S.TaggedError()( + 'CheckerAnsweredUnrequested', + { + checkerName: S.String, + phase: S.Literals(['check', 'group']), + unrequestedIds: S.Array(S.String), + requestedIds: S.Array(S.String), + }, + ) +{ override get message(): string { return `Checker "${this.checkerName}" answered about mutants it was not asked about (${this.phase} phase): ${ this.unrequestedIds.join(', ') @@ -23,14 +25,16 @@ export class CheckerAnsweredUnrequested extends S.TaggedError()( - 'CheckerSkippedRequested', - { - checkerName: S.String, - phase: S.Literals(['check', 'group']), - missingIds: S.Array(S.String), - }, -) { +export class CheckerSkippedRequested + extends S.TaggedError()( + 'CheckerSkippedRequested', + { + checkerName: S.String, + phase: S.Literals(['check', 'group']), + missingIds: S.Array(S.String), + }, + ) +{ override get message(): string { return `Checker "${this.checkerName}" skipped requested mutants (${this.phase} phase): ${ this.missingIds.join(', ') @@ -38,14 +42,16 @@ export class CheckerSkippedRequested extends S.TaggedError()( - 'CheckerIgnoredWithoutRule', - { - checkerName: S.String, - mutantId: S.String, - answered: S.String, - }, -) { +export class CheckerIgnoredWithoutRule + extends S.TaggedError()( + 'CheckerIgnoredWithoutRule', + { + checkerName: S.String, + mutantId: S.String, + answered: S.String, + }, + ) +{ override get message(): string { return `Checker "${this.checkerName}" ignored mutant ${this.mutantId} without a reason naming a rule from the ignore-rule vocabulary (\`: \`): it answered ${this.answered}. Fix the checker to answer \`{ status: 'ignored', reason: 'checker: ' }\`, or answer \`passed\` to keep the mutant.` } @@ -53,13 +59,15 @@ export class CheckerIgnoredWithoutRule extends S.TaggedError()('CheckerCommand', { - checkerName: S.String, - requestedIds: S.Array(Mutant.MutantId), - phase: S.Literals(['check', 'group']), - idGroups: S.String.pipe(S.Array, S.Array, S.optional), - answers: S.optional(S.Record(S.String, Checker.CheckAnswerSchema)), -}) { +export class CheckerCommand + extends S.TaggedClass()('CheckerCommand', { + checkerName: S.String, + requestedIds: S.Array(Mutant.MutantId), + phase: S.Literals(['check', 'group']), + idGroups: S.String.pipe(S.Array, S.Array, S.optional), + answers: S.optional(S.Record(S.String, Checker.CheckAnswerSchema)), + }) +{ static readonly [Workflow.InstrumentationBrand] = { checkerName: 'stryker.checker.name', } as const @@ -68,17 +76,21 @@ export class CheckerCommand extends S.TaggedClass()('CheckerComm const CheckerDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/CheckerDecision') type CheckerDecisionTypeId = typeof CheckerDecisionTypeId -export class CheckGroupDecision extends S.TaggedClass()('CheckGroupDecision', { - groups: S.String.pipe(S.Array, S.Array), -}) { +export class CheckGroupDecision + extends S.TaggedClass()('CheckGroupDecision', { + groups: S.String.pipe(S.Array, S.Array), + }) +{ readonly [CheckerDecisionTypeId] = CheckerDecisionTypeId } const AdmittedCheckPair = S.Struct({ id: S.String, result: Checker.CheckResultSchema }) -export class CheckResultDecision extends S.TaggedClass()('CheckResultDecision', { - pairs: S.Array(AdmittedCheckPair), -}) { +export class CheckResultDecision + extends S.TaggedClass()('CheckResultDecision', { + pairs: S.Array(AdmittedCheckPair), + }) +{ readonly [CheckerDecisionTypeId] = CheckerDecisionTypeId } diff --git a/packages/stryker-js/src/admit-discovered-entry.workflow.ts b/packages/stryker-js/src/admit-discovered-entry.workflow.ts index b2bffce91..593076bcd 100644 --- a/packages/stryker-js/src/admit-discovered-entry.workflow.ts +++ b/packages/stryker-js/src/admit-discovered-entry.workflow.ts @@ -81,27 +81,29 @@ const isIncluded = ( true, ) -export class DiscoveredEntryCommand extends S.TaggedClass()('DiscoveredEntryCommand', { - ignorePatterns: S.Array(S.String), - outputPatterns: S.Array(S.String), - outputCaseSensitive: S.Boolean, - entryName: S.String, - entryPath: S.String, - isDirectory: S.Boolean, -}) { +export class DiscoveredEntryCommand + extends S.TaggedClass()('DiscoveredEntryCommand', { + ignorePatterns: S.Array(S.String), + outputPatterns: S.Array(S.String), + outputCaseSensitive: S.Boolean, + entryName: S.String, + entryPath: S.String, + isDirectory: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = { entryName: 'stryker.discovered_entry.name', isDirectory: 'stryker.discovered_entry.is_directory', } as const } -export class EntryIncluded extends S.TaggedClass()('EntryIncluded', { +export class EntryIncluded extends S.TaggedClass()('EntryIncluded', { entryName: S.String, }) { readonly [DiscoveredEntryTypeId] = DiscoveredEntryTypeId } -export class EntryIgnored extends S.TaggedClass()('EntryIgnored', { +export class EntryIgnored extends S.TaggedClass()('EntryIgnored', { entryName: S.String, }) { readonly [DiscoveredEntryTypeId] = DiscoveredEntryTypeId diff --git a/packages/stryker-js/src/admit-file-identity.workflow.ts b/packages/stryker-js/src/admit-file-identity.workflow.ts index 14da8a0ca..57fb87aaf 100644 --- a/packages/stryker-js/src/admit-file-identity.workflow.ts +++ b/packages/stryker-js/src/admit-file-identity.workflow.ts @@ -6,14 +6,16 @@ import * as S from 'effect/Schema' import { type FormatIdentity, FormatIdentitySchema } from './IncrementalDiff.schema.js' -export class AdmitFileIdentityCommand extends S.TaggedClass()( - 'AdmitFileIdentityCommand', - { - file: S.String, - recorded: S.optional(FormatIdentitySchema), - claimed: S.optional(FormatIdentitySchema), - }, -) { +export class AdmitFileIdentityCommand + extends S.TaggedClass()( + 'AdmitFileIdentityCommand', + { + file: S.String, + recorded: S.optional(FormatIdentitySchema), + claimed: S.optional(FormatIdentitySchema), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { file: 'stryker.file_identity.file', } as const @@ -22,15 +24,19 @@ export class AdmitFileIdentityCommand extends S.TaggedClass()('FileIdentityReuse', { - file: S.String, -}) { +export class FileIdentityReuse + extends S.TaggedClass()('FileIdentityReuse', { + file: S.String, + }) +{ readonly [FileIdentityDecisionTypeId] = FileIdentityDecisionTypeId } -export class FileIdentityRecompute extends S.TaggedClass()('FileIdentityRecompute', { - file: S.String, -}) { +export class FileIdentityRecompute + extends S.TaggedClass()('FileIdentityRecompute', { + file: S.String, + }) +{ readonly [FileIdentityDecisionTypeId] = FileIdentityDecisionTypeId } diff --git a/packages/stryker-js/src/admit-file-match.workflow.ts b/packages/stryker-js/src/admit-file-match.workflow.ts index 5ed302e22..b8d879a37 100644 --- a/packages/stryker-js/src/admit-file-match.workflow.ts +++ b/packages/stryker-js/src/admit-file-match.workflow.ts @@ -43,25 +43,29 @@ const matcherMatchesResolved = ( const hasHiddenSegment = (fileName: string) => fileName.split('/').some((entry) => entry.startsWith('.')) -export class FileMatchCommand extends S.TaggedClass()('FileMatchCommand', { - resolvedPattern: S.Union([S.Boolean, S.String]), - allowHiddenFiles: S.Boolean, - resolvedFileName: S.String, -}) { +export class FileMatchCommand + extends S.TaggedClass()('FileMatchCommand', { + resolvedPattern: S.Union([S.Boolean, S.String]), + allowHiddenFiles: S.Boolean, + resolvedFileName: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { allowHiddenFiles: 'stryker.file_match.allow_hidden_files', } as const } -export class FileMatched extends S.TaggedClass()('FileMatched', { +export class FileMatched extends S.TaggedClass()('FileMatched', { resolvedFileName: S.String, }) { readonly [FileMatchTypeId] = FileMatchTypeId } -export class FileNotMatched extends S.TaggedClass()('FileNotMatched', { - resolvedFileName: S.String, -}) { +export class FileNotMatched + extends S.TaggedClass()('FileNotMatched', { + resolvedFileName: S.String, + }) +{ readonly [FileMatchTypeId] = FileMatchTypeId } diff --git a/packages/stryker-js/src/admit-incremental-report.workflow.ts b/packages/stryker-js/src/admit-incremental-report.workflow.ts index 27a804338..0f136f56f 100644 --- a/packages/stryker-js/src/admit-incremental-report.workflow.ts +++ b/packages/stryker-js/src/admit-incremental-report.workflow.ts @@ -6,16 +6,18 @@ import * as S from 'effect/Schema' import { IncrementalReportSchema } from './IncrementalReport.schema.js' -export class AdmitIncrementalReportCommand extends S.TaggedClass()( - 'AdmitIncrementalReportCommand', - { - report: S.optional(IncrementalReportSchema), - expectedIncrementalVersion: S.String, - engineDigest: S.String, - mutantSetPolicy: Options.MutantSetPolicy, - runInputsDigest: S.String, - }, -) { +export class AdmitIncrementalReportCommand + extends S.TaggedClass()( + 'AdmitIncrementalReportCommand', + { + report: S.optional(IncrementalReportSchema), + expectedIncrementalVersion: S.String, + engineDigest: S.String, + mutantSetPolicy: Options.MutantSetPolicy, + runInputsDigest: S.String, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { expectedIncrementalVersion: 'stryker.incremental_report.expected_version', engineDigest: 'stryker.incremental_report.engine_digest', @@ -28,7 +30,7 @@ const IncrementalReportDecisionTypeId: unique symbol = Symbol.for( ) type IncrementalReportDecisionTypeId = typeof IncrementalReportDecisionTypeId -export class IncrementalReportKeep extends S.TaggedClass()( +export class IncrementalReportKeep extends S.TaggedClass()( 'IncrementalReportKeep', { report: IncrementalReportSchema, @@ -46,14 +48,16 @@ const IncrementalDiscardReason = S.Literals([ ]) type IncrementalDiscardReason = typeof IncrementalDiscardReason.Type -export class IncrementalReportDiscard extends S.TaggedClass()( - 'IncrementalReportDiscard', - { - reason: IncrementalDiscardReason, - actual: S.optional(S.String), - expected: S.String, - }, -) { +export class IncrementalReportDiscard + extends S.TaggedClass()( + 'IncrementalReportDiscard', + { + reason: IncrementalDiscardReason, + actual: S.optional(S.String), + expected: S.String, + }, + ) +{ readonly [IncrementalReportDecisionTypeId] = IncrementalReportDecisionTypeId } diff --git a/packages/stryker-js/src/admit-mutation-test.workflow.ts b/packages/stryker-js/src/admit-mutation-test.workflow.ts index e887506db..5366d828e 100644 --- a/packages/stryker-js/src/admit-mutation-test.workflow.ts +++ b/packages/stryker-js/src/admit-mutation-test.workflow.ts @@ -5,10 +5,12 @@ import * as S from 'effect/Schema' import { MutationTestCommand } from './MutationTest.schema.js' -export class MutationTestError extends S.TaggedError()('MutationTestError', { - stage: S.Literal('mutationTest'), - reason: S.String, -}) { +export class MutationTestError + extends S.TaggedError()('MutationTestError', { + stage: S.Literal('mutationTest'), + reason: S.String, + }) +{ override get message(): string { return this.reason } @@ -17,15 +19,21 @@ export class MutationTestError extends S.TaggedError()('Mutat const MutationTestDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutationTestDecision') type MutationTestDecisionTypeId = typeof MutationTestDecisionTypeId -export class MutationTestProceed extends S.TaggedClass()('MutationTestProceed', {}) { +export class MutationTestProceed + extends S.TaggedClass()('MutationTestProceed', {}) +{ readonly [MutationTestDecisionTypeId] = MutationTestDecisionTypeId } -export class MutationTestDryRunOnly extends S.TaggedClass()('MutationTestDryRunOnly', {}) { +export class MutationTestDryRunOnly + extends S.TaggedClass()('MutationTestDryRunOnly', {}) +{ readonly [MutationTestDecisionTypeId] = MutationTestDecisionTypeId } -export class MutationTestNoTests extends S.TaggedClass()('MutationTestNoTests', {}) { +export class MutationTestNoTests + extends S.TaggedClass()('MutationTestNoTests', {}) +{ readonly [MutationTestDecisionTypeId] = MutationTestDecisionTypeId } diff --git a/packages/stryker-js/src/admit-reuse-source.workflow.ts b/packages/stryker-js/src/admit-reuse-source.workflow.ts index 7126e8d9a..a93e68a63 100644 --- a/packages/stryker-js/src/admit-reuse-source.workflow.ts +++ b/packages/stryker-js/src/admit-reuse-source.workflow.ts @@ -6,10 +6,12 @@ import * as S from 'effect/Schema' import { ReuseReportSchema } from './IncrementalDiff.schema.js' -export class AdmitReuseSourceCommand extends S.TaggedClass()('AdmitReuseSourceCommand', { - text: S.String, - expectedIncrementalVersion: S.String, -}) { +export class AdmitReuseSourceCommand + extends S.TaggedClass()('AdmitReuseSourceCommand', { + text: S.String, + expectedIncrementalVersion: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { expectedIncrementalVersion: 'stryker.incremental_source.expected_version', } as const @@ -18,25 +20,31 @@ export class AdmitReuseSourceCommand extends S.TaggedClass()('ReuseSourceKept', { - report: ReuseReportSchema, -}) { +export class ReuseSourceKept + extends S.TaggedClass()('ReuseSourceKept', { + report: ReuseReportSchema, + }) +{ readonly [AdmitReuseSourceTypeId] = AdmitReuseSourceTypeId } -export class ReuseSourceAbsent extends S.TaggedClass()('ReuseSourceAbsent', {}) { +export class ReuseSourceAbsent + extends S.TaggedClass()('ReuseSourceAbsent', {}) +{ readonly [AdmitReuseSourceTypeId] = AdmitReuseSourceTypeId } const ReuseSourceDiscardReason = S.Literals(['cacheLayoutChanged', 'undecodable']) type ReuseSourceDiscardReason = typeof ReuseSourceDiscardReason.Type -export class ReuseSourceDiscarded extends S.TaggedClass()('ReuseSourceDiscarded', { - reason: ReuseSourceDiscardReason, - actual: S.optional(S.String), - expected: S.String, - issue: S.optional(S.String), -}) { +export class ReuseSourceDiscarded + extends S.TaggedClass()('ReuseSourceDiscarded', { + reason: ReuseSourceDiscardReason, + actual: S.optional(S.String), + expected: S.String, + issue: S.optional(S.String), + }) +{ readonly [AdmitReuseSourceTypeId] = AdmitReuseSourceTypeId } diff --git a/packages/stryker-js/src/admit-stream-overwrite.workflow.ts b/packages/stryker-js/src/admit-stream-overwrite.workflow.ts index a14e58716..b3d1068cc 100644 --- a/packages/stryker-js/src/admit-stream-overwrite.workflow.ts +++ b/packages/stryker-js/src/admit-stream-overwrite.workflow.ts @@ -234,26 +234,32 @@ const isTornRecord = (command: StreamOverwriteCommand) => RunEventRecordOpening.literals.some(sharesAPrefix(command.leadingText)), ]) -export class StreamOverwriteCommand extends S.TaggedClass()('StreamOverwriteCommand', { - file: S.String, - regularFile: S.Boolean, - empty: S.Boolean, - wholeFileRead: S.Boolean, - leadingText: S.String, -}) { +export class StreamOverwriteCommand + extends S.TaggedClass()('StreamOverwriteCommand', { + file: S.String, + regularFile: S.Boolean, + empty: S.Boolean, + wholeFileRead: S.Boolean, + leadingText: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class OverwriteAllowed extends S.TaggedClass()('OverwriteAllowed', { - file: S.String, -}) { +export class OverwriteAllowed + extends S.TaggedClass()('OverwriteAllowed', { + file: S.String, + }) +{ readonly [StreamOverwriteTypeId] = StreamOverwriteTypeId } -export class OverwriteRefused extends S.TaggedClass()('OverwriteRefused', { - file: S.String, - reason: S.String, -}) { +export class OverwriteRefused + extends S.TaggedClass()('OverwriteRefused', { + file: S.String, + reason: S.String, + }) +{ readonly [StreamOverwriteTypeId] = StreamOverwriteTypeId } diff --git a/packages/stryker-js/src/admit-survivors-run.workflow.ts b/packages/stryker-js/src/admit-survivors-run.workflow.ts index 5fa794023..e08a878d2 100644 --- a/packages/stryker-js/src/admit-survivors-run.workflow.ts +++ b/packages/stryker-js/src/admit-survivors-run.workflow.ts @@ -13,41 +13,45 @@ export const AdmittedSurvivorShape = S.Struct({ const SurvivorsAdmissionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/SurvivorsAdmission') type SurvivorsAdmissionTypeId = typeof SurvivorsAdmissionTypeId -export class PriorReportFacts extends S.Class('PriorReportFacts')({ +export class PriorReportFacts extends S.Class('PriorReportFacts')({ config: S.Record(S.String, S.Unknown), frameworkVersion: S.UndefinedOr(S.String), }) {} -export class AdmitSurvivorsRunCommand extends S.Class('AdmitSurvivorsRunCommand')({ - priorReport: S.UndefinedOr(PriorReportFacts), - currentConfig: S.Record(S.String, S.Unknown), - frameworkVersion: S.String, - sourceContentHashes: S.Record(S.String, S.String), - priorSourceHashes: S.Record(S.String, S.String), - priorSurvivors: S.Array(AdmittedSurvivorShape), -}) { +export class AdmitSurvivorsRunCommand + extends S.Class('AdmitSurvivorsRunCommand')({ + priorReport: S.UndefinedOr(PriorReportFacts), + currentConfig: S.Record(S.String, S.Unknown), + frameworkVersion: S.String, + sourceContentHashes: S.Record(S.String, S.String), + priorSourceHashes: S.Record(S.String, S.String), + priorSurvivors: S.Array(AdmittedSurvivorShape), + }) +{ static readonly [Workflow.InstrumentationBrand] = { frameworkVersion: 'stryker.survivors.framework_version', } as const } -export class Admitted extends S.TaggedClass()('Admitted', { +export class Admitted extends S.TaggedClass()('Admitted', { survivors: S.Array(Mutant.Mutant), mutateSpans: S.Array(S.String), }) { readonly [SurvivorsAdmissionTypeId] = SurvivorsAdmissionTypeId } -export class NoSurvivors extends S.TaggedClass()('NoSurvivors', {}) { +export class NoSurvivors extends S.TaggedClass()('NoSurvivors', {}) { readonly [SurvivorsAdmissionTypeId] = SurvivorsAdmissionTypeId } export const SurvivorsAdmission = S.Union([Admitted, NoSurvivors]) export type SurvivorsAdmission = S.Schema.Type -export class SurvivorsRejection extends S.TaggedError()('SurvivorsRejection', { - reason: S.Literals(['no-report', 'mismatch']), - remediation: S.String, -}) { +export class SurvivorsRejection + extends S.TaggedError()('SurvivorsRejection', { + reason: S.Literals(['no-report', 'mismatch']), + remediation: S.String, + }) +{ readonly [SurvivorsAdmissionTypeId] = SurvivorsAdmissionTypeId override get message(): string { diff --git a/packages/stryker-js/src/audit-drops.workflow.ts b/packages/stryker-js/src/audit-drops.workflow.ts index e9a262e1c..51e55d994 100644 --- a/packages/stryker-js/src/audit-drops.workflow.ts +++ b/packages/stryker-js/src/audit-drops.workflow.ts @@ -28,11 +28,13 @@ import { type VacuousReason, } from './audit.schema.js' -export class AuditDropsCommand extends S.TaggedClass()('AuditDropsCommand', { - scope: AuditScope, - drops: S.Array(AuditedDrop), - matrix: S.Array(MatrixProject), -}) { +export class AuditDropsCommand + extends S.TaggedClass()('AuditDropsCommand', { + scope: AuditScope, + drops: S.Array(AuditedDrop), + matrix: S.Array(MatrixProject), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/audit.schema.ts b/packages/stryker-js/src/audit.schema.ts index 49407c839..71182418c 100644 --- a/packages/stryker-js/src/audit.schema.ts +++ b/packages/stryker-js/src/audit.schema.ts @@ -224,14 +224,18 @@ const AuditFailures = S.Struct({ pairs: Count, unattestedRules: Count, orphanedT const AuditReportTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/AuditReport') -export class DropAuditPassed extends S.TaggedClass()('DropAuditPassed', DropAuditFields) { +export class DropAuditPassed + extends S.TaggedClass()('DropAuditPassed', DropAuditFields) +{ readonly [AuditReportTypeId] = AuditReportTypeId } -export class DropAuditFailed extends S.TaggedClass()('DropAuditFailed', { - ...DropAuditFields, - failures: AuditFailures, -}) { +export class DropAuditFailed + extends S.TaggedClass()('DropAuditFailed', { + ...DropAuditFields, + failures: AuditFailures, + }) +{ readonly [AuditReportTypeId] = AuditReportTypeId } @@ -284,7 +288,7 @@ export const RunCounts = S.Struct({ }) export type RunCounts = typeof RunCounts.Type -export class CountsReport extends S.TaggedClass()('Counts', { +export class CountsReport extends S.TaggedClass()('Counts', { schemaVersion: AuditSchemaVersion, projects: S.Array(S.Struct({ project: S.String, counts: RunCounts })), total: RunCounts, @@ -298,9 +302,11 @@ export const AuditReportJson = S.fromJsonString(AuditReport) export const CountedProject = S.Struct({ project: S.String, report: CountedReport }) -export class NothingCounted extends S.TaggedError()('NothingCounted', { - projects: S.Array(S.String), -}) { +export class NothingCounted + extends S.TaggedError()('NothingCounted', { + projects: S.Array(S.String), + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass readonly code = 'no-mutant-recorded' as const @@ -316,7 +322,7 @@ export class NothingCounted extends S.TaggedError()('NothingCoun } } -export class AuditFailed extends S.TaggedError()('AuditFailed', { +export class AuditFailed extends S.TaggedError()('AuditFailed', { failures: AuditFailures, report: S.String, }) { @@ -339,11 +345,13 @@ const AuditInputCode = S.Literals([ 'files-with-counts-only', ]) -export class AuditInputUnusable extends S.TaggedError()('AuditInputUnusable', { - code: AuditInputCode, - detail: S.String, - next: S.String, -}) { +export class AuditInputUnusable + extends S.TaggedError()('AuditInputUnusable', { + code: AuditInputCode, + detail: S.String, + next: S.String, + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass get reason(): string { diff --git a/packages/stryker-js/src/budget-gate.workflow.ts b/packages/stryker-js/src/budget-gate.workflow.ts index ebb87909c..2eb46f24a 100644 --- a/packages/stryker-js/src/budget-gate.workflow.ts +++ b/packages/stryker-js/src/budget-gate.workflow.ts @@ -10,20 +10,22 @@ import { BudgetBaseline, BudgetBaselineSchemaVersion } from './BudgetBaseline.sc const BUDGET_EXIT_CLASS = 'VerdictFail' satisfies Plugin.ExitClass const BUDGET_REMEDIATION = 'accept the new cost with `stryker gate --update-budget-baseline`, or speed the run up' -export class BudgetGateCommand extends S.TaggedClass()('BudgetGateCommand', { - actualSeconds: Report.NonNegativeFinite, - baseline: S.NullOr(BudgetBaseline), - tolerance: Report.NonNegativeFinite, - updateBaseline: S.Boolean, - baselineFile: S.String, -}) { +export class BudgetGateCommand + extends S.TaggedClass()('BudgetGateCommand', { + actualSeconds: Report.NonNegativeFinite, + baseline: S.NullOr(BudgetBaseline), + tolerance: Report.NonNegativeFinite, + updateBaseline: S.Boolean, + baselineFile: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const BudgetGateTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/BudgetGateDecision') type BudgetGateTypeId = typeof BudgetGateTypeId -export class BudgetWithin extends S.TaggedClass()('BudgetWithin', { +export class BudgetWithin extends S.TaggedClass()('BudgetWithin', { baseline: S.NullOr(BudgetBaseline), }) { readonly [BudgetGateTypeId] = BudgetGateTypeId @@ -32,12 +34,14 @@ export class BudgetWithin extends S.TaggedClass()('BudgetWithin', export const BudgetGateDecision = S.Union([BudgetWithin]) export type BudgetGateDecision = typeof BudgetGateDecision.Type -export class BudgetExceeded extends S.TaggedError()('BudgetExceeded', { - baselineSeconds: Report.NonNegativeFinite, - allowedSeconds: Report.NonNegativeFinite, - actualSeconds: Report.NonNegativeFinite, - tolerance: Report.NonNegativeFinite, -}) { +export class BudgetExceeded + extends S.TaggedError()('BudgetExceeded', { + baselineSeconds: Report.NonNegativeFinite, + allowedSeconds: Report.NonNegativeFinite, + actualSeconds: Report.NonNegativeFinite, + tolerance: Report.NonNegativeFinite, + }) +{ readonly exitClass = BUDGET_EXIT_CLASS override get message(): string { @@ -51,9 +55,11 @@ export class BudgetExceeded extends S.TaggedError()('BudgetExcee } } -export class BudgetInputUnusable extends S.TaggedError()('BudgetInputUnusable', { - reason: S.String, -}) { +export class BudgetInputUnusable + extends S.TaggedError()('BudgetInputUnusable', { + reason: S.String, + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass override get message(): string { diff --git a/packages/stryker-js/src/build-reproducers.workflow.ts b/packages/stryker-js/src/build-reproducers.workflow.ts index 330220726..6398c92c8 100644 --- a/packages/stryker-js/src/build-reproducers.workflow.ts +++ b/packages/stryker-js/src/build-reproducers.workflow.ts @@ -27,22 +27,28 @@ export type Reproducer = typeof ReproducerSchema.Type const BuildReproducersTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/BuildReproducersDecision') type BuildReproducersTypeId = typeof BuildReproducersTypeId -export class ReproducersBuilt extends S.TaggedClass()('ReproducersBuilt', { - reproducers: S.Array(ReproducerSchema), -}) { +export class ReproducersBuilt + extends S.TaggedClass()('ReproducersBuilt', { + reproducers: S.Array(ReproducerSchema), + }) +{ readonly [BuildReproducersTypeId] = BuildReproducersTypeId } -export class NoMutantsToReproduce extends S.TaggedClass()('NoMutantsToReproduce', {}) { +export class NoMutantsToReproduce + extends S.TaggedClass()('NoMutantsToReproduce', {}) +{ readonly [BuildReproducersTypeId] = BuildReproducersTypeId } export const BuildReproducersDecision = S.Union([ReproducersBuilt, NoMutantsToReproduce]) export type BuildReproducersDecision = typeof BuildReproducersDecision.Type -export class BuildReproducersCommand extends S.TaggedClass()('BuildReproducersCommand', { - report: Report.MutationTestResult, -}) { +export class BuildReproducersCommand + extends S.TaggedClass()('BuildReproducersCommand', { + report: Report.MutationTestResult, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/cap-survivors.workflow.ts b/packages/stryker-js/src/cap-survivors.workflow.ts index 9d0604abe..ff05b9096 100644 --- a/packages/stryker-js/src/cap-survivors.workflow.ts +++ b/packages/stryker-js/src/cap-survivors.workflow.ts @@ -47,26 +47,32 @@ const withDistinctIds = (survivors: ReadonlyArray): ReadonlyArray()('SurvivorsWithinCaps', { - surfaced: S.Array(SurvivorRef), -}) { +export class SurvivorsWithinCaps + extends S.TaggedClass()('SurvivorsWithinCaps', { + surfaced: S.Array(SurvivorRef), + }) +{ readonly [CapSurvivorsTypeId] = CapSurvivorsTypeId } -export class SurvivorsCapped extends S.TaggedClass()('SurvivorsCapped', { - surfaced: S.Array(SurvivorRef), - capped: S.Array(SurvivorRef), -}) { +export class SurvivorsCapped + extends S.TaggedClass()('SurvivorsCapped', { + surfaced: S.Array(SurvivorRef), + capped: S.Array(SurvivorRef), + }) +{ readonly [CapSurvivorsTypeId] = CapSurvivorsTypeId } export const CapSurvivorsDecision = S.Union([SurvivorsWithinCaps, SurvivorsCapped]) export type CapSurvivorsDecision = typeof CapSurvivorsDecision.Type -export class CapSurvivorsCommand extends S.TaggedClass()('CapSurvivorsCommand', { - survivors: S.Array(SurvivorRef), - caps: SurfacingCaps, -}) { +export class CapSurvivorsCommand + extends S.TaggedClass()('CapSurvivorsCommand', { + survivors: S.Array(SurvivorRef), + caps: SurfacingCaps, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/checkpoint-mutants.workflow.ts b/packages/stryker-js/src/checkpoint-mutants.workflow.ts index 38dd4dad2..761f31a5d 100644 --- a/packages/stryker-js/src/checkpoint-mutants.workflow.ts +++ b/packages/stryker-js/src/checkpoint-mutants.workflow.ts @@ -8,30 +8,36 @@ import * as S from 'effect/Schema' const CheckpointRowTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/CheckpointMutantRow') type CheckpointRowTypeId = typeof CheckpointRowTypeId -export class CheckpointSettledMutant extends S.TaggedClass()('CheckpointSettledMutant', { - mutant: Mutant.Mutant, - status: Mutant.MutantStatusSchema, - killedBy: S.String.pipe(S.Array, S.optional), -}) { +export class CheckpointSettledMutant + extends S.TaggedClass()('CheckpointSettledMutant', { + mutant: Mutant.Mutant, + status: Mutant.MutantStatusSchema, + killedBy: S.String.pipe(S.Array, S.optional), + }) +{ readonly [CheckpointRowTypeId] = CheckpointRowTypeId } -export class CheckpointPendingMutant extends S.TaggedClass()('CheckpointPendingMutant', { - mutant: Mutant.Mutant, -}) { +export class CheckpointPendingMutant + extends S.TaggedClass()('CheckpointPendingMutant', { + mutant: Mutant.Mutant, + }) +{ readonly [CheckpointRowTypeId] = CheckpointRowTypeId } export const CheckpointMutantRow = S.Union([CheckpointSettledMutant, CheckpointPendingMutant]) export type CheckpointMutantRow = typeof CheckpointMutantRow.Type -export class CheckpointMutantsCommand extends S.TaggedClass()( - 'CheckpointMutantsCommand', - { - plannedMutants: S.Array(Mutant.Mutant), - settled: S.Array(CheckpointSettledMutant), - }, -) { +export class CheckpointMutantsCommand + extends S.TaggedClass()( + 'CheckpointMutantsCommand', + { + plannedMutants: S.Array(Mutant.Mutant), + settled: S.Array(CheckpointSettledMutant), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/classify-empty-directory-removal.workflow.ts b/packages/stryker-js/src/classify-empty-directory-removal.workflow.ts index f9b5ab15e..836846c8d 100644 --- a/packages/stryker-js/src/classify-empty-directory-removal.workflow.ts +++ b/packages/stryker-js/src/classify-empty-directory-removal.workflow.ts @@ -6,24 +6,30 @@ import * as S from 'effect/Schema' const EmptyDirectoryRemovalTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/EmptyDirectoryRemoval') type EmptyDirectoryRemovalTypeId = typeof EmptyDirectoryRemovalTypeId -export class ClassifyEmptyDirectoryRemovalCommand extends S.TaggedClass()( - 'ClassifyEmptyDirectoryRemovalCommand', - { - code: S.UndefinedOr(S.String), - }, -) { +export class ClassifyEmptyDirectoryRemovalCommand + extends S.TaggedClass()( + 'ClassifyEmptyDirectoryRemovalCommand', + { + code: S.UndefinedOr(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class DirectoryKept extends S.TaggedClass()('DirectoryKept', {}) { +export class DirectoryKept + extends S.TaggedClass()('DirectoryKept', {}) +{ readonly [EmptyDirectoryRemovalTypeId] = EmptyDirectoryRemovalTypeId } -export class DirectoryAbsent extends S.TaggedClass()('DirectoryAbsent', {}) { +export class DirectoryAbsent + extends S.TaggedClass()('DirectoryAbsent', {}) +{ readonly [EmptyDirectoryRemovalTypeId] = EmptyDirectoryRemovalTypeId } -export class RemovalFailed extends S.TaggedClass()('RemovalFailed', { +export class RemovalFailed extends S.TaggedClass()('RemovalFailed', { code: S.UndefinedOr(S.String), }) { readonly [EmptyDirectoryRemovalTypeId] = EmptyDirectoryRemovalTypeId diff --git a/packages/stryker-js/src/classify-exit.workflow.ts b/packages/stryker-js/src/classify-exit.workflow.ts index ba5abac4d..6f829e336 100644 --- a/packages/stryker-js/src/classify-exit.workflow.ts +++ b/packages/stryker-js/src/classify-exit.workflow.ts @@ -9,37 +9,49 @@ import * as S from 'effect/Schema' const ExitDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ExitDecision') type ExitDecisionTypeId = typeof ExitDecisionTypeId -export class ClassifyExitCommand extends S.TaggedClass()('ClassifyExitCommand', { - pending: S.Array(Plugin.ExitClass), -}) { +export class ClassifyExitCommand + extends S.TaggedClass()('ClassifyExitCommand', { + pending: S.Array(Plugin.ExitClass), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ExitPassed extends S.TaggedClass()('ExitPassed', { exitClass: S.Null }) { +export class ExitPassed + extends S.TaggedClass()('ExitPassed', { exitClass: S.Null }) +{ readonly [ExitDecisionTypeId] = ExitDecisionTypeId } -export class ExitVerdictFailed extends S.TaggedClass()('ExitVerdictFailed', { - exitClass: S.tag('VerdictFail'), -}) { +export class ExitVerdictFailed + extends S.TaggedClass()('ExitVerdictFailed', { + exitClass: S.tag('VerdictFail'), + }) +{ readonly [ExitDecisionTypeId] = ExitDecisionTypeId } -export class ExitConfigErrored extends S.TaggedClass()('ExitConfigErrored', { - exitClass: S.tag('ConfigError'), -}) { +export class ExitConfigErrored + extends S.TaggedClass()('ExitConfigErrored', { + exitClass: S.tag('ConfigError'), + }) +{ readonly [ExitDecisionTypeId] = ExitDecisionTypeId } -export class ExitRuntimeErrored extends S.TaggedClass()('ExitRuntimeErrored', { - exitClass: S.tag('RuntimeError'), -}) { +export class ExitRuntimeErrored + extends S.TaggedClass()('ExitRuntimeErrored', { + exitClass: S.tag('RuntimeError'), + }) +{ readonly [ExitDecisionTypeId] = ExitDecisionTypeId } -export class ExitInternalErrored extends S.TaggedClass()('ExitInternalErrored', { - exitClass: S.tag('InternalError'), -}) { +export class ExitInternalErrored + extends S.TaggedClass()('ExitInternalErrored', { + exitClass: S.tag('InternalError'), + }) +{ readonly [ExitDecisionTypeId] = ExitDecisionTypeId } diff --git a/packages/stryker-js/src/classify-run-outcome.workflow.ts b/packages/stryker-js/src/classify-run-outcome.workflow.ts index e10bab042..5a6204f89 100644 --- a/packages/stryker-js/src/classify-run-outcome.workflow.ts +++ b/packages/stryker-js/src/classify-run-outcome.workflow.ts @@ -20,7 +20,9 @@ import { RunSurvivorsRejectedObservation, } from './RunOutcomeCommand.schema.js' -export class RunExit extends S.TaggedError()('RunExit', { code: Plugin.ExitCode }) { +export class RunExit + extends S.TaggedError()('RunExit', { code: Plugin.ExitCode }) +{ override get [Runtime.errorExitCode](): number { return this.code } @@ -44,15 +46,17 @@ const classCode = (exitClass: Plugin.ExitClass): number => const RunOutcomeTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/RunOutcome') type RunOutcomeTypeId = typeof RunOutcomeTypeId -export class RunOk extends S.TaggedClass()('RunOk', { +export class RunOk extends S.TaggedClass()('RunOk', { help: S.Boolean, }) { readonly [RunOutcomeTypeId] = RunOutcomeTypeId } -export class RunInterrupted extends S.TaggedError()('RunInterrupted', { - code: Plugin.ExitCode, -}) { +export class RunInterrupted + extends S.TaggedError()('RunInterrupted', { + code: Plugin.ExitCode, + }) +{ readonly [RunOutcomeTypeId] = RunOutcomeTypeId override get message(): string { @@ -60,33 +64,39 @@ export class RunInterrupted extends S.TaggedError()('RunInterrup } } -export class RunParseFailed extends S.TaggedClass()('RunParseFailed', { - unrecognized: S.optional(S.String), -}) { +export class RunParseFailed + extends S.TaggedClass()('RunParseFailed', { + unrecognized: S.optional(S.String), + }) +{ readonly [RunOutcomeTypeId] = RunOutcomeTypeId } -export class RunSurvivorsRejected extends S.TaggedClass()('RunSurvivorsRejected', { - reason: S.Literals(['no-report', 'mismatch']), - diagnostic: S.optional(S.String), -}) { +export class RunSurvivorsRejected + extends S.TaggedClass()('RunSurvivorsRejected', { + reason: S.Literals(['no-report', 'mismatch']), + diagnostic: S.optional(S.String), + }) +{ readonly [RunOutcomeTypeId] = RunOutcomeTypeId } -export class RunConfigFailed extends S.TaggedClass()('RunConfigFailed', { - detail: S.optional(S.String), -}) { +export class RunConfigFailed + extends S.TaggedClass()('RunConfigFailed', { + detail: S.optional(S.String), + }) +{ readonly [RunOutcomeTypeId] = RunOutcomeTypeId } -export class RunRefused extends S.TaggedClass()('RunRefused', { +export class RunRefused extends S.TaggedClass()('RunRefused', { rule: RunEvent.RefusalRule, message: S.String, }) { readonly [RunOutcomeTypeId] = RunOutcomeTypeId } -export class RunFailed extends S.TaggedClass()('RunFailed', { +export class RunFailed extends S.TaggedClass()('RunFailed', { code: Plugin.ExitCode, diagnostic: S.optional(S.String), }) { diff --git a/packages/stryker-js/src/classify-sandbox-directory.workflow.ts b/packages/stryker-js/src/classify-sandbox-directory.workflow.ts index 6464c4b25..16854122e 100644 --- a/packages/stryker-js/src/classify-sandbox-directory.workflow.ts +++ b/packages/stryker-js/src/classify-sandbox-directory.workflow.ts @@ -6,22 +6,30 @@ import * as S from 'effect/Schema' const ClassifySandboxDirectoryTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ClassifySandboxDirectory') type ClassifySandboxDirectoryTypeId = typeof ClassifySandboxDirectoryTypeId -export class SandboxDirectoryCommand extends S.TaggedClass()('SandboxDirectoryCommand', { - name: S.String, - tempDirName: S.UndefinedOr(S.String), -}) { +export class SandboxDirectoryCommand + extends S.TaggedClass()('SandboxDirectoryCommand', { + name: S.String, + tempDirName: S.UndefinedOr(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class DirectorySkipped extends S.TaggedClass()('DirectorySkipped', {}) { +export class DirectorySkipped + extends S.TaggedClass()('DirectorySkipped', {}) +{ readonly [ClassifySandboxDirectoryTypeId] = ClassifySandboxDirectoryTypeId } -export class NodeModulesDirectory extends S.TaggedClass()('NodeModulesDirectory', {}) { +export class NodeModulesDirectory + extends S.TaggedClass()('NodeModulesDirectory', {}) +{ readonly [ClassifySandboxDirectoryTypeId] = ClassifySandboxDirectoryTypeId } -export class SearchableDirectory extends S.TaggedClass()('SearchableDirectory', {}) { +export class SearchableDirectory + extends S.TaggedClass()('SearchableDirectory', {}) +{ readonly [ClassifySandboxDirectoryTypeId] = ClassifySandboxDirectoryTypeId } diff --git a/packages/stryker-js/src/classify-worker-exit.workflow.ts b/packages/stryker-js/src/classify-worker-exit.workflow.ts index 665b7d040..991bb3d2e 100644 --- a/packages/stryker-js/src/classify-worker-exit.workflow.ts +++ b/packages/stryker-js/src/classify-worker-exit.workflow.ts @@ -8,24 +8,28 @@ import { ChildExitCode, ProcessId } from './Worker.schema.js' const WorkerExitTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/WorkerExit') type WorkerExitTypeId = typeof WorkerExitTypeId -export class ClassifyWorkerExitCommand extends S.TaggedClass()( - 'ClassifyWorkerExitCommand', - { - pid: ProcessId, - exitCode: ChildExitCode, - }, -) { +export class ClassifyWorkerExitCommand + extends S.TaggedClass()( + 'ClassifyWorkerExitCommand', + { + pid: ProcessId, + exitCode: ChildExitCode, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class WorkerOutOfMemory extends S.TaggedClass()('WorkerOutOfMemory', { - pid: ProcessId, - exitCode: ChildExitCode, -}) { +export class WorkerOutOfMemory + extends S.TaggedClass()('WorkerOutOfMemory', { + pid: ProcessId, + exitCode: ChildExitCode, + }) +{ readonly [WorkerExitTypeId] = WorkerExitTypeId } -export class WorkerCrashed extends S.TaggedClass()('WorkerCrashed', { +export class WorkerCrashed extends S.TaggedClass()('WorkerCrashed', { pid: ProcessId, exitCode: ChildExitCode, }) { diff --git a/packages/stryker-js/src/compare-verdicts.workflow.ts b/packages/stryker-js/src/compare-verdicts.workflow.ts index ecf90ca07..e30b979f4 100644 --- a/packages/stryker-js/src/compare-verdicts.workflow.ts +++ b/packages/stryker-js/src/compare-verdicts.workflow.ts @@ -30,13 +30,17 @@ export type VerdictMismatch = typeof VerdictMismatch.Type const CompareVerdictsDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/CompareVerdictsDecision') type CompareVerdictsDecisionTypeId = typeof CompareVerdictsDecisionTypeId -export class VerdictsMatch extends S.TaggedClass()('VerdictsMatch', {}) { +export class VerdictsMatch + extends S.TaggedClass()('VerdictsMatch', {}) +{ readonly [CompareVerdictsDecisionTypeId] = CompareVerdictsDecisionTypeId } -export class VerdictsDiffer extends S.TaggedError()('VerdictsDiffer', { - mismatches: S.Array(VerdictMismatch), -}) { +export class VerdictsDiffer + extends S.TaggedError()('VerdictsDiffer', { + mismatches: S.Array(VerdictMismatch), + }) +{ override get message(): string { return [ `${this.mismatches.length} mutant status(es) differ from the baseline:`, @@ -45,15 +49,17 @@ export class VerdictsDiffer extends S.TaggedError()('VerdictsDif } } -export class CompareVerdictsCommand extends S.Class('CompareVerdictsCommand')({ - baseline: VerdictSchema, - fresh: VerdictSchema, - noise: S.Array(S.String), -}) { +export class CompareVerdictsCommand + extends S.Class('CompareVerdictsCommand')({ + baseline: VerdictSchema, + fresh: VerdictSchema, + noise: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class CompareFailed extends S.TaggedError()('CompareFailed', { +export class CompareFailed extends S.TaggedError()('CompareFailed', { reason: S.String, }) { override get message(): string { diff --git a/packages/stryker-js/src/compile-glob.workflow.ts b/packages/stryker-js/src/compile-glob.workflow.ts index f04e570c4..0ada481fd 100644 --- a/packages/stryker-js/src/compile-glob.workflow.ts +++ b/packages/stryker-js/src/compile-glob.workflow.ts @@ -55,23 +55,27 @@ const globSegmentToRegex = (segment: string): string => ), ) -export class GlobMatcher extends S.TaggedClass()('GlobMatcher', { +export class GlobMatcher extends S.TaggedClass()('GlobMatcher', { source: S.String, flags: S.String, }) { readonly [CompileGlobTypeId] = CompileGlobTypeId } -export class GlobUnmatchable extends S.TaggedClass()('GlobUnmatchable', { - pattern: S.Union([S.Boolean, S.String]), -}) { +export class GlobUnmatchable + extends S.TaggedClass()('GlobUnmatchable', { + pattern: S.Union([S.Boolean, S.String]), + }) +{ readonly [CompileGlobTypeId] = CompileGlobTypeId } -export class CompileGlobCommand extends S.TaggedClass()('CompileGlobCommand', { - pattern: S.Union([S.Boolean, S.String]), - caseInsensitive: S.Boolean, -}) { +export class CompileGlobCommand + extends S.TaggedClass()('CompileGlobCommand', { + pattern: S.Union([S.Boolean, S.String]), + caseInsensitive: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/config/warning-enabled.workflow.ts b/packages/stryker-js/src/config/warning-enabled.workflow.ts index 0a3312ac3..070a726bd 100644 --- a/packages/stryker-js/src/config/warning-enabled.workflow.ts +++ b/packages/stryker-js/src/config/warning-enabled.workflow.ts @@ -7,23 +7,29 @@ import * as S from 'effect/Schema' const WarningDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/WarningDecision') type WarningDecisionTypeId = typeof WarningDecisionTypeId -export class WarningEnabled extends S.TaggedClass()('WarningEnabled', {}) { +export class WarningEnabled + extends S.TaggedClass()('WarningEnabled', {}) +{ readonly [WarningDecisionTypeId] = WarningDecisionTypeId } -export class WarningDisabled extends S.TaggedClass()('WarningDisabled', {}) { +export class WarningDisabled + extends S.TaggedClass()('WarningDisabled', {}) +{ readonly [WarningDecisionTypeId] = WarningDecisionTypeId } export type WarningDecision = WarningEnabled | WarningDisabled -export class ResolveWarningEnabledCommand extends S.TaggedClass()( - 'ResolveWarningEnabledCommand', - { - warning: S.Literals(['unknownOptions', 'preprocessorErrors', 'unserializableOptions', 'slow']), - warnings: S.Union([S.Boolean, S.Record(S.String, S.Unknown)]), - }, -) { +export class ResolveWarningEnabledCommand + extends S.TaggedClass()( + 'ResolveWarningEnabledCommand', + { + warning: S.Literals(['unknownOptions', 'preprocessorErrors', 'unserializableOptions', 'slow']), + warnings: S.Union([S.Boolean, S.Record(S.String, S.Unknown)]), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/count-runs.workflow.ts b/packages/stryker-js/src/count-runs.workflow.ts index fe8446976..7c9a4c893 100644 --- a/packages/stryker-js/src/count-runs.workflow.ts +++ b/packages/stryker-js/src/count-runs.workflow.ts @@ -18,9 +18,11 @@ import { type StatusCounts, } from './audit.schema.js' -export class CountRunsCommand extends S.TaggedClass()('CountRunsCommand', { - reports: S.Array(CountedProject), -}) { +export class CountRunsCommand + extends S.TaggedClass()('CountRunsCommand', { + reports: S.Array(CountedProject), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/decode-mutator-selection.workflow.ts b/packages/stryker-js/src/decode-mutator-selection.workflow.ts index 168e556f1..5f703fe0b 100644 --- a/packages/stryker-js/src/decode-mutator-selection.workflow.ts +++ b/packages/stryker-js/src/decode-mutator-selection.workflow.ts @@ -7,41 +7,47 @@ import * as S from 'effect/Schema' import { type MergedCatalog, MergedCatalogSchema } from './plan-mutator-catalogs.workflow.js' -export class DecodeMutatorSelectionCommand extends S.TaggedClass()( - 'DecodeMutatorSelectionCommand', - { - catalogs: S.Array(MergedCatalogSchema), - excludedMutations: S.Array(S.String), - optInMutations: S.Array(S.String), - }, -) { +export class DecodeMutatorSelectionCommand + extends S.TaggedClass()( + 'DecodeMutatorSelectionCommand', + { + catalogs: S.Array(MergedCatalogSchema), + excludedMutations: S.Array(S.String), + optInMutations: S.Array(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const MutatorSelectionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutatorSelection') type MutatorSelectionTypeId = typeof MutatorSelectionTypeId -export class MutatorSelectionDecoded extends S.TaggedClass()('MutatorSelectionDecoded', { - excludedMutations: S.Array(S.String), - optInMutations: S.Array(S.String), -}) { +export class MutatorSelectionDecoded + extends S.TaggedClass()('MutatorSelectionDecoded', { + excludedMutations: S.Array(S.String), + optInMutations: S.Array(S.String), + }) +{ readonly [MutatorSelectionTypeId] = MutatorSelectionTypeId } -export class MutatorSelectionRefused extends S.TaggedError()('MutatorSelectionRefused', { - reason: S.Literals(['UnknownName', 'NotOptInTier']), - name: S.String, -}) { +export class MutatorSelectionRefused + extends S.TaggedError()('MutatorSelectionRefused', { + reason: S.Literals(['UnknownName', 'NotOptInTier']), + mutatorName: S.String, + }) +{ override get message(): string { return Match.value(this.reason).pipe( Match.when( 'UnknownName', - () => `Refused the mutator selection: no loaded catalog declares a mutator named "${this.name}".`, + () => `Refused the mutator selection: no loaded catalog declares a mutator named "${this.mutatorName}".`, ), Match.when( 'NotOptInTier', () => - `Refused the mutator selection: "${this.name}" is a default-tier mutator, and only an opt-in entry may be named by optInMutations.`, + `Refused the mutator selection: "${this.mutatorName}" is a default-tier mutator, and only an opt-in entry may be named by optInMutations.`, ), Match.exhaustive, ) @@ -77,7 +83,7 @@ const excludedRefusalOf = ( ): Result.Result => Option.match(refusedNameIn(index.declared, command.excludedMutations), { onNone: () => Result.succeed(undefined), - onSome: (name) => Result.fail(MutatorSelectionRefused.make({ reason: 'UnknownName', name })), + onSome: (name) => Result.fail(MutatorSelectionRefused.make({ reason: 'UnknownName', mutatorName: name })), }) const optInRefusalOf = ( @@ -86,7 +92,7 @@ const optInRefusalOf = ( ): Result.Result => Option.match(refusedNameIn(index.optIn, command.optInMutations), { onNone: () => Result.succeed(undefined), - onSome: (name) => Result.fail(MutatorSelectionRefused.make({ reason: reasonFor(index, name), name })), + onSome: (name) => Result.fail(MutatorSelectionRefused.make({ reason: reasonFor(index, name), mutatorName: name })), }) const decide = ( diff --git a/packages/stryker-js/src/detect-dry-run-flakes.workflow.ts b/packages/stryker-js/src/detect-dry-run-flakes.workflow.ts index e01c87c2f..cd7d0198a 100644 --- a/packages/stryker-js/src/detect-dry-run-flakes.workflow.ts +++ b/packages/stryker-js/src/detect-dry-run-flakes.workflow.ts @@ -11,26 +11,32 @@ import { type DryRunPass, DryRunPassSchema } from './dry-run-coverage.schema.js' const DryRunFlakeDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/DryRunFlakeDecision') type DryRunFlakeDecisionTypeId = typeof DryRunFlakeDecisionTypeId -export class DryRunFlakesDetected extends S.TaggedClass()('DryRunFlakesDetected', { - flakyTestIds: S.Array(S.String), - flakyMutantIds: S.Array(S.String), -}) { +export class DryRunFlakesDetected + extends S.TaggedClass()('DryRunFlakesDetected', { + flakyTestIds: S.Array(S.String), + flakyMutantIds: S.Array(S.String), + }) +{ readonly [DryRunFlakeDecisionTypeId] = DryRunFlakeDecisionTypeId } -export class DryRunFlakesAbsent extends S.TaggedClass()('DryRunFlakesAbsent', {}) { +export class DryRunFlakesAbsent + extends S.TaggedClass()('DryRunFlakesAbsent', {}) +{ readonly [DryRunFlakeDecisionTypeId] = DryRunFlakeDecisionTypeId } export type DryRunFlakeDecision = DryRunFlakesDetected | DryRunFlakesAbsent -export class DetectDryRunFlakesCommand extends S.TaggedClass()( - 'DetectDryRunFlakesCommand', - { - first: DryRunPassSchema, - second: DryRunPassSchema, - }, -) { +export class DetectDryRunFlakesCommand + extends S.TaggedClass()( + 'DetectDryRunFlakesCommand', + { + first: DryRunPassSchema, + second: DryRunPassSchema, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/dry-run-candidates.workflow.ts b/packages/stryker-js/src/dry-run-candidates.workflow.ts index aa43546dc..9031662bc 100644 --- a/packages/stryker-js/src/dry-run-candidates.workflow.ts +++ b/packages/stryker-js/src/dry-run-candidates.workflow.ts @@ -12,35 +12,43 @@ const DryRunCandidatesDecisionTypeId: unique symbol = Symbol.for( ) type DryRunCandidatesDecisionTypeId = typeof DryRunCandidatesDecisionTypeId -export class CandidatesKept extends S.TaggedClass()('CandidatesKept', { - indices: S.Array(S.Int), - droppedOtherRoot: S.Int, - droppedUnrecorded: S.Int, -}) { +export class CandidatesKept + extends S.TaggedClass()('CandidatesKept', { + indices: S.Array(S.Int), + droppedOtherRoot: S.Int, + droppedUnrecorded: S.Int, + }) +{ readonly [DryRunCandidatesDecisionTypeId] = DryRunCandidatesDecisionTypeId } -export class CandidatesUnderOtherRoots extends S.TaggedClass()( - 'CandidatesUnderOtherRoots', - { roots: S.Array(S.String) }, -) { +export class CandidatesUnderOtherRoots + extends S.TaggedClass()( + 'CandidatesUnderOtherRoots', + { roots: S.Array(S.String) }, + ) +{ readonly [DryRunCandidatesDecisionTypeId] = DryRunCandidatesDecisionTypeId } -export class CandidatesUnrecorded extends S.TaggedClass()('CandidatesUnrecorded', {}) { +export class CandidatesUnrecorded + extends S.TaggedClass()('CandidatesUnrecorded', {}) +{ readonly [DryRunCandidatesDecisionTypeId] = DryRunCandidatesDecisionTypeId } -export class NoCandidates extends S.TaggedClass()('NoCandidates', {}) { +export class NoCandidates extends S.TaggedClass()('NoCandidates', {}) { readonly [DryRunCandidatesDecisionTypeId] = DryRunCandidatesDecisionTypeId } export type DryRunCandidatesDecision = CandidatesKept | CandidatesUnderOtherRoots | CandidatesUnrecorded | NoCandidates -export class DryRunCandidatesCommand extends S.TaggedClass()('DryRunCandidatesCommand', { - currentRoot: S.String, - candidates: S.Array(CoverageRootSchema), -}) { +export class DryRunCandidatesCommand + extends S.TaggedClass()('DryRunCandidatesCommand', { + currentRoot: S.String, + candidates: S.Array(CoverageRootSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = { currentRoot: 'stryker.dry_run_candidates.current_root', } as const diff --git a/packages/stryker-js/src/dry-run-reuse.workflow.ts b/packages/stryker-js/src/dry-run-reuse.workflow.ts index c9fe8f4b2..ce06ee4e4 100644 --- a/packages/stryker-js/src/dry-run-reuse.workflow.ts +++ b/packages/stryker-js/src/dry-run-reuse.workflow.ts @@ -15,26 +15,32 @@ import { const DryRunReuseDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/DryRunReuseDecision') type DryRunReuseDecisionTypeId = typeof DryRunReuseDecisionTypeId -export class DryRunCoverageReused extends S.TaggedClass()('DryRunCoverageReused', { - testClosureDigest: S.String, -}) { +export class DryRunCoverageReused + extends S.TaggedClass()('DryRunCoverageReused', { + testClosureDigest: S.String, + }) +{ readonly [DryRunReuseDecisionTypeId] = DryRunReuseDecisionTypeId } -export class DryRunCoverageStale extends S.TaggedClass()('DryRunCoverageStale', { - reason: DryRunRunReasonSchema, -}) { +export class DryRunCoverageStale + extends S.TaggedClass()('DryRunCoverageStale', { + reason: DryRunRunReasonSchema, + }) +{ readonly [DryRunReuseDecisionTypeId] = DryRunReuseDecisionTypeId } export type DryRunReuseDecision = DryRunCoverageReused | DryRunCoverageStale -export class DryRunReuseCommand extends S.TaggedClass()('DryRunReuseCommand', { - prior: DryRunReusePriorSchema, - currentTestClosureDigest: S.optional(S.String), - currentRunInputsDigest: S.String, - force: S.Boolean, -}) { +export class DryRunReuseCommand + extends S.TaggedClass()('DryRunReuseCommand', { + prior: DryRunReusePriorSchema, + currentTestClosureDigest: S.optional(S.String), + currentRunInputsDigest: S.String, + force: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = { force: 'stryker.dry_run_reuse.force', currentRunInputsDigest: 'stryker.dry_run_reuse.run_inputs_digest', diff --git a/packages/stryker-js/src/dry-run.workflow.ts b/packages/stryker-js/src/dry-run.workflow.ts index 7e810cab9..8f48d2400 100644 --- a/packages/stryker-js/src/dry-run.workflow.ts +++ b/packages/stryker-js/src/dry-run.workflow.ts @@ -3,7 +3,7 @@ import * as Match from 'effect/Match' import * as Result from 'effect/Result' import * as S from 'effect/Schema' -export class DryRunError extends S.TaggedError()('DryRunError', { +export class DryRunError extends S.TaggedError()('DryRunError', { stage: S.Literals(['dryRun', 'dryRunNoTests']), reason: S.String, }) { @@ -12,12 +12,14 @@ export class DryRunError extends S.TaggedError()('DryRunError', { } } -export class FailedTestSummary extends S.Class('FailedTestSummary')({ - name: S.String, - failureMessage: S.String, -}) {} +export class FailedTestSummary + extends S.Class('FailedTestSummary')({ + name: S.String, + failureMessage: S.String, + }) +{} -export class DryRunCommand extends S.TaggedClass()('DryRunCommand', { +export class DryRunCommand extends S.TaggedClass()('DryRunCommand', { status: S.Literals(['Complete', 'Error', 'Timeout']), testCount: S.Finite, failedTestCount: S.Finite, @@ -37,13 +39,13 @@ export class DryRunCommand extends S.TaggedClass()('DryRunCommand const DryRunDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/DryRunDecision') type DryRunDecisionTypeId = typeof DryRunDecisionTypeId -export class DryRunPassed extends S.TaggedClass()('DryRunPassed', { +export class DryRunPassed extends S.TaggedClass()('DryRunPassed', { testCount: S.Finite, }) { readonly [DryRunDecisionTypeId] = DryRunDecisionTypeId } -export class DryRunFailed extends S.TaggedClass()('DryRunFailed', { +export class DryRunFailed extends S.TaggedClass()('DryRunFailed', { testCount: S.Finite, failedTestCount: S.Finite, failedTests: S.Array(FailedTestSummary), diff --git a/packages/stryker-js/src/empty-directory.schema.ts b/packages/stryker-js/src/empty-directory.schema.ts index 04686c556..d7d5fce70 100644 --- a/packages/stryker-js/src/empty-directory.schema.ts +++ b/packages/stryker-js/src/empty-directory.schema.ts @@ -1,12 +1,14 @@ import * as S from 'effect/Schema' -export class EmptyDirectoryRemovalRejected extends S.TaggedError()( - 'EmptyDirectoryRemovalRejected', - { - code: S.UndefinedOr(S.String), - cause: S.Unknown, - }, -) { +export class EmptyDirectoryRemovalRejected + extends S.TaggedError()( + 'EmptyDirectoryRemovalRejected', + { + code: S.UndefinedOr(S.String), + cause: S.Unknown, + }, + ) +{ override get message(): string { return `Removing the directory failed (errno: ${String(this.code)})` } diff --git a/packages/stryker-js/src/engine-identity.schema.ts b/packages/stryker-js/src/engine-identity.schema.ts index 25cfa0f11..b0bab390d 100644 --- a/packages/stryker-js/src/engine-identity.schema.ts +++ b/packages/stryker-js/src/engine-identity.schema.ts @@ -1,9 +1,11 @@ import * as S from 'effect/Schema' -export class EngineIdentityUnreadable extends S.TaggedError()('EngineIdentityUnreadable', { - manifest: S.String, - cause: S.Unknown, -}) { +export class EngineIdentityUnreadable + extends S.TaggedError()('EngineIdentityUnreadable', { + manifest: S.String, + cause: S.Unknown, + }) +{ override get message(): string { return `The engine's identity is unreadable: every path the "files" field of ${this.manifest} declares must exist` } diff --git a/packages/stryker-js/src/frame-run-event.workflow.ts b/packages/stryker-js/src/frame-run-event.workflow.ts index 189ab9f9d..77dc07acf 100644 --- a/packages/stryker-js/src/frame-run-event.workflow.ts +++ b/packages/stryker-js/src/frame-run-event.workflow.ts @@ -24,7 +24,7 @@ export const FramingState = S.Struct({ }) export type FramingState = typeof FramingState.Type -export class FrameRunEventCommand extends S.TaggedClass()( +export class FrameRunEventCommand extends S.TaggedClass()( 'FrameRunEventCommand', { state: FramingState, @@ -34,7 +34,7 @@ export class FrameRunEventCommand extends S.TaggedClass()( static readonly [Workflow.InstrumentationBrand] = {} as const } -export class EventFramed extends S.TaggedClass()('EventFramed', { +export class EventFramed extends S.TaggedClass()('EventFramed', { state: FramingState, event: RunEvent.RunEvent, stderrLine: S.NullOr(S.String), @@ -42,7 +42,7 @@ export class EventFramed extends S.TaggedClass()('EventFramed', { readonly [FrameRunEventTypeId] = FrameRunEventTypeId } -export class EventSuppressed extends S.TaggedClass()( +export class EventSuppressed extends S.TaggedClass()( 'EventSuppressed', { state: FramingState, diff --git a/packages/stryker-js/src/gate-new-survivors.workflow.ts b/packages/stryker-js/src/gate-new-survivors.workflow.ts index b402569dd..ad9051d1a 100644 --- a/packages/stryker-js/src/gate-new-survivors.workflow.ts +++ b/packages/stryker-js/src/gate-new-survivors.workflow.ts @@ -35,7 +35,7 @@ const idOrder: Order.Order = Order.mapInput(Order.String, (entry) => const GateNewSurvivorsTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/GateNewSurvivorsDecision') type GateNewSurvivorsTypeId = typeof GateNewSurvivorsTypeId -export class GateCleared extends S.TaggedClass()('GateCleared', { +export class GateCleared extends S.TaggedClass()('GateCleared', { baseline: S.NullOr(Baseline), unchecked: Mutant.MutantId.pipe(S.Array), }) { @@ -45,16 +45,18 @@ export class GateCleared extends S.TaggedClass()('GateCleared', { export const GateNewSurvivorsDecision = S.Union([GateCleared]) export type GateNewSurvivorsDecision = typeof GateNewSurvivorsDecision.Type -export class GateNewSurvivorsCommand extends S.TaggedClass()('GateNewSurvivorsCommand', { - entries: S.Array(GateEntry), - committed: Mutant.MutantId.pipe(S.Array, S.NullOr), - baselineFile: S.String, - updateBaseline: S.Boolean, -}) { +export class GateNewSurvivorsCommand + extends S.TaggedClass()('GateNewSurvivorsCommand', { + entries: S.Array(GateEntry), + committed: Mutant.MutantId.pipe(S.Array, S.NullOr), + baselineFile: S.String, + updateBaseline: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class GateRejected extends S.TaggedError()('GateRejected', { +export class GateRejected extends S.TaggedError()('GateRejected', { newSurvivors: S.Array(GateEntry), unchecked: Mutant.MutantId.pipe(S.Array), }) { @@ -73,9 +75,11 @@ export class GateRejected extends S.TaggedError()('GateRejected', } } -export class GateInputUnusable extends S.TaggedError()('GateInputUnusable', { - reason: S.String, -}) { +export class GateInputUnusable + extends S.TaggedError()('GateInputUnusable', { + reason: S.String, + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass override get message(): string { diff --git a/packages/stryker-js/src/gate-score-break.workflow.ts b/packages/stryker-js/src/gate-score-break.workflow.ts index 0ad73e2ae..1cc78ae28 100644 --- a/packages/stryker-js/src/gate-score-break.workflow.ts +++ b/packages/stryker-js/src/gate-score-break.workflow.ts @@ -40,9 +40,11 @@ const BreakBreach = S.Struct({ ) export type BreakBreach = typeof BreakBreach.Type -export class GateScoreBreakCommand extends S.TaggedClass()('GateScoreBreakCommand', { - projects: S.Array(ProjectScore), -}) { +export class GateScoreBreakCommand + extends S.TaggedClass()('GateScoreBreakCommand', { + projects: S.Array(ProjectScore), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -58,10 +60,12 @@ const notesOf = (unscored: ReadonlyArray, unrecorded: ReadonlyArray()('ScoreAtOrAboveBreak', { - unscored: S.Array(S.String), - unrecorded: S.Array(S.String), -}) { +export class ScoreAtOrAboveBreak + extends S.TaggedClass()('ScoreAtOrAboveBreak', { + unscored: S.Array(S.String), + unrecorded: S.Array(S.String), + }) +{ readonly [GateScoreBreakTypeId] = GateScoreBreakTypeId get lines(): ReadonlyArray { @@ -72,12 +76,14 @@ export class ScoreAtOrAboveBreak extends S.TaggedClass()('S export const GateScoreBreakDecision = S.Union([ScoreAtOrAboveBreak]) export type GateScoreBreakDecision = typeof GateScoreBreakDecision.Type -export class ScoreBelowBreak extends S.TaggedError()('ScoreBelowBreak', { - breaches: S.NonEmptyArray(BreakBreach), - projects: S.Natural, - unscored: S.Array(S.String), - unrecorded: S.Array(S.String), -}) { +export class ScoreBelowBreak + extends S.TaggedError()('ScoreBelowBreak', { + breaches: S.NonEmptyArray(BreakBreach), + projects: S.Natural, + unscored: S.Array(S.String), + unrecorded: S.Array(S.String), + }) +{ readonly code = SCORE_BREAK_CODE readonly exitClass = SCORE_BREAK_EXIT_CLASS diff --git a/packages/stryker-js/src/git-diff.schema.ts b/packages/stryker-js/src/git-diff.schema.ts index b33ccbadd..39423ae6a 100644 --- a/packages/stryker-js/src/git-diff.schema.ts +++ b/packages/stryker-js/src/git-diff.schema.ts @@ -23,19 +23,23 @@ export const GitDiffResult = S.Struct({ export type GitDiffResult = typeof GitDiffResult.Type -export class GitRefUnresolved extends S.TaggedError()('GitRefUnresolved', { - ref: S.String, - detail: S.String, -}) { +export class GitRefUnresolved + extends S.TaggedError()('GitRefUnresolved', { + ref: S.String, + detail: S.String, + }) +{ override get message(): string { return `Cannot resolve git ref "${this.ref}": ${this.detail}` } } -export class GitCommandFailed extends S.TaggedError()('GitCommandFailed', { - command: S.String, - detail: S.String, -}) { +export class GitCommandFailed + extends S.TaggedError()('GitCommandFailed', { + command: S.String, + detail: S.String, + }) +{ override get message(): string { return `git ${this.command} failed: ${this.detail}` } @@ -43,20 +47,22 @@ export class GitCommandFailed extends S.TaggedError()('GitComm export type GitDiffError = GitRefUnresolved | GitCommandFailed -export class DiffScopeCommand extends S.TaggedClass()('DiffScopeCommand', { - hunks: S.Array(DiffHunk), - untrackedFiles: S.Array(S.String), -}) { +export class DiffScopeCommand + extends S.TaggedClass()('DiffScopeCommand', { + hunks: S.Array(DiffHunk), + untrackedFiles: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class DiffScoped extends S.TaggedClass()('DiffScoped', { +export class DiffScoped extends S.TaggedClass()('DiffScoped', { ranges: S.Array(S.String), }) { readonly [DiffScopeTypeId] = DiffScopeTypeId } -export class FullScope extends S.TaggedClass()('FullScope', { +export class FullScope extends S.TaggedClass()('FullScope', { reason: S.String, }) { readonly [DiffScopeTypeId] = DiffScopeTypeId diff --git a/packages/stryker-js/src/import-closure.schema.ts b/packages/stryker-js/src/import-closure.schema.ts index d5a92bafd..d8e08c0ed 100644 --- a/packages/stryker-js/src/import-closure.schema.ts +++ b/packages/stryker-js/src/import-closure.schema.ts @@ -17,19 +17,23 @@ export type ImportClosureModule = typeof ImportClosureModuleSchema.Type export type ImportClosureModuleTable = Readonly> -export class ImportClosureCommand extends S.TaggedClass()('ImportClosureCommand', { - modules: S.Record(S.String, ImportClosureModuleSchema), - globalInputs: S.Array(S.String), - testFiles: S.Array(S.String), -}) { +export class ImportClosureCommand + extends S.TaggedClass()('ImportClosureCommand', { + modules: S.Record(S.String, ImportClosureModuleSchema), + globalInputs: S.Array(S.String), + testFiles: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class TestFileClosure extends S.TaggedClass()('TestFileClosure', { - testFile: S.String, - files: S.Array(S.String), - open: S.Boolean, -}) { +export class TestFileClosure + extends S.TaggedClass()('TestFileClosure', { + testFile: S.String, + files: S.Array(S.String), + open: S.Boolean, + }) +{ readonly [ImportClosureTypeId] = ImportClosureTypeId } @@ -125,32 +129,45 @@ const ModuleSpecifierKindTypeId: unique symbol = Symbol.for('@systemfsoftware/st type ModuleSpecifierKindTypeId = typeof ModuleSpecifierKindTypeId export class ClassifyModuleSpecifierCommand - extends S.TaggedClass()('ClassifyModuleSpecifierCommand', { - specifier: S.String, - builtins: S.Array(S.String), - }) + extends S.TaggedClass()( + 'ClassifyModuleSpecifierCommand', + { + specifier: S.String, + builtins: S.Array(S.String), + }, + ) { static readonly [Workflow.InstrumentationBrand] = {} as const } -export class PathSpecifier extends S.TaggedClass()('PathSpecifier', { specifier: S.String }) { +export class PathSpecifier + extends S.TaggedClass()('PathSpecifier', { specifier: S.String }) +{ readonly [ModuleSpecifierKindTypeId] = ModuleSpecifierKindTypeId } export class SubpathImportSpecifier - extends S.TaggedClass()('SubpathImportSpecifier', { specifier: S.String }) + extends S.TaggedClass()('SubpathImportSpecifier', { + specifier: S.String, + }) { readonly [ModuleSpecifierKindTypeId] = ModuleSpecifierKindTypeId } -export class BuiltinSpecifier extends S.TaggedClass()('BuiltinSpecifier', { specifier: S.String }) { +export class BuiltinSpecifier + extends S.TaggedClass()('BuiltinSpecifier', { + specifier: S.String, + }) +{ readonly [ModuleSpecifierKindTypeId] = ModuleSpecifierKindTypeId } -export class PackageSpecifier extends S.TaggedClass()('PackageSpecifier', { - packageName: S.String, - subpath: S.String, -}) { +export class PackageSpecifier + extends S.TaggedClass()('PackageSpecifier', { + packageName: S.String, + subpath: S.String, + }) +{ readonly [ModuleSpecifierKindTypeId] = ModuleSpecifierKindTypeId } @@ -176,36 +193,48 @@ export const ModuleSpecifierKindSchema = S.Union([ export type ModuleSpecifierKind = typeof ModuleSpecifierKindSchema.Type export class PackageExportRequest - extends S.TaggedClass()('PackageExportRequest', { subpath: S.String }) + extends S.TaggedClass()('PackageExportRequest', { + subpath: S.String, + }) {} export class PackageImportRequest - extends S.TaggedClass()('PackageImportRequest', { specifier: S.String }) + extends S.TaggedClass()('PackageImportRequest', { + specifier: S.String, + }) {} const ManifestTargetTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ManifestTarget') type ManifestTargetTypeId = typeof ManifestTargetTypeId -export class ManifestTargetCommand extends S.TaggedClass()('ManifestTargetCommand', { - manifest: PackageManifestSchema, - request: S.Union([PackageExportRequest, PackageImportRequest]), -}) { +export class ManifestTargetCommand + extends S.TaggedClass()('ManifestTargetCommand', { + manifest: PackageManifestSchema, + request: S.Union([PackageExportRequest, PackageImportRequest]), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } export class ManifestPathTarget - extends S.TaggedClass()('ManifestPathTarget', { target: S.String }) + extends S.TaggedClass()('ManifestPathTarget', { + target: S.String, + }) { readonly [ManifestTargetTypeId] = ManifestTargetTypeId } export class ManifestPackageTarget - extends S.TaggedClass()('ManifestPackageTarget', { specifier: S.String }) + extends S.TaggedClass()('ManifestPackageTarget', { + specifier: S.String, + }) { readonly [ManifestTargetTypeId] = ManifestTargetTypeId } -export class ManifestTargetMissing extends S.TaggedClass()('ManifestTargetMissing', {}) { +export class ManifestTargetMissing + extends S.TaggedClass()('ManifestTargetMissing', {}) +{ readonly [ManifestTargetTypeId] = ManifestTargetTypeId } @@ -219,20 +248,27 @@ const ModuleSpecifiersTypeId: unique symbol = Symbol.for('@systemfsoftware/stryk type ModuleSpecifiersTypeId = typeof ModuleSpecifiersTypeId export class ExtractModuleSpecifiersCommand - extends S.TaggedClass()('ExtractModuleSpecifiersCommand', { program: S.Json }) + extends S.TaggedClass()( + 'ExtractModuleSpecifiersCommand', + { program: S.Json }, + ) { static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ModuleSpecifiersClosed extends S.TaggedClass()('ModuleSpecifiersClosed', { - specifiers: S.Array(S.String), -}) { +export class ModuleSpecifiersClosed + extends S.TaggedClass()('ModuleSpecifiersClosed', { + specifiers: S.Array(S.String), + }) +{ readonly [ModuleSpecifiersTypeId] = ModuleSpecifiersTypeId } -export class ModuleSpecifiersOpen extends S.TaggedClass()('ModuleSpecifiersOpen', { - specifiers: S.Array(S.String), -}) { +export class ModuleSpecifiersOpen + extends S.TaggedClass()('ModuleSpecifiersOpen', { + specifiers: S.Array(S.String), + }) +{ readonly [ModuleSpecifiersTypeId] = ModuleSpecifiersTypeId } diff --git a/packages/stryker-js/src/incremental-diff.workflow.ts b/packages/stryker-js/src/incremental-diff.workflow.ts index 3b07f23a0..580ebe261 100644 --- a/packages/stryker-js/src/incremental-diff.workflow.ts +++ b/packages/stryker-js/src/incremental-diff.workflow.ts @@ -24,18 +24,20 @@ const NO_PREVIOUS_RECORDS: readonly PreviousReuseRecord[] = [] const IncrementalDiffTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/IncrementalDiff') type IncrementalDiffTypeId = typeof IncrementalDiffTypeId -export class IncrementalDiffCommand extends S.TaggedClass()('IncrementalDiffCommand', { - currentMutants: S.Array(Mutant.Mutant), - previousRecords: S.Array(PreviousReuseRecordSchema), - closureDigestsByMutantId: S.Record(Mutant.MutantId, S.String), - closureAnalysisFailed: S.Boolean, - engineDigest: S.String, - mutantSetPolicy: Options.MutantSetPolicy, - runInputsDigest: S.String, - force: S.Boolean, - flakyMutantIds: S.String.pipe(S.Array, S.optional), - programDigest: S.optional(S.String), -}) { +export class IncrementalDiffCommand + extends S.TaggedClass()('IncrementalDiffCommand', { + currentMutants: S.Array(Mutant.Mutant), + previousRecords: S.Array(PreviousReuseRecordSchema), + closureDigestsByMutantId: S.Record(Mutant.MutantId, S.String), + closureAnalysisFailed: S.Boolean, + engineDigest: S.String, + mutantSetPolicy: Options.MutantSetPolicy, + runInputsDigest: S.String, + force: S.Boolean, + flakyMutantIds: S.String.pipe(S.Array, S.optional), + programDigest: S.optional(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = { force: 'stryker.incremental_diff.force', } as const @@ -50,26 +52,30 @@ const rememberedFields = { killedBy: S.String.pipe(S.Array, S.optional), } -export class MutantRememberedIgnored extends S.TaggedClass()('MutantRemembered', { - ...rememberedFields, - status: S.Literal('Ignored'), - statusReason: Mutant.IgnoreStatusReasonText, -}) { +export class MutantRememberedIgnored + extends S.TaggedClass()('MutantRemembered', { + ...rememberedFields, + status: S.Literal('Ignored'), + statusReason: Mutant.IgnoreStatusReasonText, + }) +{ readonly [IncrementalDiffTypeId] = IncrementalDiffTypeId } -export class MutantRememberedSettled extends S.TaggedClass()('MutantRemembered', { - ...rememberedFields, - status: Mutant.SettledStatusSchema, - statusReason: S.optional(S.String), -}) { +export class MutantRememberedSettled + extends S.TaggedClass()('MutantRemembered', { + ...rememberedFields, + status: Mutant.SettledStatusSchema, + statusReason: S.optional(S.String), + }) +{ readonly [IncrementalDiffTypeId] = IncrementalDiffTypeId } export const MutantRemembered = S.Union([MutantRememberedIgnored, MutantRememberedSettled]) export type MutantRemembered = typeof MutantRemembered.Type -export class MutantToRun extends S.TaggedClass()('MutantToRun', { +export class MutantToRun extends S.TaggedClass()('MutantToRun', { mutant: Mutant.Mutant, refusal: ReuseRefusalReasonSchema, priorTimeout: S.optional(TimeoutEvidenceSchema), diff --git a/packages/stryker-js/src/interpret-dry-run-observation.workflow.ts b/packages/stryker-js/src/interpret-dry-run-observation.workflow.ts index 283fdcd6e..2914aac47 100644 --- a/packages/stryker-js/src/interpret-dry-run-observation.workflow.ts +++ b/packages/stryker-js/src/interpret-dry-run-observation.workflow.ts @@ -5,10 +5,12 @@ import * as Option from 'effect/Option' import * as Result from 'effect/Result' import * as S from 'effect/Schema' -export class DryRunObservation extends S.TaggedClass()('DryRunObservation', { - dryRunResult: TestRunner.DryRunResultSchema, - allowEmpty: S.Boolean, -}) { +export class DryRunObservation + extends S.TaggedClass()('DryRunObservation', { + dryRunResult: TestRunner.DryRunResultSchema, + allowEmpty: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -19,23 +21,29 @@ const DryRunObservationDecisionTypeId: unique symbol = Symbol.for( ) type DryRunObservationDecisionTypeId = typeof DryRunObservationDecisionTypeId -export class DryRunObservedComplete extends S.TaggedClass()('DryRunObservedComplete', { - testCount: S.Finite, - failedTestCount: S.Finite, - failedTests: S.Array(FailureSummarySchema), -}) { +export class DryRunObservedComplete + extends S.TaggedClass()('DryRunObservedComplete', { + testCount: S.Finite, + failedTestCount: S.Finite, + failedTests: S.Array(FailureSummarySchema), + }) +{ readonly [DryRunObservationDecisionTypeId] = DryRunObservationDecisionTypeId } -export class DryRunObservedFailed extends S.TaggedClass()('DryRunObservedFailed', { - errorMessage: S.String, -}) { +export class DryRunObservedFailed + extends S.TaggedClass()('DryRunObservedFailed', { + errorMessage: S.String, + }) +{ readonly [DryRunObservationDecisionTypeId] = DryRunObservationDecisionTypeId } -export class DryRunObservedTimedOut extends S.TaggedClass()('DryRunObservedTimedOut', { - reason: S.optional(S.String), -}) { +export class DryRunObservedTimedOut + extends S.TaggedClass()('DryRunObservedTimedOut', { + reason: S.optional(S.String), + }) +{ readonly [DryRunObservationDecisionTypeId] = DryRunObservationDecisionTypeId } diff --git a/packages/stryker-js/src/interpret-dry-run-result.workflow.ts b/packages/stryker-js/src/interpret-dry-run-result.workflow.ts index bfe3718e1..b49132639 100644 --- a/packages/stryker-js/src/interpret-dry-run-result.workflow.ts +++ b/packages/stryker-js/src/interpret-dry-run-result.workflow.ts @@ -8,7 +8,7 @@ import * as S from 'effect/Schema' const MutantRunDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutantRunDecision') type MutantRunDecisionTypeId = typeof MutantRunDecisionTypeId -export class MutantRunErrored extends S.TaggedClass()('Error', { +export class MutantRunErrored extends S.TaggedClass()('Error', { errorMessage: S.String, }) { readonly [MutantRunDecisionTypeId] = MutantRunDecisionTypeId @@ -18,7 +18,7 @@ export class MutantRunErrored extends S.TaggedClass()('Error', } } -export class MutantRunKilled extends S.TaggedClass()('Killed', { +export class MutantRunKilled extends S.TaggedClass()('Killed', { failureMessage: S.String, killedBy: S.Array(TestRunner.TestId), nrOfTests: S.Natural, @@ -37,10 +37,12 @@ export class MutantRunKilled extends S.TaggedClass()('Killed', } } -export class MutantRunSurvived extends S.TaggedClass()('Survived', { - nrOfTests: S.Natural, - executedTests: S.Array(TestRunner.ExecutedTestSchema), -}) { +export class MutantRunSurvived + extends S.TaggedClass()('Survived', { + nrOfTests: S.Natural, + executedTests: S.Array(TestRunner.ExecutedTestSchema), + }) +{ readonly [MutantRunDecisionTypeId] = MutantRunDecisionTypeId get asResult(): TestRunner.MutantRunResult { @@ -48,9 +50,11 @@ export class MutantRunSurvived extends S.TaggedClass()('Survi } } -export class MutantRunTimedOut extends S.TaggedClass()('Timeout', { - reason: S.optional(S.String), -}) { +export class MutantRunTimedOut + extends S.TaggedClass()('Timeout', { + reason: S.optional(S.String), + }) +{ readonly [MutantRunDecisionTypeId] = MutantRunDecisionTypeId get asResult(): TestRunner.MutantRunResult { @@ -63,10 +67,12 @@ export class MutantRunTimedOut extends S.TaggedClass()('Timeo export type MutantRunDecision = MutantRunErrored | MutantRunKilled | MutantRunSurvived | MutantRunTimedOut -export class InterpretDryRunResultCommand extends S.TaggedClass()( - 'InterpretDryRunResultCommand', - { dryRunResult: TestRunner.DryRunResultSchema }, -) { +export class InterpretDryRunResultCommand + extends S.TaggedClass()( + 'InterpretDryRunResultCommand', + { dryRunResult: TestRunner.DryRunResultSchema }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/interpret-mutant-run.workflow.ts b/packages/stryker-js/src/interpret-mutant-run.workflow.ts index 1647684b0..834e0e352 100644 --- a/packages/stryker-js/src/interpret-mutant-run.workflow.ts +++ b/packages/stryker-js/src/interpret-mutant-run.workflow.ts @@ -9,21 +9,27 @@ type MutantRunOutcomeTypeId = typeof MutantRunOutcomeTypeId export const NoCoveringTestExecutedReason = S.Literal('no covering test executed') -export class MutantRunSettled extends S.TaggedClass()('MutantRunSettled', {}) { +export class MutantRunSettled + extends S.TaggedClass()('MutantRunSettled', {}) +{ readonly [MutantRunOutcomeTypeId] = MutantRunOutcomeTypeId } export class MutantRunPoolInvalidated - extends S.TaggedClass()('MutantRunPoolInvalidated', {}) + extends S.TaggedClass()('MutantRunPoolInvalidated', {}) { readonly [MutantRunOutcomeTypeId] = MutantRunOutcomeTypeId } -export class MutantRunRetry extends S.TaggedClass()('MutantRunRetry', {}) { +export class MutantRunRetry + extends S.TaggedClass()('MutantRunRetry', {}) +{ readonly [MutantRunOutcomeTypeId] = MutantRunOutcomeTypeId } -export class MutantRunRetryExhausted extends S.TaggedClass()('MutantRunRetryExhausted', {}) { +export class MutantRunRetryExhausted + extends S.TaggedClass()('MutantRunRetryExhausted', {}) +{ readonly [MutantRunOutcomeTypeId] = MutantRunOutcomeTypeId } @@ -33,12 +39,14 @@ export type MutantRunOutcome = | MutantRunRetry | MutantRunRetryExhausted -export class MutantRunObservation extends S.Class('MutantRunObservation')({ - wallClockTimeout: S.Boolean, - coveringTests: S.String.pipe(S.Array), - executedTests: S.String.pipe(S.Array, S.optionalKey), - attempt: S.Natural, -}) { +export class MutantRunObservation + extends S.Class('MutantRunObservation')({ + wallClockTimeout: S.Boolean, + coveringTests: S.String.pipe(S.Array), + executedTests: S.String.pipe(S.Array, S.optionalKey), + attempt: S.Natural, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/judge-mutation-score.workflow.ts b/packages/stryker-js/src/judge-mutation-score.workflow.ts index 122c7bee7..df3e91f03 100644 --- a/packages/stryker-js/src/judge-mutation-score.workflow.ts +++ b/packages/stryker-js/src/judge-mutation-score.workflow.ts @@ -30,46 +30,58 @@ const BreakThresholdFromOption = S.NullOr(Report.Percentage).pipe( }), ) -export class JudgeMutationScoreCommand extends S.TaggedClass()('JudgeMutationScoreCommand', { - score: Report.MutationScore, - breakingThreshold: BreakThresholdFromOption, -}) { +export class JudgeMutationScoreCommand + extends S.TaggedClass()('JudgeMutationScoreCommand', { + score: Report.MutationScore, + breakingThreshold: BreakThresholdFromOption, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ScoredWithoutThreshold extends S.TaggedClass()('ScoredWithoutThreshold', { - percentage: Report.Percentage, - exitClass: S.Null, -}) { +export class ScoredWithoutThreshold + extends S.TaggedClass()('ScoredWithoutThreshold', { + percentage: Report.Percentage, + exitClass: S.Null, + }) +{ readonly [ScoreJudgementTypeId] = ScoreJudgementTypeId } -export class ScoreAtOrAboveThreshold extends S.TaggedClass()('ScoreAtOrAboveThreshold', { - percentage: Report.Percentage, - threshold: Report.Percentage, - exitClass: S.Null, -}) { +export class ScoreAtOrAboveThreshold + extends S.TaggedClass()('ScoreAtOrAboveThreshold', { + percentage: Report.Percentage, + threshold: Report.Percentage, + exitClass: S.Null, + }) +{ readonly [ScoreJudgementTypeId] = ScoreJudgementTypeId } -export class ScoreBelowThreshold extends S.TaggedClass()('ScoreBelowThreshold', { - percentage: Report.Percentage, - threshold: Report.Percentage, - exitClass: S.tag('VerdictFail'), -}) { +export class ScoreBelowThreshold + extends S.TaggedClass()('ScoreBelowThreshold', { + percentage: Report.Percentage, + threshold: Report.Percentage, + exitClass: S.tag('VerdictFail'), + }) +{ readonly [ScoreJudgementTypeId] = ScoreJudgementTypeId } -export class UnscoredAgainstThreshold extends S.TaggedClass()('UnscoredAgainstThreshold', { - threshold: Report.Percentage, - exitClass: S.Null, -}) { +export class UnscoredAgainstThreshold + extends S.TaggedClass()('UnscoredAgainstThreshold', { + threshold: Report.Percentage, + exitClass: S.Null, + }) +{ readonly [ScoreJudgementTypeId] = ScoreJudgementTypeId } -export class UnscoredWithoutThreshold extends S.TaggedClass()('UnscoredWithoutThreshold', { - exitClass: S.Null, -}) { +export class UnscoredWithoutThreshold + extends S.TaggedClass()('UnscoredWithoutThreshold', { + exitClass: S.Null, + }) +{ readonly [ScoreJudgementTypeId] = ScoreJudgementTypeId } diff --git a/packages/stryker-js/src/judge-sandbox-build.workflow.ts b/packages/stryker-js/src/judge-sandbox-build.workflow.ts index 32254ab1b..409b58d0f 100644 --- a/packages/stryker-js/src/judge-sandbox-build.workflow.ts +++ b/packages/stryker-js/src/judge-sandbox-build.workflow.ts @@ -8,15 +8,17 @@ import { StrykerError } from './stryker-error.schema.js' const JudgeSandboxBuildTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/JudgeSandboxBuild') type JudgeSandboxBuildTypeId = typeof JudgeSandboxBuildTypeId -export class SandboxBuildCommand extends S.TaggedClass()('SandboxBuildCommand', { - command: S.String, - exitCode: S.Int, - stderr: S.String, -}) { +export class SandboxBuildCommand + extends S.TaggedClass()('SandboxBuildCommand', { + command: S.String, + exitCode: S.Int, + stderr: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class SandboxBuilt extends S.TaggedClass()('SandboxBuilt', {}) { +export class SandboxBuilt extends S.TaggedClass()('SandboxBuilt', {}) { readonly [JudgeSandboxBuildTypeId] = JudgeSandboxBuildTypeId } diff --git a/packages/stryker-js/src/keep-temp-dir.workflow.ts b/packages/stryker-js/src/keep-temp-dir.workflow.ts index 928a4d149..2fdb5cb04 100644 --- a/packages/stryker-js/src/keep-temp-dir.workflow.ts +++ b/packages/stryker-js/src/keep-temp-dir.workflow.ts @@ -8,20 +8,24 @@ type KeepTempDirTypeId = typeof KeepTempDirTypeId const CleanTempDirOption = S.Literals(['always', false, true]) -export class TempDirKept extends S.TaggedClass()('TempDirKept', {}) { +export class TempDirKept extends S.TaggedClass()('TempDirKept', {}) { readonly [KeepTempDirTypeId] = KeepTempDirTypeId } -export class TempDirRemoved extends S.TaggedClass()('TempDirRemoved', {}) { +export class TempDirRemoved + extends S.TaggedClass()('TempDirRemoved', {}) +{ readonly [KeepTempDirTypeId] = KeepTempDirTypeId } export type KeepTempDirOutcome = TempDirKept | TempDirRemoved -export class KeepTempDirCommand extends S.TaggedClass()('KeepTempDirCommand', { - cleanTempDir: CleanTempDirOption, - failed: S.Boolean, -}) { +export class KeepTempDirCommand + extends S.TaggedClass()('KeepTempDirCommand', { + cleanTempDir: CleanTempDirOption, + failed: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/lockfile-closure.workflow.ts b/packages/stryker-js/src/lockfile-closure.workflow.ts index c7e69699b..2847e4d92 100644 --- a/packages/stryker-js/src/lockfile-closure.workflow.ts +++ b/packages/stryker-js/src/lockfile-closure.workflow.ts @@ -33,53 +33,71 @@ export const InstallSettingsSchema = S.Struct({ }) export type InstallSettings = typeof InstallSettingsSchema.Type -export class LockfileDecoded extends S.TaggedClass()('LockfileDecoded', { - lockfile: PnpmLockfileSchema, -}) {} - -export class LockfileUndecodable extends S.TaggedClass()('LockfileUndecodable', { - message: S.String, -}) {} +export class LockfileDecoded + extends S.TaggedClass()('LockfileDecoded', { + lockfile: PnpmLockfileSchema, + }) +{} -export class InstallSettingsRead extends S.TaggedClass()('InstallSettingsRead', { - settings: InstallSettingsSchema, -}) {} +export class LockfileUndecodable + extends S.TaggedClass()('LockfileUndecodable', { + message: S.String, + }) +{} -export class InstallSettingsUnreadable extends S.TaggedClass()( - 'InstallSettingsUnreadable', - { message: S.String }, -) {} +export class InstallSettingsRead + extends S.TaggedClass()('InstallSettingsRead', { + settings: InstallSettingsSchema, + }) +{} -export class PnpmLockfileRead extends S.TaggedClass()('PnpmLockfileRead', { - text: S.String, - lockfile: S.Union([LockfileDecoded, LockfileUndecodable]), - importerKey: S.NullOr(S.String), - installSettings: S.Union([InstallSettingsRead, InstallSettingsUnreadable]), -}) {} +export class InstallSettingsUnreadable + extends S.TaggedClass()( + 'InstallSettingsUnreadable', + { message: S.String }, + ) +{} + +export class PnpmLockfileRead + extends S.TaggedClass()('PnpmLockfileRead', { + text: S.String, + lockfile: S.Union([LockfileDecoded, LockfileUndecodable]), + importerKey: S.NullOr(S.String), + installSettings: S.Union([InstallSettingsRead, InstallSettingsUnreadable]), + }) +{} -export class OtherLockfileRead extends S.TaggedClass()('OtherLockfileRead', { - text: S.String, -}) {} +export class OtherLockfileRead + extends S.TaggedClass()('OtherLockfileRead', { + text: S.String, + }) +{} -export class NoLockfileRead extends S.TaggedClass()('NoLockfileRead', {}) {} +export class NoLockfileRead + extends S.TaggedClass()('NoLockfileRead', {}) +{} -export class LockfileClosureCommand extends S.TaggedClass()('LockfileClosureCommand', { - source: S.Union([PnpmLockfileRead, OtherLockfileRead, NoLockfileRead]), -}) { +export class LockfileClosureCommand + extends S.TaggedClass()('LockfileClosureCommand', { + source: S.Union([PnpmLockfileRead, OtherLockfileRead, NoLockfileRead]), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const LockfileClosureDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/LockfileClosureDecision') type LockfileClosureDecisionTypeId = typeof LockfileClosureDecisionTypeId -export class LockfileClosure extends S.TaggedClass()('LockfileClosure', { - lockfileVersion: S.String, - settings: S.NullOr(S.Record(S.String, S.Json)), - installSettings: InstallSettingsSchema, - importers: S.Record(S.String, PnpmImporterSchema), - snapshots: S.Record(S.String, PnpmSnapshotSchema), - packages: S.Record(S.String, S.Json), -}) { +export class LockfileClosure + extends S.TaggedClass()('LockfileClosure', { + lockfileVersion: S.String, + settings: S.NullOr(S.Record(S.String, S.Json)), + installSettings: InstallSettingsSchema, + importers: S.Record(S.String, PnpmImporterSchema), + snapshots: S.Record(S.String, PnpmSnapshotSchema), + packages: S.Record(S.String, S.Json), + }) +{ readonly [LockfileClosureDecisionTypeId] = LockfileClosureDecisionTypeId } @@ -96,7 +114,7 @@ export type LockfileFallbackReason = typeof LockfileFallbackReasonSchema.Type export const LockfileFallbackSchema = S.Struct({ reason: LockfileFallbackReasonSchema, detail: S.String }) export type LockfileFallback = typeof LockfileFallbackSchema.Type -export class WholeLockfile extends S.TaggedClass()('WholeLockfile', { +export class WholeLockfile extends S.TaggedClass()('WholeLockfile', { text: S.String, fallback: S.NullOr(LockfileFallbackSchema), }) { diff --git a/packages/stryker-js/src/matching.schema.ts b/packages/stryker-js/src/matching.schema.ts index b2b6c174c..dc6ee0e3f 100644 --- a/packages/stryker-js/src/matching.schema.ts +++ b/packages/stryker-js/src/matching.schema.ts @@ -1,6 +1,6 @@ import * as S from 'effect/Schema' -export class FileMatcher extends S.Class('FileMatcher')({ +export class FileMatcher extends S.Class('FileMatcher')({ pattern: S.Union([S.Boolean, S.String]), allowHiddenFiles: S.Boolean, }) {} diff --git a/packages/stryker-js/src/materialize-mutant-plans.workflow.ts b/packages/stryker-js/src/materialize-mutant-plans.workflow.ts index a07f1e51b..ad9396798 100644 --- a/packages/stryker-js/src/materialize-mutant-plans.workflow.ts +++ b/packages/stryker-js/src/materialize-mutant-plans.workflow.ts @@ -34,28 +34,34 @@ const EarlyResultPlanSchema = S.Struct({ const MaterializedPlanTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MaterializedPlan') type MaterializedPlanTypeId = typeof MaterializedPlanTypeId -export class MutantRunPlanMaterialized extends S.TaggedClass()('MutantRunPlanMaterialized', { - plan: RunPlanSchema, -}) { +export class MutantRunPlanMaterialized + extends S.TaggedClass()('MutantRunPlanMaterialized', { + plan: RunPlanSchema, + }) +{ readonly [MaterializedPlanTypeId] = MaterializedPlanTypeId } -export class MutantEarlyResultPlanMaterialized extends S.TaggedClass()( - 'MutantEarlyResultPlanMaterialized', - { plan: EarlyResultPlanSchema }, -) { +export class MutantEarlyResultPlanMaterialized + extends S.TaggedClass()( + 'MutantEarlyResultPlanMaterialized', + { plan: EarlyResultPlanSchema }, + ) +{ readonly [MaterializedPlanTypeId] = MaterializedPlanTypeId } export type MaterializedMutantPlan = MutantRunPlanMaterialized | MutantEarlyResultPlanMaterialized -export class MaterializeMutantPlanCommand extends S.TaggedClass()( - 'MaterializeMutantPlanCommand', - { - mutant: Mutant.Mutant, - plan: S.Union([PlannedRunMutant, PlannedEarlyResultMutant]), - }, -) { +export class MaterializeMutantPlanCommand + extends S.TaggedClass()( + 'MaterializeMutantPlanCommand', + { + mutant: Mutant.Mutant, + plan: S.Union([PlannedRunMutant, PlannedEarlyResultMutant]), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/mutation-reporting.schema.ts b/packages/stryker-js/src/mutation-reporting.schema.ts index a4ab614ab..6d4dcbf6c 100644 --- a/packages/stryker-js/src/mutation-reporting.schema.ts +++ b/packages/stryker-js/src/mutation-reporting.schema.ts @@ -1,9 +1,11 @@ import { Schema as S } from 'effect' -export class ManifestUnreadable extends S.TaggedError()('ManifestUnreadable', { - specifier: S.String, - cause: S.Unknown, -}) { +export class ManifestUnreadable + extends S.TaggedError()('ManifestUnreadable', { + specifier: S.String, + cause: S.Unknown, + }) +{ override get message(): string { return `Package manifest is unreadable: ${this.specifier}` } diff --git a/packages/stryker-js/src/node-platform.ts b/packages/stryker-js/src/node-platform.ts index 1352cc8c1..69886c6ff 100644 --- a/packages/stryker-js/src/node-platform.ts +++ b/packages/stryker-js/src/node-platform.ts @@ -2,7 +2,7 @@ import { NodeFileSystem, NodePath, NodeSocket, NodeStdio } from '@effect/platfor import * as NodeChildProcessSpawner from '@effect/platform-node-shared/NodeChildProcessSpawner' import * as NodeCrypto from '@effect/platform-node-shared/NodeCrypto' import { SpanTaxonomy } from '@systemfsoftware/stryker-js-cli-contract' -import * as Crypto from 'effect/Crypto' +import * as SecureRandom from 'effect/crypto/SecureRandom' import * as Duration from 'effect/Duration' import * as Effect from 'effect/Effect' import * as FileSystem from 'effect/FileSystem' @@ -48,7 +48,7 @@ const nodeWorkerLauncherLayer = (childEnv: Readonly>) => Layer.effect( WorkerLauncher, Effect.gen(function*() { - const crypto = yield* Crypto.Crypto + const crypto = yield* SecureRandom.SecureRandom const fs = yield* FileSystem.FileSystem const path = yield* Path.Path const spawner = yield* ChildProcessSpawner.ChildProcessSpawner @@ -57,7 +57,7 @@ const nodeWorkerLauncherLayer = (childEnv: Readonly>) => spawn: Effect.fn(SpanTaxonomy.Spans.workerSpawn.name)( function*(params: WorkerSpawnParams) { const workerDir = yield* fs.makeTempDirectoryScoped({ prefix: params.tempDirPrefix }) - const workerId = yield* crypto.randomUUIDv4 + const workerId = yield* crypto.uuidV4() const socketPath = Match.value(globalThis.process.platform).pipe( Match.when('win32', () => `\\\\.\\pipe\\stryker-worker-${workerId}`), Match.orElse(() => path.join(workerDir, 'worker.sock')), @@ -204,7 +204,7 @@ export const makeNodePlatformLayer = (options: { readonly childEnv: Readonly> }): Layer.Layer => Layer.mergeAll( - nodeWorkerLauncherLayer(options.childEnv).pipe(Layer.provide(Layer.merge(nodeBase, NodeCrypto.layer))), + nodeWorkerLauncherLayer(options.childEnv).pipe(Layer.provide(Layer.merge(nodeBase, NodeCrypto.layerSecureRandom))), nodeBase, GitDiff.layer, oxcSourceParserLayer, diff --git a/packages/stryker-js/src/oxc-source-parser.ts b/packages/stryker-js/src/oxc-source-parser.ts index ee7515666..c6d008c8c 100644 --- a/packages/stryker-js/src/oxc-source-parser.ts +++ b/packages/stryker-js/src/oxc-source-parser.ts @@ -40,7 +40,7 @@ const jsonOf: (value: OxcValue) => Result.Result = Match.type load) + const oxc = yield* Effect.flatten(oxcModule) const parsed = oxc.parseSync(absolute, content, { lang: language }) return { program: itemOf(parsed.program), parseFailed: parsed.errors.length > 0 } satisfies ParsedSource }) @@ -95,7 +95,7 @@ if (import.meta.vitest !== void 0) { subject: itemOf, }, (subject, [callee, digits, body, flags]) => - Effect.map(Effect.flatMap(oxcModule, (load) => load), (oxc) => { + Effect.map(Effect.flatten(oxcModule), (oxc) => { const source = `${callee}(${digits}n)\n${callee}(/${body}/${flags})\n` const objects = objectsOf(subject(oxc.parseSync('drawn.ts', source, { lang: 'ts' }).program)) return lawHolds(objects, `${digits}n`, `/${body}/${flags}`) diff --git a/packages/stryker-js/src/phase-durations.workflow.ts b/packages/stryker-js/src/phase-durations.workflow.ts index 008d3a246..33a88d655 100644 --- a/packages/stryker-js/src/phase-durations.workflow.ts +++ b/packages/stryker-js/src/phase-durations.workflow.ts @@ -14,12 +14,14 @@ import { PhaseMarkSchema, } from './phase-durations.schema.js' -export class PhaseDurationsCommand extends S.TaggedClass()('PhaseDurationsCommand', { - marks: S.Array(PhaseMarkSchema), - elapsedMs: Report.NonNegativeFinite, - checkerBusy: S.Array(CheckerBusyIntervalSchema), - checkersConfigured: S.Boolean, -}) { +export class PhaseDurationsCommand + extends S.TaggedClass()('PhaseDurationsCommand', { + marks: S.Array(PhaseMarkSchema), + elapsedMs: Report.NonNegativeFinite, + checkerBusy: S.Array(CheckerBusyIntervalSchema), + checkersConfigured: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = { elapsedMs: 'stryker.phase_durations.elapsed_ms', checkersConfigured: 'stryker.phase_durations.checkers_configured', @@ -29,15 +31,19 @@ export class PhaseDurationsCommand extends S.TaggedClass( const PhaseDurationsDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/PhaseDurationsDecision') type PhaseDurationsDecisionTypeId = typeof PhaseDurationsDecisionTypeId -export class PhaseDurationsComputed extends S.TaggedClass()('PhaseDurationsComputed', { - durations: RunEvent.PhaseDurations, -}) { +export class PhaseDurationsComputed + extends S.TaggedClass()('PhaseDurationsComputed', { + durations: RunEvent.PhaseDurations, + }) +{ readonly [PhaseDurationsDecisionTypeId] = PhaseDurationsDecisionTypeId } -export class PhaseMarksMissing extends S.TaggedClass()('PhaseMarksMissing', { - phases: S.Array(RunEvent.RunPhase), -}) { +export class PhaseMarksMissing + extends S.TaggedClass()('PhaseMarksMissing', { + phases: S.Array(RunEvent.RunPhase), + }) +{ readonly [PhaseDurationsDecisionTypeId] = PhaseDurationsDecisionTypeId } diff --git a/packages/stryker-js/src/plan-instrumentation.workflow.ts b/packages/stryker-js/src/plan-instrumentation.workflow.ts index 72de271d4..3a69722ca 100644 --- a/packages/stryker-js/src/plan-instrumentation.workflow.ts +++ b/packages/stryker-js/src/plan-instrumentation.workflow.ts @@ -6,11 +6,13 @@ import * as S from 'effect/Schema' const Count = Report.NonNegativeInt -export class InstrumentCommand extends S.TaggedClass()('InstrumentCommand', { - fileCount: Count, - inPlace: S.Boolean, - pluginCount: Count, -}) { +export class InstrumentCommand + extends S.TaggedClass()('InstrumentCommand', { + fileCount: Count, + inPlace: S.Boolean, + pluginCount: Count, + }) +{ static readonly [Workflow.InstrumentationBrand] = { fileCount: 'stryker.instrument.file_count', inPlace: 'stryker.instrument.in_place', @@ -20,18 +22,22 @@ export class InstrumentCommand extends S.TaggedClass()('Instr const InstrumentDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/InstrumentDecision') type InstrumentDecisionTypeId = typeof InstrumentDecisionTypeId -export class InPlaceInstrument extends S.TaggedClass()('InPlaceInstrument', { - workingDirectoryHint: S.String, - backupDirectoryHint: S.String, - fileCount: Count, -}) { +export class InPlaceInstrument + extends S.TaggedClass()('InPlaceInstrument', { + workingDirectoryHint: S.String, + backupDirectoryHint: S.String, + fileCount: Count, + }) +{ readonly [InstrumentDecisionTypeId] = InstrumentDecisionTypeId } -export class EphemeralInstrument extends S.TaggedClass()('EphemeralInstrument', { - workingDirectoryHint: S.String, - fileCount: Count, -}) { +export class EphemeralInstrument + extends S.TaggedClass()('EphemeralInstrument', { + workingDirectoryHint: S.String, + fileCount: Count, + }) +{ readonly [InstrumentDecisionTypeId] = InstrumentDecisionTypeId } diff --git a/packages/stryker-js/src/plan-mutant-tests.workflow.ts b/packages/stryker-js/src/plan-mutant-tests.workflow.ts index 8bde74977..b14b52b62 100644 --- a/packages/stryker-js/src/plan-mutant-tests.workflow.ts +++ b/packages/stryker-js/src/plan-mutant-tests.workflow.ts @@ -14,38 +14,46 @@ import { MutantTestPlanCommand } from './MutantTestPlanCommand.schema.js' const MutantPlanTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutantPlan') type MutantPlanTypeId = typeof MutantPlanTypeId -export class PlannedRunMutant extends S.TaggedClass()('PlannedRunMutant', { - mutantId: Mutant.MutantId, - netTime: S.Finite, - runOptions: PlannedMutantRunOptions, - static: S.optional(S.Boolean), - coveredBy: S.String.pipe(S.Array, S.optional), -}) { +export class PlannedRunMutant + extends S.TaggedClass()('PlannedRunMutant', { + mutantId: Mutant.MutantId, + netTime: S.Finite, + runOptions: PlannedMutantRunOptions, + static: S.optional(S.Boolean), + coveredBy: S.String.pipe(S.Array, S.optional), + }) +{ readonly [MutantPlanTypeId] = MutantPlanTypeId } -export class PlannedEarlyResultMutant extends S.TaggedClass()('PlannedEarlyResultMutant', { - mutantId: Mutant.MutantId, - status: Mutant.MutantStatusSchema, - statusReason: S.optional(S.String), - static: S.optional(S.Boolean), - coveredBy: S.String.pipe(S.Array, S.optional), -}) { +export class PlannedEarlyResultMutant + extends S.TaggedClass()('PlannedEarlyResultMutant', { + mutantId: Mutant.MutantId, + status: Mutant.MutantStatusSchema, + statusReason: S.optional(S.String), + static: S.optional(S.Boolean), + coveredBy: S.String.pipe(S.Array, S.optional), + }) +{ readonly [MutantPlanTypeId] = MutantPlanTypeId } -export class CoveredMutantHitCountMissing extends S.TaggedError()( - 'CoveredMutantHitCountMissing', - { missingIds: S.Array(S.String) }, -) { +export class CoveredMutantHitCountMissing + extends S.TaggedError()( + 'CoveredMutantHitCountMissing', + { missingIds: S.Array(S.String) }, + ) +{ override get message(): string { return `Hit count missing for covered mutants: ${this.missingIds.join(', ')}` } } -export class MutantTimeoutNotFinite extends S.TaggedError()('MutantTimeoutNotFinite', { - mutantId: Mutant.MutantId, -}) { +export class MutantTimeoutNotFinite + extends S.TaggedError()('MutantTimeoutNotFinite', { + mutantId: Mutant.MutantId, + }) +{ override get message(): string { return `Computed test timeout for mutant ${this.mutantId} is not finite` } diff --git a/packages/stryker-js/src/plan-mutator-catalogs.workflow.ts b/packages/stryker-js/src/plan-mutator-catalogs.workflow.ts index 2b050aef8..c67bba215 100644 --- a/packages/stryker-js/src/plan-mutator-catalogs.workflow.ts +++ b/packages/stryker-js/src/plan-mutator-catalogs.workflow.ts @@ -28,32 +28,38 @@ export const ProviderCatalogSchema = S.Struct({ }) export type ProviderCatalog = typeof ProviderCatalogSchema.Type -export class PlanMutatorCatalogsCommand extends S.TaggedClass()( - 'PlanMutatorCatalogsCommand', - { - stock: MergedCatalogSchema, - providers: S.Array(ProviderCatalogSchema), - }, -) { +export class PlanMutatorCatalogsCommand + extends S.TaggedClass()( + 'PlanMutatorCatalogsCommand', + { + stock: MergedCatalogSchema, + providers: S.Array(ProviderCatalogSchema), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const MutatorCatalogsTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/MutatorCatalogs') type MutatorCatalogsTypeId = typeof MutatorCatalogsTypeId -export class MutatorCatalogsPlanned extends S.TaggedClass()('MutatorCatalogsPlanned', { - catalogs: S.Array(MergedCatalogSchema), -}) { +export class MutatorCatalogsPlanned + extends S.TaggedClass()('MutatorCatalogsPlanned', { + catalogs: S.Array(MergedCatalogSchema), + }) +{ readonly [MutatorCatalogsTypeId] = MutatorCatalogsTypeId } -export class MutatorCatalogRefused extends S.TaggedError()('MutatorCatalogRefused', { - reason: S.Literals(['DuplicateNamespace', 'StockName', 'UnownedName']), - name: S.String, - modules: S.Array(S.String), -}) { +export class MutatorCatalogRefused + extends S.TaggedError()('MutatorCatalogRefused', { + reason: S.Literals(['DuplicateNamespace', 'StockName', 'UnownedName']), + mutatorName: S.String, + modules: S.Array(S.String), + }) +{ override get message(): string { - return `Refused the mutator catalog of ${this.modules.join(', ')}: ${this.reason} "${this.name}".` + return `Refused the mutator catalog of ${this.modules.join(', ')}: ${this.reason} "${this.mutatorName}".` } } @@ -98,7 +104,7 @@ const duplicateNamespaceOf = (providers: readonly ProviderCatalog[]): Option.Opt (clash) => MutatorCatalogRefused.make({ reason: 'DuplicateNamespace', - name: clash.namespace, + mutatorName: clash.namespace, modules: [...clash.modules], }), ) @@ -157,7 +163,7 @@ const offendingEntryRefusalOf = ( (offending) => MutatorCatalogRefused.make({ reason: offending.reason, - name: offending.name, + mutatorName: offending.name, modules: [offending.moduleName], }), ) diff --git a/packages/stryker-js/src/plan-node-modules-links.workflow.ts b/packages/stryker-js/src/plan-node-modules-links.workflow.ts index ee2bb789a..d6e64a77c 100644 --- a/packages/stryker-js/src/plan-node-modules-links.workflow.ts +++ b/packages/stryker-js/src/plan-node-modules-links.workflow.ts @@ -7,24 +7,32 @@ import * as S from 'effect/Schema' const PlanNodeModulesLinksTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/PlanNodeModulesLinks') type PlanNodeModulesLinksTypeId = typeof PlanNodeModulesLinksTypeId -export class NodeModulesSearchCommand extends S.TaggedClass()('NodeModulesSearchCommand', { - linking: S.Boolean, - found: S.Array(S.String), -}) { +export class NodeModulesSearchCommand + extends S.TaggedClass()('NodeModulesSearchCommand', { + linking: S.Boolean, + found: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class NodeModulesNotLinked extends S.TaggedClass()('NodeModulesNotLinked', {}) { +export class NodeModulesNotLinked + extends S.TaggedClass()('NodeModulesNotLinked', {}) +{ readonly [PlanNodeModulesLinksTypeId] = PlanNodeModulesLinksTypeId } -export class NodeModulesNotFound extends S.TaggedClass()('NodeModulesNotFound', {}) { +export class NodeModulesNotFound + extends S.TaggedClass()('NodeModulesNotFound', {}) +{ readonly [PlanNodeModulesLinksTypeId] = PlanNodeModulesLinksTypeId } -export class NodeModulesLinked extends S.TaggedClass()('NodeModulesLinked', { - nodeModules: S.NonEmptyArray(S.String), -}) { +export class NodeModulesLinked + extends S.TaggedClass()('NodeModulesLinked', { + nodeModules: S.NonEmptyArray(S.String), + }) +{ readonly [PlanNodeModulesLinksTypeId] = PlanNodeModulesLinksTypeId } diff --git a/packages/stryker-js/src/plan-plugin-load.workflow.ts b/packages/stryker-js/src/plan-plugin-load.workflow.ts index d08225487..511d4ba56 100644 --- a/packages/stryker-js/src/plan-plugin-load.workflow.ts +++ b/packages/stryker-js/src/plan-plugin-load.workflow.ts @@ -25,25 +25,31 @@ export const PluginShadowingSchema = S.Struct({ }) export type PluginShadowing = typeof PluginShadowingSchema.Type -export class PluginLoadCommand extends S.TaggedClass()('PluginLoadCommand', { - declarations: S.Array(PluginDeclarationSchema), -}) { +export class PluginLoadCommand + extends S.TaggedClass()('PluginLoadCommand', { + declarations: S.Array(PluginDeclarationSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = { declarations: 'stryker.plugin_load.declarations', } as const } -export class PluginDeclarationsPlanned extends S.TaggedClass()( - 'PluginDeclarationsPlanned', - { - winners: S.Array(PluginDeclarationSchema), - shadowings: S.Array(PluginShadowingSchema), - }, -) { +export class PluginDeclarationsPlanned + extends S.TaggedClass()( + 'PluginDeclarationsPlanned', + { + winners: S.Array(PluginDeclarationSchema), + shadowings: S.Array(PluginShadowingSchema), + }, + ) +{ readonly [PluginLoadTypeId] = PluginLoadTypeId } -export class NoPluginDeclarations extends S.TaggedClass()('NoPluginDeclarations', {}) { +export class NoPluginDeclarations + extends S.TaggedClass()('NoPluginDeclarations', {}) +{ readonly [PluginLoadTypeId] = PluginLoadTypeId } diff --git a/packages/stryker-js/src/plan-request.schema.ts b/packages/stryker-js/src/plan-request.schema.ts index 2437bceff..10f05d1a6 100644 --- a/packages/stryker-js/src/plan-request.schema.ts +++ b/packages/stryker-js/src/plan-request.schema.ts @@ -14,9 +14,11 @@ export const CompileErrorProbeSchema = S.Struct({ files: S.Record(S.String, S.Struct({ mutants: S.Array(S.Struct({ status: S.String })) })), }) -export class PlanShardsRefused extends S.TaggedError()('PlanShardsRefused', { - detail: S.String, -}) { +export class PlanShardsRefused + extends S.TaggedError()('PlanShardsRefused', { + detail: S.String, + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass readonly next = 'Pass --target-seconds above 0 and --max-shards of 1 or more, and name each project directory once in --projects.' diff --git a/packages/stryker-js/src/plan-run-conclusion.workflow.ts b/packages/stryker-js/src/plan-run-conclusion.workflow.ts index 8fa6a9232..f88ae6163 100644 --- a/packages/stryker-js/src/plan-run-conclusion.workflow.ts +++ b/packages/stryker-js/src/plan-run-conclusion.workflow.ts @@ -39,13 +39,15 @@ export const RunOutcomeTag = S.Literals([ ]) export type RunOutcomeTag = typeof RunOutcomeTag.Type -export class PlanRunConclusionCommand extends S.TaggedClass()('PlanRunConclusionCommand', { - command: RunOutcomeCommand, - machine: S.Boolean, - exitCode: Plugin.ExitCode, - outcome: RunOutcomeTag, - error: S.String, -}) { +export class PlanRunConclusionCommand + extends S.TaggedClass()('PlanRunConclusionCommand', { + command: RunOutcomeCommand, + machine: S.Boolean, + exitCode: Plugin.ExitCode, + outcome: RunOutcomeTag, + error: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { machine: 'stryker.run_conclusion.machine', exitCode: 'stryker.run.exit_code', @@ -54,31 +56,39 @@ export class PlanRunConclusionCommand extends S.TaggedClass()('RunConclusionEmittedOk', { - command: RunOutcomeCommand, -}) { +export class RunConclusionEmittedOk + extends S.TaggedClass()('RunConclusionEmittedOk', { + command: RunOutcomeCommand, + }) +{ readonly [PlanRunConclusionTypeId] = PlanRunConclusionTypeId } -export class RunConclusionEmittedFailed extends S.TaggedClass()( - 'RunConclusionEmittedFailed', - { - command: RunOutcomeCommand, - exitCode: Plugin.ExitCode, - }, -) { +export class RunConclusionEmittedFailed + extends S.TaggedClass()( + 'RunConclusionEmittedFailed', + { + command: RunOutcomeCommand, + exitCode: Plugin.ExitCode, + }, + ) +{ readonly [PlanRunConclusionTypeId] = PlanRunConclusionTypeId } -export class RunConclusionQuietOk extends S.TaggedClass()('RunConclusionQuietOk', {}) { +export class RunConclusionQuietOk + extends S.TaggedClass()('RunConclusionQuietOk', {}) +{ readonly [PlanRunConclusionTypeId] = PlanRunConclusionTypeId } -export class RunConclusionQuietFailed extends S.TaggedClass()('RunConclusionQuietFailed', { - exitCode: Plugin.ExitCode, - exitClass: S.Union([Plugin.ExitClass, RunOutcomeTag]), - error: S.String, -}) { +export class RunConclusionQuietFailed + extends S.TaggedClass()('RunConclusionQuietFailed', { + exitCode: Plugin.ExitCode, + exitClass: S.Union([Plugin.ExitClass, RunOutcomeTag]), + error: S.String, + }) +{ readonly [PlanRunConclusionTypeId] = PlanRunConclusionTypeId } diff --git a/packages/stryker-js/src/plan-sandbox-acquisition.workflow.ts b/packages/stryker-js/src/plan-sandbox-acquisition.workflow.ts index 06f00e6c3..8d966aa1b 100644 --- a/packages/stryker-js/src/plan-sandbox-acquisition.workflow.ts +++ b/packages/stryker-js/src/plan-sandbox-acquisition.workflow.ts @@ -7,36 +7,42 @@ import * as S from 'effect/Schema' const PlanSandboxAcquisitionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/PlanSandboxAcquisition') type PlanSandboxAcquisitionTypeId = typeof PlanSandboxAcquisitionTypeId -export class SandboxAcquisitionCommand extends S.TaggedClass()('SandboxAcquisitionCommand', { - inPlace: S.Boolean, - backupDirectory: S.String, - symlinkNodeModules: S.Boolean, - buildCommand: S.UndefinedOr(S.String), -}) { +export class SandboxAcquisitionCommand + extends S.TaggedClass()('SandboxAcquisitionCommand', { + inPlace: S.Boolean, + backupDirectory: S.String, + symlinkNodeModules: S.Boolean, + buildCommand: S.UndefinedOr(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const variantFields = { buildCommand: S.Option(S.String) } -export class SandboxInPlaceRestored extends S.TaggedClass()( +export class SandboxInPlaceRestored extends S.TaggedClass()( 'SandboxInPlaceRestored', variantFields, ) { readonly [PlanSandboxAcquisitionTypeId] = PlanSandboxAcquisitionTypeId } -export class SandboxInPlaceUnrestored extends S.TaggedClass()( - 'SandboxInPlaceUnrestored', - variantFields, -) { +export class SandboxInPlaceUnrestored + extends S.TaggedClass()( + 'SandboxInPlaceUnrestored', + variantFields, + ) +{ readonly [PlanSandboxAcquisitionTypeId] = PlanSandboxAcquisitionTypeId } -export class SandboxCopiedLinked extends S.TaggedClass()('SandboxCopiedLinked', variantFields) { +export class SandboxCopiedLinked + extends S.TaggedClass()('SandboxCopiedLinked', variantFields) +{ readonly [PlanSandboxAcquisitionTypeId] = PlanSandboxAcquisitionTypeId } -export class SandboxCopiedUnlinked extends S.TaggedClass()( +export class SandboxCopiedUnlinked extends S.TaggedClass()( 'SandboxCopiedUnlinked', variantFields, ) { diff --git a/packages/stryker-js/src/plan-shards.workflow.ts b/packages/stryker-js/src/plan-shards.workflow.ts index 22610b9ec..2e5346532 100644 --- a/packages/stryker-js/src/plan-shards.workflow.ts +++ b/packages/stryker-js/src/plan-shards.workflow.ts @@ -37,19 +37,21 @@ const plannedMutantsAreDistinct = S.makeFilter( const PlannedMutants = S.Array(PlannedMutant).check(plannedMutantsAreDistinct) -export class PlanShardsCommand extends S.TaggedClass()('PlanShardsCommand', { - targetSeconds: PositiveSeconds, - maxShards: S.optional(PositiveInt), - mutants: PlannedMutants, - dryRunCosts: S.Record(S.String, CostMs), -}) { +export class PlanShardsCommand + extends S.TaggedClass()('PlanShardsCommand', { + targetSeconds: PositiveSeconds, + maxShards: S.optional(PositiveInt), + mutants: PlannedMutants, + dryRunCosts: S.Record(S.String, CostMs), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const ShardPlanTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/PlannedShards') type ShardPlanTypeId = typeof ShardPlanTypeId -export class PlannedShard extends S.TaggedClass()('PlannedShard', { +export class PlannedShard extends S.TaggedClass()('PlannedShard', { index: S.Int, count: S.Int, predictedSeconds: Report.NonNegativeFinite, diff --git a/packages/stryker-js/src/pnpm-lock.schema.ts b/packages/stryker-js/src/pnpm-lock.schema.ts index 0b8a7521d..868145df9 100644 --- a/packages/stryker-js/src/pnpm-lock.schema.ts +++ b/packages/stryker-js/src/pnpm-lock.schema.ts @@ -54,9 +54,13 @@ export type PnpmWorkspaceSettings = typeof PnpmWorkspaceSettingsSchema.Type export const PackageManagerManifestSchema = S.Struct({ packageManager: S.optionalKey(S.String) }) export type PackageManagerManifest = typeof PackageManagerManifestSchema.Type -export class LinkRef extends S.TaggedClass()('LinkRef', { target: S.String }) {} +export class LinkRef + extends S.TaggedClass()('LinkRef', { target: S.String }) +{} -export class SnapshotRef extends S.TaggedClass()('SnapshotRef', { key: S.String }) {} +export class SnapshotRef + extends S.TaggedClass()('SnapshotRef', { key: S.String }) +{} export const LockRefSchema = S.Union([LinkRef, SnapshotRef]) export type LockRef = typeof LockRefSchema.Type diff --git a/packages/stryker-js/src/readmit-subsumed.workflow.ts b/packages/stryker-js/src/readmit-subsumed.workflow.ts index a1c0be27b..8fc9f973c 100644 --- a/packages/stryker-js/src/readmit-subsumed.workflow.ts +++ b/packages/stryker-js/src/readmit-subsumed.workflow.ts @@ -10,23 +10,29 @@ import * as S from 'effect/Schema' const ReadmitSubsumedTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ReadmitSubsumed') type ReadmitSubsumedTypeId = typeof ReadmitSubsumedTypeId -export class Settled extends S.TaggedClass()('Settled', { +export class Settled extends S.TaggedClass()('Settled', { status: S.Literals(['Killed', 'Survived', 'Timeout', 'NoCoverage', 'RuntimeError']), }) {} -export class IgnoredAtCheck extends S.TaggedClass()('IgnoredAtCheck', { - reason: S.String, -}) {} +export class IgnoredAtCheck + extends S.TaggedClass()('IgnoredAtCheck', { + reason: S.String, + }) +{} -export class CompiledWithError extends S.TaggedClass()('CompiledWithError', {}) {} +export class CompiledWithError + extends S.TaggedClass()('CompiledWithError', {}) +{} -export class IgnoredAtPlan extends S.TaggedClass()('IgnoredAtPlan', {}) {} +export class IgnoredAtPlan + extends S.TaggedClass()('IgnoredAtPlan', {}) +{} -export class Remembered extends S.TaggedClass()('Remembered', { +export class Remembered extends S.TaggedClass()('Remembered', { status: Mutant.MutantStatusSchema, }) {} -export class Unsettled extends S.TaggedClass()('Unsettled', {}) {} +export class Unsettled extends S.TaggedClass()('Unsettled', {}) {} export const DominatorOutcome = S.Union([Settled, IgnoredAtCheck, CompiledWithError, IgnoredAtPlan, Remembered]) export type DominatorOutcome = typeof DominatorOutcome.Type @@ -52,21 +58,23 @@ export const DominatorSettlement = S.Struct({ }) export type DominatorSettlement = typeof DominatorSettlement.Type -export class ReadmitSubsumedCommand extends S.TaggedClass()('ReadmitSubsumedCommand', { - held: S.Array(HeldMutant), - settlements: S.Array(DominatorSettlement), -}) { +export class ReadmitSubsumedCommand + extends S.TaggedClass()('ReadmitSubsumedCommand', { + held: S.Array(HeldMutant), + settlements: S.Array(DominatorSettlement), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class StillSubsumed extends S.TaggedClass()('StillSubsumed', { +export class StillSubsumed extends S.TaggedClass()('StillSubsumed', { id: Mutant.MutantId, dominator: Mutant.MutantId, }) { readonly [ReadmitSubsumedTypeId] = ReadmitSubsumedTypeId } -export class Readmitted extends S.TaggedClass()('Readmitted', { +export class Readmitted extends S.TaggedClass()('Readmitted', { id: Mutant.MutantId, causes: S.NonEmptyArray(ReadmitCause), }) { diff --git a/packages/stryker-js/src/refuse-local-mutation.workflow.ts b/packages/stryker-js/src/refuse-local-mutation.workflow.ts index d2371ff5c..f9eb5ac27 100644 --- a/packages/stryker-js/src/refuse-local-mutation.workflow.ts +++ b/packages/stryker-js/src/refuse-local-mutation.workflow.ts @@ -9,25 +9,31 @@ const LocalMutationDecisionTypeId: unique symbol = Symbol.for( ) type LocalMutationDecisionTypeId = typeof LocalMutationDecisionTypeId -export class RefuseLocalMutationCommand extends S.TaggedClass()( - 'RefuseLocalMutationCommand', - { - dryRunOnly: S.Boolean, - githubActions: S.UndefinedOr(S.String), - allowLocalMutation: S.UndefinedOr(S.String), - }, -) { +export class RefuseLocalMutationCommand + extends S.TaggedClass()( + 'RefuseLocalMutationCommand', + { + dryRunOnly: S.Boolean, + githubActions: S.UndefinedOr(S.String), + allowLocalMutation: S.UndefinedOr(S.String), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class LocalMutationAllowed extends S.TaggedClass()('LocalMutationAllowed', {}) { +export class LocalMutationAllowed + extends S.TaggedClass()('LocalMutationAllowed', {}) +{ readonly [LocalMutationDecisionTypeId] = LocalMutationDecisionTypeId } -export class LocalMutationRefused extends S.TaggedError()('LocalMutationRefused', { - rule: RunEvent.RefusalRule, - message: S.String, -}) {} +export class LocalMutationRefused + extends S.TaggedError()('LocalMutationRefused', { + rule: RunEvent.RefusalRule, + message: S.String, + }) +{} const decide = ( command: RefuseLocalMutationCommand, diff --git a/packages/stryker-js/src/render-annotations.workflow.ts b/packages/stryker-js/src/render-annotations.workflow.ts index c757e73e2..bea54ca15 100644 --- a/packages/stryker-js/src/render-annotations.workflow.ts +++ b/packages/stryker-js/src/render-annotations.workflow.ts @@ -24,9 +24,11 @@ const SURVIVOR_LEVELS: Record = { Survived: 'warni const decodeMutantStatus = S.decodeOption(MUTANT_STATUSES) -export class AnnotationsUnusable extends S.TaggedError()('AnnotationsUnusable', { - reason: S.String, -}) { +export class AnnotationsUnusable + extends S.TaggedError()('AnnotationsUnusable', { + reason: S.String, + }) +{ readonly exitClass = 'ConfigError' satisfies Plugin.ExitClass override get message(): string { @@ -37,26 +39,32 @@ export class AnnotationsUnusable extends S.TaggedError()('A const RenderAnnotationsTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/RenderAnnotationsDecision') type RenderAnnotationsTypeId = typeof RenderAnnotationsTypeId -export class AnnotationsRendered extends S.TaggedClass()('AnnotationsRendered', { - lines: S.Array(S.String), -}) { +export class AnnotationsRendered + extends S.TaggedClass()('AnnotationsRendered', { + lines: S.Array(S.String), + }) +{ readonly [RenderAnnotationsTypeId] = RenderAnnotationsTypeId } -export class NothingToAnnotate extends S.TaggedClass()('NothingToAnnotate', { - survivorCount: S.Natural, -}) { +export class NothingToAnnotate + extends S.TaggedClass()('NothingToAnnotate', { + survivorCount: S.Natural, + }) +{ readonly [RenderAnnotationsTypeId] = RenderAnnotationsTypeId } export const RenderAnnotationsDecision = S.Union([AnnotationsRendered, NothingToAnnotate]) export type RenderAnnotationsDecision = typeof RenderAnnotationsDecision.Type -export class RenderAnnotationsCommand extends S.TaggedClass()('RenderAnnotationsCommand', { - report: Report.MutationTestResult, - survivors: S.Array(SurvivorRef), - baseline: S.Array(Mutant.MutantId), -}) { +export class RenderAnnotationsCommand + extends S.TaggedClass()('RenderAnnotationsCommand', { + report: Report.MutationTestResult, + survivors: S.Array(SurvivorRef), + baseline: S.Array(Mutant.MutantId), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/report-from-stream.workflow.ts b/packages/stryker-js/src/report-from-stream.workflow.ts index a6fd0e0cd..9dd5112aa 100644 --- a/packages/stryker-js/src/report-from-stream.workflow.ts +++ b/packages/stryker-js/src/report-from-stream.workflow.ts @@ -12,26 +12,34 @@ const STREAM_THRESHOLDS = { high: 100, low: 80, break: null } const ReportFromStreamTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ReportFromStream') type ReportFromStreamTypeId = typeof ReportFromStreamTypeId -export class ReportFromStreamCommand extends S.Class('ReportFromStreamCommand')({ - text: S.String, -}) { +export class ReportFromStreamCommand + extends S.Class('ReportFromStreamCommand')({ + text: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { text: 'stryker.report.stream.text' } as const } -export class ReportFromStreamRebuilt extends S.TaggedClass()('ReportFromStreamRebuilt', { - report: Report.MutationTestResult, -}) { +export class ReportFromStreamRebuilt + extends S.TaggedClass()('ReportFromStreamRebuilt', { + report: Report.MutationTestResult, + }) +{ readonly [ReportFromStreamTypeId] = ReportFromStreamTypeId } -export class ReportFromStreamAbsent extends S.TaggedClass()('ReportFromStreamAbsent', {}) { +export class ReportFromStreamAbsent + extends S.TaggedClass()('ReportFromStreamAbsent', {}) +{ readonly [ReportFromStreamTypeId] = ReportFromStreamTypeId } -export class StreamVersionMismatch extends S.TaggedError()('StreamVersionMismatch', { - expected: S.String, - found: S.String, -}) { +export class StreamVersionMismatch + extends S.TaggedError()('StreamVersionMismatch', { + expected: S.String, + found: S.String, + }) +{ override get message(): string { return `Stream schema ${this.found} cannot be read by a reader of stream schema ${this.expected}. Re-run that shard with the same stryker release as \`stryker merge\`.` } diff --git a/packages/stryker-js/src/report-test-ids.workflow.ts b/packages/stryker-js/src/report-test-ids.workflow.ts index bcb0fcf1c..affb1cc38 100644 --- a/packages/stryker-js/src/report-test-ids.workflow.ts +++ b/packages/stryker-js/src/report-test-ids.workflow.ts @@ -8,16 +8,18 @@ import { type ReuseTestFile, type ReuseTestFiles, ReuseTestFilesSchema } from '. const ReportTestIdTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ReportTestId') type ReportTestIdTypeId = typeof ReportTestIdTypeId -export class ReportTestId extends S.TaggedClass()('ReportTestId', { +export class ReportTestId extends S.TaggedClass()('ReportTestId', { positionalId: S.String, runnerTestId: S.String, }) { readonly [ReportTestIdTypeId] = ReportTestIdTypeId } -export class ResolveReportTestIds extends S.TaggedClass()('ResolveReportTestIds', { - testFiles: S.optional(ReuseTestFilesSchema), -}) { +export class ResolveReportTestIds + extends S.TaggedClass()('ResolveReportTestIds', { + testFiles: S.optional(ReuseTestFilesSchema), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/reporting/run-failure.schema.ts b/packages/stryker-js/src/reporting/run-failure.schema.ts index 445f1f07c..50af81fee 100644 --- a/packages/stryker-js/src/reporting/run-failure.schema.ts +++ b/packages/stryker-js/src/reporting/run-failure.schema.ts @@ -2,7 +2,7 @@ import { RunEvent } from '@systemfsoftware/stryker-js-cli-contract' import { Plugin } from '@systemfsoftware/stryker-js-plugin-interface' import * as S from 'effect/Schema' -export class ErrorEnvelope extends S.Class('ErrorEnvelope')({ +export class ErrorEnvelope extends S.Class('ErrorEnvelope')({ schemaVersion: RunEvent.StreamSchemaVersion, code: Plugin.ExitCode, error: S.NonEmptyString, @@ -13,6 +13,6 @@ export class ErrorEnvelope extends S.Class('ErrorEnvelope')({ } } -export class RunExitCode extends S.Class('RunExitCode')({ +export class RunExitCode extends S.Class('RunExitCode')({ code: Plugin.ExitCode, }) {} diff --git a/packages/stryker-js/src/reporting/verdict-envelope.schema.ts b/packages/stryker-js/src/reporting/verdict-envelope.schema.ts index 785393d9b..c9f714d9e 100644 --- a/packages/stryker-js/src/reporting/verdict-envelope.schema.ts +++ b/packages/stryker-js/src/reporting/verdict-envelope.schema.ts @@ -3,7 +3,7 @@ import { Mutant } from '@systemfsoftware/stryker-js-plugin-interface' import { Report } from '@systemfsoftware/stryker-js-plugin-interface' import * as S from 'effect/Schema' -export class VerdictEnvelope extends S.Class('VerdictEnvelope')({ +export class VerdictEnvelope extends S.Class('VerdictEnvelope')({ schemaVersion: RunEvent.StreamSchemaVersion, runId: RunEvent.RunId, mode: OutputMode.OutputMode, diff --git a/packages/stryker-js/src/require-dry-run.workflow.ts b/packages/stryker-js/src/require-dry-run.workflow.ts index b19541a69..1a04f00b2 100644 --- a/packages/stryker-js/src/require-dry-run.workflow.ts +++ b/packages/stryker-js/src/require-dry-run.workflow.ts @@ -16,24 +16,28 @@ export type PriorStatus = typeof PriorStatus.Type export const DryRunCandidate = S.Struct({ id: Mutant.MutantId, static: S.Boolean }) export type DryRunCandidate = typeof DryRunCandidate.Type -export class RequireDryRunCommand extends S.TaggedClass()('RequireDryRunCommand', { - dryRunOnly: S.Boolean, - ignoreStatic: S.Boolean, - hasCheckers: S.Boolean, - mutants: S.Array(DryRunCandidate), - priorStatuses: S.Array(PriorStatus), - priorFlakyMutantIds: S.Array(S.String), -}) { +export class RequireDryRunCommand + extends S.TaggedClass()('RequireDryRunCommand', { + dryRunOnly: S.Boolean, + ignoreStatic: S.Boolean, + hasCheckers: S.Boolean, + mutants: S.Array(DryRunCandidate), + priorStatuses: S.Array(PriorStatus), + priorFlakyMutantIds: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class DryRunNeeded extends S.TaggedClass()('DryRunNeeded', { +export class DryRunNeeded extends S.TaggedClass()('DryRunNeeded', { dependentMutantIds: S.Array(Mutant.MutantId), }) { readonly [RequireDryRunTypeId] = RequireDryRunTypeId } -export class DryRunSkippable extends S.TaggedClass()('DryRunSkippable', {}) { +export class DryRunSkippable + extends S.TaggedClass()('DryRunSkippable', {}) +{ readonly [RequireDryRunTypeId] = RequireDryRunTypeId } diff --git a/packages/stryker-js/src/resolve-concurrency.workflow.ts b/packages/stryker-js/src/resolve-concurrency.workflow.ts index 409796016..184e4d3b9 100644 --- a/packages/stryker-js/src/resolve-concurrency.workflow.ts +++ b/packages/stryker-js/src/resolve-concurrency.workflow.ts @@ -11,16 +11,18 @@ type ConcurrencyDecisionTypeId = typeof ConcurrencyDecisionTypeId const PERCENTAGE_OPTION = /^(100|[1-9]?[0-9])%$/ -export class TestRunnersOnly extends S.TaggedClass()('TestRunnersOnly', { - testRunners: S.Finite, - total: S.Finite, - isPercentage: S.Boolean, - announcement: S.Option(S.String), -}) { +export class TestRunnersOnly + extends S.TaggedClass()('TestRunnersOnly', { + testRunners: S.Finite, + total: S.Finite, + isPercentage: S.Boolean, + announcement: S.Option(S.String), + }) +{ readonly [ConcurrencyDecisionTypeId] = ConcurrencyDecisionTypeId } -export class TestRunnersAndCheckers extends S.TaggedClass()( +export class TestRunnersAndCheckers extends S.TaggedClass()( 'TestRunnersAndCheckers', { testRunners: S.Finite, @@ -36,11 +38,13 @@ export class TestRunnersAndCheckers extends S.TaggedClass()('ResolveConcurrency', { - concurrency: S.optional(S.Union([S.Finite, S.String])), - checkerCount: S.Natural, - availableParallelism: S.Natural, -}) { +export class ResolveConcurrency + extends S.TaggedClass()('ResolveConcurrency', { + concurrency: S.optional(S.Union([S.Finite, S.String])), + checkerCount: S.Natural, + availableParallelism: S.Natural, + }) +{ static readonly [Workflow.InstrumentationBrand] = { checkerCount: 'stryker.concurrency.checker_count', } as const diff --git a/packages/stryker-js/src/resolve-output-mode.workflow.ts b/packages/stryker-js/src/resolve-output-mode.workflow.ts index c00a29a2f..2cdc65d8c 100644 --- a/packages/stryker-js/src/resolve-output-mode.workflow.ts +++ b/packages/stryker-js/src/resolve-output-mode.workflow.ts @@ -8,25 +8,29 @@ import { OutputMode } from '@systemfsoftware/stryker-js-cli-contract' const TOOL_VARIABLES = ['CLAUDECODE', 'CODEX_SANDBOX'] as const -export class ResolveModeCommand extends S.TaggedClass()('ResolveModeCommand', { - stdoutIsTTY: S.Boolean, - text: S.optional(S.Boolean), - json: S.optional(S.Boolean), - envMode: S.optional(S.String), - agent: S.optional(S.String), - toolVars: S.optional(S.Record(S.String, S.String)), -}) { +export class ResolveModeCommand + extends S.TaggedClass()('ResolveModeCommand', { + stdoutIsTTY: S.Boolean, + text: S.optional(S.Boolean), + json: S.optional(S.Boolean), + envMode: S.optional(S.String), + agent: S.optional(S.String), + toolVars: S.optional(S.Record(S.String, S.String)), + }) +{ static readonly [Workflow.InstrumentationBrand] = { stdoutIsTTY: 'stryker.output_mode.stdout_is_tty' } as const } const ResolveModeTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ResolveMode') type ResolveModeTypeId = typeof ResolveModeTypeId -export class ModeConflictError extends S.TaggedError()('ModeConflictError', { - option: S.String, - value: S.String, - expected: S.String, -}) { +export class ModeConflictError + extends S.TaggedError()('ModeConflictError', { + option: S.String, + value: S.String, + expected: S.String, + }) +{ readonly [ResolveModeTypeId] = ResolveModeTypeId override get message(): string { @@ -34,14 +38,14 @@ export class ModeConflictError extends S.TaggedError()('ModeC } } -export class HumanOutput extends S.TaggedClass()('HumanOutput', { +export class HumanOutput extends S.TaggedClass()('HumanOutput', { signal: OutputMode.ModeSignal, stdoutIsTTY: S.Boolean, }) { readonly [ResolveModeTypeId] = ResolveModeTypeId } -export class MachineOutput extends S.TaggedClass()('MachineOutput', { +export class MachineOutput extends S.TaggedClass()('MachineOutput', { signal: OutputMode.ModeSignal, stdoutIsTTY: S.Boolean, }) { diff --git a/packages/stryker-js/src/rewrite-sandbox-tsconfig.workflow.ts b/packages/stryker-js/src/rewrite-sandbox-tsconfig.workflow.ts index 1c2b35e27..f021ad5f3 100644 --- a/packages/stryker-js/src/rewrite-sandbox-tsconfig.workflow.ts +++ b/packages/stryker-js/src/rewrite-sandbox-tsconfig.workflow.ts @@ -30,25 +30,34 @@ export const TsconfigParsed = S.TaggedStruct('TsconfigParsed', { }) export class RewriteSandboxTsconfigCommand - extends S.TaggedClass()('RewriteSandboxTsconfigCommand', { - tsconfig: S.Union([TsconfigMissing, TsconfigUnparsable, TsconfigParsed]), - }) + extends S.TaggedClass()( + 'RewriteSandboxTsconfigCommand', + { + tsconfig: S.Union([TsconfigMissing, TsconfigUnparsable, TsconfigParsed]), + }, + ) { static readonly [Workflow.InstrumentationBrand] = {} as const } -export class TsconfigSkipped extends S.TaggedClass()('TsconfigSkipped', {}) { +export class TsconfigSkipped + extends S.TaggedClass()('TsconfigSkipped', {}) +{ readonly [RewriteSandboxTsconfigTypeId] = RewriteSandboxTsconfigTypeId } -export class TsconfigKept extends S.TaggedClass()('TsconfigKept', { reason: S.String }) { +export class TsconfigKept + extends S.TaggedClass()('TsconfigKept', { reason: S.String }) +{ readonly [RewriteSandboxTsconfigTypeId] = RewriteSandboxTsconfigTypeId } -export class TsconfigRewritten extends S.TaggedClass()('TsconfigRewritten', { - config: TsConfigSchema, - follow: S.Array(S.String), -}) { +export class TsconfigRewritten + extends S.TaggedClass()('TsconfigRewritten', { + config: TsConfigSchema, + follow: S.Array(S.String), + }) +{ readonly [RewriteSandboxTsconfigTypeId] = RewriteSandboxTsconfigTypeId } diff --git a/packages/stryker-js/src/route-cli-request.workflow.ts b/packages/stryker-js/src/route-cli-request.workflow.ts index b1deb4641..0da54f0ab 100644 --- a/packages/stryker-js/src/route-cli-request.workflow.ts +++ b/packages/stryker-js/src/route-cli-request.workflow.ts @@ -10,11 +10,13 @@ import { CliRouteCommand, FeedbackJudgmentSchema, ServeChannelSchema } from './C const CliRouteDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/CliRouteDecision') type CliRouteDecisionTypeId = typeof CliRouteDecisionTypeId -export class CliHelpRequested extends S.TaggedClass()('CliHelpRequested', {}) { +export class CliHelpRequested + extends S.TaggedClass()('CliHelpRequested', {}) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliMergeRequested extends S.TaggedClass()( +export class CliMergeRequested extends S.TaggedClass()( 'CliMergeRequested', { plan: S.String, @@ -25,97 +27,123 @@ export class CliMergeRequested extends S.TaggedClass()( readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliShardRunRequested extends S.TaggedClass()('CliShardRunRequested', { - plan: S.String, - shard: S.String, - out: S.optional(S.String), -}) { +export class CliShardRunRequested + extends S.TaggedClass()('CliShardRunRequested', { + plan: S.String, + shard: S.String, + out: S.optional(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliShardLeafRequested extends S.TaggedClass()('CliShardLeafRequested', { - plan: S.String, - shard: S.String, - project: S.String, -}) { +export class CliShardLeafRequested + extends S.TaggedClass()('CliShardLeafRequested', { + plan: S.String, + shard: S.String, + project: S.String, + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliRunRequested extends S.TaggedClass()('CliRunRequested', {}) { +export class CliRunRequested + extends S.TaggedClass()('CliRunRequested', {}) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliSurvivorsRequested extends S.TaggedClass()('CliSurvivorsRequested', {}) { +export class CliSurvivorsRequested + extends S.TaggedClass()('CliSurvivorsRequested', {}) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliRerunRequested extends S.TaggedClass()('CliRerunRequested', { - ids: S.Array(S.String), -}) { +export class CliRerunRequested + extends S.TaggedClass()('CliRerunRequested', { + ids: S.Array(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliCompareRequested extends S.TaggedClass()('CliCompareRequested', { - baseline: S.String, - fresh: S.String, - noise: S.optional(S.String), -}) { +export class CliCompareRequested + extends S.TaggedClass()('CliCompareRequested', { + baseline: S.String, + fresh: S.String, + noise: S.optional(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliGateRequested extends S.TaggedClass()('CliGateRequested', { - baseline: S.optional(S.String), - updateBaseline: S.Boolean, - budgetBaseline: S.optional(S.String), - budgetTolerance: S.Finite, - updateBudgetBaseline: S.Boolean, -}) { +export class CliGateRequested + extends S.TaggedClass()('CliGateRequested', { + baseline: S.optional(S.String), + updateBaseline: S.Boolean, + budgetBaseline: S.optional(S.String), + budgetTolerance: S.Finite, + updateBudgetBaseline: S.Boolean, + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliAnnotateRequested extends S.TaggedClass()('CliAnnotateRequested', { - baseline: S.optional(S.String), -}) { +export class CliAnnotateRequested + extends S.TaggedClass()('CliAnnotateRequested', { + baseline: S.optional(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliPlanRequested extends S.TaggedClass()('CliPlanRequested', { - targetSeconds: S.Finite, - maxShards: S.optional(S.Int), - projects: S.Array(S.String).pipe(S.optional), - out: S.optional(S.String), - full: S.Boolean, -}) { +export class CliPlanRequested + extends S.TaggedClass()('CliPlanRequested', { + targetSeconds: S.Finite, + maxShards: S.optional(S.Int), + projects: S.Array(S.String).pipe(S.optional), + out: S.optional(S.String), + full: S.Boolean, + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliAuditRequested extends S.TaggedClass()('CliAuditRequested', { - matrix: S.String, - out: S.String, - countsOnly: S.Boolean, - projects: S.Array(S.String).pipe(S.optional), - files: S.Array(S.String).pipe(S.optional), -}) { +export class CliAuditRequested + extends S.TaggedClass()('CliAuditRequested', { + matrix: S.String, + out: S.String, + countsOnly: S.Boolean, + projects: S.Array(S.String).pipe(S.optional), + files: S.Array(S.String).pipe(S.optional), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliServeRequested extends S.TaggedClass()('CliServeRequested', { - channel: ServeChannelSchema, - port: S.optional(S.Int), - address: S.optional(S.String), -}) { +export class CliServeRequested + extends S.TaggedClass()('CliServeRequested', { + channel: ServeChannelSchema, + port: S.optional(S.Int), + address: S.optional(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliFeedbackRequested extends S.TaggedClass()('CliFeedbackRequested', { - id: S.String, - judgment: FeedbackJudgmentSchema, - reason: S.optional(S.String), -}) { +export class CliFeedbackRequested + extends S.TaggedClass()('CliFeedbackRequested', { + id: S.String, + judgment: FeedbackJudgmentSchema, + reason: S.optional(S.String), + }) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } -export class CliMcpRequested extends S.TaggedClass()('CliMcpRequested', {}) { +export class CliMcpRequested + extends S.TaggedClass()('CliMcpRequested', {}) +{ readonly [CliRouteDecisionTypeId] = CliRouteDecisionTypeId } diff --git a/packages/stryker-js/src/run/admit-non-empty-project.workflow.ts b/packages/stryker-js/src/run/admit-non-empty-project.workflow.ts index edfd27110..65a1a738f 100644 --- a/packages/stryker-js/src/run/admit-non-empty-project.workflow.ts +++ b/packages/stryker-js/src/run/admit-non-empty-project.workflow.ts @@ -6,19 +6,23 @@ import * as S from 'effect/Schema' const NonEmptyProjectTypeId = Symbol.for('@systemfsoftware/stryker-js/NonEmptyProjectDecision') type NonEmptyProjectTypeId = typeof NonEmptyProjectTypeId -export class NonEmptyProjectCommand extends S.TaggedClass()('NonEmptyProjectCommand', { - fileCount: S.Int, -}) { +export class NonEmptyProjectCommand + extends S.TaggedClass()('NonEmptyProjectCommand', { + fileCount: S.Int, + }) +{ static readonly [Workflow.InstrumentationBrand] = { fileCount: 'stryker.non_empty_project.file_count', } as const } -export class ProjectAdmitted extends S.TaggedClass()('ProjectAdmitted', {}) { +export class ProjectAdmitted + extends S.TaggedClass()('ProjectAdmitted', {}) +{ readonly [NonEmptyProjectTypeId] = NonEmptyProjectTypeId } -export class ProjectEmpty extends S.TaggedClass()('ProjectEmpty', {}) { +export class ProjectEmpty extends S.TaggedClass()('ProjectEmpty', {}) { readonly [NonEmptyProjectTypeId] = NonEmptyProjectTypeId } diff --git a/packages/stryker-js/src/run/describe-config-error.workflow.ts b/packages/stryker-js/src/run/describe-config-error.workflow.ts index 1c32181da..9e27db47c 100644 --- a/packages/stryker-js/src/run/describe-config-error.workflow.ts +++ b/packages/stryker-js/src/run/describe-config-error.workflow.ts @@ -8,27 +8,33 @@ import * as S from 'effect/Schema' const ConfigErrorDescriptionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ConfigErrorDescription') type ConfigErrorDescriptionTypeId = typeof ConfigErrorDescriptionTypeId -export class DescribeConfigErrorCommand extends S.TaggedClass()( - 'DescribeConfigErrorCommand', - { - message: S.String.pipe(S.optional), - errors: S.Array(S.String).pipe(S.optional), - }, -) { +export class DescribeConfigErrorCommand + extends S.TaggedClass()( + 'DescribeConfigErrorCommand', + { + message: S.String.pipe(S.optional), + errors: S.Array(S.String).pipe(S.optional), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ConfigErrorDescribed extends S.TaggedClass()('ConfigErrorDescribed', { - errors: S.Array(S.String), - text: S.String, -}) { +export class ConfigErrorDescribed + extends S.TaggedClass()('ConfigErrorDescribed', { + errors: S.Array(S.String), + text: S.String, + }) +{ readonly [ConfigErrorDescriptionTypeId] = ConfigErrorDescriptionTypeId } -export class ConfigErrorUnparsed extends S.TaggedClass()('ConfigErrorUnparsed', { - errors: S.Array(S.String), - text: S.String, -}) { +export class ConfigErrorUnparsed + extends S.TaggedClass()('ConfigErrorUnparsed', { + errors: S.Array(S.String), + text: S.String, + }) +{ readonly [ConfigErrorDescriptionTypeId] = ConfigErrorDescriptionTypeId } diff --git a/packages/stryker-js/src/run/describe-config-module-failure.workflow.ts b/packages/stryker-js/src/run/describe-config-module-failure.workflow.ts index 0a3b50560..984b490c9 100644 --- a/packages/stryker-js/src/run/describe-config-module-failure.workflow.ts +++ b/packages/stryker-js/src/run/describe-config-module-failure.workflow.ts @@ -11,26 +11,30 @@ const ConfigModuleFailureDecisionTypeId: unique symbol = Symbol.for( ) type ConfigModuleFailureDecisionTypeId = typeof ConfigModuleFailureDecisionTypeId -export class DescribeConfigImportCommand extends S.TaggedClass()( - 'DescribeConfigImportCommand', - { - file: S.String, - message: S.String, - cause: S.Unknown, - }, -) { +export class DescribeConfigImportCommand + extends S.TaggedClass()( + 'DescribeConfigImportCommand', + { + file: S.String, + message: S.String, + cause: S.Unknown, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ConfigImportDescribed extends S.TaggedClass()('ConfigImportDescribed', { - code: S.String, - message: S.String, -}) { +export class ConfigImportDescribed + extends S.TaggedClass()('ConfigImportDescribed', { + code: S.String, + message: S.String, + }) +{ readonly [ConfigModuleFailureDecisionTypeId] = ConfigModuleFailureDecisionTypeId } export class ConfigImportUnclassified - extends S.TaggedClass()('ConfigImportUnclassified', {}) + extends S.TaggedClass()('ConfigImportUnclassified', {}) { readonly [ConfigModuleFailureDecisionTypeId] = ConfigModuleFailureDecisionTypeId } diff --git a/packages/stryker-js/src/run/discover-config-file.workflow.ts b/packages/stryker-js/src/run/discover-config-file.workflow.ts index 1bd9ed865..cff43f73b 100644 --- a/packages/stryker-js/src/run/discover-config-file.workflow.ts +++ b/packages/stryker-js/src/run/discover-config-file.workflow.ts @@ -13,42 +13,52 @@ export type ConfigFileKindValue = S.Schema.Type const ConfigDiscoveryDecisionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ConfigDiscoveryDecision') type ConfigDiscoveryDecisionTypeId = typeof ConfigDiscoveryDecisionTypeId -export class ConfigFileRequest extends S.Class('ConfigFileRequest')({ - file: S.String, - kind: ConfigFileKind, - exists: S.Boolean, -}) {} - -export class ConfigDiscoveryCommand extends S.TaggedClass()('ConfigDiscoveryCommand', { - context: S.Literals(['cli', 'extends']), - requested: S.optional(ConfigFileRequest), - discovered: S.optional(S.String), - legacyPresent: S.optional(S.String), -}) { +export class ConfigFileRequest + extends S.Class('ConfigFileRequest')({ + file: S.String, + kind: ConfigFileKind, + exists: S.Boolean, + }) +{} + +export class ConfigDiscoveryCommand + extends S.TaggedClass()('ConfigDiscoveryCommand', { + context: S.Literals(['cli', 'extends']), + requested: S.optional(ConfigFileRequest), + discovered: S.optional(S.String), + legacyPresent: S.optional(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ConfigFileRead extends S.TaggedClass()('ConfigFileRead', { - file: S.String, - shadowedLegacyWarning: S.optional(S.String), -}) { +export class ConfigFileRead + extends S.TaggedClass()('ConfigFileRead', { + file: S.String, + shadowedLegacyWarning: S.optional(S.String), + }) +{ readonly [ConfigDiscoveryDecisionTypeId] = ConfigDiscoveryDecisionTypeId } -export class ConfigFileRefused extends S.TaggedClass()('ConfigFileRefused', { - file: S.String, - hint: S.String, -}) { +export class ConfigFileRefused + extends S.TaggedClass()('ConfigFileRefused', { + file: S.String, + hint: S.String, + }) +{ readonly [ConfigDiscoveryDecisionTypeId] = ConfigDiscoveryDecisionTypeId } -export class ConfigFileMissing extends S.TaggedClass()('ConfigFileMissing', { - file: S.String, -}) { +export class ConfigFileMissing + extends S.TaggedClass()('ConfigFileMissing', { + file: S.String, + }) +{ readonly [ConfigDiscoveryDecisionTypeId] = ConfigDiscoveryDecisionTypeId } -export class NoConfigFile extends S.TaggedClass()('NoConfigFile', {}) { +export class NoConfigFile extends S.TaggedClass()('NoConfigFile', {}) { readonly [ConfigDiscoveryDecisionTypeId] = ConfigDiscoveryDecisionTypeId } diff --git a/packages/stryker-js/src/run/dry-run.cell.ts b/packages/stryker-js/src/run/dry-run.cell.ts index 4f42fc7b8..1130595d2 100644 --- a/packages/stryker-js/src/run/dry-run.cell.ts +++ b/packages/stryker-js/src/run/dry-run.cell.ts @@ -723,7 +723,11 @@ export const dryRunCell: Cell.Cell writeDryRunPassed(raw), DryRunFailed: ({ testCount, failedTestCount, failedTests }, _raw) => - writeDryRunFailed({ testCount, failedTestCount, failedTests }), + writeDryRunFailed({ + testCount, + failedTestCount, + failedTests: failedTests.map(({ failureMessage, name }) => FailedTestSummary.make({ failureMessage, name })), + }), DryRunError: ({ stage, reason }) => Effect.fail(StageError.make({ stage, reason, cause: DryRunError.make({ stage, reason }) })), CommandRejected: ({ issue }) => Effect.fail(StageError.make({ stage: 'dryRun', reason: issue })), diff --git a/packages/stryker-js/src/run/explain-file-skip.workflow.ts b/packages/stryker-js/src/run/explain-file-skip.workflow.ts index 957818e1c..4364ce37f 100644 --- a/packages/stryker-js/src/run/explain-file-skip.workflow.ts +++ b/packages/stryker-js/src/run/explain-file-skip.workflow.ts @@ -10,7 +10,7 @@ export const FrameworkClaimant = S.Struct({ }) export type FrameworkClaimant = S.Schema.Type -export class ExplainFileSkipCommand extends S.TaggedClass()( +export class ExplainFileSkipCommand extends S.TaggedClass()( 'ExplainFileSkipCommand', { extension: S.String, @@ -25,26 +25,32 @@ export class ExplainFileSkipCommand extends S.TaggedClass()('FileSkipExplained', { - extension: S.String, - reason: S.String, - ownerPackage: S.NullOr(S.String), -}) { +export class FileSkipExplained + extends S.TaggedClass()('FileSkipExplained', { + extension: S.String, + reason: S.String, + ownerPackage: S.NullOr(S.String), + }) +{ readonly [ExplainFileSkipTypeId] = ExplainFileSkipTypeId } -export class SkipKnownExplained extends S.TaggedClass()('SkipKnownExplained', { - extension: S.String, - reason: S.String, - ownerPackage: S.String, -}) { +export class SkipKnownExplained + extends S.TaggedClass()('SkipKnownExplained', { + extension: S.String, + reason: S.String, + ownerPackage: S.String, + }) +{ readonly [ExplainFileSkipTypeId] = ExplainFileSkipTypeId } -export class SkipUnknownExplained extends S.TaggedClass()('SkipUnknownExplained', { - extension: S.String, - reason: S.String, -}) { +export class SkipUnknownExplained + extends S.TaggedClass()('SkipUnknownExplained', { + extension: S.String, + reason: S.String, + }) +{ readonly [ExplainFileSkipTypeId] = ExplainFileSkipTypeId } diff --git a/packages/stryker-js/src/run/extends-step.workflow.ts b/packages/stryker-js/src/run/extends-step.workflow.ts index 431086a3e..8a548be5f 100644 --- a/packages/stryker-js/src/run/extends-step.workflow.ts +++ b/packages/stryker-js/src/run/extends-step.workflow.ts @@ -23,40 +23,46 @@ type ExtendsStepDecisionTypeId = typeof ExtendsStepDecisionTypeId const configsMerge = mergeConfigs -export class ExtendsStepDone extends S.TaggedClass()('done', { +export class ExtendsStepDone extends S.TaggedClass()('done', { options: ConfigDocumentSchema, }) { readonly [ExtendsStepDecisionTypeId] = ExtendsStepDecisionTypeId } -export class ExtendsStepRead extends S.TaggedClass()('read', { +export class ExtendsStepRead extends S.TaggedClass()('read', { specifier: S.String, state: ExtendsStepStateSchema, }) { readonly [ExtendsStepDecisionTypeId] = ExtendsStepDecisionTypeId } -export class ExtendsStepResolve extends S.TaggedClass()('resolve', { - specifier: S.String, - state: ExtendsStepStateSchema, -}) { +export class ExtendsStepResolve + extends S.TaggedClass()('resolve', { + specifier: S.String, + state: ExtendsStepStateSchema, + }) +{ readonly [ExtendsStepDecisionTypeId] = ExtendsStepDecisionTypeId } -export class ExtendsStepRefused extends S.TaggedClass()('refused', { - reason: S.Literals(['cycle', 'non-string-extends']), - file: S.String, -}) { +export class ExtendsStepRefused + extends S.TaggedClass()('refused', { + reason: S.Literals(['cycle', 'non-string-extends']), + file: S.String, + }) +{ readonly [ExtendsStepDecisionTypeId] = ExtendsStepDecisionTypeId } export type ExtendsStepDecision = ExtendsStepDone | ExtendsStepRead | ExtendsStepResolve | ExtendsStepRefused -export class ExtendsStepCommand extends S.TaggedClass()('ExtendsStepCommand', { - state: ExtendsStepStateSchema, - document: ConfigDocumentSchema, - file: S.String, -}) { +export class ExtendsStepCommand + extends S.TaggedClass()('ExtendsStepCommand', { + state: ExtendsStepStateSchema, + document: ConfigDocumentSchema, + file: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/run/plan-prepare.workflow.ts b/packages/stryker-js/src/run/plan-prepare.workflow.ts index c6a112ffe..d51f7cd71 100644 --- a/packages/stryker-js/src/run/plan-prepare.workflow.ts +++ b/packages/stryker-js/src/run/plan-prepare.workflow.ts @@ -6,7 +6,7 @@ import * as S from 'effect/Schema' const PrepareDecisionTypeId = Symbol.for('@systemfsoftware/stryker-js/PrepareDecision') type PrepareDecisionTypeId = typeof PrepareDecisionTypeId -export class PrepareDecoded extends S.Class('PrepareDecoded')({ +export class PrepareDecoded extends S.Class('PrepareDecoded')({ mode: S.Literals(['human', 'machine']), reporters: S.Array(S.String), fileCount: S.Finite, @@ -17,15 +17,19 @@ export class PrepareDecoded extends S.Class('PrepareDecoded')({ } as const } -export class HumanReporters extends S.TaggedClass()('HumanReporters', { - reporters: S.Array(S.String), -}) { +export class HumanReporters + extends S.TaggedClass()('HumanReporters', { + reporters: S.Array(S.String), + }) +{ readonly [PrepareDecisionTypeId] = PrepareDecisionTypeId } -export class MachineReporters extends S.TaggedClass()('MachineReporters', { - reporters: S.Array(S.String), -}) { +export class MachineReporters + extends S.TaggedClass()('MachineReporters', { + reporters: S.Array(S.String), + }) +{ readonly [PrepareDecisionTypeId] = PrepareDecisionTypeId } diff --git a/packages/stryker-js/src/run/resolve-config.workflow.ts b/packages/stryker-js/src/run/resolve-config.workflow.ts index aef4d1d79..47ad4ec2d 100644 --- a/packages/stryker-js/src/run/resolve-config.workflow.ts +++ b/packages/stryker-js/src/run/resolve-config.workflow.ts @@ -11,30 +11,38 @@ type LoadConfigDecisionTypeId = typeof LoadConfigDecisionTypeId const DecodedOptions = S.toType(Options.StrykerOptionsSchema) -export class ConfigOptionsRefused extends S.TaggedError()('ConfigOptionsRefused', { - message: S.String, -}) {} +export class ConfigOptionsRefused + extends S.TaggedError()('ConfigOptionsRefused', { + message: S.String, + }) +{} -export class ConfigFromFile extends S.TaggedClass()('ConfigFromFile', { - options: DecodedOptions, -}) { +export class ConfigFromFile + extends S.TaggedClass()('ConfigFromFile', { + options: DecodedOptions, + }) +{ readonly [LoadConfigDecisionTypeId] = LoadConfigDecisionTypeId static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ConfigFromDefaults extends S.TaggedClass()('ConfigFromDefaults', { - options: DecodedOptions, -}) { +export class ConfigFromDefaults + extends S.TaggedClass()('ConfigFromDefaults', { + options: DecodedOptions, + }) +{ readonly [LoadConfigDecisionTypeId] = LoadConfigDecisionTypeId static readonly [Workflow.InstrumentationBrand] = {} as const } export type LoadConfigDecision = ConfigFromFile | ConfigFromDefaults -export class LoadConfigCommand extends S.TaggedClass()('LoadConfigCommand', { - document: ConfigDocumentSchema, - fileFound: S.Boolean, -}) { +export class LoadConfigCommand + extends S.TaggedClass()('LoadConfigCommand', { + document: ConfigDocumentSchema, + fileFound: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/packages/stryker-js/src/run/resolve-configured-plugin.workflow.ts b/packages/stryker-js/src/run/resolve-configured-plugin.workflow.ts index d43e974bf..fad3d3371 100644 --- a/packages/stryker-js/src/run/resolve-configured-plugin.workflow.ts +++ b/packages/stryker-js/src/run/resolve-configured-plugin.workflow.ts @@ -11,40 +11,48 @@ import { type PluginSource, PluginSourceSchema, type WorkerPluginSource } from ' const ResolvedWorkerSpawnTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/ResolvedWorkerSpawn') type ResolvedWorkerSpawnTypeId = typeof ResolvedWorkerSpawnTypeId -export class ConfiguredPluginName extends S.TaggedClass()('ConfiguredPluginName', { - name: S.String, -}) {} +export class ConfiguredPluginName + extends S.TaggedClass()('ConfiguredPluginName', { + name: S.String, + }) +{} export class ConfiguredPluginModulePath - extends S.TaggedClass()('ConfiguredPluginModulePath', { + extends S.TaggedClass()('ConfiguredPluginModulePath', { modulePath: S.String, }) {} export const ConfiguredPluginSchema = S.Union([ConfiguredPluginName, ConfiguredPluginModulePath]) -export class WorkerSpawnResolved extends S.TaggedClass()('WorkerSpawnResolved', { - kind: Plugin.WorkerPluginKind, - name: S.String, - entrypoint: S.String, -}) { +export class WorkerSpawnResolved + extends S.TaggedClass()('WorkerSpawnResolved', { + kind: Plugin.WorkerPluginKind, + name: S.String, + entrypoint: S.String, + }) +{ readonly [ResolvedWorkerSpawnTypeId] = ResolvedWorkerSpawnTypeId } -export class WorkerSpawnMissing extends S.TaggedError()('WorkerSpawnMissing', { - reason: S.String, - descriptor: S.String, -}) { +export class WorkerSpawnMissing + extends S.TaggedError()('WorkerSpawnMissing', { + reason: S.String, + descriptor: S.String, + }) +{ override get message(): string { return `${this.reason} (${this.descriptor})` } } -export class WorkerSpawnCommand extends S.TaggedClass()('WorkerSpawnCommand', { - sources: S.Array(PluginSourceSchema), - kind: Plugin.WorkerPluginKind, - configured: ConfiguredPluginSchema, -}) { +export class WorkerSpawnCommand + extends S.TaggedClass()('WorkerSpawnCommand', { + sources: S.Array(PluginSourceSchema), + kind: Plugin.WorkerPluginKind, + configured: ConfiguredPluginSchema, + }) +{ static readonly [Workflow.InstrumentationBrand] = { kind: 'stryker.plugin.kind' } as const } diff --git a/packages/stryker-js/src/run/select-package-entry.workflow.ts b/packages/stryker-js/src/run/select-package-entry.workflow.ts index 9789fe472..1da2f1b67 100644 --- a/packages/stryker-js/src/run/select-package-entry.workflow.ts +++ b/packages/stryker-js/src/run/select-package-entry.workflow.ts @@ -8,13 +8,15 @@ import * as S from 'effect/Schema' import { packageSpecifierOf } from '../import-closure.schema.js' import { type PackageExportValue, PackageManifestFields } from './package-manifest.schema.js' -export class SelectPackageEntryCommand extends S.TaggedClass()( - 'SelectPackageEntryCommand', - { - specifier: S.String, - manifest: PackageManifestFields, - }, -) { +export class SelectPackageEntryCommand + extends S.TaggedClass()( + 'SelectPackageEntryCommand', + { + specifier: S.String, + manifest: PackageManifestFields, + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = { specifier: 'stryker.package_entry.specifier', } as const @@ -23,17 +25,21 @@ export class SelectPackageEntryCommand extends S.TaggedClass()('PackageEntrySelected', { - specifier: S.String, - entry: S.String, -}) { +export class PackageEntrySelected + extends S.TaggedClass()('PackageEntrySelected', { + specifier: S.String, + entry: S.String, + }) +{ readonly [SelectPackageEntryTypeId] = SelectPackageEntryTypeId } -export class PackageEntryUnresolved extends S.TaggedClass()('PackageEntryUnresolved', { - specifier: S.String, - reason: S.String, -}) { +export class PackageEntryUnresolved + extends S.TaggedClass()('PackageEntryUnresolved', { + specifier: S.String, + reason: S.String, + }) +{ readonly [SelectPackageEntryTypeId] = SelectPackageEntryTypeId } diff --git a/packages/stryker-js/src/run/validate-options-admission.workflow.ts b/packages/stryker-js/src/run/validate-options-admission.workflow.ts index a7038137b..07dc192ed 100644 --- a/packages/stryker-js/src/run/validate-options-admission.workflow.ts +++ b/packages/stryker-js/src/run/validate-options-admission.workflow.ts @@ -26,31 +26,39 @@ export type ValidationSchemaDocument = { readonly [key: string]: A } -export class ValidateOptionsCommand extends S.TaggedClass()('ValidateOptionsCommand', { - options: S.Record(S.String, S.Unknown), - schema: ValidationSchemaDocumentSchema, -}) { +export class ValidateOptionsCommand + extends S.TaggedClass()('ValidateOptionsCommand', { + options: S.Record(S.String, S.Unknown), + schema: ValidationSchemaDocumentSchema, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class OptionsValidated extends S.TaggedClass()('OptionsValidated', { - options: DecodedOptions, - warnings: S.Array(S.String), -}) { +export class OptionsValidated + extends S.TaggedClass()('OptionsValidated', { + options: DecodedOptions, + warnings: S.Array(S.String), + }) +{ readonly [ValidateOptionsDecisionTypeId] = ValidateOptionsDecisionTypeId } -export class OptionsRefused extends S.TaggedClass()('OptionsRefused', { - errors: S.Array(S.String), - warnings: S.Array(S.String), -}) { +export class OptionsRefused + extends S.TaggedClass()('OptionsRefused', { + errors: S.Array(S.String), + warnings: S.Array(S.String), + }) +{ readonly [ValidateOptionsDecisionTypeId] = ValidateOptionsDecisionTypeId } -export class OptionsUndecodable extends S.TaggedClass()('OptionsUndecodable', { - message: S.String, - warnings: S.Array(S.String), -}) { +export class OptionsUndecodable + extends S.TaggedClass()('OptionsUndecodable', { + message: S.String, + warnings: S.Array(S.String), + }) +{ readonly [ValidateOptionsDecisionTypeId] = ValidateOptionsDecisionTypeId } diff --git a/packages/stryker-js/src/select-project-files.workflow.ts b/packages/stryker-js/src/select-project-files.workflow.ts index 31ff11199..71012b0d8 100644 --- a/packages/stryker-js/src/select-project-files.workflow.ts +++ b/packages/stryker-js/src/select-project-files.workflow.ts @@ -410,31 +410,37 @@ const MutateDescriptionSchema = S.Union([S.Boolean, S.Array(Mutant.Location)]) const FileDescriptionsSchema = S.Record(S.String, S.Struct({ mutate: MutateDescriptionSchema })) -export class ProjectSelectionCommand extends S.TaggedClass()('ProjectSelectionCommand', { - inputFileNames: S.Array(S.String), - mutatePatterns: S.Array(S.String), - targetMutatePatterns: S.Array(S.String).pipe(S.optional), - diffRanges: S.Array(S.String).pipe(S.optional), - testFilePatterns: S.Array(S.String), - testFileIgnores: S.Array(S.String).pipe(S.optional), - basePath: S.String, -}) { +export class ProjectSelectionCommand + extends S.TaggedClass()('ProjectSelectionCommand', { + inputFileNames: S.Array(S.String), + mutatePatterns: S.Array(S.String), + targetMutatePatterns: S.Array(S.String).pipe(S.optional), + diffRanges: S.Array(S.String).pipe(S.optional), + testFilePatterns: S.Array(S.String), + testFileIgnores: S.Array(S.String).pipe(S.optional), + basePath: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = { basePath: 'stryker.project_selection.base_path', } as const } -export class ProjectFilesDiscovered extends S.TaggedClass()('ProjectFilesDiscovered', { - fileDescriptions: FileDescriptionsSchema, - testFiles: S.Array(S.String), -}) { +export class ProjectFilesDiscovered + extends S.TaggedClass()('ProjectFilesDiscovered', { + fileDescriptions: FileDescriptionsSchema, + testFiles: S.Array(S.String), + }) +{ readonly [ProjectSelectionTypeId] = ProjectSelectionTypeId } -export class ProjectFilesNoneDiscovered extends S.TaggedClass()( - 'ProjectFilesNoneDiscovered', - {}, -) { +export class ProjectFilesNoneDiscovered + extends S.TaggedClass()( + 'ProjectFilesNoneDiscovered', + {}, + ) +{ readonly [ProjectSelectionTypeId] = ProjectSelectionTypeId } diff --git a/packages/stryker-js/src/shard/merge-shard-reports.workflow.ts b/packages/stryker-js/src/shard/merge-shard-reports.workflow.ts index 9e8ee5337..2ab1a90a6 100644 --- a/packages/stryker-js/src/shard/merge-shard-reports.workflow.ts +++ b/packages/stryker-js/src/shard/merge-shard-reports.workflow.ts @@ -42,22 +42,28 @@ export const MergedShardProject = S.Struct({ }) export type MergedShardProject = typeof MergedShardProject.Type -export class MergeShardReportsCommand extends S.Class('MergeShardReportsCommand')({ - shards: S.Array(PlannedShard), - reports: S.Array(ReportedShardProject), -}) { +export class MergeShardReportsCommand + extends S.Class('MergeShardReportsCommand')({ + shards: S.Array(PlannedShard), + reports: S.Array(ReportedShardProject), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class MergedShardReports extends S.TaggedClass()('MergedShardReports', { - projects: S.Array(MergedShardProject), -}) { +export class MergedShardReports + extends S.TaggedClass()('MergedShardReports', { + projects: S.Array(MergedShardProject), + }) +{ readonly [MergeShardReportsTypeId] = MergeShardReportsTypeId } -export class ShardReportGap extends S.TaggedError()('ShardReportGap', { - mutants: S.Array(S.String), -}) { +export class ShardReportGap + extends S.TaggedError()('ShardReportGap', { + mutants: S.Array(S.String), + }) +{ readonly [MergeShardReportsTypeId] = MergeShardReportsTypeId override get message(): string { @@ -65,9 +71,11 @@ export class ShardReportGap extends S.TaggedError()('ShardReport } } -export class ShardReportOverlap extends S.TaggedError()('ShardReportOverlap', { - mutants: S.Array(S.String), -}) { +export class ShardReportOverlap + extends S.TaggedError()('ShardReportOverlap', { + mutants: S.Array(S.String), + }) +{ readonly [MergeShardReportsTypeId] = MergeShardReportsTypeId override get message(): string { diff --git a/packages/stryker-js/src/shard/select-shard.workflow.ts b/packages/stryker-js/src/shard/select-shard.workflow.ts index 992bdd596..d4e081765 100644 --- a/packages/stryker-js/src/shard/select-shard.workflow.ts +++ b/packages/stryker-js/src/shard/select-shard.workflow.ts @@ -7,14 +7,16 @@ import * as S from 'effect/Schema' const SelectShardTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/SelectShard') type SelectShardTypeId = typeof SelectShardTypeId -export class SelectShardCommand extends S.Class('SelectShardCommand')({ - plan: ShardPlan, - shard: S.String, -}) { +export class SelectShardCommand + extends S.Class('SelectShardCommand')({ + plan: ShardPlan, + shard: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class SelectedShard extends S.TaggedClass()('SelectedShard', { +export class SelectedShard extends S.TaggedClass()('SelectedShard', { index: S.Int, count: S.Int, projects: S.Array(ShardProject), @@ -22,7 +24,7 @@ export class SelectedShard extends S.TaggedClass()('SelectedShard readonly [SelectShardTypeId] = SelectShardTypeId } -export class ShardUnknown extends S.TaggedError()('ShardUnknown', { +export class ShardUnknown extends S.TaggedError()('ShardUnknown', { shard: S.String, reason: S.String, }) { diff --git a/packages/stryker-js/src/shard/settle-shard-child.workflow.ts b/packages/stryker-js/src/shard/settle-shard-child.workflow.ts index 3b5767f34..d4c0b1758 100644 --- a/packages/stryker-js/src/shard/settle-shard-child.workflow.ts +++ b/packages/stryker-js/src/shard/settle-shard-child.workflow.ts @@ -14,23 +14,31 @@ const verdictFailCode: number | undefined = Option.getOrUndefined( S.decodeOption(Plugin.ExitCodeFromClass)('VerdictFail'), ) -export class SettleShardChildCommand extends S.TaggedClass()('SettleShardChildCommand', { - exitCode: S.Int, -}) { +export class SettleShardChildCommand + extends S.TaggedClass()('SettleShardChildCommand', { + exitCode: S.Int, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ShardChildCompleted extends S.TaggedClass()('ShardChildCompleted', {}) { +export class ShardChildCompleted + extends S.TaggedClass()('ShardChildCompleted', {}) +{ readonly [SettleShardChildTypeId] = SettleShardChildTypeId } -export class ShardChildVerdictFailed extends S.TaggedClass()('ShardChildVerdictFailed', {}) { +export class ShardChildVerdictFailed + extends S.TaggedClass()('ShardChildVerdictFailed', {}) +{ readonly [SettleShardChildTypeId] = SettleShardChildTypeId } -export class ShardChildAborted extends S.TaggedClass()('ShardChildAborted', { - exitCode: S.Int, -}) { +export class ShardChildAborted + extends S.TaggedClass()('ShardChildAborted', { + exitCode: S.Int, + }) +{ readonly [SettleShardChildTypeId] = SettleShardChildTypeId } diff --git a/packages/stryker-js/src/shard/shard-merge.schema.ts b/packages/stryker-js/src/shard/shard-merge.schema.ts index 553ab05de..e732ae444 100644 --- a/packages/stryker-js/src/shard/shard-merge.schema.ts +++ b/packages/stryker-js/src/shard/shard-merge.schema.ts @@ -1,9 +1,11 @@ import { RunEvent } from '@systemfsoftware/stryker-js-cli-contract' import * as S from 'effect/Schema' -export class ShardMergeFailed extends S.TaggedError()('ShardMergeFailed', { - reason: S.String, -}) { +export class ShardMergeFailed + extends S.TaggedError()('ShardMergeFailed', { + reason: S.String, + }) +{ override get message(): string { return this.reason } diff --git a/packages/stryker-js/src/shard/shard-plan.schema.ts b/packages/stryker-js/src/shard/shard-plan.schema.ts index 01f3e162e..5c9234b62 100644 --- a/packages/stryker-js/src/shard/shard-plan.schema.ts +++ b/packages/stryker-js/src/shard/shard-plan.schema.ts @@ -1,9 +1,11 @@ import * as S from 'effect/Schema' -export class ShardPlanInvalid extends S.TaggedError()('ShardPlanInvalid', { - file: S.String, - reason: S.String, -}) { +export class ShardPlanInvalid + extends S.TaggedError()('ShardPlanInvalid', { + file: S.String, + reason: S.String, + }) +{ readonly exitClass = 'ConfigError' as const override get message(): string { diff --git a/packages/stryker-js/src/shard/shard-run.schema.ts b/packages/stryker-js/src/shard/shard-run.schema.ts index 3a834813e..7b352d3d4 100644 --- a/packages/stryker-js/src/shard/shard-run.schema.ts +++ b/packages/stryker-js/src/shard/shard-run.schema.ts @@ -1,10 +1,12 @@ import * as S from 'effect/Schema' -export class ShardChildFailed extends S.TaggedError()('ShardChildFailed', { - project: S.String, - exitCode: S.Int, - childOutput: S.String, -}) { +export class ShardChildFailed + extends S.TaggedError()('ShardChildFailed', { + project: S.String, + exitCode: S.Int, + childOutput: S.String, + }) +{ readonly exitClass = 'RuntimeError' as const override get message(): string { diff --git a/packages/stryker-js/src/sort-run-plans.workflow.ts b/packages/stryker-js/src/sort-run-plans.workflow.ts index 0576132f5..1a6e971bc 100644 --- a/packages/stryker-js/src/sort-run-plans.workflow.ts +++ b/packages/stryker-js/src/sort-run-plans.workflow.ts @@ -8,15 +8,17 @@ import * as S from 'effect/Schema' const RunOrderTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-js/RunOrder') type RunOrderTypeId = typeof RunOrderTypeId -export class OrderedRunPlan extends S.TaggedClass()('OrderedRunPlan', { - id: Mutant.MutantId, - netTime: Report.NonNegativeFinite, - reloadEnvironment: S.Boolean, -}) { +export class OrderedRunPlan + extends S.TaggedClass()('OrderedRunPlan', { + id: Mutant.MutantId, + netTime: Report.NonNegativeFinite, + reloadEnvironment: S.Boolean, + }) +{ readonly [RunOrderTypeId] = RunOrderTypeId } -export class SortRunPlans extends S.TaggedClass()('SortRunPlans', { +export class SortRunPlans extends S.TaggedClass()('SortRunPlans', { plans: S.Array(OrderedRunPlan), }) { static readonly [Workflow.InstrumentationBrand] = {} as const diff --git a/packages/stryker-js/src/stryker-error.schema.ts b/packages/stryker-js/src/stryker-error.schema.ts index 00f5050f6..d3083e67e 100644 --- a/packages/stryker-js/src/stryker-error.schema.ts +++ b/packages/stryker-js/src/stryker-error.schema.ts @@ -1,18 +1,22 @@ import { Schema as S } from 'effect' -export class StrykerError extends S.TaggedError()('StrykerError', { +export class StrykerError extends S.TaggedError()('StrykerError', { message: S.String, cause: S.optional(S.Unknown), }) {} -export class ReporterStageForged extends S.TaggedError()('ReporterStageForged', {}) { +export class ReporterStageForged + extends S.TaggedError()('ReporterStageForged', {}) +{ override get message(): string { return 'Reporter stage is missing its attachments' } } -export class ReporterFactoryThrew extends S.TaggedError()('ReporterFactoryThrew', { - reporterName: S.String, - message: S.String, - cause: S.Defect(), -}) {} +export class ReporterFactoryThrew + extends S.TaggedError()('ReporterFactoryThrew', { + reporterName: S.String, + message: S.String, + cause: S.Defect(), + }) +{} diff --git a/packages/stryker-js/src/stryker-package.schema.ts b/packages/stryker-js/src/stryker-package.schema.ts index b2dd71d0d..fbc233869 100644 --- a/packages/stryker-js/src/stryker-package.schema.ts +++ b/packages/stryker-js/src/stryker-package.schema.ts @@ -1,7 +1,7 @@ import pkgJson from '@systemfsoftware/stryker-js/package.json' with { type: 'json' } import * as S from 'effect/Schema' -export class StrykerPackage extends S.Class('StrykerPackage')({ +export class StrykerPackage extends S.Class('StrykerPackage')({ name: S.String, version: S.String, }) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c72c750f7..bcd79112e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,18 +15,6 @@ catalogs: '@commitlint/types': specifier: ^21 version: 21.2.0 - '@effect/opentelemetry': - specifier: ^4.0.0 - version: 4.0.0 - '@effect/platform-node': - specifier: ^4.0.0 - version: 4.0.0 - '@effect/platform-node-shared': - specifier: ^4.0.0 - version: 4.0.0 - '@effect/tsgo': - specifier: ^0.50.0 - version: 0.50.0 '@eslint-community/regexpp': specifier: ^4.12.2 version: 4.12.2 @@ -124,8 +112,8 @@ catalogs: specifier: ^10 version: 10.0.5 effect: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.1.0 + version: 4.1.0 fast-check: specifier: ^4 version: 4.9.0 @@ -151,11 +139,11 @@ catalogs: specifier: ^1 version: 1.1.1 oxlint: - specifier: ^1 - version: 1.82.0 + specifier: ~1.90.0 + version: 1.90.0 oxlint-tsgolint: - specifier: ^7 - version: 7.0.2001 + specifier: 7.0.2005 + version: 7.0.2005 rimraf: specifier: ^6.1.3 version: 6.1.3 @@ -192,6 +180,10 @@ catalogs: version: 3.9.0 overrides: + '@effect/opentelemetry': ^4.1.0 + '@effect/platform-node': ^4.1.0 + '@effect/platform-node-shared': ^4.1.0 + '@effect/tsgo': ^0.63.0 '@systemfsoftware/oxlint-ignorer-config@*': file:.sfs-deps/oxlint-ignorer-config.tgz '@systemfsoftware/stryker-framework-interface@*': file:.sfs-deps/stryker-framework-interface.tgz '@systemfsoftware/stryker-ignorer-angular@*': file:.sfs-deps/stryker-ignorer-angular.tgz @@ -228,8 +220,8 @@ importers: specifier: 'catalog:' version: 21.2.0 '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -247,10 +239,10 @@ importers: version: 17.5.1 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 turbo: specifier: 'catalog:' version: 2.10.12 @@ -268,8 +260,8 @@ importers: version: 10.12.0 devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -287,7 +279,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -302,7 +294,7 @@ importers: version: 0.150.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -323,8 +315,8 @@ importers: version: link:../../ignorers/interface devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -342,7 +334,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -351,7 +343,7 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -372,8 +364,8 @@ importers: version: link:../interface devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -391,7 +383,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -409,7 +401,7 @@ importers: version: 0.150.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -452,7 +444,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -464,7 +456,7 @@ importers: version: 5.0.1(@vitest/browser@5.0.1)(vitest@5.0.1) oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -488,8 +480,8 @@ importers: version: link:../kit devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -507,7 +499,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -519,7 +511,7 @@ importers: version: 5.0.1(@vitest/browser@5.0.1)(vitest@5.0.1) oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -543,8 +535,8 @@ importers: version: link:../kit devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -562,7 +554,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -574,7 +566,7 @@ importers: version: 5.0.1(@vitest/browser@5.0.1)(vitest@5.0.1) oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -591,8 +583,8 @@ importers: packages/ignorers/interface: devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -613,7 +605,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -622,7 +614,7 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -668,7 +660,7 @@ importers: version: link:../../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../toolchain/vitest-config @@ -683,7 +675,7 @@ importers: version: 10.0.5 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -700,14 +692,14 @@ importers: packages/stryker-js: dependencies: '@effect/opentelemetry': - specifier: 'catalog:' - version: 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@noble/hashes': specifier: 'catalog:' version: 2.4.0 @@ -728,20 +720,20 @@ importers: version: 2.11.0(@opentelemetry/api@1.9.1) '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-vm-runner': specifier: workspace:@systemfsoftware/stryker-js-vitest-runner@^ version: link:../stryker-js-vitest-runner effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 yaml: specifier: 'catalog:' version: 2.9.1 devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -759,13 +751,13 @@ importers: version: 1.0.1(patch_hash=e976436ae352fe9fcf978ef1d4dabae26df9728372562b28e5ca60d7cde9f9ee)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../toolchain/stryker-config @@ -783,7 +775,7 @@ importers: version: link:../ignorers/interface '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../stryker-js-cli-contract @@ -804,7 +796,7 @@ importers: version: file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2) '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -813,7 +805,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -846,10 +838,10 @@ importers: version: 0.150.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -870,14 +862,14 @@ importers: version: link:../stryker-js-plugin-interface effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 devDependencies: '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -886,13 +878,13 @@ importers: version: 4.2.0 '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -901,7 +893,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -910,10 +902,10 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -936,11 +928,11 @@ importers: packages/stryker-js-html-reporter: dependencies: '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../stryker-js-cli-contract @@ -955,8 +947,8 @@ importers: version: 3.9.0 devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -965,10 +957,10 @@ importers: version: 4.2.0 '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../toolchain/stryker-config @@ -980,13 +972,13 @@ importers: version: file:.sfs-deps/stryker-ignorer-in-source-vitest-block.tgz(rolldown@1.2.8) '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-typescript-checker': specifier: file:../../.sfs-deps/stryker-js-typescript-checker.tgz version: file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2) '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -995,7 +987,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1004,13 +996,13 @@ importers: version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1037,7 +1029,7 @@ importers: version: 0.150.0 '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-framework-interface': specifier: workspace:^ version: link:../frameworks/interface @@ -1049,7 +1041,7 @@ importers: version: link:../stryker-js-plugin-interface effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 oxc-parser: specifier: 'catalog:' version: 0.150.0 @@ -1058,11 +1050,11 @@ importers: version: 1.1.1(@oxc-project/types@0.150.0)(oxc-parser@0.150.0)(rolldown@1.2.8) devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1071,13 +1063,13 @@ importers: version: 4.2.0 '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-recursion-budget': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0) + version: 2.0.0(effect@4.1.0) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../toolchain/stryker-config @@ -1092,13 +1084,13 @@ importers: version: link:../ignorers/interface '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-typescript-checker': specifier: file:../../.sfs-deps/stryker-js-typescript-checker.tgz version: file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2) '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1107,7 +1099,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1116,7 +1108,7 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1137,14 +1129,14 @@ importers: version: link:../ignorers/interface effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 devDependencies: '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1153,13 +1145,13 @@ importers: version: 4.2.0 '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1168,7 +1160,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1180,10 +1172,10 @@ importers: version: 3.9.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1207,7 +1199,7 @@ importers: version: 1.9.1 '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../stryker-js-cli-contract @@ -1216,11 +1208,11 @@ importers: version: link:../stryker-js-plugin-interface effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1229,10 +1221,10 @@ importers: version: 4.2.0 '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1241,7 +1233,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1250,10 +1242,10 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1270,8 +1262,8 @@ importers: packages/stryker-js-typescript-checker: dependencies: '@effect/opentelemetry': - specifier: 'catalog:' - version: 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@noble/hashes': specifier: 'catalog:' version: 2.4.0 @@ -1286,7 +1278,7 @@ importers: version: 2.11.0(@opentelemetry/api@1.9.1) '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../stryker-js-cli-contract @@ -1301,20 +1293,20 @@ importers: version: link:../stryker-js-plugin-runtime effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 typescript: specifier: 'catalog:' version: 7.0.2 devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1329,13 +1321,13 @@ importers: version: 1.0.1(patch_hash=e976436ae352fe9fcf978ef1d4dabae26df9728372562b28e5ca60d7cde9f9ee)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../toolchain/stryker-config @@ -1347,13 +1339,13 @@ importers: version: file:.sfs-deps/stryker-ignorer-in-source-vitest-block.tgz(rolldown@1.2.8) '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-typescript-checker': specifier: file:../../.sfs-deps/stryker-js-typescript-checker.tgz version: file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2) '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1362,7 +1354,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1374,7 +1366,7 @@ importers: version: 4.9.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1388,8 +1380,8 @@ importers: packages/stryker-js-vitest-runner: dependencies: '@effect/opentelemetry': - specifier: 'catalog:' - version: 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@opentelemetry/exporter-trace-otlp-http': specifier: 'catalog:' version: 0.222.0(@opentelemetry/api@1.9.1) @@ -1401,11 +1393,11 @@ importers: version: 2.11.0(@opentelemetry/api@1.9.1) '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1414,10 +1406,10 @@ importers: version: 4.2.0 '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../toolchain/stryker-config @@ -1429,7 +1421,7 @@ importers: version: file:.sfs-deps/stryker-ignorer-in-source-vitest-block.tgz(rolldown@1.2.8) '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../stryker-js-cli-contract @@ -1447,7 +1439,7 @@ importers: version: file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2) '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1456,7 +1448,7 @@ importers: version: link:../toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../toolchain/vitest-config @@ -1471,10 +1463,10 @@ importers: version: 10.0.5 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1491,8 +1483,8 @@ importers: packages/toolchain/oxlint-ignorer-config: devDependencies: '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@microsoft/api-extractor': specifier: 'catalog:' version: 7.59.1(@types/node@24.13.3) @@ -1504,7 +1496,7 @@ importers: version: 24.13.3 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) packages/toolchain/stryker-config: devDependencies: @@ -1513,7 +1505,7 @@ importers: version: 2.0.1 '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../vitest-config @@ -1522,7 +1514,7 @@ importers: version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 vitest: specifier: 'catalog:' version: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) @@ -1534,7 +1526,7 @@ importers: version: 2.0.1 '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../vitest-config @@ -1543,7 +1535,7 @@ importers: version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 fast-check: specifier: 'catalog:' version: 4.9.0 @@ -1573,22 +1565,22 @@ importers: version: 2.0.0 '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-recursion-budget': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0) + version: 2.0.0(effect@4.1.0) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@types/node': specifier: 'catalog:' version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 vitest: specifier: 'catalog:' version: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) @@ -1596,20 +1588,20 @@ importers: test/bench: devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-e2e-core': specifier: workspace:^ version: link:../e2e-core @@ -1621,7 +1613,7 @@ importers: version: 2.0.1 '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../packages/toolchain/vitest-config @@ -1630,16 +1622,16 @@ importers: version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 fast-check: specifier: 'catalog:' version: 4.9.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 tsx: specifier: 'catalog:' version: 4.23.15 @@ -1653,14 +1645,14 @@ importers: test/checker-parity: dependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@noble/hashes': specifier: 'catalog:' version: 2.4.0 '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js': specifier: workspace:^ version: link:../../packages/stryker-js @@ -1675,32 +1667,32 @@ importers: version: link:../../packages/stryker-js-typescript-checker effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 typescript: specifier: 'catalog:' version: 7.0.2 devDependencies: '@effect/opentelemetry': - specifier: 'catalog:' - version: 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@effect/platform-node-shared': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@opentelemetry/sdk-trace-base': specifier: 'catalog:' version: 2.11.0(@opentelemetry/api@1.9.1) '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../../packages/stryker-js-cli-contract @@ -1712,7 +1704,7 @@ importers: version: link:../../packages/toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../packages/toolchain/vitest-config @@ -1724,10 +1716,10 @@ importers: version: 4.9.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -1741,20 +1733,20 @@ importers: test/e2e: devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-microsandbox': specifier: 'catalog:' - version: 5.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) + version: 5.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) '@systemfsoftware/effect-readiness': specifier: 'catalog:' - version: 1.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) + version: 1.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) '@systemfsoftware/stryker-e2e-core': specifier: workspace:^ version: link:../e2e-core @@ -1775,16 +1767,16 @@ importers: version: link:../../packages/stryker-js-vitest-runner '@systemfsoftware/trace-spec': specifier: 'catalog:' - version: 1.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 1.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/trace-taxonomy': specifier: 'catalog:' - version: 1.0.0(effect@4.0.0) + version: 1.0.0(effect@4.1.0) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../packages/toolchain/vitest-config @@ -1793,13 +1785,13 @@ importers: version: 24.13.3 effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 microsandbox: specifier: 'catalog:' version: 0.7.2 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) tsx: specifier: 'catalog:' version: 4.23.15 @@ -1814,7 +1806,7 @@ importers: dependencies: '@systemfsoftware/effect-cell-types': specifier: 'catalog:' - version: 12.0.0(effect@4.0.0) + version: 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': specifier: workspace:^ version: link:../../packages/stryker-js-cli-contract @@ -1823,26 +1815,26 @@ importers: version: link:../../packages/stryker-js-plugin-interface effect: specifier: 'catalog:' - version: 4.0.0 + version: 4.1.0 devDependencies: '@effect/platform-node': - specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: ^4.1.0 + version: 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) '@effect/tsgo': - specifier: 'catalog:' - version: 0.50.0 + specifier: ^0.63.0 + version: 0.63.0 '@systemfsoftware/differential-spec': specifier: 'catalog:' version: 1.0.1(patch_hash=e976436ae352fe9fcf978ef1d4dabae26df9728372562b28e5ca60d7cde9f9ee)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/effect-gherkin-spec': specifier: 'catalog:' - version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/effect-schema-law': specifier: 'catalog:' - version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) + version: 5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) '@systemfsoftware/oxlint-config-recommended': specifier: 'catalog:' - version: 4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) + version: 4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) '@systemfsoftware/stryker-config': specifier: workspace:^ version: link:../../packages/toolchain/stryker-config @@ -1854,7 +1846,7 @@ importers: version: file:.sfs-deps/stryker-ignorer-in-source-vitest-block.tgz(rolldown@1.2.8) '@systemfsoftware/stryker-js': specifier: file:../../.sfs-deps/stryker-js.tgz - version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/stryker-js-instrumenter': specifier: workspace:^ version: link:../../packages/stryker-js-instrumenter @@ -1863,7 +1855,7 @@ importers: version: link:../../packages/stryker-js-typescript-checker '@systemfsoftware/stryker-js-vitest-runner': specifier: file:../../.sfs-deps/stryker-js-vitest-runner.tgz - version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1) + version: file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1) '@systemfsoftware/tsconfig': specifier: 'catalog:' version: 2.0.1 @@ -1872,7 +1864,7 @@ importers: version: link:../../packages/toolchain/tsdown-config '@systemfsoftware/vitest': specifier: 'catalog:' - version: 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + version: 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) '@systemfsoftware/vitest-config': specifier: workspace:^ version: link:../../packages/toolchain/vitest-config @@ -1884,10 +1876,10 @@ importers: version: 4.9.0 oxlint: specifier: 'catalog:' - version: 1.82.0(oxlint-tsgolint@7.0.2001) + version: 1.90.0(oxlint-tsgolint@7.0.2005) oxlint-tsgolint: specifier: 'catalog:' - version: 7.0.2001 + version: 7.0.2005 rimraf: specifier: 'catalog:' version: 6.1.3 @@ -2067,9 +2059,9 @@ packages: resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==} engines: {node: '>=20.19.0'} - '@effect/opentelemetry@4.0.0': - resolution: {integrity: sha512-vXVhqlcADHtmKlw2gIqRRlXFve4ms4JJ5ykAqzNe37QQ/5N5A5gJ9VOXkMBORHZC5O4gdHZwxhAzGZb0zvFf/Q==} - engines: {node: '>=18.0.0'} + '@effect/opentelemetry@4.1.0': + resolution: {integrity: sha512-j9bNzQaoQvcnimBFMG0i3piEW20E8HjkXAQHTJN/XqG2e4uJ9zCv53/HCNzD7+ooFn5S4nwQy/BOXeNReMIe+A==} + engines: {node: '>=22.19.0'} peerDependencies: '@opentelemetry/api': '>=1.9.0 <2.0.0' '@opentelemetry/api-logs': '>=0.203.0 <0.300.0' @@ -2080,7 +2072,7 @@ packages: '@opentelemetry/sdk-trace-node': '>=2.0.0 <3.0.0' '@opentelemetry/sdk-trace-web': '>=2.0.0 <3.0.0' '@opentelemetry/semantic-conventions': '>=1.33.0 <2.0.0' - effect: ^4.0.0 + effect: ^4.1.0 peerDependenciesMeta: '@opentelemetry/api': optional: true @@ -2099,95 +2091,56 @@ packages: '@opentelemetry/sdk-trace-web': optional: true - '@effect/platform-node-shared@4.0.0': - resolution: {integrity: sha512-VBXHJU9UXVZPdQGGDRjGXpo+TpOzRwZuMrdKAtIxi1qwcRftmacZ1zTgIrzBa0Z2RA2KVkoOecQUsTlt/nJZhw==} - engines: {node: '>=18.0.0'} + '@effect/platform-node-shared@4.1.0': + resolution: {integrity: sha512-uYQfFRoxWLo8fIhiSeBcmz/R1ooOfE3HF3cWHFgxz82tZMk2Wn02BGABcdLmaAch9VpDLbtWnuhSxNyBsGMUFg==} + engines: {node: '>=22.19.0'} peerDependencies: - effect: ^4.0.0 + effect: ^4.1.0 - '@effect/platform-node@4.0.0': - resolution: {integrity: sha512-/L+4MUbl8FejPKLHLROYSOebvHnfixkP8KiblSD/DE5uH5xENZBHaux4nH6XMnRP+lr8ajpEJFS8sUrmmxFJeQ==} - engines: {node: '>=18.0.0'} + '@effect/platform-node@4.1.0': + resolution: {integrity: sha512-v+X7moGVF9k5oMVvz0slA+NgtEod+W+oygeI285MDJgSlUCW3JcqElj+cD3rlijFZtpKhC7RLkU1GuCxjGHTpA==} + engines: {node: '>=22.19.0'} peerDependencies: - effect: ^4.0.0 + effect: ^4.1.0 redis: '>=5.0.0 <7.0.0' - '@effect/tsgo-darwin-arm64@0.45.0': - resolution: {integrity: sha512-WUoiEVcm8E19QK6fl63lsssM4dkT9IFnULbmqQ6LBfv7H9uRkpE9S3thj8ZtZ+vl/QY8atwfuaTf+3A1m/kGtQ==} - cpu: [arm64] - os: [darwin] - - '@effect/tsgo-darwin-arm64@0.50.0': - resolution: {integrity: sha512-CtpXnQbf2BXavXeY3g/LZinyXWEsMftVcbla0zbwe4HiGqueUaacCqI1HTGZ2JUFYo/3M5MsnFFe2VCWW0wj4w==} + '@effect/tsgo-darwin-arm64@0.63.0': + resolution: {integrity: sha512-KBvYatuEol71+i+BERWuDRU9XE+4sTK78N83Ko6VNF5gy6yXiujj/bgtWs2P3cDGXsevAV6L+HtpuAWjAQKC6Q==} cpu: [arm64] os: [darwin] - '@effect/tsgo-darwin-x64@0.45.0': - resolution: {integrity: sha512-s3yz7ZfIzvObXJ/r5xd9sEPxHKC3L+D+yedS1BV2Kpn47Je2svYCNYKxzXIpqFLkNjK+RcOQrcfYbYEpKZZa6g==} + '@effect/tsgo-darwin-x64@0.63.0': + resolution: {integrity: sha512-Qxp51/OFaHx5D+z5f1FtRKAiUH5rkMzaqjv/4ppUGNS0ppdqlcQ5rwQqbY6CiZOxqUlcnmKRirtWpmuxUgHP7w==} cpu: [x64] os: [darwin] - '@effect/tsgo-darwin-x64@0.50.0': - resolution: {integrity: sha512-SC3Tk1nDtjUA+UYg3qyyKUz62/mhpPOdhL9HmBBI+Cksg3XXjYw8cenmDT24yJKiwFxO3AbYQ0siXy3QrYaOdQ==} - cpu: [x64] - os: [darwin] - - '@effect/tsgo-linux-arm64@0.45.0': - resolution: {integrity: sha512-N+lyzixtylOOn49demDaqg0kb/U8ISxM10Gphs1pIMSGlqlfqC4inYEoFpYej+f4T/cRlkA11Ue7wJzNz83ePA==} - cpu: [arm64] - os: [linux] - - '@effect/tsgo-linux-arm64@0.50.0': - resolution: {integrity: sha512-u6oBSeK9bL7Ta5OJX/v92AErjl+9YQXZuHPuWGsajia6cV2IpyR5UwbOX2ekk4V2QhVpSzmSIYVIEkq9jOL6Pg==} + '@effect/tsgo-linux-arm64@0.63.0': + resolution: {integrity: sha512-uwnM3kSwaHDKPeU1WSMxijdZaM1NxpDREgJtyyIx2qdqB6HnRYhEZB8RrhWvYYPw1QDKaWHd+byzq5p49+o7+Q==} cpu: [arm64] os: [linux] - '@effect/tsgo-linux-arm@0.45.0': - resolution: {integrity: sha512-f6zL6YbWA9lXdfJ//KOjUz/U3CdGtajKi5NsR/lcQaKfZiJwHfeeLBB3yetF3qbPGSA149/kuMoDMWL13RUH3A==} + '@effect/tsgo-linux-arm@0.63.0': + resolution: {integrity: sha512-tVwlTyAqmDVPvDrr0oogCnlRVs96X19Ny9OD/XJ/6QQSp/1hIjXAvKjo9HAyncF2sAUQyVdF1E7Q7X3wFXvSnQ==} cpu: [arm] os: [linux] - '@effect/tsgo-linux-arm@0.50.0': - resolution: {integrity: sha512-qLJdYvGw4mrMrjonhqzSkwByR4X5SlUhG2Pg0LIlKVSy21B0RxLQ2Sg1Re90XpwQCcFCV1byoqW4QLT6A1YDcQ==} - cpu: [arm] - os: [linux] - - '@effect/tsgo-linux-x64@0.45.0': - resolution: {integrity: sha512-aWt0G8celAxJOis4+xiILkyMP/3J+vukimUhSoCmUAPt8zoT9qhZcN64XYZE7jfqp88ByRdgN9GK1/C7YfPtcQ==} - cpu: [x64] - os: [linux] - - '@effect/tsgo-linux-x64@0.50.0': - resolution: {integrity: sha512-x7Xz7IPP/4CKHaWk58tm+LpgMPAwNXGQcLXZAkWUoarjcXzrDG3QCoEjnIpCRSzL7O8ykShApgGcYv0Pd2tJkA==} + '@effect/tsgo-linux-x64@0.63.0': + resolution: {integrity: sha512-fM3pJIhAZEX8LMbd/pN9iYNxkdVEkx68vMtILYGT4qazwxWelvouD/5fNV0SHDmY13Mv04NJ/550vTLC2hU8VA==} cpu: [x64] os: [linux] - '@effect/tsgo-win32-arm64@0.45.0': - resolution: {integrity: sha512-EAdeV366ja+M4XCx6xjXMv4Xkc0Fgzy4bapa0saDWcGhllNLqJDfOk4lk0BgAEjBUI8+0xC+PXKVB5SMz4EpVA==} - cpu: [arm64] - os: [win32] - - '@effect/tsgo-win32-arm64@0.50.0': - resolution: {integrity: sha512-VK3PTybFLmwKI50FMcNeX1LpPv9m55coKv+PKLj7gkb91YZIUooQ7hQJdSUhiuCTaUU3kikHQpnW7UbN9q4zDw==} + '@effect/tsgo-win32-arm64@0.63.0': + resolution: {integrity: sha512-LTS0CrEqZmQO0AJAIfFaETjIN/3d/Nda1Mi5zl90y/9BKZr4yyFfClCkz+DMl6/P/+TOuEQ5Wi8LvRiEdwWT4g==} cpu: [arm64] os: [win32] - '@effect/tsgo-win32-x64@0.45.0': - resolution: {integrity: sha512-1Hsr/sT5dmIafoY9L0ASJo4VqGyPNzM1nwTb4Wj1Lmjq6kGuwO/PVozFg3WZZ0piChFmgiU3nx1AKZfyqgjGUw==} + '@effect/tsgo-win32-x64@0.63.0': + resolution: {integrity: sha512-28s5YrwL26/7EUnUOu81IOJGJZLkPf2lPkiSIsd4EnFhimeBqP279bhAoDAEwLW1gv45GKM/49JKduXmdLyT1g==} cpu: [x64] os: [win32] - '@effect/tsgo-win32-x64@0.50.0': - resolution: {integrity: sha512-ANbPqHKT/owJ9vIjyOWai+vO0IZAKZd3nN6QlPBBJyHe5BWMjz+MpntNwGxSvvp2PTMb4ZPBLQ2ixh4c9IMOMg==} - cpu: [x64] - os: [win32] - - '@effect/tsgo@0.45.0': - resolution: {integrity: sha512-gPG0ixVHgtYBUe5DbKX9vzHlhqd9+ZEfs4m/XWy0808av0A2XqMzaG3F5rnPBN7EUJRPlo9TluIi8WHx/pBV+A==} - hasBin: true - - '@effect/tsgo@0.50.0': - resolution: {integrity: sha512-BCRwWFBVfQGhFPXmLlNCbYhohTPoIzCL+0iSrDkSpSN2TRtGbbxCB1Mi4oBPr1jRk5VgMB0jOFEvXmPt3SqCDg==} + '@effect/tsgo@0.63.0': + resolution: {integrity: sha512-bRbvVj+YLE/nBmcBWGAwsul3mjEYlqqOmWMxvwSVKq/oNnJEuZYgi2OFDeUf7q49E2g3w+oMHMWyN2QayZ77RQ==} hasBin: true '@emnapi/core@2.0.0-alpha.3': @@ -2562,6 +2515,7 @@ packages: '@opentelemetry/propagator-jaeger@2.11.0': resolution: {integrity: sha512-RUOqgoIqXOPQTOhpBrs07Y8sBlxVoLY5Fka6ueZ0prW+k6fWQsba/nHDY4gm+gmfuwtRqbX5Y9YKhDvktjbIqQ==} engines: {node: ^18.19.0 || >=20.6.0} + deprecated: Package no longer supported. See https://github.com/open-telemetry/opentelemetry-js/pull/7077 peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -2592,12 +2546,14 @@ packages: '@opentelemetry/sdk-trace-base@2.11.0': resolution: {integrity: sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==} engines: {node: ^18.19.0 || >=20.6.0} + deprecated: Use @opentelemetry/sdk-trace package peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' '@opentelemetry/sdk-trace-node@2.11.0': resolution: {integrity: sha512-CuvCMJmZxswhNLlM2LfuLOW3h3fZujA4hsG4B+Sz4dX2zvaXO8Ng74cnDHWD64gLszTlhiG3c0iNUjj4g+0/sA==} engines: {node: ^18.19.0 || >=20.6.0} + deprecated: Use @opentelemetry/sdk-trace package peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -2743,33 +2699,33 @@ packages: '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} - '@oxlint-tsgolint/darwin-arm64@7.0.2001': - resolution: {integrity: sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==} + '@oxlint-tsgolint/darwin-arm64@7.0.2005': + resolution: {integrity: sha512-VqDZxcZVjlonNLuuvraVNgDQt+1ndwa4yJo8OqsK4HYh/61ba9IlMStCVfi/aaIqRoDhNbAKC8gdcTrXqnb+Ug==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@7.0.2001': - resolution: {integrity: sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==} + '@oxlint-tsgolint/darwin-x64@7.0.2005': + resolution: {integrity: sha512-4kUfLRNYoVpv0Tm3jPYrvxyfOc/LmdvFC3pKZ4tL6K7lA7K/VS81SAtmxRzbYXYSyb3SBWhwsuX+df4neqzxxA==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@7.0.2001': - resolution: {integrity: sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==} + '@oxlint-tsgolint/linux-arm64@7.0.2005': + resolution: {integrity: sha512-rhUNcPsBlKvhXtrbhbBUidtRBRdJ8fbEHN9H5Q5N59gby18ruGuDA7KUxl7oRnUzp797uykYQhkBDm+0KpfK/Q==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@7.0.2001': - resolution: {integrity: sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==} + '@oxlint-tsgolint/linux-x64@7.0.2005': + resolution: {integrity: sha512-tKs9yinDQZOHygM0e8EJnjTU3mzJtdfkOZP6Udu82iLMePUSHOhTJ9zzU/mSd1hQxURI4LTRRiFhfzC+PzwdNA==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@7.0.2001': - resolution: {integrity: sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==} + '@oxlint-tsgolint/win32-arm64@7.0.2005': + resolution: {integrity: sha512-VYPnu1gjfbSv+ROhuyNfMs382D4zQU2ZRc8Uc3nuEZo1k2kf+1KfTrg4hrlWh73h9GI+dUWyo+DYCQzUBlPwcQ==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@7.0.2001': - resolution: {integrity: sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==} + '@oxlint-tsgolint/win32-x64@7.0.2005': + resolution: {integrity: sha512-ekU89cTGy9fpQzuvxIsFHrnoP8XoFjGIRgPEW6eqgY2NYjGy9pwpjF79o04WXRMJFKRrcaVqkZXUUBdLsqpQDw==} cpu: [x64] os: [win32] @@ -2779,42 +2735,84 @@ packages: cpu: [arm] os: [android] + '@oxlint/binding-android-arm-eabi@1.90.0': + resolution: {integrity: sha512-sgfalb1HuxYjiAa4wESZ626z1FGusqNcXYHyB5oIOEprS2sbPg0UYEfo83uF1GNG70DIfZxHkXuE6KFrlSdn8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxlint/binding-android-arm64@1.82.0': resolution: {integrity: sha512-OBlhRgNqFblGpGenno/aqOfJLOkQ2B8Ig3iDAalfn0H8hJGZKXPeexCRTDm6uwv6YUjSA9Xnwt1y/Bgj5ZH8uw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@oxlint/binding-android-arm64@1.90.0': + resolution: {integrity: sha512-RcKhz1ETMq+fazE9TKS2+5NIRGwigm/nW8egqF0LI+A8Yw2iW5r0E/C3XAPRiwIm/vcPiutIRIa6IQCIKhZsTQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxlint/binding-darwin-arm64@1.82.0': resolution: {integrity: sha512-dsopxqtY5ZdyT9uLHyGt1SyiLop6hi7hWI3PKpePodkRQOkLaCm+OE4fR9CAz9qdfjiFO8531tX/QDyP/psjFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@oxlint/binding-darwin-arm64@1.90.0': + resolution: {integrity: sha512-PSrxMvP6mx+p1karZcUxLdy9lpaP+JWQPti4al9FgTaPhxE+pT/BjhGExloVVSWgZgIfOlLOjVyyq8BXlodhLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@oxlint/binding-darwin-x64@1.82.0': resolution: {integrity: sha512-94Lu0SgTClKColU66g1VDuigV3HkcbkJBnTtZjGYfE8UPugaWDgKrm2icjC6HJVUYler2OXaHP/X0TBy8+CowQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@oxlint/binding-darwin-x64@1.90.0': + resolution: {integrity: sha512-OLbU9qsrV2Q8QxT2OEzOPdO8zCCpyI8qB+hDI8yr6RsYELtkf0FAZhJdfjM/RnLHKzt44HWwAPnk92vBtKofvw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@oxlint/binding-freebsd-x64@1.82.0': resolution: {integrity: sha512-hne/V06ewhh1i0w8+l7GDNROAGCGPmyFuOwiP7YTRu0JycyStJ4785dmF8xU5p0uUwt2emvIF9vc7Xjis+cJ0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@oxlint/binding-freebsd-x64@1.90.0': + resolution: {integrity: sha512-fBA4pWyVDARmNucQqpyFuPC49xYf1r+sX7dxPL5fNPQrSMLum39Sn56tZ9JPleWC7FzLPwSQ7plYYfirYBHF8A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@oxlint/binding-linux-arm-gnueabihf@1.82.0': resolution: {integrity: sha512-aWY2xtbZf1LneW9Qsv/n2Sp8gOu74JrlQzEtj4coHX2SHFrCfhmAumaU+sI/A5nr+yoTRTSmI/pL2s6ADlNSkw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxlint/binding-linux-arm-gnueabihf@1.90.0': + resolution: {integrity: sha512-zhxH78eP2nR6/pGdhBc7MIfjhhcgATeu8fkmkFJbuzfk6Cj0FzBxyEhL85yDqrCybjx+G2YDzZGsxIO9kvO4Iw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxlint/binding-linux-arm-musleabihf@1.82.0': resolution: {integrity: sha512-Fe+TtXCXMh/5f7kWlZ2VAwsMumZWtraFlKVk1NJlL52/beGwfDE7ov+/8gVirHzWokzGu7X65hSPq0ucPDskWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@oxlint/binding-linux-arm-musleabihf@1.90.0': + resolution: {integrity: sha512-MvYmpHyJqUJjEvkZbJHdwfdL45cGn8EVBkYmoXFiaYFW9suoD3dbJl5mBdpy0DVgdjlyddmldbRtk3cCgETadQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@oxlint/binding-linux-arm64-gnu@1.82.0': resolution: {integrity: sha512-6azCZ6OJudlvipNttXCCQcyeFfcJ/NvUZdSN1z8elo73kCHtyQC7WTiUcSjWYvJ1jaq9KDUyMAoAS/vNzhBomA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2822,6 +2820,13 @@ packages: os: [linux] libc: [glibc] + '@oxlint/binding-linux-arm64-gnu@1.90.0': + resolution: {integrity: sha512-L13Sy+Kg0nZhwTsToniqjUFPA2TuM6962qCZ5Wp5KeB517Tw7ApdLTTtlb+bF86fcZZa2EtvCVvAJxk4Dya/MQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxlint/binding-linux-arm64-musl@1.82.0': resolution: {integrity: sha512-PLEaSD8IAIIlwW4dwOd9YaxuxeOpwiXL4J24rcnE4iNtyM5j9Q9/3+gti08oXpx0u2ygNjRDx9xjWWpQonuJEw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2829,6 +2834,13 @@ packages: os: [linux] libc: [musl] + '@oxlint/binding-linux-arm64-musl@1.90.0': + resolution: {integrity: sha512-wFDdZWGpzIPFdJFjSLWnKB0TGzFriTKUIrl04iMqMyM9BBIJTuerfCHYa0WpDSjr5x3lcW/CHLyacSt886WpGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxlint/binding-linux-ppc64-gnu@1.82.0': resolution: {integrity: sha512-D94em/BwknNTn4vqxjHh5wb2oL566eFhArabqKIr0cNZMHOJuiraFp1A8tXpH05bbE5tqwEfLXTI0MWEGtn3Dw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2836,6 +2848,13 @@ packages: os: [linux] libc: [glibc] + '@oxlint/binding-linux-ppc64-gnu@1.90.0': + resolution: {integrity: sha512-FRywfn+MoKn8xpBSzgNwNVliSKRI2QXkxi/iF7o6FEQs8Bh8z2RpVTaFAcO3pchXjvB2eGNFIoLLQABIQ+u7VA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxlint/binding-linux-riscv64-gnu@1.82.0': resolution: {integrity: sha512-MOprxBaoYU2D4VgxXCl3ghydThWtx7Um1lL51kGYNeQ5Al7WzsH7/tqGdNtbLrIWnjq3bsm13+nz/gRIxjrOXw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2843,6 +2862,13 @@ packages: os: [linux] libc: [glibc] + '@oxlint/binding-linux-riscv64-gnu@1.90.0': + resolution: {integrity: sha512-IS2PaUgpc/qeLADTyhUNmdx3x4ijs9pjJdPKBYHaT+mAE7k3FsjnHPTjhpsak1b++h6CIPhv6WX9Z+y7Pw0voQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxlint/binding-linux-riscv64-musl@1.82.0': resolution: {integrity: sha512-5h55QsfJ/luDXZzC20k6SNOY1Az+dCP9WvntKtcUWh2JhckAdwApY2ZusaBTwLENnReXU+A2fJtSrYvZJNKNPg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2850,6 +2876,13 @@ packages: os: [linux] libc: [musl] + '@oxlint/binding-linux-riscv64-musl@1.90.0': + resolution: {integrity: sha512-s7JFKRkGS8O7i2ZVODfuO++NC7sH6HDqpMn8lYxw91w0SXJOxnAVjQ8utvmDwLMMT0jaSkuOKuUYJDGDtu4sHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxlint/binding-linux-s390x-gnu@1.82.0': resolution: {integrity: sha512-IE8NJNLlHr0CaXyGJPGVn0eTkUyoj1I2UfA8x7I4PSOYKsQ/6btVC7Pywrj5onk0cMH25r6Z38SoN3AvE5Zuog==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2857,6 +2890,13 @@ packages: os: [linux] libc: [glibc] + '@oxlint/binding-linux-s390x-gnu@1.90.0': + resolution: {integrity: sha512-b0GxrOQr5VONCkd7KLSqmP6b6nqZuTpuS8QPQHzltmqdXP5bY0Jl0CZ0QmlCTrS3ExaLYbioFYOARzNbYvcApQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxlint/binding-linux-x64-gnu@1.82.0': resolution: {integrity: sha512-XUUUxaBo9XKl+J1B9EmP1cTGQPddzeURvoGkfwh/94PGnbW+hBprDljneoI2M1jzC1bzrIV3ihc7iM9UXl8+tg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2864,6 +2904,13 @@ packages: os: [linux] libc: [glibc] + '@oxlint/binding-linux-x64-gnu@1.90.0': + resolution: {integrity: sha512-iaJeShJtgUp8rZbt9YUdTAGOpmX5KogCLba17Jp1tWdJ3F4M3D2g2TKUyI1FMTHxKH9NNHuQcuC2kZRg6IV7yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxlint/binding-linux-x64-musl@1.82.0': resolution: {integrity: sha512-SWLSFulX9TDuH6yvbPYp4+VNn6jkkIvvI+KiujDM5rWBRHEfkesCC/pCneIIUr6ovkxZ5fRtpi2v5Cz5FrMJZg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2871,30 +2918,61 @@ packages: os: [linux] libc: [musl] + '@oxlint/binding-linux-x64-musl@1.90.0': + resolution: {integrity: sha512-/aZoXnL5WBLCXuzfHqvEFXcm4iwYmr/cYByHDTXzLFzJdE5DC7bm6phpWqHv6BeqpVgY9IpBAxGDv2WEkl5JCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxlint/binding-openharmony-arm64@1.82.0': resolution: {integrity: sha512-BQy35f6ZUdNr9a6c7B7orxQTcLjByGT2z3WAgmRovpRwmPYAaJ+NTplmMzhdjdJ4qSchfMNZy/Ukg+qRg6zseQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@oxlint/binding-openharmony-arm64@1.90.0': + resolution: {integrity: sha512-SMhk7ozwoxYDKfYqGZCQEfULOKDneF9uhaoIf2neoDLWvNtjY9yVeL7YHmE5L9WdKvMpWNwwZxhenxBu6AgfOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@oxlint/binding-win32-arm64-msvc@1.82.0': resolution: {integrity: sha512-V4QhSTg5gctZue8RJjsGi7NpQPThr/p1/HfmiMC5kfe1KFEup9SQRVub4A6kijQjdHfxj7bLL1KO3QO7/5bwMQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@oxlint/binding-win32-arm64-msvc@1.90.0': + resolution: {integrity: sha512-KBvR3A9fO7fCi2vCP8ifWvlia7tGEQV9NaYh+IGwa/7Groy48Mt/UaYqMK9/zOtAWl20BUCf6RPqzJ32fRw33Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxlint/binding-win32-ia32-msvc@1.82.0': resolution: {integrity: sha512-TUSCLaKB2yktpFAJ/r3HAUYsaV/3DT7JS4iNKyoh3a9YNwD0UG7Ezh4D8m23654vQcU6P/RQrCAjRPKe4peP/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@oxlint/binding-win32-ia32-msvc@1.90.0': + resolution: {integrity: sha512-+x42rDHQGbTCuT3EzpWAzhP3NoVPE/cJsG4gnrakOSg0olV+GCdMpPU23Nvrl3zZMnXxFZdTtDv4D3SuaA5ZeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@oxlint/binding-win32-x64-msvc@1.82.0': resolution: {integrity: sha512-VTVoRIWJTb+wvUX8EYoPArfFH02whuR10goFXE/LHRRX33ajRrFgqbcONXZMiF4C5rnattfkm87HqYn8jb8hmQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@oxlint/binding-win32-x64-msvc@1.90.0': + resolution: {integrity: sha512-30JiaFEBUB9peEOcvVM8ggo88SoN/IdSr9DW505JdBji/R6dM66gKEiG65hw6qcaF2f4mO0cEJ+RwRZprmun9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxlint/plugins@1.82.0': resolution: {integrity: sha512-IDF4UXBNOaCeLoEpVxf5Bg85KOWdeuBEkbo1rGzS2vXcbD+GT1asBSeeTC+5BgW6NFTHVByd6N5giHsFPGtwAA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3391,8 +3469,8 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/ws@8.18.2': + resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==} '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} @@ -3939,8 +4017,8 @@ packages: oxc-resolver: optional: true - effect@4.0.0: - resolution: {integrity: sha512-ooc1TG5t+FfzgYnFz2ff6BBKyZ7EwBRVXC7c4RhQUAD6/TZ2gTXXMeb4WX7a19ozQo4J73/QW+S00YAIresoMQ==} + effect@4.1.0: + resolution: {integrity: sha512-lGx2MJJyrXA8RZb2UpQ/0Nkb5Utaimby7oD92+18noBxLPE85IFOvptdzau8dvcxAOwfwHo9iqapbKeFzqQM/Q==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -4338,8 +4416,8 @@ packages: rolldown: optional: true - oxlint-tsgolint@7.0.2001: - resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==} + oxlint-tsgolint@7.0.2005: + resolution: {integrity: sha512-6ccPGu4u4J9bwYPHXBFPee3RZrX3BboRdU7k14zRDDB1lvN3O7J/vPRFdaEfa1+CWx4xnQQOp4ctoaF66oO0uw==} hasBin: true oxlint@1.82.0: @@ -4355,6 +4433,19 @@ packages: vite-plus: optional: true + oxlint@1.90.0: + resolution: {integrity: sha512-RkTN9EmgIUpLuhNoLhO3OliMGJlvb3Dk7XVjBZnfoMCHrVpuz5ESd97klfiyYeV7XfA2lNLnDCPMkUI+Qw5How==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2005' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -4675,8 +4766,8 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@8.11.2: - resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} engines: {node: '>=22.19.0'} universalify@2.0.1: @@ -5055,10 +5146,10 @@ snapshots: '@csstools/css-tokenizer@4.0.1': {} - '@effect/opentelemetry@4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)': + '@effect/opentelemetry@4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)': dependencies: '@opentelemetry/semantic-conventions': 1.43.0 - effect: 4.0.0 + effect: 4.1.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.222.0 @@ -5068,86 +5159,55 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-node': 2.11.0(@opentelemetry/api@1.9.1) - '@effect/platform-node-shared@4.0.0(effect@4.0.0)': + '@effect/platform-node-shared@4.1.0(effect@4.1.0)': dependencies: - '@types/ws': 8.18.1 - effect: 4.0.0 + '@types/ws': 8.18.2 + effect: 4.1.0 ws: 8.22.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))': + '@effect/platform-node@4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))': dependencies: - '@effect/platform-node-shared': 4.0.0(effect@4.0.0) - effect: 4.0.0 + '@effect/platform-node-shared': 4.1.0(effect@4.1.0) + effect: 4.1.0 redis: 6.2.1(@opentelemetry/api@1.9.1) - undici: 8.11.2 + undici: 8.12.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/tsgo-darwin-arm64@0.45.0': + '@effect/tsgo-darwin-arm64@0.63.0': optional: true - '@effect/tsgo-darwin-arm64@0.50.0': + '@effect/tsgo-darwin-x64@0.63.0': optional: true - '@effect/tsgo-darwin-x64@0.45.0': + '@effect/tsgo-linux-arm64@0.63.0': optional: true - '@effect/tsgo-darwin-x64@0.50.0': + '@effect/tsgo-linux-arm@0.63.0': optional: true - '@effect/tsgo-linux-arm64@0.45.0': + '@effect/tsgo-linux-x64@0.63.0': optional: true - '@effect/tsgo-linux-arm64@0.50.0': + '@effect/tsgo-win32-arm64@0.63.0': optional: true - '@effect/tsgo-linux-arm@0.45.0': + '@effect/tsgo-win32-x64@0.63.0': optional: true - '@effect/tsgo-linux-arm@0.50.0': - optional: true - - '@effect/tsgo-linux-x64@0.45.0': - optional: true - - '@effect/tsgo-linux-x64@0.50.0': - optional: true - - '@effect/tsgo-win32-arm64@0.45.0': - optional: true - - '@effect/tsgo-win32-arm64@0.50.0': - optional: true - - '@effect/tsgo-win32-x64@0.45.0': - optional: true - - '@effect/tsgo-win32-x64@0.50.0': - optional: true - - '@effect/tsgo@0.45.0': - optionalDependencies: - '@effect/tsgo-darwin-arm64': 0.45.0 - '@effect/tsgo-darwin-x64': 0.45.0 - '@effect/tsgo-linux-arm': 0.45.0 - '@effect/tsgo-linux-arm64': 0.45.0 - '@effect/tsgo-linux-x64': 0.45.0 - '@effect/tsgo-win32-arm64': 0.45.0 - '@effect/tsgo-win32-x64': 0.45.0 - - '@effect/tsgo@0.50.0': + '@effect/tsgo@0.63.0': optionalDependencies: - '@effect/tsgo-darwin-arm64': 0.50.0 - '@effect/tsgo-darwin-x64': 0.50.0 - '@effect/tsgo-linux-arm': 0.50.0 - '@effect/tsgo-linux-arm64': 0.50.0 - '@effect/tsgo-linux-x64': 0.50.0 - '@effect/tsgo-win32-arm64': 0.50.0 - '@effect/tsgo-win32-x64': 0.50.0 + '@effect/tsgo-darwin-arm64': 0.63.0 + '@effect/tsgo-darwin-x64': 0.63.0 + '@effect/tsgo-linux-arm': 0.63.0 + '@effect/tsgo-linux-arm64': 0.63.0 + '@effect/tsgo-linux-x64': 0.63.0 + '@effect/tsgo-win32-arm64': 0.63.0 + '@effect/tsgo-win32-x64': 0.63.0 '@emnapi/core@2.0.0-alpha.3': dependencies: @@ -5629,81 +5689,138 @@ snapshots: '@oxc-project/types@0.150.0': {} - '@oxlint-tsgolint/darwin-arm64@7.0.2001': + '@oxlint-tsgolint/darwin-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/darwin-x64@7.0.2001': + '@oxlint-tsgolint/darwin-x64@7.0.2005': optional: true - '@oxlint-tsgolint/linux-arm64@7.0.2001': + '@oxlint-tsgolint/linux-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/linux-x64@7.0.2001': + '@oxlint-tsgolint/linux-x64@7.0.2005': optional: true - '@oxlint-tsgolint/win32-arm64@7.0.2001': + '@oxlint-tsgolint/win32-arm64@7.0.2005': optional: true - '@oxlint-tsgolint/win32-x64@7.0.2001': + '@oxlint-tsgolint/win32-x64@7.0.2005': optional: true '@oxlint/binding-android-arm-eabi@1.82.0': optional: true + '@oxlint/binding-android-arm-eabi@1.90.0': + optional: true + '@oxlint/binding-android-arm64@1.82.0': optional: true + '@oxlint/binding-android-arm64@1.90.0': + optional: true + '@oxlint/binding-darwin-arm64@1.82.0': optional: true + '@oxlint/binding-darwin-arm64@1.90.0': + optional: true + '@oxlint/binding-darwin-x64@1.82.0': optional: true + '@oxlint/binding-darwin-x64@1.90.0': + optional: true + '@oxlint/binding-freebsd-x64@1.82.0': optional: true + '@oxlint/binding-freebsd-x64@1.90.0': + optional: true + '@oxlint/binding-linux-arm-gnueabihf@1.82.0': optional: true + '@oxlint/binding-linux-arm-gnueabihf@1.90.0': + optional: true + '@oxlint/binding-linux-arm-musleabihf@1.82.0': optional: true + '@oxlint/binding-linux-arm-musleabihf@1.90.0': + optional: true + '@oxlint/binding-linux-arm64-gnu@1.82.0': optional: true + '@oxlint/binding-linux-arm64-gnu@1.90.0': + optional: true + '@oxlint/binding-linux-arm64-musl@1.82.0': optional: true + '@oxlint/binding-linux-arm64-musl@1.90.0': + optional: true + '@oxlint/binding-linux-ppc64-gnu@1.82.0': optional: true + '@oxlint/binding-linux-ppc64-gnu@1.90.0': + optional: true + '@oxlint/binding-linux-riscv64-gnu@1.82.0': optional: true + '@oxlint/binding-linux-riscv64-gnu@1.90.0': + optional: true + '@oxlint/binding-linux-riscv64-musl@1.82.0': optional: true + '@oxlint/binding-linux-riscv64-musl@1.90.0': + optional: true + '@oxlint/binding-linux-s390x-gnu@1.82.0': optional: true + '@oxlint/binding-linux-s390x-gnu@1.90.0': + optional: true + '@oxlint/binding-linux-x64-gnu@1.82.0': optional: true + '@oxlint/binding-linux-x64-gnu@1.90.0': + optional: true + '@oxlint/binding-linux-x64-musl@1.82.0': optional: true + '@oxlint/binding-linux-x64-musl@1.90.0': + optional: true + '@oxlint/binding-openharmony-arm64@1.82.0': optional: true + '@oxlint/binding-openharmony-arm64@1.90.0': + optional: true + '@oxlint/binding-win32-arm64-msvc@1.82.0': optional: true + '@oxlint/binding-win32-arm64-msvc@1.90.0': + optional: true + '@oxlint/binding-win32-ia32-msvc@1.82.0': optional: true + '@oxlint/binding-win32-ia32-msvc@1.90.0': + optional: true + '@oxlint/binding-win32-x64-msvc@1.82.0': optional: true + '@oxlint/binding-win32-x64-msvc@1.90.0': + optional: true + '@oxlint/plugins@1.82.0': {} '@polka/url@1.0.0-next.29': {} @@ -5869,10 +5986,10 @@ snapshots: '@systemfsoftware/differential-spec@1.0.1(patch_hash=e976436ae352fe9fcf978ef1d4dabae26df9728372562b28e5ca60d7cde9f9ee)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1)': dependencies: - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) - '@systemfsoftware/effect-sim-kernel': 1.0.0(effect@4.0.0) - '@systemfsoftware/vitest': 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) - effect: 4.0.0 + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) + '@systemfsoftware/effect-sim-kernel': 1.0.0(effect@4.1.0) + '@systemfsoftware/vitest': 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + effect: 4.1.0 fast-check: 4.9.0 transitivePeerDependencies: - bufferutil @@ -5880,23 +5997,23 @@ snapshots: - utf-8-validate - vitest - '@systemfsoftware/effect-cell-types@12.0.0(effect@4.0.0)': + '@systemfsoftware/effect-cell-types@12.0.0(effect@4.1.0)': dependencies: - effect: 4.0.0 + effect: 4.1.0 - '@systemfsoftware/effect-gherkin-spec@7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1)': + '@systemfsoftware/effect-gherkin-spec@7.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1)': dependencies: - '@systemfsoftware/effect-spec-runtime': 1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) - '@systemfsoftware/vitest': 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) - effect: 4.0.0 + '@systemfsoftware/effect-spec-runtime': 1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) + '@systemfsoftware/vitest': 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + effect: 4.1.0 vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) - '@systemfsoftware/effect-microsandbox@5.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2)': + '@systemfsoftware/effect-microsandbox@5.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2)': dependencies: - '@effect/platform-node': 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) - '@systemfsoftware/effect-readiness': 1.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) - effect: 4.0.0 + '@effect/platform-node': 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) + '@systemfsoftware/effect-readiness': 1.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2) + effect: 4.1.0 microsandbox: 0.7.2 typescript: 7.0.2 transitivePeerDependencies: @@ -5904,11 +6021,11 @@ snapshots: - redis - utf-8-validate - '@systemfsoftware/effect-readiness@1.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2)': + '@systemfsoftware/effect-readiness@1.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(typescript@7.0.2)': dependencies: - '@effect/platform-node': 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) - effect: 4.0.0 + '@effect/platform-node': 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) + effect: 4.1.0 typescript: 7.0.2 transitivePeerDependencies: - bufferutil @@ -5920,102 +6037,102 @@ snapshots: '@oxc-project/types': 0.150.0 oxc-parser: 0.150.0 - '@systemfsoftware/effect-schema-law@5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1)': + '@systemfsoftware/effect-schema-law@5.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1)': dependencies: - '@systemfsoftware/vitest': 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) - effect: 4.0.0 + '@systemfsoftware/vitest': 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + effect: 4.1.0 vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) - '@systemfsoftware/effect-schema-recursion-budget@2.0.0(effect@4.0.0)': + '@systemfsoftware/effect-schema-recursion-budget@2.0.0(effect@4.1.0)': dependencies: '@oxc-project/types': 0.150.0 - effect: 4.0.0 + effect: 4.1.0 oxc-parser: 0.150.0 - '@systemfsoftware/effect-sim-kernel@1.0.0(effect@4.0.0)': + '@systemfsoftware/effect-sim-kernel@1.0.0(effect@4.1.0)': dependencies: - effect: 4.0.0 + effect: 4.1.0 - '@systemfsoftware/effect-spec-runtime@1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1)': + '@systemfsoftware/effect-spec-runtime@1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1)': dependencies: - '@systemfsoftware/effect-sim-kernel': 1.0.0(effect@4.0.0) - '@systemfsoftware/vitest': 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) - effect: 4.0.0 + '@systemfsoftware/effect-sim-kernel': 1.0.0(effect@4.1.0) + '@systemfsoftware/vitest': 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + effect: 4.1.0 vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) - '@systemfsoftware/oxlint-config-cell-architecture@4.0.0(effect@4.0.0)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2)': + '@systemfsoftware/oxlint-config-cell-architecture@4.0.0(effect@4.1.0)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2)': dependencies: - '@systemfsoftware/oxlint-plugin-cell-architecture': 5.0.0(effect@4.0.0)(typescript@7.0.2) - effect: 4.0.0 - oxlint: 1.82.0(oxlint-tsgolint@7.0.2001) + '@systemfsoftware/oxlint-plugin-cell-architecture': 5.0.0(effect@4.1.0)(typescript@7.0.2) + effect: 4.1.0 + oxlint: 1.90.0(oxlint-tsgolint@7.0.2005) typescript: 7.0.2 - '@systemfsoftware/oxlint-config-dmmf@2.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2)': + '@systemfsoftware/oxlint-config-dmmf@2.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2)': dependencies: - '@systemfsoftware/oxlint-plugin-dmmf-workflow': 7.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(typescript@7.0.2) - '@systemfsoftware/oxlint-plugin-effect-schema': 6.0.0(effect@4.0.0)(typescript@7.0.2) - effect: 4.0.0 - oxlint: 1.82.0(oxlint-tsgolint@7.0.2001) - oxlint-tsgolint: 7.0.2001 + '@systemfsoftware/oxlint-plugin-dmmf-workflow': 7.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(typescript@7.0.2) + '@systemfsoftware/oxlint-plugin-effect-schema': 6.0.0(effect@4.1.0)(typescript@7.0.2) + effect: 4.1.0 + oxlint: 1.90.0(oxlint-tsgolint@7.0.2005) + oxlint-tsgolint: 7.0.2005 typescript: 7.0.2 transitivePeerDependencies: - vite-plus - '@systemfsoftware/oxlint-config-recommended@4.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2)': + '@systemfsoftware/oxlint-config-recommended@4.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2)': dependencies: - '@effect/tsgo': 0.45.0 - '@systemfsoftware/oxlint-config-cell-architecture': 4.0.0(effect@4.0.0)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) - '@systemfsoftware/oxlint-config-dmmf': 2.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(oxlint@1.82.0(oxlint-tsgolint@7.0.2001))(typescript@7.0.2) - '@systemfsoftware/oxlint-plugin-effect-platform': 2.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(typescript@7.0.2) - '@systemfsoftware/oxlint-plugin-test-discipline': 5.0.0(effect@4.0.0)(typescript@7.0.2) - effect: 4.0.0 - oxlint: 1.82.0(oxlint-tsgolint@7.0.2001) - oxlint-tsgolint: 7.0.2001 + '@effect/tsgo': 0.63.0 + '@systemfsoftware/oxlint-config-cell-architecture': 4.0.0(effect@4.1.0)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) + '@systemfsoftware/oxlint-config-dmmf': 2.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(oxlint@1.90.0(oxlint-tsgolint@7.0.2005))(typescript@7.0.2) + '@systemfsoftware/oxlint-plugin-effect-platform': 2.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(typescript@7.0.2) + '@systemfsoftware/oxlint-plugin-test-discipline': 5.0.0(effect@4.1.0)(typescript@7.0.2) + effect: 4.1.0 + oxlint: 1.90.0(oxlint-tsgolint@7.0.2005) + oxlint-tsgolint: 7.0.2005 typescript: 7.0.2 transitivePeerDependencies: - vite-plus - '@systemfsoftware/oxlint-plugin-cell-architecture@5.0.0(effect@4.0.0)(typescript@7.0.2)': + '@systemfsoftware/oxlint-plugin-cell-architecture@5.0.0(effect@4.1.0)(typescript@7.0.2)': dependencies: '@oxc-project/types': 0.150.0 '@oxlint/plugins': 1.82.0 - effect: 4.0.0 + effect: 4.1.0 typescript: 7.0.2 - '@systemfsoftware/oxlint-plugin-dmmf-workflow@7.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(typescript@7.0.2)': + '@systemfsoftware/oxlint-plugin-dmmf-workflow@7.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(typescript@7.0.2)': dependencies: '@oxc-project/types': 0.150.0 '@oxlint/plugins': 1.82.0 - effect: 4.0.0 - oxlint: 1.82.0(oxlint-tsgolint@7.0.2001) + effect: 4.1.0 + oxlint: 1.82.0(oxlint-tsgolint@7.0.2005) typescript: 7.0.2 transitivePeerDependencies: - oxlint-tsgolint - vite-plus - '@systemfsoftware/oxlint-plugin-effect-platform@2.0.0(effect@4.0.0)(oxlint-tsgolint@7.0.2001)(typescript@7.0.2)': + '@systemfsoftware/oxlint-plugin-effect-platform@2.0.0(effect@4.1.0)(oxlint-tsgolint@7.0.2005)(typescript@7.0.2)': dependencies: '@oxc-project/types': 0.150.0 '@oxlint/plugins': 1.82.0 - effect: 4.0.0 - oxlint: 1.82.0(oxlint-tsgolint@7.0.2001) + effect: 4.1.0 + oxlint: 1.82.0(oxlint-tsgolint@7.0.2005) typescript: 7.0.2 transitivePeerDependencies: - oxlint-tsgolint - vite-plus - '@systemfsoftware/oxlint-plugin-effect-schema@6.0.0(effect@4.0.0)(typescript@7.0.2)': + '@systemfsoftware/oxlint-plugin-effect-schema@6.0.0(effect@4.1.0)(typescript@7.0.2)': dependencies: '@oxc-project/types': 0.150.0 '@oxlint/plugins': 1.82.0 - effect: 4.0.0 + effect: 4.1.0 typescript: 7.0.2 - '@systemfsoftware/oxlint-plugin-test-discipline@5.0.0(effect@4.0.0)(typescript@7.0.2)': + '@systemfsoftware/oxlint-plugin-test-discipline@5.0.0(effect@4.1.0)(typescript@7.0.2)': dependencies: '@oxc-project/types': 0.150.0 '@oxlint/plugins': 1.82.0 - effect: 4.0.0 + effect: 4.1.0 typescript: 7.0.2 '@systemfsoftware/stryker-framework-interface@file:.sfs-deps/stryker-framework-interface.tgz': @@ -6050,18 +6167,18 @@ snapshots: '@systemfsoftware/stryker-js-cli-contract@file:.sfs-deps/stryker-js-cli-contract.tgz': dependencies: '@systemfsoftware/stryker-js-plugin-interface': file:.sfs-deps/stryker-js-plugin-interface.tgz - effect: 4.0.0 + effect: 4.1.0 '@systemfsoftware/stryker-js-instrumenter@file:.sfs-deps/stryker-js-instrumenter.tgz(rolldown@1.2.8)': dependencies: '@eslint-community/regexpp': 4.12.2 '@noble/hashes': 2.4.0 '@oxc-project/types': 0.150.0 - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-framework-interface': file:.sfs-deps/stryker-framework-interface.tgz '@systemfsoftware/stryker-js-cli-contract': file:.sfs-deps/stryker-js-cli-contract.tgz '@systemfsoftware/stryker-js-plugin-interface': file:.sfs-deps/stryker-js-plugin-interface.tgz - effect: 4.0.0 + effect: 4.1.0 oxc-parser: 0.150.0 oxc-walker: 1.1.1(@oxc-project/types@0.150.0)(oxc-parser@0.150.0)(rolldown@1.2.8) transitivePeerDependencies: @@ -6070,29 +6187,29 @@ snapshots: '@systemfsoftware/stryker-js-plugin-interface@file:.sfs-deps/stryker-js-plugin-interface.tgz': dependencies: '@systemfsoftware/stryker-ignorer-interface': file:.sfs-deps/stryker-ignorer-interface.tgz - effect: 4.0.0 + effect: 4.1.0 '@systemfsoftware/stryker-js-plugin-runtime@file:.sfs-deps/stryker-js-plugin-runtime.tgz': dependencies: '@opentelemetry/api': 1.9.1 - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': file:.sfs-deps/stryker-js-cli-contract.tgz '@systemfsoftware/stryker-js-plugin-interface': file:.sfs-deps/stryker-js-plugin-interface.tgz - effect: 4.0.0 + effect: 4.1.0 '@systemfsoftware/stryker-js-typescript-checker@file:.sfs-deps/stryker-js-typescript-checker.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(rolldown@1.2.8)(supports-color@10.2.2)': dependencies: - '@effect/opentelemetry': 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + '@effect/opentelemetry': 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@noble/hashes': 2.4.0 '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-node': 0.222.0(@opentelemetry/api@1.9.1)(supports-color@10.2.2) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) '@systemfsoftware/stryker-js-cli-contract': file:.sfs-deps/stryker-js-cli-contract.tgz '@systemfsoftware/stryker-js-instrumenter': file:.sfs-deps/stryker-js-instrumenter.tgz(rolldown@1.2.8) '@systemfsoftware/stryker-js-plugin-interface': file:.sfs-deps/stryker-js-plugin-interface.tgz '@systemfsoftware/stryker-js-plugin-runtime': file:.sfs-deps/stryker-js-plugin-runtime.tgz - effect: 4.0.0 + effect: 4.1.0 typescript: 7.0.2 transitivePeerDependencies: - '@opentelemetry/api' @@ -6106,13 +6223,13 @@ snapshots: - rolldown - supports-color - '@systemfsoftware/stryker-js-vitest-runner@file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1)': + '@systemfsoftware/stryker-js-vitest-runner@file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1)': dependencies: - '@effect/opentelemetry': 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + '@effect/opentelemetry': 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-node': 0.222.0(@opentelemetry/api@1.9.1)(supports-color@10.2.2) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - '@opentelemetry/api' @@ -6126,20 +6243,20 @@ snapshots: - effect - supports-color - '@systemfsoftware/stryker-js@file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1)': + '@systemfsoftware/stryker-js@file:.sfs-deps/stryker-js.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(supports-color@10.2.2)(vitest@5.0.1)': dependencies: - '@effect/opentelemetry': 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) - '@effect/platform-node': 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) - '@effect/platform-node-shared': 4.0.0(effect@4.0.0) + '@effect/opentelemetry': 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) + '@effect/platform-node': 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + '@effect/platform-node-shared': 4.1.0(effect@4.1.0) '@noble/hashes': 2.4.0 '@opentelemetry/api': 1.9.1 '@opentelemetry/exporter-metrics-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-trace-otlp-http': 0.222.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) - '@systemfsoftware/stryker-js-vm-runner': '@systemfsoftware/stryker-js-vitest-runner@file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0)(supports-color@10.2.2)(vitest@5.0.1)' - effect: 4.0.0 + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) + '@systemfsoftware/stryker-js-vm-runner': '@systemfsoftware/stryker-js-vitest-runner@file:.sfs-deps/stryker-js-vitest-runner.tgz(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0)(supports-color@10.2.2)(vitest@5.0.1)' + effect: 4.1.0 transitivePeerDependencies: - '@opentelemetry/api-logs' - '@opentelemetry/resources' @@ -6153,18 +6270,18 @@ snapshots: - utf-8-validate - vitest - '@systemfsoftware/trace-spec@1.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1)': + '@systemfsoftware/trace-spec@1.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1)': dependencies: - '@effect/opentelemetry': 4.0.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.0.0) + '@effect/opentelemetry': 4.1.0(@opentelemetry/api-logs@0.222.0)(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-logs@0.222.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-metrics@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-node@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.43.0)(effect@4.1.0) '@opentelemetry/api': 1.9.1 '@opentelemetry/resources': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.43.0 - '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.0.0) - '@systemfsoftware/effect-spec-runtime': 1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.0.0)(vitest@5.0.1) - '@systemfsoftware/trace-taxonomy': 1.0.0(effect@4.0.0) - '@systemfsoftware/vitest': 2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) - effect: 4.0.0 + '@systemfsoftware/effect-cell-types': 12.0.0(effect@4.1.0) + '@systemfsoftware/effect-spec-runtime': 1.0.0(@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1))(effect@4.1.0)(vitest@5.0.1) + '@systemfsoftware/trace-taxonomy': 1.0.0(effect@4.1.0) + '@systemfsoftware/vitest': 2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1) + effect: 4.1.0 vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - '@opentelemetry/api-logs' @@ -6173,16 +6290,16 @@ snapshots: - '@opentelemetry/sdk-trace-node' - '@opentelemetry/sdk-trace-web' - '@systemfsoftware/trace-taxonomy@1.0.0(effect@4.0.0)': + '@systemfsoftware/trace-taxonomy@1.0.0(effect@4.1.0)': dependencies: - effect: 4.0.0 + effect: 4.1.0 '@systemfsoftware/tsconfig@2.0.1': {} - '@systemfsoftware/vitest@2.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1)': + '@systemfsoftware/vitest@2.0.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1))(vitest@5.0.1)': dependencies: - '@effect/platform-node': 4.0.0(effect@4.0.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) - effect: 4.0.0 + '@effect/platform-node': 4.1.0(effect@4.1.0)(redis@6.2.1(@opentelemetry/api@1.9.1)) + effect: 4.1.0 vitest: 5.0.1(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@5.0.1)(@vitest/coverage-v8@5.0.1)(@vitest/ui@5.0.1)(happy-dom@20.14.5)(jsdom@30.1.1(@noble/hashes@2.4.0))(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.6.1)(tsx@4.23.15)(yaml@2.9.1)) transitivePeerDependencies: - bufferutil @@ -6234,7 +6351,7 @@ snapshots: '@types/whatwg-mimetype@3.0.2': {} - '@types/ws@8.18.1': + '@types/ws@8.18.2': dependencies: '@types/node': 24.13.3 @@ -6628,7 +6745,7 @@ snapshots: dts-resolver@3.0.0: {} - effect@4.0.0: {} + effect@4.1.0: {} emoji-regex@10.6.0: {} @@ -6748,7 +6865,7 @@ snapshots: dependencies: '@types/node': 24.13.3 '@types/whatwg-mimetype': 3.0.2 - '@types/ws': 8.18.1 + '@types/ws': 8.18.2 buffer-image-size: 0.6.4 entities: 7.0.1 whatwg-mimetype: 3.0.0 @@ -6834,7 +6951,7 @@ snapshots: parse5: 8.0.1 saxes: 6.0.0 tough-cookie: 6.0.2 - undici: 8.11.2 + undici: 8.12.3 w3c-xmlserializer: 6.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -7002,16 +7119,16 @@ snapshots: oxc-parser: 0.150.0 rolldown: 1.2.8 - oxlint-tsgolint@7.0.2001: + oxlint-tsgolint@7.0.2005: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 7.0.2001 - '@oxlint-tsgolint/darwin-x64': 7.0.2001 - '@oxlint-tsgolint/linux-arm64': 7.0.2001 - '@oxlint-tsgolint/linux-x64': 7.0.2001 - '@oxlint-tsgolint/win32-arm64': 7.0.2001 - '@oxlint-tsgolint/win32-x64': 7.0.2001 - - oxlint@1.82.0(oxlint-tsgolint@7.0.2001): + '@oxlint-tsgolint/darwin-arm64': 7.0.2005 + '@oxlint-tsgolint/darwin-x64': 7.0.2005 + '@oxlint-tsgolint/linux-arm64': 7.0.2005 + '@oxlint-tsgolint/linux-x64': 7.0.2005 + '@oxlint-tsgolint/win32-arm64': 7.0.2005 + '@oxlint-tsgolint/win32-x64': 7.0.2005 + + oxlint@1.82.0(oxlint-tsgolint@7.0.2005): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.82.0 '@oxlint/binding-android-arm64': 1.82.0 @@ -7032,7 +7149,30 @@ snapshots: '@oxlint/binding-win32-arm64-msvc': 1.82.0 '@oxlint/binding-win32-ia32-msvc': 1.82.0 '@oxlint/binding-win32-x64-msvc': 1.82.0 - oxlint-tsgolint: 7.0.2001 + oxlint-tsgolint: 7.0.2005 + + oxlint@1.90.0(oxlint-tsgolint@7.0.2005): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.90.0 + '@oxlint/binding-android-arm64': 1.90.0 + '@oxlint/binding-darwin-arm64': 1.90.0 + '@oxlint/binding-darwin-x64': 1.90.0 + '@oxlint/binding-freebsd-x64': 1.90.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.90.0 + '@oxlint/binding-linux-arm-musleabihf': 1.90.0 + '@oxlint/binding-linux-arm64-gnu': 1.90.0 + '@oxlint/binding-linux-arm64-musl': 1.90.0 + '@oxlint/binding-linux-ppc64-gnu': 1.90.0 + '@oxlint/binding-linux-riscv64-gnu': 1.90.0 + '@oxlint/binding-linux-riscv64-musl': 1.90.0 + '@oxlint/binding-linux-s390x-gnu': 1.90.0 + '@oxlint/binding-linux-x64-gnu': 1.90.0 + '@oxlint/binding-linux-x64-musl': 1.90.0 + '@oxlint/binding-openharmony-arm64': 1.90.0 + '@oxlint/binding-win32-arm64-msvc': 1.90.0 + '@oxlint/binding-win32-ia32-msvc': 1.90.0 + '@oxlint/binding-win32-x64-msvc': 1.90.0 + oxlint-tsgolint: 7.0.2005 package-json-from-dist@1.0.1: {} @@ -7372,7 +7512,7 @@ snapshots: undici-types@7.18.2: {} - undici@8.11.2: {} + undici@8.12.3: {} universalify@2.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index de3c3a2c8..5438618a7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,11 +10,11 @@ catalog: "@commitlint/cli": ^21 "@commitlint/config-conventional": ^21 "@commitlint/types": ^21 - "@effect/tsgo": ^0.50.0 - "@effect/platform-node": ^4.0.0 - "@effect/platform-node-shared": ^4.0.0 - "@effect/vitest": ^4.0.0 - "@effect/opentelemetry": ^4.0.0 + "@effect/tsgo": ^0.63.0 + "@effect/platform-node": ^4.1.0 + "@effect/platform-node-shared": ^4.1.0 + "@effect/vitest": ^4.1.0 + "@effect/opentelemetry": ^4.1.0 "@eslint-community/regexpp": ^4.12.2 angular-html-parser: ~10.12.0 "@microsoft/api-extractor": ^7 @@ -53,14 +53,14 @@ catalog: "@vitest/browser-playwright": ^5 "@vitest/coverage-v8": ^5 fast-check: ^4 - effect: ^4.0.0 + effect: ^4.1.0 husky: ^9 lint-staged: ^17 microsandbox: 0.7.2 oxc-parser: ^0.150.0 oxc-walker: ^1 - oxlint: ^1 - oxlint-tsgolint: ^7 + oxlint: ~1.90.0 + oxlint-tsgolint: 7.0.2005 rimraf: ^6.1.3 tsdown: ^0.23.0 turbo: ^2 @@ -77,6 +77,10 @@ catalogs: mutation-testing-elements: 3.9.0 mutation-testing-report-schema: 3.9.0 overrides: + "@effect/opentelemetry": "catalog:" + "@effect/platform-node": "catalog:" + "@effect/platform-node-shared": "catalog:" + "@effect/tsgo": "catalog:" # Every package this repository releases resolves to the tarball of the release # pinned by the `stryker-published` flake input, wherever it appears outside # the workspace; workspace links are untouched. The runner is also reached diff --git a/test/bench/src/abort-run-path.workflow.ts b/test/bench/src/abort-run-path.workflow.ts index f506fe49f..5960d500f 100644 --- a/test/bench/src/abort-run-path.workflow.ts +++ b/test/bench/src/abort-run-path.workflow.ts @@ -11,9 +11,11 @@ import { RunPathUnrestoredAbort, } from './run-path.schema.js' -export class AbortRunPathCommand extends S.TaggedClass()('AbortRunPathCommand', { - failure: RunPathFailure, -}) { +export class AbortRunPathCommand + extends S.TaggedClass()('AbortRunPathCommand', { + failure: RunPathFailure, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/bench-failure.schema.ts b/test/bench/src/bench-failure.schema.ts index c43a1c577..6a9eb6e36 100644 --- a/test/bench/src/bench-failure.schema.ts +++ b/test/bench/src/bench-failure.schema.ts @@ -1,10 +1,12 @@ import { BenchAbortCode } from '@systemfsoftware/stryker-e2e-core' import * as S from 'effect/Schema' -export class BenchOrchestrationFailed extends S.TaggedError()('BenchOrchestrationFailed', { - code: BenchAbortCode, - reason: S.String, -}) { +export class BenchOrchestrationFailed + extends S.TaggedError()('BenchOrchestrationFailed', { + code: BenchAbortCode, + reason: S.String, + }) +{ override get message(): string { return `${this.code}: ${this.reason}` } diff --git a/test/bench/src/bench-plan.schema.ts b/test/bench/src/bench-plan.schema.ts index aa3b97581..937c6a8fa 100644 --- a/test/bench/src/bench-plan.schema.ts +++ b/test/bench/src/bench-plan.schema.ts @@ -5,7 +5,7 @@ import * as S from 'effect/Schema' const LegSelectionTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/LegSelection') type LegSelectionTypeId = typeof LegSelectionTypeId -export class AffectedLegs extends S.TaggedClass()('AffectedLegs', { +export class AffectedLegs extends S.TaggedClass()('AffectedLegs', { base: S.NonEmptyString, legs: S.Array(S.NonEmptyString), skipped: S.Array(S.NonEmptyString), @@ -16,7 +16,7 @@ export class AffectedLegs extends S.TaggedClass()('AffectedLegs', export const FullCorpusReason = S.Literals(['dispatch', 'no-green-ancestor', 'lane-inputs-changed']) export type FullCorpusReason = typeof FullCorpusReason.Type -export class FullCorpus extends S.TaggedClass()('FullCorpus', { +export class FullCorpus extends S.TaggedClass()('FullCorpus', { base: S.NonEmptyString, reason: FullCorpusReason, legs: S.NonEmptyArray(S.NonEmptyString), @@ -27,7 +27,7 @@ export class FullCorpus extends S.TaggedClass()('FullCorpus', { export const LegSelection = S.Union([AffectedLegs, FullCorpus]) export type LegSelection = typeof LegSelection.Type -export class NoBenchBase extends S.TaggedError()('NoBenchBase', { +export class NoBenchBase extends S.TaggedError()('NoBenchBase', { head: S.NonEmptyString, }) { override get message(): string { @@ -45,7 +45,7 @@ export type GreenRun = typeof GreenRun.Type const BaseChoiceTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/BaseChoice') type BaseChoiceTypeId = typeof BaseChoiceTypeId -export class GreenBase extends S.TaggedClass()('GreenBase', { +export class GreenBase extends S.TaggedClass()('GreenBase', { sha: S.NonEmptyString, }) { readonly [BaseChoiceTypeId] = BaseChoiceTypeId @@ -54,10 +54,12 @@ export class GreenBase extends S.TaggedClass()('GreenBase', { export const FirstParentReason = S.Literals(['dispatch', 'no-green-ancestor']) export type FirstParentReason = typeof FirstParentReason.Type -export class FirstParentBase extends S.TaggedClass()('FirstParentBase', { - sha: S.NonEmptyString, - reason: FirstParentReason, -}) { +export class FirstParentBase + extends S.TaggedClass()('FirstParentBase', { + sha: S.NonEmptyString, + reason: FirstParentReason, + }) +{ readonly [BaseChoiceTypeId] = BaseChoiceTypeId } diff --git a/test/bench/src/choose-base.workflow.ts b/test/bench/src/choose-base.workflow.ts index d4f3da8d2..839b26ddc 100644 --- a/test/bench/src/choose-base.workflow.ts +++ b/test/bench/src/choose-base.workflow.ts @@ -15,12 +15,14 @@ import { NoBenchBase, } from './bench-plan.schema.js' -export class ChooseBaseCommand extends S.TaggedClass()('ChooseBaseCommand', { - event: S.Literals(['push', 'workflow_dispatch']), - head: S.NonEmptyString, - greenRuns: S.Array(GreenRun), - firstParent: S.Option(S.NonEmptyString), -}) { +export class ChooseBaseCommand + extends S.TaggedClass()('ChooseBaseCommand', { + event: S.Literals(['push', 'workflow_dispatch']), + head: S.NonEmptyString, + greenRuns: S.Array(GreenRun), + firstParent: S.Option(S.NonEmptyString), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/leg-clock.schema.ts b/test/bench/src/leg-clock.schema.ts index 42ef5910a..e89c96320 100644 --- a/test/bench/src/leg-clock.schema.ts +++ b/test/bench/src/leg-clock.schema.ts @@ -5,7 +5,7 @@ import * as S from 'effect/Schema' const LegClockTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/LegClock') type LegClockTypeId = typeof LegClockTypeId -export class LegElapsed extends S.TaggedClass()('LegElapsed', { +export class LegElapsed extends S.TaggedClass()('LegElapsed', { wallMs: S.Finite.pipe( S.check( S.isGreaterThanOrEqualTo(0, { @@ -17,7 +17,9 @@ export class LegElapsed extends S.TaggedClass()('LegElapsed', { readonly [LegClockTypeId] = LegClockTypeId } -export class LegClockBehind extends S.TaggedClass()('LegClockBehind', {}) { +export class LegClockBehind + extends S.TaggedClass()('LegClockBehind', {}) +{ readonly [LegClockTypeId] = LegClockTypeId } diff --git a/test/bench/src/main.ts b/test/bench/src/main.ts index a1bddc460..6bcb6e8cd 100644 --- a/test/bench/src/main.ts +++ b/test/bench/src/main.ts @@ -1,3 +1,4 @@ +import { layerDigest } from '@effect/platform-node/NodeCrypto' import * as NodeRuntime from '@effect/platform-node/NodeRuntime' import { layer as nodeServicesLayer } from '@effect/platform-node/NodeServices' import { @@ -24,6 +25,7 @@ import * as Config from 'effect/Config' import * as Console from 'effect/Console' import * as Effect from 'effect/Effect' import * as FileSystem from 'effect/FileSystem' +import * as Layer from 'effect/Layer' import * as Match from 'effect/Match' import * as Option from 'effect/Option' import * as Path from 'effect/Path' @@ -309,4 +311,6 @@ const program = Effect.gen(function*() { }) }) -NodeRuntime.runMain({ disableErrorReporting: true })(program.pipe(Effect.provide(nodeServicesLayer))) +NodeRuntime.runMain({ disableErrorReporting: true })( + program.pipe(Effect.provide(Layer.mergeAll(nodeServicesLayer, layerDigest))), +) diff --git a/test/bench/src/measure-leg.workflow.ts b/test/bench/src/measure-leg.workflow.ts index 749a8adb1..7a6b195f0 100644 --- a/test/bench/src/measure-leg.workflow.ts +++ b/test/bench/src/measure-leg.workflow.ts @@ -6,10 +6,12 @@ import * as S from 'effect/Schema' import { LegClock, LegClockBehind, LegElapsed } from './leg-clock.schema.js' -export class MeasureLegCommand extends S.TaggedClass()('MeasureLegCommand', { - startedAtSeconds: S.Finite, - nowMs: S.Finite, -}) { +export class MeasureLegCommand + extends S.TaggedClass()('MeasureLegCommand', { + startedAtSeconds: S.Finite, + nowMs: S.Finite, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/plan-run-path.workflow.ts b/test/bench/src/plan-run-path.workflow.ts index e39b8a84a..f5944d29a 100644 --- a/test/bench/src/plan-run-path.workflow.ts +++ b/test/bench/src/plan-run-path.workflow.ts @@ -7,14 +7,16 @@ import * as S from 'effect/Schema' import { RunPathMoveIn, RunPathOccupied, RunPathOutsideTree, RunPathPlan } from './run-path.schema.js' -export class PlanRunPathCommand extends S.TaggedClass()('PlanRunPathCommand', { - runnerTemp: S.NonEmptyString, - runnerTempEntries: S.Array(S.String), - side: BenchSide, - tree: S.NonEmptyString, - cwd: S.NonEmptyString, - cli: S.NonEmptyString, -}) { +export class PlanRunPathCommand + extends S.TaggedClass()('PlanRunPathCommand', { + runnerTemp: S.NonEmptyString, + runnerTempEntries: S.Array(S.String), + side: BenchSide, + tree: S.NonEmptyString, + cwd: S.NonEmptyString, + cli: S.NonEmptyString, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/prepare-side.schema.ts b/test/bench/src/prepare-side.schema.ts index 52568e573..08f0913ac 100644 --- a/test/bench/src/prepare-side.schema.ts +++ b/test/bench/src/prepare-side.schema.ts @@ -1,10 +1,12 @@ import { Schema as S } from 'effect' -export class BenchSetupFailed extends S.TaggedError()('BenchSetupFailed', { - step: S.String, - detail: S.String, - cause: S.optional(S.Unknown), -}) { +export class BenchSetupFailed + extends S.TaggedError()('BenchSetupFailed', { + step: S.String, + detail: S.String, + cause: S.optional(S.Unknown), + }) +{ override get message(): string { return `${this.step}: ${this.detail}` } diff --git a/test/bench/src/run-bench.service.ts b/test/bench/src/run-bench.service.ts index 952e7057b..6aeb48241 100644 --- a/test/bench/src/run-bench.service.ts +++ b/test/bench/src/run-bench.service.ts @@ -12,7 +12,7 @@ import { } from '@systemfsoftware/stryker-e2e-core' import * as Arr from 'effect/Array' import * as Clock from 'effect/Clock' -import * as Crypto from 'effect/Crypto' +import type * as Digest from 'effect/crypto/Digest' import * as Duration from 'effect/Duration' import * as Effect from 'effect/Effect' import * as Exit from 'effect/Exit' @@ -63,7 +63,7 @@ type BenchPlatform = | FileSystem.FileSystem | Path.Path | ChildProcessSpawner.ChildProcessSpawner - | Crypto.Crypto + | Digest.Digest const slug = (value: string): string => value.replace(/[^A-Za-z0-9._-]+/g, '-') diff --git a/test/bench/src/run-path.schema.ts b/test/bench/src/run-path.schema.ts index fb93c16b1..f2894b04c 100644 --- a/test/bench/src/run-path.schema.ts +++ b/test/bench/src/run-path.schema.ts @@ -7,7 +7,7 @@ import * as S from 'effect/Schema' const RunPathPlanTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/RunPathPlan') type RunPathPlanTypeId = typeof RunPathPlanTypeId -export class RunPathMoveIn extends S.TaggedClass()('RunPathMoveIn', { +export class RunPathMoveIn extends S.TaggedClass()('RunPathMoveIn', { side: BenchSide, tree: S.NonEmptyString, runPath: S.NonEmptyString, @@ -17,21 +17,25 @@ export class RunPathMoveIn extends S.TaggedClass()('RunPathMoveIn readonly [RunPathPlanTypeId] = RunPathPlanTypeId } -export class RunPathOccupied extends S.TaggedClass()('RunPathOccupied', { - side: BenchSide, - runPath: S.NonEmptyString, -}) { +export class RunPathOccupied + extends S.TaggedClass()('RunPathOccupied', { + side: BenchSide, + runPath: S.NonEmptyString, + }) +{ readonly [RunPathPlanTypeId] = RunPathPlanTypeId } export const RunPathPlan = S.Union([RunPathMoveIn, RunPathOccupied]) export type RunPathPlan = typeof RunPathPlan.Type -export class RunPathOutsideTree extends S.TaggedError()('RunPathOutsideTree', { - side: BenchSide, - tree: S.NonEmptyString, - path: S.NonEmptyString, -}) { +export class RunPathOutsideTree + extends S.TaggedError()('RunPathOutsideTree', { + side: BenchSide, + tree: S.NonEmptyString, + path: S.NonEmptyString, + }) +{ override get message(): string { return `side ${this.side}: ${this.path} is not inside the side's tree ${this.tree}, so it cannot run from the run path` } @@ -40,10 +44,12 @@ export class RunPathOutsideTree extends S.TaggedError()('Run const RunPathRestoredTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/RunPathRestored') type RunPathRestoredTypeId = typeof RunPathRestoredTypeId -export class RunPathRestored extends S.TaggedClass()('RunPathRestored', { - side: BenchSide, - tree: S.NonEmptyString, -}) { +export class RunPathRestored + extends S.TaggedClass()('RunPathRestored', { + side: BenchSide, + tree: S.NonEmptyString, + }) +{ readonly [RunPathRestoredTypeId] = RunPathRestoredTypeId } @@ -61,13 +67,15 @@ export type RunPathRunEnd = typeof RunPathRunEnd.Type const causeText = (cause: C): string => Cause.pretty(Cause.isCause(cause) ? cause : Cause.die(cause)) -export class RunPathUnrestored extends S.TaggedError()('RunPathUnrestored', { - side: BenchSide, - tree: S.NonEmptyString, - runPath: S.NonEmptyString, - cause: S.optional(S.Unknown), - run: RunPathRunEnd, -}) { +export class RunPathUnrestored + extends S.TaggedError()('RunPathUnrestored', { + side: BenchSide, + tree: S.NonEmptyString, + runPath: S.NonEmptyString, + cause: S.optional(S.Unknown), + run: RunPathRunEnd, + }) +{ override get message(): string { const run = RunPathRunEnd.match(this.run, { RunSucceeded: () => 'the run itself succeeded', @@ -79,11 +87,13 @@ export class RunPathUnrestored extends S.TaggedError()('RunPa } } -export class RunPathUnlisted extends S.TaggedError()('RunPathUnlisted', { - side: BenchSide, - runnerTemp: S.NonEmptyString, - cause: S.optional(S.Unknown), -}) { +export class RunPathUnlisted + extends S.TaggedError()('RunPathUnlisted', { + side: BenchSide, + runnerTemp: S.NonEmptyString, + cause: S.optional(S.Unknown), + }) +{ override get message(): string { return `side ${this.side}: ${this.runnerTemp} could not be listed to check the run path is absent: ${ causeText(this.cause) @@ -91,12 +101,14 @@ export class RunPathUnlisted extends S.TaggedError()('RunPathUn } } -export class RunPathMoveInFailed extends S.TaggedError()('RunPathMoveInFailed', { - side: BenchSide, - tree: S.NonEmptyString, - runPath: S.NonEmptyString, - cause: S.optional(S.Unknown), -}) { +export class RunPathMoveInFailed + extends S.TaggedError()('RunPathMoveInFailed', { + side: BenchSide, + tree: S.NonEmptyString, + runPath: S.NonEmptyString, + cause: S.optional(S.Unknown), + }) +{ override get message(): string { return `side ${this.side}: ${this.tree} could not be moved to the run path ${this.runPath}: ${ causeText(this.cause) @@ -116,24 +128,30 @@ export type RunPathFailure = typeof RunPathFailure.Type const RunPathAbortTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-bench/RunPathAbort') type RunPathAbortTypeId = typeof RunPathAbortTypeId -export class RunPathOccupiedAbort extends S.TaggedClass()('RunPathOccupiedAbort', { - code: S.Literal('run-path-occupied'), - reason: S.String, -}) { +export class RunPathOccupiedAbort + extends S.TaggedClass()('RunPathOccupiedAbort', { + code: S.Literal('run-path-occupied'), + reason: S.String, + }) +{ readonly [RunPathAbortTypeId] = RunPathAbortTypeId } -export class RunPathMoveFailedAbort extends S.TaggedClass()('RunPathMoveFailedAbort', { - code: S.Literal('run-path-move-failed'), - reason: S.String, -}) { +export class RunPathMoveFailedAbort + extends S.TaggedClass()('RunPathMoveFailedAbort', { + code: S.Literal('run-path-move-failed'), + reason: S.String, + }) +{ readonly [RunPathAbortTypeId] = RunPathAbortTypeId } -export class RunPathUnrestoredAbort extends S.TaggedClass()('RunPathUnrestoredAbort', { - code: S.Literal('run-path-unrestored'), - reason: S.String, -}) { +export class RunPathUnrestoredAbort + extends S.TaggedClass()('RunPathUnrestoredAbort', { + code: S.Literal('run-path-unrestored'), + reason: S.String, + }) +{ readonly [RunPathAbortTypeId] = RunPathAbortTypeId } diff --git a/test/bench/src/select-legs.workflow.ts b/test/bench/src/select-legs.workflow.ts index 6d7e9c722..46f63c683 100644 --- a/test/bench/src/select-legs.workflow.ts +++ b/test/bench/src/select-legs.workflow.ts @@ -7,13 +7,15 @@ import * as S from 'effect/Schema' import { AffectedLegs, BaseChoice, FirstParentBase, FullCorpus, GreenBase, LegSelection } from './bench-plan.schema.js' -export class SelectLegsCommand extends S.TaggedClass()('SelectLegsCommand', { - base: BaseChoice, - entries: S.NonEmptyArray(S.NonEmptyString), - engineDirs: S.NonEmptyArray(S.NonEmptyString), - changedFiles: S.Array(S.String), - affectedPaths: S.Array(S.String), -}) { +export class SelectLegsCommand + extends S.TaggedClass()('SelectLegsCommand', { + base: BaseChoice, + entries: S.NonEmptyArray(S.NonEmptyString), + engineDirs: S.NonEmptyArray(S.NonEmptyString), + changedFiles: S.Array(S.String), + affectedPaths: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/settle-run-path.workflow.ts b/test/bench/src/settle-run-path.workflow.ts index eba21fd72..b80822217 100644 --- a/test/bench/src/settle-run-path.workflow.ts +++ b/test/bench/src/settle-run-path.workflow.ts @@ -6,13 +6,15 @@ import * as S from 'effect/Schema' import { RunPathMoveBack, RunPathRestored, RunPathRunEnd, RunPathUnrestored } from './run-path.schema.js' -export class SettleRunPathCommand extends S.TaggedClass()('SettleRunPathCommand', { - side: BenchSide, - tree: S.NonEmptyString, - runPath: S.NonEmptyString, - moveBack: RunPathMoveBack, - run: RunPathRunEnd, -}) { +export class SettleRunPathCommand + extends S.TaggedClass()('SettleRunPathCommand', { + side: BenchSide, + tree: S.NonEmptyString, + runPath: S.NonEmptyString, + moveBack: RunPathMoveBack, + run: RunPathRunEnd, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/bench/src/workload-digest.service.ts b/test/bench/src/workload-digest.service.ts index b5a4bb524..addbe2dfa 100644 --- a/test/bench/src/workload-digest.service.ts +++ b/test/bench/src/workload-digest.service.ts @@ -9,9 +9,8 @@ import { type WorkspaceCatalogs, } from '@systemfsoftware/stryker-e2e-core' import * as Arr from 'effect/Array' -import * as Crypto from 'effect/Crypto' +import * as Digest from 'effect/crypto/Digest' import * as Effect from 'effect/Effect' -import { Hex } from 'effect/encoding' import * as FileSystem from 'effect/FileSystem' import * as HashMap from 'effect/HashMap' import * as Option from 'effect/Option' @@ -186,13 +185,10 @@ const digestInput = (entries: ReadonlyArray): Uint8Array => { return buffer } -const digestOf = (entries: ReadonlyArray): Effect.Effect => +const digestOf = (entries: ReadonlyArray): Effect.Effect => Effect.gen(function*() { - const crypto = yield* Crypto.Crypto - return yield* crypto.digest('SHA-256', digestInput(dedupe(entries))).pipe( - Effect.map(Hex.encode), - Effect.mapError(() => 'sha256 digest failed'), - ) + const digest = yield* Digest.Digest + return yield* digest.digestHex(Digest.sha256, digestInput(dedupe(entries))) }) const digestOfFound = ( @@ -200,7 +196,7 @@ const digestOfFound = ( path: Path.Path, input: WorkloadDigestInput, found: CoveringTestFilesFound, -): Effect.Effect => +): Effect.Effect => Effect.gen(function*() { const workload = yield* readEntries( fs, @@ -219,7 +215,7 @@ const digestFromReport = ( path: Path.Path, input: WorkloadDigestInput, reportText: string, -): Effect.Effect => +): Effect.Effect => Effect.gen(function*() { const covered = coveringTestFiles(CoveringTestFilesCommand.make({ report: reportText })) if (Result.isFailure(covered)) { @@ -230,7 +226,7 @@ const digestFromReport = ( export const workloadDigest = ( input: WorkloadDigestInput, -): Effect.Effect => +): Effect.Effect => Effect.gen(function*() { const fs = yield* FileSystem.FileSystem const path = yield* Path.Path diff --git a/test/checker-parity/oxlint.config.ts b/test/checker-parity/oxlint.config.ts index b7c141479..c23aebee6 100644 --- a/test/checker-parity/oxlint.config.ts +++ b/test/checker-parity/oxlint.config.ts @@ -33,6 +33,7 @@ export default defineConfig({ }, overrides: [ + { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: pureCore, rules: { diff --git a/test/checker-parity/src/DriverFailure.schema.ts b/test/checker-parity/src/DriverFailure.schema.ts index 519b0266a..40cc1b6c5 100644 --- a/test/checker-parity/src/DriverFailure.schema.ts +++ b/test/checker-parity/src/DriverFailure.schema.ts @@ -14,7 +14,7 @@ export const DriverFailureCode = S.Literals([ 'io-failed', ]) -export class DriverFailure extends S.TaggedError()('DriverFailure', { +export class DriverFailure extends S.TaggedError()('DriverFailure', { schemaVersion: S.Literal(1), code: DriverFailureCode, reason: S.String, @@ -25,7 +25,7 @@ export class DriverFailure extends S.TaggedError()('DriverFailure } } -export class ReportedExit extends S.TaggedError()('ReportedExit', { +export class ReportedExit extends S.TaggedError()('ReportedExit', { exitCode: S.Int, }) { override get message(): string { diff --git a/test/checker-parity/src/Parity.schema.ts b/test/checker-parity/src/Parity.schema.ts index c6e25c73a..17f49f232 100644 --- a/test/checker-parity/src/Parity.schema.ts +++ b/test/checker-parity/src/Parity.schema.ts @@ -31,7 +31,7 @@ const NonNegativeFinite = S.Finite.check(S.isGreaterThanOrEqualTo(0)) const SCHEMA_VERSION = S.Literal(1) /** `line` is the mutant's 1-based start line; `reason` carries the checker's status-reason text. */ -export class Verdict extends S.TaggedClass()('Verdict', { +export class Verdict extends S.TaggedClass()('Verdict', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -43,7 +43,7 @@ export class Verdict extends S.TaggedClass()('Verdict', { cached: S.Boolean, }) {} -export class CheckCall extends S.TaggedClass()('CheckCall', { +export class CheckCall extends S.TaggedClass()('CheckCall', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -54,7 +54,7 @@ export class CheckCall extends S.TaggedClass()('CheckCall', { cached: S.Boolean, }) {} -export class GroupCall extends S.TaggedClass()('GroupCall', { +export class GroupCall extends S.TaggedClass()('GroupCall', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -63,7 +63,7 @@ export class GroupCall extends S.TaggedClass()('GroupCall', { cached: S.Boolean, }) {} -export class DigestCall extends S.TaggedClass()('DigestCall', { +export class DigestCall extends S.TaggedClass()('DigestCall', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -72,7 +72,7 @@ export class DigestCall extends S.TaggedClass()('DigestCall', { cached: S.Boolean, }) {} -export class Counts extends S.TaggedClass()('Counts', { +export class Counts extends S.TaggedClass()('Counts', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -85,20 +85,24 @@ export class Counts extends S.TaggedClass()('Counts', { checkSpans: NonNegativeInt, }) {} -export class ProjectBootFailed extends S.TaggedClass()('ProjectBootFailed', { - schemaVersion: SCHEMA_VERSION, - side: Side, - project: S.String, - reason: S.String, -}) {} +export class ProjectBootFailed + extends S.TaggedClass()('ProjectBootFailed', { + schemaVersion: SCHEMA_VERSION, + side: Side, + project: S.String, + reason: S.String, + }) +{} -export class ProjectSkipped extends S.TaggedClass()('ProjectSkipped', { - schemaVersion: SCHEMA_VERSION, - project: S.String, - reason: S.String, -}) {} +export class ProjectSkipped + extends S.TaggedClass()('ProjectSkipped', { + schemaVersion: SCHEMA_VERSION, + project: S.String, + reason: S.String, + }) +{} -export class CacheEntry extends S.TaggedClass()('CacheEntry', { +export class CacheEntry extends S.TaggedClass()('CacheEntry', { schemaVersion: SCHEMA_VERSION, side: Side, project: S.String, @@ -107,40 +111,46 @@ export class CacheEntry extends S.TaggedClass()('CacheEntry', { hit: S.Boolean, }) {} -export class TelemetryMissing extends S.TaggedClass()('TelemetryMissing', { - schemaVersion: SCHEMA_VERSION, - side: Side, - project: S.String, - expectedSpans: NonNegativeInt, - receivedSpans: NonNegativeInt, -}) {} - -export class TypeAnswerLine extends S.TaggedClass()('TypeAnswerLine', { - schemaVersion: SCHEMA_VERSION, - side: S.Literal('branch'), - project: S.String, - mutantId: S.String, - fileName: S.String, - line: PositiveInt, - column: PositiveInt, - candidate: S.String, - siteKind: TypeQuery.TypeQuerySiteKind, - siteType: S.optional(S.String), - contextualType: S.optional(S.String), - answer: TypeQuery.TypeAnswer, -}) {} +export class TelemetryMissing + extends S.TaggedClass()('TelemetryMissing', { + schemaVersion: SCHEMA_VERSION, + side: Side, + project: S.String, + expectedSpans: NonNegativeInt, + receivedSpans: NonNegativeInt, + }) +{} + +export class TypeAnswerLine + extends S.TaggedClass()('TypeAnswerLine', { + schemaVersion: SCHEMA_VERSION, + side: S.Literal('branch'), + project: S.String, + mutantId: S.String, + fileName: S.String, + line: PositiveInt, + column: PositiveInt, + candidate: S.String, + siteKind: TypeQuery.TypeQuerySiteKind, + siteType: S.optional(S.String), + contextualType: S.optional(S.String), + answer: TypeQuery.TypeAnswer, + }) +{} export const TypeQueryRefusalReason = S.Union([TypeQuery.FileRefusedReason, TypeQuery.TypeQueryRefusedReason]) export type TypeQueryRefusalReason = typeof TypeQueryRefusalReason.Type -export class TypeQueryFileRefused extends S.TaggedClass()('TypeQueryFileRefused', { - schemaVersion: SCHEMA_VERSION, - project: S.String, - fileName: S.String, - reason: TypeQueryRefusalReason, - nextAction: S.String, - mutantCount: NonNegativeInt, -}) {} +export class TypeQueryFileRefused + extends S.TaggedClass()('TypeQueryFileRefused', { + schemaVersion: SCHEMA_VERSION, + project: S.String, + fileName: S.String, + reason: TypeQueryRefusalReason, + nextAction: S.String, + mutantCount: NonNegativeInt, + }) +{} /** * Legacy, decode-only: an earlier driver wrote one `TypeQueryServers` line per branch project recording the @@ -151,14 +161,16 @@ export class TypeQueryFileRefused extends S.TaggedClass()( * add a project to `projectCount` or `typeQuery.projects` nor drop a skipped project from `summary.skipped`, * and the report's shard hints ignore it. */ -export class TypeQueryServers extends S.TaggedClass()('TypeQueryServers', { - schemaVersion: SCHEMA_VERSION, - side: S.Literal('branch'), - project: S.String, - peakLiveServers: NonNegativeInt, -}) {} +export class TypeQueryServers + extends S.TaggedClass()('TypeQueryServers', { + schemaVersion: SCHEMA_VERSION, + side: S.Literal('branch'), + project: S.String, + peakLiveServers: NonNegativeInt, + }) +{} -export class Deferred extends S.TaggedClass()('Deferred', { +export class Deferred extends S.TaggedClass()('Deferred', { schemaVersion: SCHEMA_VERSION, side: S.NullOr(Side), project: S.String, @@ -167,15 +179,17 @@ export class Deferred extends S.TaggedClass()('Deferred', { reason: S.Literals(['deadline-passed', 'interrupted-at-deadline']), }) {} -export class UnitOverBudget extends S.TaggedClass()('UnitOverBudget', { - schemaVersion: SCHEMA_VERSION, - side: Side, - project: S.String, - fileName: S.String, - mutantIds: S.Array(S.String), - interrupts: PositiveInt, - ms: NonNegativeFinite, -}) {} +export class UnitOverBudget + extends S.TaggedClass()('UnitOverBudget', { + schemaVersion: SCHEMA_VERSION, + side: Side, + project: S.String, + fileName: S.String, + mutantIds: S.Array(S.String), + interrupts: PositiveInt, + ms: NonNegativeFinite, + }) +{} export const PhaseLine = S.Union([CheckCall, GroupCall, DigestCall]) export type PhaseLine = typeof PhaseLine.Type @@ -205,7 +219,7 @@ const MutantCount = S.Int.check(S.isBetween({ minimum: 1, maximum: MAX_MUTANTS } export const RunId = S.Int.check(S.isBetween({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER })) export type RunId = typeof RunId.Type -export class FileRate extends S.Class('FileRate')({ +export class FileRate extends S.Class('FileRate')({ project: S.String, fileName: S.String, msPerMutant: BoundedMs, @@ -213,13 +227,13 @@ export class FileRate extends S.Class('FileRate')({ runId: RunId, }) {} -export class ProjectOverhead extends S.Class('ProjectOverhead')({ +export class ProjectOverhead extends S.Class('ProjectOverhead')({ project: S.String, ms: BoundedMs, runId: RunId, }) {} -export class FileCosts extends S.Class('FileCosts')({ +export class FileCosts extends S.Class('FileCosts')({ schemaVersion: S.Literal(3), runs: S.Array(RunId), files: S.Array(FileRate), @@ -229,7 +243,7 @@ export class FileCosts extends S.Class('FileCosts')({ export const CostSource = S.Literals(['measured', 'project-p90', 'corpus-p90', 'no-measurements']) export type CostSource = typeof CostSource.Type -export class PlannedUnit extends S.Class('PlannedUnit')({ +export class PlannedUnit extends S.Class('PlannedUnit')({ project: S.String, fileName: S.String, fromBlock: NonNegativeInt, @@ -240,13 +254,13 @@ export class PlannedUnit extends S.Class('PlannedUnit')({ source: CostSource, }) {} -export class PlannedLeg extends S.Class('PlannedLeg')({ +export class PlannedLeg extends S.Class('PlannedLeg')({ leg: PositiveInt, ms: NonNegativeFinite, units: S.NonEmptyArray(PlannedUnit), }) {} -export class ParityPlan extends S.Class('ParityPlan')({ +export class ParityPlan extends S.Class('ParityPlan')({ schemaVersion: S.Literal(1), deadlineSeconds: PositiveInt, fill: S.Finite.check(S.isBetween({ minimum: 0, maximum: 1, exclusiveMinimum: true })), @@ -259,7 +273,7 @@ export class ParityPlan extends S.Class('ParityPlan')({ export const RunScopeName = S.Literals(['pr', 'full']) export type RunScopeName = typeof RunScopeName.Type -export class ScopeSettings extends S.Class('ScopeSettings')({ +export class ScopeSettings extends S.Class('ScopeSettings')({ schemaVersion: SCHEMA_VERSION, seed: S.String, driftProjects: PositiveInt, @@ -282,7 +296,7 @@ export const seededOrder: { ), ) -export class LegStarted extends S.TaggedClass()('LegStarted', { +export class LegStarted extends S.TaggedClass()('LegStarted', { schemaVersion: SCHEMA_VERSION, shard: S.String, scope: RunScopeName, @@ -291,7 +305,7 @@ export class LegStarted extends S.TaggedClass()('LegStarted', { corpusDiscoveryMs: NonNegativeFinite, }) {} -export class LegScope extends S.TaggedClass()('LegScope', { +export class LegScope extends S.TaggedClass()('LegScope', { schemaVersion: SCHEMA_VERSION, shard: S.String, scope: RunScopeName, diff --git a/test/checker-parity/src/assign-drift-legs.workflow.ts b/test/checker-parity/src/assign-drift-legs.workflow.ts index 85d6b3cfa..2228b4736 100644 --- a/test/checker-parity/src/assign-drift-legs.workflow.ts +++ b/test/checker-parity/src/assign-drift-legs.workflow.ts @@ -11,26 +11,32 @@ type AssignDriftLegsTypeId = typeof AssignDriftLegsTypeId const PositiveInt = S.Int.check(S.isGreaterThanOrEqualTo(1)) -export class AssignDriftLegsCommand extends S.TaggedClass()('AssignDriftLegsCommand', { - settings: ScopeSettings, - projects: S.Array(S.String), - shards: PositiveInt, -}) { +export class AssignDriftLegsCommand + extends S.TaggedClass()('AssignDriftLegsCommand', { + settings: ScopeSettings, + projects: S.Array(S.String), + shards: PositiveInt, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class DriftProject extends S.Class('DriftProject')({ +export class DriftProject extends S.Class('DriftProject')({ project: S.String, leg: PositiveInt, }) {} -export class DriftLegsAssigned extends S.TaggedClass()('DriftLegsAssigned', { - projects: S.Array(DriftProject), -}) { +export class DriftLegsAssigned + extends S.TaggedClass()('DriftLegsAssigned', { + projects: S.Array(DriftProject), + }) +{ readonly [AssignDriftLegsTypeId] = AssignDriftLegsTypeId } -export class NoDriftProjects extends S.TaggedClass()('NoDriftProjects', {}) { +export class NoDriftProjects + extends S.TaggedClass()('NoDriftProjects', {}) +{ readonly [AssignDriftLegsTypeId] = AssignDriftLegsTypeId } diff --git a/test/checker-parity/src/compare-sides.workflow.ts b/test/checker-parity/src/compare-sides.workflow.ts index 703cbebe6..fd8bdb0b4 100644 --- a/test/checker-parity/src/compare-sides.workflow.ts +++ b/test/checker-parity/src/compare-sides.workflow.ts @@ -47,19 +47,21 @@ export const ObservedVerdict = S.Struct({ }) export type ObservedVerdict = typeof ObservedVerdict.Type -export class VerdictMismatch extends S.TaggedClass()('VerdictMismatch', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('verdict-mismatch'), - nextAction: S.String, - project: S.String, - mutantId: S.String, - fileName: S.String, - line: S.Int, - main: S.NullOr(ObservedVerdict), - branch: S.NullOr(ObservedVerdict), -}) {} +export class VerdictMismatch + extends S.TaggedClass()('VerdictMismatch', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('verdict-mismatch'), + nextAction: S.String, + project: S.String, + mutantId: S.String, + fileName: S.String, + line: S.Int, + main: S.NullOr(ObservedVerdict), + branch: S.NullOr(ObservedVerdict), + }) +{} -export class BootAsymmetry extends S.TaggedClass()('BootAsymmetry', { +export class BootAsymmetry extends S.TaggedClass()('BootAsymmetry', { schemaVersion: SCHEMA_VERSION, code: S.Literal('boot-asymmetry'), nextAction: S.String, @@ -67,71 +69,83 @@ export class BootAsymmetry extends S.TaggedClass()('BootAsymmetry failedSide: Side, }) {} -export class ZeroSnapshotUpdates extends S.TaggedClass()('ZeroSnapshotUpdates', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('zero-snapshot-updates'), - nextAction: S.String, - project: S.String, -}) {} - -export class TelemetryMissingViolation extends S.TaggedClass()( - 'TelemetryMissingViolation', - { +export class ZeroSnapshotUpdates + extends S.TaggedClass()('ZeroSnapshotUpdates', { schemaVersion: SCHEMA_VERSION, - code: S.Literal('telemetry-missing'), + code: S.Literal('zero-snapshot-updates'), nextAction: S.String, - side: Side, project: S.String, - expectedSpans: S.Int, - receivedSpans: S.Int, - }, -) {} + }) +{} + +export class TelemetryMissingViolation + extends S.TaggedClass()( + 'TelemetryMissingViolation', + { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('telemetry-missing'), + nextAction: S.String, + side: Side, + project: S.String, + expectedSpans: S.Int, + receivedSpans: S.Int, + }, + ) +{} -export class ZeroShortcuts extends S.TaggedClass()('ZeroShortcuts', { +export class ZeroShortcuts extends S.TaggedClass()('ZeroShortcuts', { schemaVersion: SCHEMA_VERSION, code: S.Literal('zero-shortcuts'), nextAction: S.String, scope: S.Literals(['overall', 'isolatedDeclarations']), }) {} -export class NothingCompared extends S.TaggedClass()('NothingCompared', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('nothing-compared'), - nextAction: S.String, - projectCount: S.Int, - skippedCount: S.Int, -}) {} +export class NothingCompared + extends S.TaggedClass()('NothingCompared', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('nothing-compared'), + nextAction: S.String, + projectCount: S.Int, + skippedCount: S.Int, + }) +{} -export class WrongNotAssignable extends S.TaggedClass()('WrongNotAssignable', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('wrong-not-assignable'), - nextAction: S.String, - project: S.String, - mutantId: S.String, - fileName: S.String, - line: S.Int, - column: S.Int, - candidate: S.String, - candidateType: S.String, - contextualType: S.String, - verdict: VerdictStatus, -}) {} +export class WrongNotAssignable + extends S.TaggedClass()('WrongNotAssignable', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('wrong-not-assignable'), + nextAction: S.String, + project: S.String, + mutantId: S.String, + fileName: S.String, + line: S.Int, + column: S.Int, + candidate: S.String, + candidateType: S.String, + contextualType: S.String, + verdict: VerdictStatus, + }) +{} -export class ZeroNotAssignable extends S.TaggedClass()('ZeroNotAssignable', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('zero-not-assignable'), - nextAction: S.String, -}) {} +export class ZeroNotAssignable + extends S.TaggedClass()('ZeroNotAssignable', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('zero-not-assignable'), + nextAction: S.String, + }) +{} -export class UnitOverBudgetViolation extends S.TaggedClass()('UnitOverBudgetViolation', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('unit-over-budget'), - nextAction: S.String, - side: Side, - project: S.String, - fileName: S.String, - mutantIds: S.Array(S.String), -}) {} +export class UnitOverBudgetViolation + extends S.TaggedClass()('UnitOverBudgetViolation', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('unit-over-budget'), + nextAction: S.String, + side: Side, + project: S.String, + fileName: S.String, + mutantIds: S.Array(S.String), + }) +{} export const Violation = S.Union([ VerdictMismatch, @@ -223,7 +237,7 @@ export type ComparisonSummary = typeof ComparisonSummary.Type const ComparisonTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-checker-parity/CompareSides') type ComparisonTypeId = typeof ComparisonTypeId -export class ParityHolds extends S.TaggedClass()('ParityHolds', { +export class ParityHolds extends S.TaggedClass()('ParityHolds', { schemaVersion: SCHEMA_VERSION, summary: ComparisonSummary, warnings: S.Array(SpeedGateUnmeasured), @@ -231,7 +245,7 @@ export class ParityHolds extends S.TaggedClass()('ParityHolds', { readonly [ComparisonTypeId] = ComparisonTypeId } -export class ParityBroken extends S.TaggedClass()('ParityBroken', { +export class ParityBroken extends S.TaggedClass()('ParityBroken', { schemaVersion: SCHEMA_VERSION, violations: S.Array(Violation), displayed: S.Array(Violation), @@ -245,11 +259,13 @@ export class ParityBroken extends S.TaggedClass()('ParityBroken', export const ComparisonDecision = S.Union([ParityHolds, ParityBroken]) export type ComparisonDecision = typeof ComparisonDecision.Type -export class CompareSidesCommand extends S.TaggedClass()('CompareSidesCommand', { - lines: S.Array(ParityLine), - gates: Gates, - isolatedDeclarationsProject: S.String, -}) { +export class CompareSidesCommand + extends S.TaggedClass()('CompareSidesCommand', { + lines: S.Array(ParityLine), + gates: Gates, + isolatedDeclarationsProject: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/checker-parity/src/main.ts b/test/checker-parity/src/main.ts index 9125a58c3..1fe8f27f1 100644 --- a/test/checker-parity/src/main.ts +++ b/test/checker-parity/src/main.ts @@ -602,6 +602,7 @@ const usageReasonsOf = (cause: CliError.CliError): ReadonlyArray => UnknownSubcommand: (error) => [error.message], UnrecognizedOption: (error) => [error.message], UserError: (error) => [error.message], + ValidationError: (error) => [error.message], }) const usageOutcome = (cause: CliError.CliError): Effect.Effect => diff --git a/test/checker-parity/src/plan-legs.workflow.ts b/test/checker-parity/src/plan-legs.workflow.ts index faf278027..37a046529 100644 --- a/test/checker-parity/src/plan-legs.workflow.ts +++ b/test/checker-parity/src/plan-legs.workflow.ts @@ -23,30 +23,34 @@ const NonNegativeFinite = S.Finite.check(S.isGreaterThanOrEqualTo(0)) const CapacityMs = S.Finite.check(S.isBetween({ minimum: 0, maximum: ONE_DAY_MS, exclusiveMinimum: true })) const BlockMutants = S.Int.check(S.isBetween({ minimum: 1, maximum: 4096 })) -export class CorpusFile extends S.Class('CorpusFile')({ +export class CorpusFile extends S.Class('CorpusFile')({ project: S.String, fileName: S.String, mutants: NonNegativeInt, }) {} -export class PlanLegsCommand extends S.TaggedClass()('PlanLegsCommand', { - files: S.Array(CorpusFile), - rates: S.Array(FileRate), - overheads: S.Array(ProjectOverhead), - capacityMs: CapacityMs, - blockMutants: BlockMutants, -}) { +export class PlanLegsCommand + extends S.TaggedClass()('PlanLegsCommand', { + files: S.Array(CorpusFile), + rates: S.Array(FileRate), + overheads: S.Array(ProjectOverhead), + capacityMs: CapacityMs, + blockMutants: BlockMutants, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class LegsPlanned extends S.TaggedClass()('LegsPlanned', { +export class LegsPlanned extends S.TaggedClass()('LegsPlanned', { legs: S.NonEmptyArray(PlannedLeg), totalMs: NonNegativeFinite, }) { readonly [PlanLegsTypeId] = PlanLegsTypeId } -export class NoCorpusMutants extends S.TaggedClass()('NoCorpusMutants', {}) { +export class NoCorpusMutants + extends S.TaggedClass()('NoCorpusMutants', {}) +{ readonly [PlanLegsTypeId] = PlanLegsTypeId } diff --git a/test/checker-parity/src/report-parity-outcome.workflow.ts b/test/checker-parity/src/report-parity-outcome.workflow.ts index f1701c2e3..d65bfff12 100644 --- a/test/checker-parity/src/report-parity-outcome.workflow.ts +++ b/test/checker-parity/src/report-parity-outcome.workflow.ts @@ -25,19 +25,23 @@ import { type Warning } from './speed-gate.workflow.js' const ReportTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-checker-parity/ReportParityOutcome') type ReportTypeId = typeof ReportTypeId -export class ProjectShard extends S.Class('ProjectShard')({ project: S.String, shard: S.Int }) {} - -export class CompareFinished extends S.TaggedClass()('CompareFinished', { - decision: ComparisonDecision, - lineCount: S.Int, - shards: S.Int, - summaryFile: S.String, - projectShards: S.Array(ProjectShard), - legs: S.Array(LegScope), -}) {} +export class ProjectShard + extends S.Class('ProjectShard')({ project: S.String, shard: S.Int }) +{} + +export class CompareFinished + extends S.TaggedClass()('CompareFinished', { + decision: ComparisonDecision, + lineCount: S.Int, + shards: S.Int, + summaryFile: S.String, + projectShards: S.Array(ProjectShard), + legs: S.Array(LegScope), + }) +{} export class ReportParityOutcomeCommand - extends S.TaggedClass()('ReportParityOutcomeCommand', { + extends S.TaggedClass()('ReportParityOutcomeCommand', { outcome: S.Union([CompareFinished, DriverFailure]), githubActions: S.Boolean, runId: S.String, @@ -53,24 +57,30 @@ const reportFields = { stepSummary: S.String, } -export class ParityHeldReport extends S.TaggedClass()('ParityHeldReport', { - exitCode: S.Literal(0), - ...reportFields, -}) { +export class ParityHeldReport + extends S.TaggedClass()('ParityHeldReport', { + exitCode: S.Literal(0), + ...reportFields, + }) +{ readonly [ReportTypeId] = ReportTypeId } -export class ParityBrokenReport extends S.TaggedClass()('ParityBrokenReport', { - exitCode: S.Literal(1), - ...reportFields, -}) { +export class ParityBrokenReport + extends S.TaggedClass()('ParityBrokenReport', { + exitCode: S.Literal(1), + ...reportFields, + }) +{ readonly [ReportTypeId] = ReportTypeId } -export class DriverFailedReport extends S.TaggedClass()('DriverFailedReport', { - exitCode: S.Literal(2), - ...reportFields, -}) { +export class DriverFailedReport + extends S.TaggedClass()('DriverFailedReport', { + exitCode: S.Literal(2), + ...reportFields, + }) +{ readonly [ReportTypeId] = ReportTypeId } diff --git a/test/checker-parity/src/reuse-cached-verdicts.workflow.ts b/test/checker-parity/src/reuse-cached-verdicts.workflow.ts index 716cfa521..927bb31ac 100644 --- a/test/checker-parity/src/reuse-cached-verdicts.workflow.ts +++ b/test/checker-parity/src/reuse-cached-verdicts.workflow.ts @@ -10,20 +10,22 @@ import * as Str from 'effect/String' const ReuseTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-checker-parity/ReuseCachedVerdicts') type ReuseTypeId = typeof ReuseTypeId -export class VerdictCacheIdentity extends S.Class('VerdictCacheIdentity')({ - schemaVersion: S.Literal(1), - bundleHash: S.String, - programDigest: S.String, - wires: S.Array(Checker.CheckerMutantWire), -}) {} +export class VerdictCacheIdentity + extends S.Class('VerdictCacheIdentity')({ + schemaVersion: S.Literal(1), + bundleHash: S.String, + programDigest: S.String, + wires: S.Array(Checker.CheckerMutantWire), + }) +{} -export class BatchInterrupts extends S.Class('BatchInterrupts')({ +export class BatchInterrupts extends S.Class('BatchInterrupts')({ identity: VerdictCacheIdentity, interrupts: S.Int.check(S.isGreaterThanOrEqualTo(0)), }) {} export class ReuseCachedVerdictsCommand - extends S.TaggedClass()('ReuseCachedVerdictsCommand', { + extends S.TaggedClass()('ReuseCachedVerdictsCommand', { current: VerdictCacheIdentity, stored: S.NullOr(VerdictCacheIdentity), }) @@ -31,7 +33,9 @@ export class ReuseCachedVerdictsCommand static readonly [Workflow.InstrumentationBrand] = {} as const } -export class VerdictsReused extends S.TaggedClass()('VerdictsReused', {}) { +export class VerdictsReused + extends S.TaggedClass()('VerdictsReused', {}) +{ readonly [ReuseTypeId] = ReuseTypeId } @@ -43,7 +47,9 @@ export const FreshReason = S.Literals([ ]) export type FreshReason = typeof FreshReason.Type -export class CheckFreshly extends S.TaggedClass()('CheckFreshly', { reason: FreshReason }) { +export class CheckFreshly + extends S.TaggedClass()('CheckFreshly', { reason: FreshReason }) +{ readonly [ReuseTypeId] = ReuseTypeId } diff --git a/test/checker-parity/src/select-scope.workflow.ts b/test/checker-parity/src/select-scope.workflow.ts index 9485fe632..d75612894 100644 --- a/test/checker-parity/src/select-scope.workflow.ts +++ b/test/checker-parity/src/select-scope.workflow.ts @@ -15,16 +15,18 @@ type SelectScopeTypeId = typeof SelectScopeTypeId type Wire = Checker.CheckerMutantWire -export class SelectScopeCommand extends S.TaggedClass()('SelectScopeCommand', { - changedFiles: S.Array(S.String), - sampleFile: S.NullOr(S.String), - mutants: S.Array(Checker.CheckerMutantWire), - settings: ScopeSettings, -}) { +export class SelectScopeCommand + extends S.TaggedClass()('SelectScopeCommand', { + changedFiles: S.Array(S.String), + sampleFile: S.NullOr(S.String), + mutants: S.Array(Checker.CheckerMutantWire), + settings: ScopeSettings, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class ScopeSelected extends S.TaggedClass()('ScopeSelected', { +export class ScopeSelected extends S.TaggedClass()('ScopeSelected', { changed: S.Array(Checker.CheckerMutantWire), sampled: S.Array(Checker.CheckerMutantWire), wires: S.Array(Checker.CheckerMutantWire), @@ -32,7 +34,9 @@ export class ScopeSelected extends S.TaggedClass()('ScopeSelected readonly [SelectScopeTypeId] = SelectScopeTypeId } -export class NothingSelected extends S.TaggedClass()('NothingSelected', {}) { +export class NothingSelected + extends S.TaggedClass()('NothingSelected', {}) +{ readonly [SelectScopeTypeId] = SelectScopeTypeId } diff --git a/test/checker-parity/src/speed-gate.workflow.ts b/test/checker-parity/src/speed-gate.workflow.ts index 1d4d863ae..f912605c4 100644 --- a/test/checker-parity/src/speed-gate.workflow.ts +++ b/test/checker-parity/src/speed-gate.workflow.ts @@ -7,41 +7,49 @@ import { CheckCall, ParityLine, PhaseLine, type Side } from './Parity.schema.js' const SCHEMA_VERSION = S.Literal(1) -export class SlowerThanMain extends S.TaggedClass()('SlowerThanMain', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('slower-than-main'), - nextAction: S.String, - branchMs: S.Finite, - mainMs: S.Finite, -}) {} +export class SlowerThanMain + extends S.TaggedClass()('SlowerThanMain', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('slower-than-main'), + nextAction: S.String, + branchMs: S.Finite, + mainMs: S.Finite, + }) +{} const SpeedGateTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-checker-parity/SpeedGate') type SpeedGateTypeId = typeof SpeedGateTypeId -export class SpeedGateUnmeasured extends S.TaggedClass()('SpeedGateUnmeasured', { - schemaVersion: SCHEMA_VERSION, - code: S.Literal('speed-gate-unmeasured'), - nextAction: S.String, -}) { +export class SpeedGateUnmeasured + extends S.TaggedClass()('SpeedGateUnmeasured', { + schemaVersion: SCHEMA_VERSION, + code: S.Literal('speed-gate-unmeasured'), + nextAction: S.String, + }) +{ readonly [SpeedGateTypeId] = SpeedGateTypeId } export type Warning = SpeedGateUnmeasured -export class SpeedGateCommand extends S.TaggedClass()('SpeedGateCommand', { - lines: S.Array(ParityLine), - projects: S.Array(S.String), - speedGateEnabled: S.Boolean, -}) { +export class SpeedGateCommand + extends S.TaggedClass()('SpeedGateCommand', { + lines: S.Array(ParityLine), + projects: S.Array(S.String), + speedGateEnabled: S.Boolean, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class SpeedGateEvaluated extends S.TaggedClass()('SpeedGateEvaluated', { - measuredProjects: S.Array(S.String), - mainMs: S.Finite, - branchMs: S.Finite, - slowerThanMain: S.Array(SlowerThanMain), -}) { +export class SpeedGateEvaluated + extends S.TaggedClass()('SpeedGateEvaluated', { + measuredProjects: S.Array(S.String), + mainMs: S.Finite, + branchMs: S.Finite, + slowerThanMain: S.Array(SlowerThanMain), + }) +{ readonly [SpeedGateTypeId] = SpeedGateTypeId } diff --git a/test/checker-parity/src/trigger-parity-lane.workflow.ts b/test/checker-parity/src/trigger-parity-lane.workflow.ts index 9e2d1a693..260068da9 100644 --- a/test/checker-parity/src/trigger-parity-lane.workflow.ts +++ b/test/checker-parity/src/trigger-parity-lane.workflow.ts @@ -21,18 +21,20 @@ const SHARED_FILES: ReadonlyArray = [ const SHARED_DIRECTORIES: ReadonlyArray = ['.github/actions/', 'test/e2e/testResources/'] -export class TriggerParityLaneCommand extends S.TaggedClass()('TriggerParityLaneCommand', { - fullCorpus: S.Boolean, - closureDirectories: S.Array(S.String), - changedFiles: S.Array(S.String), -}) { +export class TriggerParityLaneCommand + extends S.TaggedClass()('TriggerParityLaneCommand', { + fullCorpus: S.Boolean, + closureDirectories: S.Array(S.String), + changedFiles: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } export const RunReason = S.Literals(['full-corpus', 'closure-changed', 'shared-input-changed']) export type RunReason = typeof RunReason.Type -export class RunLane extends S.TaggedClass()('RunLane', { +export class RunLane extends S.TaggedClass()('RunLane', { schemaVersion: S.Literal(1), reason: RunReason, matchedCount: S.Int, @@ -41,7 +43,7 @@ export class RunLane extends S.TaggedClass()('RunLane', { readonly [TriggerTypeId] = TriggerTypeId } -export class SkipLane extends S.TaggedClass()('SkipLane', { +export class SkipLane extends S.TaggedClass()('SkipLane', { schemaVersion: S.Literal(1), reason: S.Literal('no-closure-change'), changedCount: S.Int, diff --git a/test/e2e-core/oxlint.config.ts b/test/e2e-core/oxlint.config.ts index 5bd98d239..6d1307887 100644 --- a/test/e2e-core/oxlint.config.ts +++ b/test/e2e-core/oxlint.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ }, overrides: [ + { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: ['src/**'], rules: { diff --git a/test/e2e-core/src/__tests__/placement-closure.workflow.property.test.ts b/test/e2e-core/src/__tests__/placement-closure.workflow.property.test.ts index ede6e21e2..28c7e1f57 100644 --- a/test/e2e-core/src/__tests__/placement-closure.workflow.property.test.ts +++ b/test/e2e-core/src/__tests__/placement-closure.workflow.property.test.ts @@ -50,7 +50,7 @@ describe('placementClosure', () => { return Result.match(subject(commandOf([entry], [], [])), { onFailure: (failure) => S.is(PlacementUnwitnessed)(failure) && - failure.name === drawn.name && + failure.entryName === drawn.name && failure.tier === drawn.tier, onSuccess: () => false, }) @@ -75,7 +75,7 @@ describe('placementClosure', () => { (subject, [drawn, reason]) => { const entry = entryOf(drawn.id, drawn.name, drawn.tier) return Result.match(subject(commandOf([entry], [drawn.name], [{ name: drawn.name, reason }])), { - onFailure: (failure) => S.is(PlacementWaiverStale)(failure) && failure.name === drawn.name, + onFailure: (failure) => S.is(PlacementWaiverStale)(failure) && failure.entryName === drawn.name, onSuccess: () => false, }) }, @@ -93,7 +93,7 @@ describe('placementClosure', () => { } const entry = entryOf(drawn.id, drawn.name, drawn.tier) return Result.match(subject(commandOf([entry], [drawn.name], [{ name: otherName, reason }])), { - onFailure: (failure) => S.is(PlacementWaiverStale)(failure) && failure.name === otherName, + onFailure: (failure) => S.is(PlacementWaiverStale)(failure) && failure.entryName === otherName, onSuccess: () => false, }) }, diff --git a/test/e2e-core/src/annotation.schema.ts b/test/e2e-core/src/annotation.schema.ts index eec1569ef..d188b14b8 100644 --- a/test/e2e-core/src/annotation.schema.ts +++ b/test/e2e-core/src/annotation.schema.ts @@ -20,19 +20,27 @@ export const ErrorClass = S.String.pipe( ) export type ErrorClass = typeof ErrorClass.Type -export class AnnotationStatusOutcome extends S.TaggedClass()('Status', { - status: Mutant.MutantStatusSchema, -}) {} - -export class KilledOrTimeoutOutcome extends S.TaggedClass()('KilledOrTimeout', {}) {} - -export class CompileErrorOutcome extends S.TaggedClass()('CompileError', { - code: TsCode, -}) {} - -export class RuntimeErrorOutcome extends S.TaggedClass()('RuntimeError', { - errorClass: ErrorClass, -}) {} +export class AnnotationStatusOutcome + extends S.TaggedClass()('Status', { + status: Mutant.MutantStatusSchema, + }) +{} + +export class KilledOrTimeoutOutcome + extends S.TaggedClass()('KilledOrTimeout', {}) +{} + +export class CompileErrorOutcome + extends S.TaggedClass()('CompileError', { + code: TsCode, + }) +{} + +export class RuntimeErrorOutcome + extends S.TaggedClass()('RuntimeError', { + errorClass: ErrorClass, + }) +{} export const Outcome = S.Union([ AnnotationStatusOutcome, @@ -48,9 +56,9 @@ export const MutatorItem = S.Struct({ }) export type MutatorItem = typeof MutatorItem.Type -export class AllMutators extends S.TaggedClass()('All', {}) {} +export class AllMutators extends S.TaggedClass()('All', {}) {} -export class NamedMutators extends S.TaggedClass()('Named', { +export class NamedMutators extends S.TaggedClass()('Named', { items: S.Array(MutatorItem), }) {} @@ -63,7 +71,7 @@ export type SourceLine = typeof SourceLine.Type const AnnotationTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/Annotation') type AnnotationTypeId = typeof AnnotationTypeId -export class Annotation extends S.TaggedClass()('Annotation', { +export class Annotation extends S.TaggedClass()('Annotation', { line: S.Int, scope: Scope, range: Mutant.Location, @@ -77,22 +85,26 @@ export class Annotation extends S.TaggedClass()('Annotation', { export const SourcedAnnotation = S.Struct({ file: S.String, annotation: Annotation }) export type SourcedAnnotation = typeof SourcedAnnotation.Type -export class AnnotationUnreadable extends S.TaggedError()('AnnotationUnreadable', { - file: S.String, - line: S.Int, - text: S.String, - reason: S.String, -}) { +export class AnnotationUnreadable + extends S.TaggedError()('AnnotationUnreadable', { + file: S.String, + line: S.Int, + text: S.String, + reason: S.String, + }) +{ override get message(): string { return `${this.file}:${this.line}: ${this.reason}: ${this.text}` } } -export class AnnotationRangeUnresolved extends S.TaggedError()('AnnotationRangeUnresolved', { - file: S.String, - line: S.Int, - reason: S.String, -}) { +export class AnnotationRangeUnresolved + extends S.TaggedError()('AnnotationRangeUnresolved', { + file: S.String, + line: S.Int, + reason: S.String, + }) +{ override get message(): string { return `${this.file}:${this.line}: the annotated scope has no source range: ${this.reason}` } diff --git a/test/e2e-core/src/bench-report.schema.ts b/test/e2e-core/src/bench-report.schema.ts index 2b09a4d70..23075980b 100644 --- a/test/e2e-core/src/bench-report.schema.ts +++ b/test/e2e-core/src/bench-report.schema.ts @@ -81,7 +81,7 @@ export const abortedOutcomeOf: { const BenchReportTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/BenchReport') type BenchReportTypeId = typeof BenchReportTypeId -export class BenchReport extends S.Class('BenchReport')({ +export class BenchReport extends S.Class('BenchReport')({ schemaVersion: S.Literal('2.0'), baseSha: S.String, headSha: S.String, @@ -105,11 +105,15 @@ const RenderedFields = { exitCode: S.Literals([0, 1]), } -export class BenchRenderedNotice extends S.TaggedClass()('notice', RenderedFields) { +export class BenchRenderedNotice + extends S.TaggedClass()('notice', RenderedFields) +{ readonly [BenchRenderedTypeId] = BenchRenderedTypeId } -export class BenchRenderedError extends S.TaggedClass()('error', RenderedFields) { +export class BenchRenderedError + extends S.TaggedClass()('error', RenderedFields) +{ readonly [BenchRenderedTypeId] = BenchRenderedTypeId } diff --git a/test/e2e-core/src/bench-run.schema.ts b/test/e2e-core/src/bench-run.schema.ts index fd44ed4de..505866ed7 100644 --- a/test/e2e-core/src/bench-run.schema.ts +++ b/test/e2e-core/src/bench-run.schema.ts @@ -10,7 +10,7 @@ export type BenchSide = typeof BenchSide.Type export const BenchCorpusName = S.Literals(['repo', 'enterprise']) export type BenchCorpusName = typeof BenchCorpusName.Type -export class BenchRunKey extends S.Class('BenchRunKey')({ +export class BenchRunKey extends S.Class('BenchRunKey')({ corpus: BenchCorpusName, entry: S.NonEmptyString, side: BenchSide, @@ -33,7 +33,7 @@ export type WorkloadDigest = typeof WorkloadDigest.Type export const BenchRunFailureCode = S.Literals(['stream-undecodable', 'stream-invalid']) export type BenchRunFailureCode = typeof BenchRunFailureCode.Type -export class BenchRunMeasured extends S.TaggedClass()('measured', { +export class BenchRunMeasured extends S.TaggedClass()('measured', { key: BenchRunKey, phaseDurations: RunEvent.PhaseDurations, mutants: Report.NonNegativeInt, @@ -45,7 +45,7 @@ export class BenchRunMeasured extends S.TaggedClass()('measure readonly [BenchRunTypeId] = BenchRunTypeId } -export class BenchRunInvalid extends S.TaggedClass()('invalid', { +export class BenchRunInvalid extends S.TaggedClass()('invalid', { key: BenchRunKey, code: BenchRunFailureCode, reason: S.String, diff --git a/test/e2e-core/src/bench-summary.schema.ts b/test/e2e-core/src/bench-summary.schema.ts index c4e99a540..fba7a1191 100644 --- a/test/e2e-core/src/bench-summary.schema.ts +++ b/test/e2e-core/src/bench-summary.schema.ts @@ -64,7 +64,7 @@ export const PhaseVerdict = S.TaggedUnion({ }) export type PhaseVerdict = typeof PhaseVerdict.Type -export class BenchPhaseRow extends S.Class('BenchPhaseRow')({ +export class BenchPhaseRow extends S.Class('BenchPhaseRow')({ phase: BenchPhase, a: SideCell, b: SideCell, @@ -80,20 +80,22 @@ export type Workload = typeof Workload.Type const CountRange = S.Struct({ min: Report.NonNegativeInt, max: Report.NonNegativeInt }) -export class SideCounts extends S.Class('SideCounts')({ +export class SideCounts extends S.Class('SideCounts')({ mutants: CountRange, testsExecuted: CountRange, }) {} export const CorpusCounts = S.Struct({ a: SideCounts, b: SideCounts }) -export class BenchProjectSummary extends S.Class('BenchProjectSummary')({ - corpus: BenchCorpusName, - entry: S.NonEmptyString, - workload: Workload, - counts: CorpusCounts, - rows: S.Array(BenchPhaseRow), -}) {} +export class BenchProjectSummary + extends S.Class('BenchProjectSummary')({ + corpus: BenchCorpusName, + entry: S.NonEmptyString, + workload: Workload, + counts: CorpusCounts, + rows: S.Array(BenchPhaseRow), + }) +{} export const RegressedMetric = S.Struct({ corpus: BenchCorpusName, @@ -119,7 +121,7 @@ export type PhaseRegressed = typeof Regression.cases.PhaseRegressed.Type const BenchSummaryTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/BenchSummary') type BenchSummaryTypeId = typeof BenchSummaryTypeId -export class BenchSummary extends S.TaggedClass()('BenchSummary', { +export class BenchSummary extends S.TaggedClass()('BenchSummary', { projects: S.Array(BenchProjectSummary), regression: Regression, }) { diff --git a/test/e2e-core/src/catalog-resolution.schema.ts b/test/e2e-core/src/catalog-resolution.schema.ts index 9cc18457e..ffa162416 100644 --- a/test/e2e-core/src/catalog-resolution.schema.ts +++ b/test/e2e-core/src/catalog-resolution.schema.ts @@ -88,20 +88,24 @@ export const CatalogMode = S.TaggedUnion({ }) export type CatalogMode = typeof CatalogMode.Type -export class MalformedFixtureManifest extends S.TaggedError()('MalformedFixtureManifest', { - manifest: S.String, - detail: S.String, -}) { +export class MalformedFixtureManifest + extends S.TaggedError()('MalformedFixtureManifest', { + manifest: S.String, + detail: S.String, + }) +{ override get message(): string { return `${this.manifest}: ${this.detail}` } } -export class UnresolvedCatalogSpec extends S.TaggedError()('UnresolvedCatalogSpec', { - manifest: S.String, - packageName: S.String, - catalog: S.String, -}) { +export class UnresolvedCatalogSpec + extends S.TaggedError()('UnresolvedCatalogSpec', { + manifest: S.String, + packageName: S.String, + catalog: S.String, + }) +{ override get message(): string { return `${this.manifest}: "${this.packageName}" is missing from the ${this.catalog} catalog in pnpm-workspace.yaml` } diff --git a/test/e2e-core/src/confirm-annotations.workflow.ts b/test/e2e-core/src/confirm-annotations.workflow.ts index e1be0d630..0b5f6ed39 100644 --- a/test/e2e-core/src/confirm-annotations.workflow.ts +++ b/test/e2e-core/src/confirm-annotations.workflow.ts @@ -8,19 +8,21 @@ import * as S from 'effect/Schema' import { type Outcome } from './annotation.schema.js' import { MatchedAnnotation } from './match-annotations.workflow.js' -export class ConfirmAnnotationsCommand extends S.TaggedClass()( - 'ConfirmAnnotationsCommand', - { - matched: S.Array(MatchedAnnotation), - }, -) { +export class ConfirmAnnotationsCommand + extends S.TaggedClass()( + 'ConfirmAnnotationsCommand', + { + matched: S.Array(MatchedAnnotation), + }, + ) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const OutcomeTallyTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/OutcomeTally') type OutcomeTallyTypeId = typeof OutcomeTallyTypeId -export class OutcomeTally extends S.TaggedClass()('OutcomeTally', { +export class OutcomeTally extends S.TaggedClass()('OutcomeTally', { matched: S.Int, byStatus: S.Record(S.String, S.Int), byMutator: S.Record(S.String, S.Int), @@ -30,30 +32,34 @@ export class OutcomeTally extends S.TaggedClass()('OutcomeTally', const KILLED_OR_TIMEOUT_STATUSES: ReadonlyArray = ['Killed', 'Timeout'] -export class AnnotationStatusMismatch extends S.TaggedError()( - 'AnnotationStatusMismatch', - { - file: S.String, - line: S.Int, - column: S.Int, - mutator: S.String, - expected: S.String, - actual: S.String, - }, -) { +export class AnnotationStatusMismatch + extends S.TaggedError()( + 'AnnotationStatusMismatch', + { + file: S.String, + line: S.Int, + column: S.Int, + mutator: S.String, + expected: S.String, + actual: S.String, + }, + ) +{ override get message(): string { return `${this.file}:${this.line}:${this.column}: the ${this.mutator} mutant was annotated ${this.expected} but the run reported ${this.actual}` } } -export class AnnotationCauseMismatch extends S.TaggedError()('AnnotationCauseMismatch', { - file: S.String, - line: S.Int, - column: S.Int, - mutator: S.String, - expectedCause: S.String, - actualReason: S.String, -}) { +export class AnnotationCauseMismatch + extends S.TaggedError()('AnnotationCauseMismatch', { + file: S.String, + line: S.Int, + column: S.Int, + mutator: S.String, + expectedCause: S.String, + actualReason: S.String, + }) +{ override get message(): string { return `${this.file}:${this.line}:${this.column}: the ${this.mutator} mutant was annotated ${this.expectedCause}, but the reported reason names no such cause: ${this.actualReason}` } diff --git a/test/e2e-core/src/covering-test-files.workflow.ts b/test/e2e-core/src/covering-test-files.workflow.ts index 06dcdb9b2..3dd4d5879 100644 --- a/test/e2e-core/src/covering-test-files.workflow.ts +++ b/test/e2e-core/src/covering-test-files.workflow.ts @@ -18,9 +18,11 @@ const DecodeReport = S.decodeResult(S.fromJsonString(IncrementalReportSubset)) type IncrementalReport = typeof IncrementalReportSubset.Type -export class CoveringTestFilesCommand extends S.TaggedClass()('CoveringTestFilesCommand', { - report: S.String, -}) { +export class CoveringTestFilesCommand + extends S.TaggedClass()('CoveringTestFilesCommand', { + report: S.String, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } @@ -29,17 +31,21 @@ const CoveringTestFilesFoundTypeId: unique symbol = Symbol.for( ) type CoveringTestFilesFoundTypeId = typeof CoveringTestFilesFoundTypeId -export class CoveringTestFilesFound extends S.TaggedClass()('CoveringTestFilesFound', { - mutatedFiles: S.Array(S.String), - testFiles: S.Array(S.String), -}) { +export class CoveringTestFilesFound + extends S.TaggedClass()('CoveringTestFilesFound', { + mutatedFiles: S.Array(S.String), + testFiles: S.Array(S.String), + }) +{ readonly [CoveringTestFilesFoundTypeId] = CoveringTestFilesFoundTypeId } -export class IncrementalReportUnreadable extends S.TaggedError()( - 'IncrementalReportUnreadable', - { reason: S.String }, -) { +export class IncrementalReportUnreadable + extends S.TaggedError()( + 'IncrementalReportUnreadable', + { reason: S.String }, + ) +{ override get message(): string { return `the run's incremental report is unreadable: ${this.reason}` } diff --git a/test/e2e-core/src/install-closure.workflow.ts b/test/e2e-core/src/install-closure.workflow.ts index 1515333fd..646848734 100644 --- a/test/e2e-core/src/install-closure.workflow.ts +++ b/test/e2e-core/src/install-closure.workflow.ts @@ -9,41 +9,49 @@ import * as S from 'effect/Schema' import { type PackedManifest, PackedMember, StagedFixtureManifest } from './install-closure.schema.js' -export class InstallClosureCommand extends S.TaggedClass()('InstallClosureCommand', { - members: S.Array(PackedMember), - fixtures: S.Array(StagedFixtureManifest), - workspace: S.Array(S.String), -}) { +export class InstallClosureCommand + extends S.TaggedClass()('InstallClosureCommand', { + members: S.Array(PackedMember), + fixtures: S.Array(StagedFixtureManifest), + workspace: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const ClosureInstallTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/ClosureInstall') type ClosureInstallTypeId = typeof ClosureInstallTypeId -export class ClosureInstall extends S.TaggedClass()('ClosureInstall', { - specs: S.Array(S.String), - dependencies: S.Record(S.String, S.String), -}) { +export class ClosureInstall + extends S.TaggedClass()('ClosureInstall', { + specs: S.Array(S.String), + dependencies: S.Record(S.String, S.String), + }) +{ readonly [ClosureInstallTypeId] = ClosureInstallTypeId } -export class UnpackedWorkspaceDependency extends S.TaggedError()( - 'UnpackedWorkspaceDependency', - { - dependent: S.String, - dependency: S.String, - target: S.String, - }, -) { +export class UnpackedWorkspaceDependency + extends S.TaggedError()( + 'UnpackedWorkspaceDependency', + { + dependent: S.String, + dependency: S.String, + target: S.String, + }, + ) +{ override get message(): string { return `${this.dependent} depends on the workspace package ${this.target} as "${this.dependency}", but the packed closure carries no tarball for it, so npm would resolve it from the registry` } } -export class ConflictingAliasTargets extends S.TaggedError()('ConflictingAliasTargets', { - dependency: S.String, - targets: S.Array(S.String), -}) { +export class ConflictingAliasTargets + extends S.TaggedError()('ConflictingAliasTargets', { + dependency: S.String, + targets: S.Array(S.String), + }) +{ override get message(): string { return `the packed closure installs "${this.dependency}" as more than one package (${ this.targets.join(', ') @@ -51,14 +59,16 @@ export class ConflictingAliasTargets extends S.TaggedError()( - 'FixtureNamesWorkspacePackage', - { - fixture: S.String, - dependency: S.String, - target: S.String, - }, -) { +export class FixtureNamesWorkspacePackage + extends S.TaggedError()( + 'FixtureNamesWorkspacePackage', + { + fixture: S.String, + dependency: S.String, + target: S.String, + }, + ) +{ override get message(): string { return `${this.fixture} depends on the workspace package ${this.target} as "${this.dependency}", but the fixture's own npm install resolves it from the registry; the bake installs the packed closure into every fixture, so drop the edge` } diff --git a/test/e2e-core/src/match-annotations.workflow.ts b/test/e2e-core/src/match-annotations.workflow.ts index 73d5a5efb..5686f7d35 100644 --- a/test/e2e-core/src/match-annotations.workflow.ts +++ b/test/e2e-core/src/match-annotations.workflow.ts @@ -20,36 +20,44 @@ import { ReportMutant } from './match.schema.js' const MatchedAnnotationTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/MatchedAnnotation') type MatchedAnnotationTypeId = typeof MatchedAnnotationTypeId -export class MatchedAnnotation extends S.TaggedClass()('MatchedAnnotation', { - mutant: ReportMutant, - annotation: SourcedAnnotation, -}) { +export class MatchedAnnotation + extends S.TaggedClass()('MatchedAnnotation', { + mutant: ReportMutant, + annotation: SourcedAnnotation, + }) +{ readonly [MatchedAnnotationTypeId] = MatchedAnnotationTypeId } -export class MatchAnnotationsCommand extends S.TaggedClass()('MatchAnnotationsCommand', { - slice: S.String, - annotations: S.Array(SourcedAnnotation), - mutants: S.Array(ReportMutant), -}) { +export class MatchAnnotationsCommand + extends S.TaggedClass()('MatchAnnotationsCommand', { + slice: S.String, + annotations: S.Array(SourcedAnnotation), + mutants: S.Array(ReportMutant), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class MutantUnmatched extends S.TaggedError()('MutantUnmatched', { - file: S.String, - line: S.Int, - column: S.Int, - mutator: S.String, -}) { +export class MutantUnmatched + extends S.TaggedError()('MutantUnmatched', { + file: S.String, + line: S.Int, + column: S.Int, + mutator: S.String, + }) +{ override get message(): string { return `${this.file}:${this.line}:${this.column}: no annotation covers the ${this.mutator} mutant` } } -export class AnnotationDangling extends S.TaggedError()('AnnotationDangling', { - file: S.String, - line: S.Int, -}) { +export class AnnotationDangling + extends S.TaggedError()('AnnotationDangling', { + file: S.String, + line: S.Int, + }) +{ override get message(): string { return `${this.file}:${this.line}: the annotation claims no mutant` } @@ -58,13 +66,15 @@ export class AnnotationDangling extends S.TaggedError()('Ann export const AnnotationClaim = S.Struct({ file: S.String, line: S.Int }) export type AnnotationClaim = typeof AnnotationClaim.Type -export class MutantClaimedTwice extends S.TaggedError()('MutantClaimedTwice', { - file: S.String, - line: S.Int, - column: S.Int, - mutator: S.String, - claimedBy: S.Array(AnnotationClaim), -}) { +export class MutantClaimedTwice + extends S.TaggedError()('MutantClaimedTwice', { + file: S.String, + line: S.Int, + column: S.Int, + mutator: S.String, + claimedBy: S.Array(AnnotationClaim), + }) +{ override get message(): string { const claims = this.claimedBy.map((claim) => `${claim.file}:${claim.line}`).join(', ') return `${this.file}:${this.line}:${this.column}: the ${this.mutator} mutant is claimed at one scope by ${claims}` diff --git a/test/e2e-core/src/missing-fixtures.workflow.ts b/test/e2e-core/src/missing-fixtures.workflow.ts index f789fae94..b0b39e7f2 100644 --- a/test/e2e-core/src/missing-fixtures.workflow.ts +++ b/test/e2e-core/src/missing-fixtures.workflow.ts @@ -8,20 +8,24 @@ import { FixtureKeyRef } from './bake-key.schema.js' const entryNameOf = (fixture: { readonly fixtureId: string; readonly key: string }): string => `${fixture.fixtureId}.${fixture.key}` -export class MissingFixturesCommand extends S.TaggedClass()('MissingFixturesCommand', { - fixtures: S.Array(FixtureKeyRef), - present: S.Array(S.String), -}) { +export class MissingFixturesCommand + extends S.TaggedClass()('MissingFixturesCommand', { + fixtures: S.Array(FixtureKeyRef), + present: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const MissingFixtureTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/MissingFixture') type MissingFixtureTypeId = typeof MissingFixtureTypeId -export class MissingFixture extends S.TaggedClass()('MissingFixture', { - fixtureId: S.String, - key: S.String, -}) { +export class MissingFixture + extends S.TaggedClass()('MissingFixture', { + fixtureId: S.String, + key: S.String, + }) +{ readonly [MissingFixtureTypeId] = MissingFixtureTypeId } diff --git a/test/e2e-core/src/parse-annotations.workflow.ts b/test/e2e-core/src/parse-annotations.workflow.ts index 7ffd48ac3..c3a5fde5d 100644 --- a/test/e2e-core/src/parse-annotations.workflow.ts +++ b/test/e2e-core/src/parse-annotations.workflow.ts @@ -21,10 +21,12 @@ import { SourceLine, } from './annotation.schema.js' -export class ParseAnnotationsCommand extends S.TaggedClass()('ParseAnnotationsCommand', { - file: S.String, - lines: S.Array(SourceLine), -}) { +export class ParseAnnotationsCommand + extends S.TaggedClass()('ParseAnnotationsCommand', { + file: S.String, + lines: S.Array(SourceLine), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/e2e-core/src/placement-closure.workflow.ts b/test/e2e-core/src/placement-closure.workflow.ts index 011c31da0..c9c2f530a 100644 --- a/test/e2e-core/src/placement-closure.workflow.ts +++ b/test/e2e-core/src/placement-closure.workflow.ts @@ -8,37 +8,45 @@ import * as S from 'effect/Schema' import { CatalogEntryRef, PlacementWaiver } from './closure.schema.js' -export class PlacementClosureCommand extends S.TaggedClass()('PlacementClosureCommand', { - entries: S.Array(CatalogEntryRef), - witnessed: S.Array(Mutant.MutatorName), - waivers: S.Array(PlacementWaiver), -}) { +export class PlacementClosureCommand + extends S.TaggedClass()('PlacementClosureCommand', { + entries: S.Array(CatalogEntryRef), + witnessed: S.Array(Mutant.MutatorName), + waivers: S.Array(PlacementWaiver), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const PlacementClosureTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/PlacementClosure') type PlacementClosureTypeId = typeof PlacementClosureTypeId -export class PlacementClosure extends S.TaggedClass()('PlacementClosure', { - entries: S.Array(CatalogEntryRef), -}) { +export class PlacementClosure + extends S.TaggedClass()('PlacementClosure', { + entries: S.Array(CatalogEntryRef), + }) +{ readonly [PlacementClosureTypeId] = PlacementClosureTypeId } -export class PlacementUnwitnessed extends S.TaggedError()('PlacementUnwitnessed', { - name: S.String, - tier: S.String, -}) { +export class PlacementUnwitnessed + extends S.TaggedError()('PlacementUnwitnessed', { + entryName: S.String, + tier: S.String, + }) +{ override get message(): string { - return `the ${this.tier} catalog entry "${this.name}" has neither an annotated witness nor a named waiver` + return `the ${this.tier} catalog entry "${this.entryName}" has neither an annotated witness nor a named waiver` } } -export class PlacementWaiverStale extends S.TaggedError()('PlacementWaiverStale', { - name: S.String, -}) { +export class PlacementWaiverStale + extends S.TaggedError()('PlacementWaiverStale', { + entryName: S.String, + }) +{ override get message(): string { - return `the placement waiver for "${this.name}" names an entry that is witnessed or is not in the catalog` + return `the placement waiver for "${this.entryName}" names an entry that is witnessed or is not in the catalog` } } @@ -65,7 +73,7 @@ const unwitnessedRefusal = ( ): Result.Result => Option.match(Arr.head(unwitnessedOf(command)), { onNone: () => Result.succeed(undefined), - onSome: (entry) => Result.fail(PlacementUnwitnessed.make({ name: entry.name, tier: entry.tier })), + onSome: (entry) => Result.fail(PlacementUnwitnessed.make({ entryName: entry.name, tier: entry.tier })), }) const staleWaiverRefusal = ( @@ -73,7 +81,7 @@ const staleWaiverRefusal = ( ): Result.Result => Option.match(Arr.findFirst(command.waivers, (waiver) => waiverIsStale(command, waiver)), { onNone: () => Result.succeed(PlacementClosure.make({ entries: [...command.entries] })), - onSome: (waiver) => Result.fail(PlacementWaiverStale.make({ name: waiver.name })), + onSome: (waiver) => Result.fail(PlacementWaiverStale.make({ entryName: waiver.name })), }) const decide = (command: PlacementClosureCommand): Result.Result => diff --git a/test/e2e-core/src/prune-stale-entries.workflow.ts b/test/e2e-core/src/prune-stale-entries.workflow.ts index 3965547c4..a0db66789 100644 --- a/test/e2e-core/src/prune-stale-entries.workflow.ts +++ b/test/e2e-core/src/prune-stale-entries.workflow.ts @@ -3,18 +3,22 @@ import * as Boolean from 'effect/Boolean' import * as Result from 'effect/Result' import * as S from 'effect/Schema' -export class PruneStaleEntriesCommand extends S.TaggedClass()('PruneStaleEntriesCommand', { - entries: S.Array(S.String), - keep: S.String, - leased: S.Array(S.String), -}) { +export class PruneStaleEntriesCommand + extends S.TaggedClass()('PruneStaleEntriesCommand', { + entries: S.Array(S.String), + keep: S.String, + leased: S.Array(S.String), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const PrunableEntryTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/PrunableEntry') type PrunableEntryTypeId = typeof PrunableEntryTypeId -export class PrunableEntry extends S.TaggedClass()('PrunableEntry', { name: S.String }) { +export class PrunableEntry + extends S.TaggedClass()('PrunableEntry', { name: S.String }) +{ readonly [PrunableEntryTypeId] = PrunableEntryTypeId } diff --git a/test/e2e-core/src/read-bench-run.workflow.ts b/test/e2e-core/src/read-bench-run.workflow.ts index 9e887eaee..45f91430c 100644 --- a/test/e2e-core/src/read-bench-run.workflow.ts +++ b/test/e2e-core/src/read-bench-run.workflow.ts @@ -11,14 +11,16 @@ import { BenchRun, BenchRunInvalid, BenchRunKey, BenchRunMeasured, WorkloadDiges const DecodeWireLine = S.decodeResult(RunEvent.RunEventWireLine) -export class ReadBenchRunCommand extends S.TaggedClass()('ReadBenchRunCommand', { - key: BenchRunKey, - lines: S.Array(S.String), - exitCode: S.Int, - workloadDigest: WorkloadDigest, - stderrTail: S.String, - wallMs: Report.NonNegativeFinite, -}) { +export class ReadBenchRunCommand + extends S.TaggedClass()('ReadBenchRunCommand', { + key: BenchRunKey, + lines: S.Array(S.String), + exitCode: S.Int, + workloadDigest: WorkloadDigest, + stderrTail: S.String, + wallMs: Report.NonNegativeFinite, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/e2e-core/src/render-bench-report.workflow.ts b/test/e2e-core/src/render-bench-report.workflow.ts index e0f8ad7f8..d4d150ee5 100644 --- a/test/e2e-core/src/render-bench-report.workflow.ts +++ b/test/e2e-core/src/render-bench-report.workflow.ts @@ -29,9 +29,11 @@ import { Workload, } from './bench-summary.schema.js' -export class RenderBenchReportCommand extends S.TaggedClass()('RenderBenchReportCommand', { - report: BenchReport, -}) { +export class RenderBenchReportCommand + extends S.TaggedClass()('RenderBenchReportCommand', { + report: BenchReport, + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } diff --git a/test/e2e-core/src/status-closure.workflow.ts b/test/e2e-core/src/status-closure.workflow.ts index 1ef65f47b..17554debe 100644 --- a/test/e2e-core/src/status-closure.workflow.ts +++ b/test/e2e-core/src/status-closure.workflow.ts @@ -8,32 +8,36 @@ import * as S from 'effect/Schema' import { JourneyAvailability, type StatusWaiver, StatusWitness, WitnessRegistry } from './closure.schema.js' -export class StatusClosureCommand extends S.TaggedClass()('StatusClosureCommand', { - statuses: S.Array(Mutant.MutantStatusSchema), - registry: WitnessRegistry, - journeys: S.Array(JourneyAvailability), -}) { +export class StatusClosureCommand + extends S.TaggedClass()('StatusClosureCommand', { + statuses: S.Array(Mutant.MutantStatusSchema), + registry: WitnessRegistry, + journeys: S.Array(JourneyAvailability), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } const StatusClosureTypeId: unique symbol = Symbol.for('@systemfsoftware/stryker-e2e-core/StatusClosure') type StatusClosureTypeId = typeof StatusClosureTypeId -export class StatusClosure extends S.TaggedClass()('StatusClosure', { +export class StatusClosure extends S.TaggedClass()('StatusClosure', { witnesses: S.Array(StatusWitness), }) { readonly [StatusClosureTypeId] = StatusClosureTypeId } -export class StatusUnwitnessed extends S.TaggedError()('StatusUnwitnessed', { - status: S.String, -}) { +export class StatusUnwitnessed + extends S.TaggedError()('StatusUnwitnessed', { + status: S.String, + }) +{ override get message(): string { return `status closure: the ${this.status} status has neither a witnessing journey nor a waiver` } } -export class StatusUnknown extends S.TaggedError()('StatusUnknown', { +export class StatusUnknown extends S.TaggedError()('StatusUnknown', { status: S.String, }) { override get message(): string { @@ -41,35 +45,43 @@ export class StatusUnknown extends S.TaggedError()('StatusUnknown } } -export class StatusWitnessDuplicated extends S.TaggedError()('StatusWitnessDuplicated', { - status: S.String, -}) { +export class StatusWitnessDuplicated + extends S.TaggedError()('StatusWitnessDuplicated', { + status: S.String, + }) +{ override get message(): string { return `status closure: more than one journey witnesses the ${this.status} status` } } -export class StatusWaiverStale extends S.TaggedError()('StatusWaiverStale', { - status: S.String, -}) { +export class StatusWaiverStale + extends S.TaggedError()('StatusWaiverStale', { + status: S.String, + }) +{ override get message(): string { return `status closure: the waiver for the ${this.status} status is stale, because a journey already witnesses it` } } -export class StatusWaiverForProducedStatus extends S.TaggedError()( - 'StatusWaiverForProducedStatus', - { status: S.String }, -) { +export class StatusWaiverForProducedStatus + extends S.TaggedError()( + 'StatusWaiverForProducedStatus', + { status: S.String }, + ) +{ override get message(): string { return `status closure: the ${this.status} status is produced by this wave, so no waiver may cover it` } } -export class StatusJourneyUnusable extends S.TaggedError()('StatusJourneyUnusable', { - status: S.String, - journey: S.String, -}) { +export class StatusJourneyUnusable + extends S.TaggedError()('StatusJourneyUnusable', { + status: S.String, + journey: S.String, + }) +{ override get message(): string { return `status closure: the witness for the ${this.status} status names the journey ${this.journey}, which the lane does not run` } diff --git a/test/e2e-core/src/summarize-bench.workflow.ts b/test/e2e-core/src/summarize-bench.workflow.ts index 0cc29ccfa..1c27fdec7 100644 --- a/test/e2e-core/src/summarize-bench.workflow.ts +++ b/test/e2e-core/src/summarize-bench.workflow.ts @@ -35,18 +35,22 @@ const min = Math.min const max = Math.max const abs = Math.abs -export class SummarizeBenchCommand extends S.TaggedClass()('SummarizeBenchCommand', { - sha: S.String, - baseSha: S.String, - ref: S.NonEmptyString, - runs: S.Array(BenchRun), -}) { +export class SummarizeBenchCommand + extends S.TaggedClass()('SummarizeBenchCommand', { + sha: S.String, + baseSha: S.String, + ref: S.NonEmptyString, + runs: S.Array(BenchRun), + }) +{ static readonly [Workflow.InstrumentationBrand] = {} as const } -export class BenchRunsInvalid extends S.TaggedError()('BenchRunsInvalid', { - runs: S.Array(BenchRun), -}) { +export class BenchRunsInvalid + extends S.TaggedError()('BenchRunsInvalid', { + runs: S.Array(BenchRun), + }) +{ override get message(): string { const labels = Arr.map(this.runs, (run) => run.key.label).join(', ') return `cannot summarize ${this.runs.length} invalid bench run(s): ${labels}` diff --git a/test/e2e-core/tests/__fixtures__/placement-failure.schema.ts b/test/e2e-core/tests/__fixtures__/placement-failure.schema.ts index 24d92f05b..0d9ba72d0 100644 --- a/test/e2e-core/tests/__fixtures__/placement-failure.schema.ts +++ b/test/e2e-core/tests/__fixtures__/placement-failure.schema.ts @@ -1,18 +1,22 @@ import * as S from 'effect/Schema' -export class PlacementFixtureUnreadable extends S.TaggedError()( - 'PlacementFixtureUnreadable', - { reason: S.String }, -) { +export class PlacementFixtureUnreadable + extends S.TaggedError()( + 'PlacementFixtureUnreadable', + { reason: S.String }, + ) +{ override get message(): string { return this.reason } } -export class PlacementSliceUndecodable extends S.TaggedError()( - 'PlacementSliceUndecodable', - { reason: S.String }, -) { +export class PlacementSliceUndecodable + extends S.TaggedError()( + 'PlacementSliceUndecodable', + { reason: S.String }, + ) +{ override get message(): string { return this.reason } diff --git a/test/e2e/src/Harness/fixture-cache.service.ts b/test/e2e/src/Harness/fixture-cache.service.ts index f706ae49d..dc9bb27ec 100644 --- a/test/e2e/src/Harness/fixture-cache.service.ts +++ b/test/e2e/src/Harness/fixture-cache.service.ts @@ -5,7 +5,6 @@ import { Cache, Config, Context, - Crypto, Effect, FileSystem, Layer, @@ -17,7 +16,8 @@ import { Scope, Stream, } from 'effect' -import { Hex } from 'effect/encoding' +import * as Digest from 'effect/crypto/Digest' +import * as SecureRandom from 'effect/crypto/SecureRandom' import type { PlatformError } from 'effect/PlatformError' import { ChildProcess, ChildProcessSpawner } from 'effect/process' @@ -57,7 +57,8 @@ import * as Warm from './warm-sandbox.handle.js' export type BakePlatform = | GuestJobs | ChildProcessSpawner.ChildProcessSpawner - | Crypto.Crypto + | Digest.Digest + | SecureRandom.SecureRandom | FileSystem.FileSystem | Path.Path | Readiness.HostProber @@ -327,8 +328,8 @@ const leaseEntry = (directory: string) => Effect.gen(function*() { const fs = yield* FileSystem.FileSystem const path = yield* Path.Path - const crypto = yield* Crypto.Crypto - const id = yield* crypto.randomUUIDv4 + const secureRandom = yield* SecureRandom.SecureRandom + const id = yield* secureRandom.uuidV4() const file = path.join(directory, `${LEASE_PREFIX}${id}`) const pending = path.join(directory, `${LEASE_PENDING_PREFIX}${id}`) yield* fs.writeFileString(pending, String(Date.now())) @@ -415,7 +416,7 @@ const canonicalFile = (file: FileBytes): FileBytes => ({ bytes: canonicalBytes(file.relativePath, file.bytes), }) -const hashOf = (crypto: Crypto.Crypto, bytes: Uint8Array) => Effect.map(crypto.digest('SHA-256', bytes), Hex.encode) +const hashOf = (digest: Digest.Digest['Service'], bytes: Uint8Array) => digest.digestHex(Digest.sha256, bytes) const keysRecordOf = (fixtures: ReadonlyArray): FixtureKeys => Object.fromEntries(fixtures.map((fixture) => [fixture.fixtureId, fixture.key])) @@ -650,13 +651,13 @@ const deriveBakeKeys = ( fixtureInputs: ReadonlyArray, ): Effect.Effect => Effect.gen(function*() { - const crypto = yield* Crypto.Crypto - const packsKey = yield* hashOf(crypto, packsKeyBytes(packsInput)) + const digest = yield* Digest.Digest + const packsKey = yield* hashOf(digest, packsKeyBytes(packsInput)) const fixtures = yield* Effect.forEach( fixtureInputs, (input) => Effect.map( - hashOf(crypto, fixtureKeyBytes(input)), + hashOf(digest, fixtureKeyBytes(input)), (key): BakedFixture => ({ fixtureId: input.fixtureId, key }), ), { concurrency: UNPACK_CONCURRENCY }, @@ -689,9 +690,9 @@ const bakeMissing = ( const closure = yield* closureInstallOf(environment, packsInput, fixtureInputs) const fs = yield* FileSystem.FileSystem const path = yield* Path.Path - const crypto = yield* Crypto.Crypto + const secureRandom = yield* SecureRandom.SecureRandom const jobs = yield* GuestJobs - const stagingDir = `${root}${STAGING_MARKER}${yield* crypto.randomUUIDv4}` + const stagingDir = `${root}${STAGING_MARKER}${yield* secureRandom.uuidV4()}` yield* Effect.gen(function*() { yield* fs.remove(stagingDir, { recursive: true, force: true }) yield* fs.makeDirectory(stagingDir, { recursive: true }) diff --git a/test/e2e/src/Harness/guest-job.service.ts b/test/e2e/src/Harness/guest-job.service.ts index 8c9944a5f..1e8a63ea7 100644 --- a/test/e2e/src/Harness/guest-job.service.ts +++ b/test/e2e/src/Harness/guest-job.service.ts @@ -1,6 +1,6 @@ import type { Readiness } from '@systemfsoftware/effect-readiness' import { Context, type Effect } from 'effect' -import type * as Crypto from 'effect/Crypto' +import type * as SecureRandom from 'effect/crypto/SecureRandom' import type * as FileSystem from 'effect/FileSystem' import type { ExitFailure, GuestJobFailure, GuestSignaledFailure } from './harness-failure.schema.js' @@ -18,7 +18,7 @@ export interface GuestJobsShape { ) => Effect.Effect< void, ExitFailure | GuestJobFailure | GuestSignaledFailure, - Crypto.Crypto | FileSystem.FileSystem | Readiness.HostProber + SecureRandom.SecureRandom | FileSystem.FileSystem | Readiness.HostProber > } diff --git a/test/e2e/src/Harness/harness-layers.ts b/test/e2e/src/Harness/harness-layers.ts index 5d5cf1071..da964fd60 100644 --- a/test/e2e/src/Harness/harness-layers.ts +++ b/test/e2e/src/Harness/harness-layers.ts @@ -1,6 +1,7 @@ import { Layer } from 'effect' import type { OtlpExporter } from 'effect/observability' +import { layerDigest, layerSecureRandom } from '@effect/platform-node/NodeCrypto' import { layer as nodeServicesLayer } from '@effect/platform-node/NodeServices' import { Readiness } from '@systemfsoftware/effect-readiness' import * as TestTelemetry from '@systemfsoftware/vitest-config/telemetry' @@ -19,6 +20,8 @@ export const HarnessServicesLive = Layer.mergeAll(BakedFixtureCache.layer, stryk export const HarnessPlatformLive = Layer.mergeAll( guestJobsLayer, nodeServicesLayer, + layerSecureRandom, + layerDigest, Readiness.NodeHostProber.layer, harnessTelemetryLayer, ) diff --git a/test/e2e/src/Harness/stryker-cli-runner.service.ts b/test/e2e/src/Harness/stryker-cli-runner.service.ts index bb6880dcb..89ff64e85 100644 --- a/test/e2e/src/Harness/stryker-cli-runner.service.ts +++ b/test/e2e/src/Harness/stryker-cli-runner.service.ts @@ -1,5 +1,6 @@ -import { type Config, Context, type Crypto, type Effect } from 'effect' +import { type Config, Context, type Effect } from 'effect' import type { Scope } from 'effect' +import type * as SecureRandom from 'effect/crypto/SecureRandom' import type { ExecResult } from './guest-job.schema.js' import type { SandboxForkFailure } from './harness-failure.schema.js' @@ -21,14 +22,18 @@ export interface StrykerCliRunnerShape { warm: Warm.WarmSandbox, label: string, runEnvironment?: Readonly> | undefined, - ) => Effect.Effect + ) => Effect.Effect readonly streamRun: ( args: ReadonlyArray, warm: Warm.WarmSandbox, label: string, runEnvironment: Readonly> | undefined, interruptOnLine: (line: string, readGuestFile: Warm.GuestFileReader) => Promise, - ) => Effect.Effect + ) => Effect.Effect< + ForkedStreamedRun, + Config.ConfigError | SandboxForkFailure, + SecureRandom.SecureRandom | Scope.Scope + > } export class StrykerCliRunner extends Context.Service()( diff --git a/test/e2e/src/Harness/warm-sandbox.handle.ts b/test/e2e/src/Harness/warm-sandbox.handle.ts index 3da14a993..0b2d55c5e 100644 --- a/test/e2e/src/Harness/warm-sandbox.handle.ts +++ b/test/e2e/src/Harness/warm-sandbox.handle.ts @@ -1,7 +1,7 @@ import { Handle } from '@systemfsoftware/effect-cell-types' import { MicroVM } from '@systemfsoftware/effect-microsandbox' import { Boolean, Effect } from 'effect' -import * as Crypto from 'effect/Crypto' +import * as SecureRandom from 'effect/crypto/SecureRandom' import type * as Scope from 'effect/Scope' import { NetworkPolicy, Sandbox, Snapshot } from 'microsandbox' import type { ExecHandle } from 'microsandbox' @@ -62,8 +62,8 @@ const populateScript = const uniqueName = (label: string) => Effect.flatMap( - Crypto.Crypto, - (crypto) => Effect.map(Effect.orDie(crypto.randomUUIDv4), (uuid) => `${label}-${uuid.slice(0, NAME_SUFFIX_CHARS)}`), + SecureRandom.SecureRandom, + (crypto) => Effect.map(Effect.orDie(crypto.uuidV4()), (uuid) => `${label}-${uuid.slice(0, NAME_SUFFIX_CHARS)}`), ) const bootAndCapture = (bakedFixtureDir: string, fixtureId: string, snapshotName: string) => @@ -131,7 +131,7 @@ const teardown = (sandbox: Sandbox) => export const fork = ( warm: WarmSandbox, label: string, -): Effect.Effect => +): Effect.Effect => Effect.gen(function*() { const name = yield* uniqueName(label) return yield* Effect.acquireRelease( From e3973b5103f933c5090c326307ebf44b9d5501be Mon Sep 17 00:00:00 2001 From: systemfsoftware-bot Date: Thu, 29 Oct 2026 17:27:58 -0400 Subject: [PATCH 2/4] build(deps): move the run stream to 9.0 for effect 4.1.0's integer bounds effect 4.1.0 writes the safe-integer range onto integer fields in the generated stream schema. The contract version law counts that as a breaking stream change, so the stream version moves to 9.0 and cli-contract takes a major changeset. Claude-Session: https://claude.ai/code/session_017rX35xUAHEjVVaDKVVzubW --- .changeset/cli-contract-safe-integer-bounds.md | 7 +++++++ .changeset/effect-4-1-crypto-migration.md | 1 - packages/stryker-js-cli-contract/README.md | 2 +- .../contract/stream.schema.json | 12 ++++++------ .../src/stream-version.schema.ts | 2 +- .../tests/run-event-wire-line.integration.test.ts | 6 +++--- .../tests/framework-stream.integration.test.ts | 2 +- .../tests/progress-stream-file.integration.test.ts | 2 +- .../tests/run-event-stream.integration.test.ts | 8 ++++---- .../stryker-js/tests/shard-merge.integration.test.ts | 2 +- test/e2e/tests/failing-run.e2e.test.ts | 2 +- 11 files changed, 26 insertions(+), 20 deletions(-) create mode 100644 .changeset/cli-contract-safe-integer-bounds.md diff --git a/.changeset/cli-contract-safe-integer-bounds.md b/.changeset/cli-contract-safe-integer-bounds.md new file mode 100644 index 000000000..5f0edb232 --- /dev/null +++ b/.changeset/cli-contract-safe-integer-bounds.md @@ -0,0 +1,7 @@ +--- +"@systemfsoftware/stryker-js-cli-contract": major +--- + +Regenerate the stream schema on effect 4.1.0, which writes the safe-integer range onto every integer and non-negative integer field (`minimum` 0 and `maximum` 9007199254740991, or both bounds for signed integers). A consumer that validates a stream line against the published document now refuses an integer beyond 2^53 - 1, which the previous document admitted. + +The run stream moves to schema version 9.0, because the contract version law counts the narrower integer fields as a breaking stream change. diff --git a/.changeset/effect-4-1-crypto-migration.md b/.changeset/effect-4-1-crypto-migration.md index 8c9d5f1f6..a3cc8912e 100644 --- a/.changeset/effect-4-1-crypto-migration.md +++ b/.changeset/effect-4-1-crypto-migration.md @@ -5,7 +5,6 @@ "@systemfsoftware/stryker-js-instrumenter": patch "@systemfsoftware/stryker-js-plugin-interface": patch "@systemfsoftware/stryker-js-plugin-runtime": patch -"@systemfsoftware/stryker-js-cli-contract": patch "@systemfsoftware/stryker-js-html-reporter": patch --- diff --git a/packages/stryker-js-cli-contract/README.md b/packages/stryker-js-cli-contract/README.md index 21a072b24..4a4e769ef 100644 --- a/packages/stryker-js-cli-contract/README.md +++ b/packages/stryker-js-cli-contract/README.md @@ -16,7 +16,7 @@ pnpm add @systemfsoftware/stryker-js-cli-contract The package groups its exports into namespaces. `RunEvent` holds the machine stream: the `RunEvent` union of every event kind the CLI emits, each event's -class, two newline-delimited JSON codecs, and `StreamSchemaVersion` (`8.0`, the +class, two newline-delimited JSON codecs, and `StreamSchemaVersion` (`9.0`, the version the stream declares). `RunEventWireLine` reads one line. `RunEventWireText` reads a whole stdout: it skips blank and whitespace-only lines, and it refuses the first other line that is not an event, at that line's 0-based position. diff --git a/packages/stryker-js-cli-contract/contract/stream.schema.json b/packages/stryker-js-cli-contract/contract/stream.schema.json index a0281d31f..b8f9a8e0f 100644 --- a/packages/stryker-js-cli-contract/contract/stream.schema.json +++ b/packages/stryker-js-cli-contract/contract/stream.schema.json @@ -66,7 +66,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "runId": { @@ -390,7 +390,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "role": { @@ -1219,7 +1219,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "runId": { @@ -1625,7 +1625,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "code": { @@ -1766,7 +1766,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "code": { @@ -1803,7 +1803,7 @@ "schemaVersion": { "type": "string", "enum": [ - "8.0" + "9.0" ] }, "rule": { diff --git a/packages/stryker-js-cli-contract/src/stream-version.schema.ts b/packages/stryker-js-cli-contract/src/stream-version.schema.ts index 6d9c3b865..26eb0f162 100644 --- a/packages/stryker-js-cli-contract/src/stream-version.schema.ts +++ b/packages/stryker-js-cli-contract/src/stream-version.schema.ts @@ -1,4 +1,4 @@ import * as S from 'effect/Schema' -export const StreamSchemaVersion = S.Literal('8.0') +export const StreamSchemaVersion = S.Literal('9.0') export type StreamSchemaVersion = typeof StreamSchemaVersion.Type diff --git a/packages/stryker-js-cli-contract/tests/run-event-wire-line.integration.test.ts b/packages/stryker-js-cli-contract/tests/run-event-wire-line.integration.test.ts index c9eb67777..fed58f84e 100644 --- a/packages/stryker-js-cli-contract/tests/run-event-wire-line.integration.test.ts +++ b/packages/stryker-js-cli-contract/tests/run-event-wire-line.integration.test.ts @@ -13,7 +13,7 @@ const LOCATION = '"location":{"start":{"line":1,"column":1},"end":{"line":1,"col const COST = '{"fixedOverheadMs":1,"testBodyMs":2,"testsExecuted":1,"shared":false}' -const WORKER = '{"_tag":"worker","schemaVersion":"8.0","role":"testRunner","index":0,"startupMs":12.5}' +const WORKER = '{"_tag":"worker","schemaVersion":"9.0","role":"testRunner","index":0,"startupMs":12.5}' const READS_NOWHERE = '"subsumption":null' @@ -67,7 +67,7 @@ const COUNTS = const PHASES = '"prepare":1,"instrument":2,"dry-run":3,"mutation-test":4' const verdictLine = (phaseDurations: string): string => - `{"_tag":"verdict","schemaVersion":"8.0","runId":"01ARZ3NDEKTSV4RRFFQ69G5FAV","mode":"machine","signal":"flag","score":100,"thresholds":{"high":80,"low":60,"break":null},"reportFile":null,"counts":${COUNTS},"mutants":[],"scope":"full","mutantSetPolicy":"default","phaseDurations":${phaseDurations},"static":null,"budget":{"predictedSeconds":0,"actualSeconds":1}}` + `{"_tag":"verdict","schemaVersion":"9.0","runId":"01ARZ3NDEKTSV4RRFFQ69G5FAV","mode":"machine","signal":"flag","score":100,"thresholds":{"high":80,"low":60,"break":null},"reportFile":null,"counts":${COUNTS},"mutants":[],"scope":"full","mutantSetPolicy":"default","phaseDurations":${phaseDurations},"static":null,"budget":{"predictedSeconds":0,"actualSeconds":1}}` const durationOf = (line: string, phase: 'check' | 'reporting'): string => Result.match(S.decodeResult(RunEvent.RunEventWireLine)(line), { @@ -305,7 +305,7 @@ Feature('The machine-stream wire codec refuses lines the contract does not decla () => Effect.sync(() => ({ declared: WORKER, - undeclared: '{"_tag":"worker","schemaVersion":"8.0","role":"testRunner","index":0}', + undeclared: '{"_tag":"worker","schemaVersion":"9.0","role":"testRunner","index":0}', })), ), When('each line is decoded through the wire codec')( diff --git a/packages/stryker-js/tests/framework-stream.integration.test.ts b/packages/stryker-js/tests/framework-stream.integration.test.ts index 737cedc31..b73e9d903 100644 --- a/packages/stryker-js/tests/framework-stream.integration.test.ts +++ b/packages/stryker-js/tests/framework-stream.integration.test.ts @@ -43,7 +43,7 @@ const skippedReport = RunEvent.SkippedReported.make({ }) const refusal = RunEvent.RunFailed.make({ - schemaVersion: '8.0', + schemaVersion: '9.0', code: 2, error: `Failed to load plugin "${frameworkModule}" (PeerMissing)`, remediation: 'install the peer dependency the plugin needs', diff --git a/packages/stryker-js/tests/progress-stream-file.integration.test.ts b/packages/stryker-js/tests/progress-stream-file.integration.test.ts index 7fcc857fb..82fcf0432 100644 --- a/packages/stryker-js/tests/progress-stream-file.integration.test.ts +++ b/packages/stryker-js/tests/progress-stream-file.integration.test.ts @@ -75,7 +75,7 @@ const OVERSIZED_STREAM_RECORD = `${ JSON.stringify({ _tag: 'stream', schemaVersion: '9.0', runId: 'r', note: 'x'.repeat(1_100_000) }) }\n` -const TORN_RECORD = '{"_tag":"verdict","schemaVersion":"8.0","runId":"06GK' +const TORN_RECORD = '{"_tag":"verdict","schemaVersion":"9.0","runId":"06GK' const LINK_TARGET = 'linked-stream.jsonl' diff --git a/packages/stryker-js/tests/run-event-stream.integration.test.ts b/packages/stryker-js/tests/run-event-stream.integration.test.ts index 734e30279..2b3f82f45 100644 --- a/packages/stryker-js/tests/run-event-stream.integration.test.ts +++ b/packages/stryker-js/tests/run-event-stream.integration.test.ts @@ -20,9 +20,9 @@ const Feature = makeFeature({ it }) const PLAN_KNOWN = CliContract.PlanKnown.make({ total: 4, shardPlan: null }) const PHASE_ENTERED = CliContract.PhaseEntered.make({ phase: 'dry-run', elapsedMs: 1 }) const HEARTBEAT = CliContract.Heartbeat.make({ elapsedMs: 2, completed: 1, total: 4 }) -const HELP_RENDERED = CliContract.HelpRendered.make({ schemaVersion: '8.0', code: 0, help: 'usage' }) +const HELP_RENDERED = CliContract.HelpRendered.make({ schemaVersion: '9.0', code: 0, help: 'usage' }) const RUN_FAILED = CliContract.RunFailed.make({ - schemaVersion: '8.0', + schemaVersion: '9.0', code: 3, error: 'x', remediation: 'y', @@ -264,7 +264,7 @@ Feature('Streaming a run to machine readers') tags: ['stream', 'plan', 'phase', 'tick', 'help'], newlineTerminated: true, stderr: [], - opening: { mode: 'machine', signal: 'tty', schemaVersion: '8.0', runIdIsNonEmpty: true }, + opening: { mode: 'machine', signal: 'tty', schemaVersion: '9.0', runIdIsNonEmpty: true }, }) }), ), @@ -390,7 +390,7 @@ Feature('Streaming a run to machine readers') open: s.result.open, }).toEqual({ tags: ['stream', 'error'], - failure: { code: 3, error: 'x', remediation: 'y', schemaVersion: '8.0' }, + failure: { code: 3, error: 'x', remediation: 'y', schemaVersion: '9.0' }, open: false, }) }), diff --git a/packages/stryker-js/tests/shard-merge.integration.test.ts b/packages/stryker-js/tests/shard-merge.integration.test.ts index 9df3ca30d..0594d5b75 100644 --- a/packages/stryker-js/tests/shard-merge.integration.test.ts +++ b/packages/stryker-js/tests/shard-merge.integration.test.ts @@ -524,7 +524,7 @@ Feature('Sharded runs merge to the unsharded statuses', { timeout: 180_000 }) expect({ exitCode: s.outcome.exitCode === 0 ? 0 : 1, namesWrittenVersion: s.outcome.output.includes('6.0'), - namesExpectedVersion: s.outcome.output.includes('8.0'), + namesExpectedVersion: s.outcome.output.includes('9.0'), }).toEqual({ exitCode: 1, namesWrittenVersion: true, namesExpectedVersion: true }) ), ), diff --git a/test/e2e/tests/failing-run.e2e.test.ts b/test/e2e/tests/failing-run.e2e.test.ts index 7ec511f03..723cbb44a 100644 --- a/test/e2e/tests/failing-run.e2e.test.ts +++ b/test/e2e/tests/failing-run.e2e.test.ts @@ -36,7 +36,7 @@ const verifyTypedErrorDocument = ( carriesVerdict: tags.includes('verdict'), }).toStrictEqual({ terminalTag: 'error', - schemaVersion: '8.0', + schemaVersion: '9.0', code: FAILING_DRY_RUN_RUNTIME_ERROR_CODE, errorIsString: true, remediationHasContent: true, From afcfc53e7ea6717671fe57dfd267e3f4b67c566a Mon Sep 17 00:00:00 2001 From: systemfsoftware-bot Date: Thu, 29 Oct 2026 17:35:23 -0400 Subject: [PATCH 3/4] build(lint): allow the unstable effect modules per package, not by turning the rule off Revert the oxlint override entries that switched effecttsgo/unstable-api-usage off and list the unstable modules each package imports in the tsgo plugin's allowedUnstableApis. Claude-Session: https://claude.ai/code/session_017rX35xUAHEjVVaDKVVzubW --- .../stryker-js-cli-contract/oxlint.config.ts | 1 - .../stryker-js-cli-contract/tsconfig.app.json | 11 ++++- .../tsconfig.test.json | 11 ++++- .../stryker-js-html-reporter/oxlint.config.ts | 1 - .../tsconfig.app.json | 8 +++- .../tsconfig.test.json | 8 +++- .../stryker-js-instrumenter/oxlint.config.ts | 1 - .../stryker-js-instrumenter/tsconfig.app.json | 8 +++- .../tsconfig.resources.json | 6 +++ .../tsconfig.test.json | 8 +++- .../oxlint.config.ts | 1 - .../tsconfig.app.json | 12 ++++- .../tsconfig.test.json | 12 ++++- .../oxlint.config.ts | 1 - .../tsconfig.app.json | 16 ++++++- .../oxlint.config.ts | 1 - .../tsconfig.app.json | 15 ++++++- .../tsconfig.test.json | 15 ++++++- .../stryker-js-vitest-runner/oxlint.config.ts | 1 - .../tsconfig.app.json | 13 +++++- .../tsconfig.test.json | 13 +++++- packages/stryker-js/oxlint.config.ts | 1 - packages/stryker-js/tsconfig.app.json | 45 ++++++++++++++++++- packages/stryker-js/tsconfig.test.json | 45 ++++++++++++++++++- .../toolchain/tsdown-config/tsconfig.app.json | 13 ++++-- .../tsdown-config/tsconfig.test.json | 13 ++++-- .../toolchain/vitest-config/tsconfig.app.json | 16 +++++-- .../vitest-config/tsconfig.test.json | 27 ++++++++--- test/bench/tsconfig.app.json | 14 +++++- test/bench/tsconfig.test.json | 14 +++++- test/checker-parity/oxlint.config.ts | 1 - test/checker-parity/tsconfig.app.json | 29 +++++++++++- test/checker-parity/tsconfig.test.json | 29 +++++++++++- test/e2e-core/oxlint.config.ts | 1 - test/e2e-core/tsconfig.app.json | 12 ++++- test/e2e-core/tsconfig.test.json | 12 ++++- 36 files changed, 390 insertions(+), 45 deletions(-) diff --git a/packages/stryker-js-cli-contract/oxlint.config.ts b/packages/stryker-js-cli-contract/oxlint.config.ts index 3b5a7d6c3..de5f70fe4 100644 --- a/packages/stryker-js-cli-contract/oxlint.config.ts +++ b/packages/stryker-js-cli-contract/oxlint.config.ts @@ -12,7 +12,6 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/src/generated/**', diff --git a/packages/stryker-js-cli-contract/tsconfig.app.json b/packages/stryker-js-cli-contract/tsconfig.app.json index 30786cc59..d845e2b19 100644 --- a/packages/stryker-js-cli-contract/tsconfig.app.json +++ b/packages/stryker-js-cli-contract/tsconfig.app.json @@ -25,7 +25,16 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/packages/stryker-js-cli-contract/tsconfig.test.json b/packages/stryker-js-cli-contract/tsconfig.test.json index 289e823ad..774b02558 100644 --- a/packages/stryker-js-cli-contract/tsconfig.test.json +++ b/packages/stryker-js-cli-contract/tsconfig.test.json @@ -26,7 +26,16 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/packages/stryker-js-html-reporter/oxlint.config.ts b/packages/stryker-js-html-reporter/oxlint.config.ts index 12065c58f..8e66774f5 100644 --- a/packages/stryker-js-html-reporter/oxlint.config.ts +++ b/packages/stryker-js-html-reporter/oxlint.config.ts @@ -3,7 +3,6 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'typescript/no-unnecessary-condition': 'error', 'typescript/strict-boolean-expressions': 'error', diff --git a/packages/stryker-js-html-reporter/tsconfig.app.json b/packages/stryker-js-html-reporter/tsconfig.app.json index de21eec50..f24d69d6c 100644 --- a/packages/stryker-js-html-reporter/tsconfig.app.json +++ b/packages/stryker-js-html-reporter/tsconfig.app.json @@ -19,7 +19,13 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path" + ] } ] }, diff --git a/packages/stryker-js-html-reporter/tsconfig.test.json b/packages/stryker-js-html-reporter/tsconfig.test.json index b0101a39f..680dfcef1 100644 --- a/packages/stryker-js-html-reporter/tsconfig.test.json +++ b/packages/stryker-js-html-reporter/tsconfig.test.json @@ -20,7 +20,13 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path" + ] } ] }, diff --git a/packages/stryker-js-instrumenter/oxlint.config.ts b/packages/stryker-js-instrumenter/oxlint.config.ts index e3fbb1089..1192cd184 100644 --- a/packages/stryker-js-instrumenter/oxlint.config.ts +++ b/packages/stryker-js-instrumenter/oxlint.config.ts @@ -13,6 +13,5 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [...(recommended.ignorePatterns ?? []), '**/testResources/**'], }) diff --git a/packages/stryker-js-instrumenter/tsconfig.app.json b/packages/stryker-js-instrumenter/tsconfig.app.json index af7cd4bfe..f536b88e4 100644 --- a/packages/stryker-js-instrumenter/tsconfig.app.json +++ b/packages/stryker-js-instrumenter/tsconfig.app.json @@ -18,7 +18,13 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node/NodeFileSystem", + "effect/Arbitrary", + "effect/FileSystem", + "effect/PlatformError" + ] } ] }, diff --git a/packages/stryker-js-instrumenter/tsconfig.resources.json b/packages/stryker-js-instrumenter/tsconfig.resources.json index fc692b680..daaab05d2 100644 --- a/packages/stryker-js-instrumenter/tsconfig.resources.json +++ b/packages/stryker-js-instrumenter/tsconfig.resources.json @@ -132,6 +132,12 @@ } } } + ], + "allowedUnstableApis": [ + "@effect/platform-node/NodeFileSystem", + "effect/Arbitrary", + "effect/FileSystem", + "effect/PlatformError" ] } ] diff --git a/packages/stryker-js-instrumenter/tsconfig.test.json b/packages/stryker-js-instrumenter/tsconfig.test.json index e2cf02c97..99a53ca1c 100644 --- a/packages/stryker-js-instrumenter/tsconfig.test.json +++ b/packages/stryker-js-instrumenter/tsconfig.test.json @@ -18,7 +18,13 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node/NodeFileSystem", + "effect/Arbitrary", + "effect/FileSystem", + "effect/PlatformError" + ] } ] }, diff --git a/packages/stryker-js-plugin-interface/oxlint.config.ts b/packages/stryker-js-plugin-interface/oxlint.config.ts index 3b5a7d6c3..de5f70fe4 100644 --- a/packages/stryker-js-plugin-interface/oxlint.config.ts +++ b/packages/stryker-js-plugin-interface/oxlint.config.ts @@ -12,7 +12,6 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/src/generated/**', diff --git a/packages/stryker-js-plugin-interface/tsconfig.app.json b/packages/stryker-js-plugin-interface/tsconfig.app.json index 30786cc59..9fb4c2e56 100644 --- a/packages/stryker-js-plugin-interface/tsconfig.app.json +++ b/packages/stryker-js-plugin-interface/tsconfig.app.json @@ -25,7 +25,17 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path", + "effect/rpc/Rpc", + "effect/rpc/RpcGroup", + "effect/rpc/RpcMiddleware", + "effect/rpc/RpcSchema" + ] } ] }, diff --git a/packages/stryker-js-plugin-interface/tsconfig.test.json b/packages/stryker-js-plugin-interface/tsconfig.test.json index 85d74791a..0bdcdb311 100644 --- a/packages/stryker-js-plugin-interface/tsconfig.test.json +++ b/packages/stryker-js-plugin-interface/tsconfig.test.json @@ -26,7 +26,17 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeFileSystem", + "@effect/platform-node-shared/NodePath", + "effect/FileSystem", + "effect/Path", + "effect/rpc/Rpc", + "effect/rpc/RpcGroup", + "effect/rpc/RpcMiddleware", + "effect/rpc/RpcSchema" + ] } ] }, diff --git a/packages/stryker-js-plugin-runtime/oxlint.config.ts b/packages/stryker-js-plugin-runtime/oxlint.config.ts index 6ec6f90fa..e0f324fee 100644 --- a/packages/stryker-js-plugin-runtime/oxlint.config.ts +++ b/packages/stryker-js-plugin-runtime/oxlint.config.ts @@ -3,7 +3,6 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'effecttsgo/unstable-api-usage': 'off', diff --git a/packages/stryker-js-plugin-runtime/tsconfig.app.json b/packages/stryker-js-plugin-runtime/tsconfig.app.json index 3b494d467..05c600fa4 100644 --- a/packages/stryker-js-plugin-runtime/tsconfig.app.json +++ b/packages/stryker-js-plugin-runtime/tsconfig.app.json @@ -25,7 +25,21 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "effect/FileSystem", + "effect/Path", + "effect/PlatformError", + "effect/http/Headers", + "effect/net/NetAddress", + "effect/rpc/Rpc", + "effect/rpc/RpcGroup", + "effect/rpc/RpcMessage", + "effect/rpc/RpcMiddleware", + "effect/rpc/RpcSerialization", + "effect/rpc/RpcServer", + "effect/socket/SocketServer" + ] } ] }, diff --git a/packages/stryker-js-typescript-checker/oxlint.config.ts b/packages/stryker-js-typescript-checker/oxlint.config.ts index 64cf440e5..abbab414f 100644 --- a/packages/stryker-js-typescript-checker/oxlint.config.ts +++ b/packages/stryker-js-typescript-checker/oxlint.config.ts @@ -3,7 +3,6 @@ import { defineConfig } from 'oxlint' export default defineConfig({ extends: [recommended], - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], rules: { 'effecttsgo/unstable-api-usage': 'off', 'typescript/no-unnecessary-condition': 'error', diff --git a/packages/stryker-js-typescript-checker/tsconfig.app.json b/packages/stryker-js-typescript-checker/tsconfig.app.json index af7cd4bfe..ba167d5ae 100644 --- a/packages/stryker-js-typescript-checker/tsconfig.app.json +++ b/packages/stryker-js-typescript-checker/tsconfig.app.json @@ -18,7 +18,20 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/packages/stryker-js-typescript-checker/tsconfig.test.json b/packages/stryker-js-typescript-checker/tsconfig.test.json index b19376959..dfefd55d4 100644 --- a/packages/stryker-js-typescript-checker/tsconfig.test.json +++ b/packages/stryker-js-typescript-checker/tsconfig.test.json @@ -18,7 +18,20 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/packages/stryker-js-vitest-runner/oxlint.config.ts b/packages/stryker-js-vitest-runner/oxlint.config.ts index 0aa3c0891..4634d8db6 100644 --- a/packages/stryker-js-vitest-runner/oxlint.config.ts +++ b/packages/stryker-js-vitest-runner/oxlint.config.ts @@ -13,7 +13,6 @@ export default defineConfig({ 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, overrides: [ - { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: [userProjectSetupFile], rules: { diff --git a/packages/stryker-js-vitest-runner/tsconfig.app.json b/packages/stryker-js-vitest-runner/tsconfig.app.json index 7f7320311..349d9a727 100644 --- a/packages/stryker-js-vitest-runner/tsconfig.app.json +++ b/packages/stryker-js-vitest-runner/tsconfig.app.json @@ -22,7 +22,18 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "effect/FileSystem", + "effect/Path", + "effect/crypto/SecureRandom" + ] } ] }, diff --git a/packages/stryker-js-vitest-runner/tsconfig.test.json b/packages/stryker-js-vitest-runner/tsconfig.test.json index 28d19f4d9..057206a66 100644 --- a/packages/stryker-js-vitest-runner/tsconfig.test.json +++ b/packages/stryker-js-vitest-runner/tsconfig.test.json @@ -22,7 +22,18 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "effect/FileSystem", + "effect/Path", + "effect/crypto/SecureRandom" + ] } ] }, diff --git a/packages/stryker-js/oxlint.config.ts b/packages/stryker-js/oxlint.config.ts index bf52b1e18..9afc397f8 100644 --- a/packages/stryker-js/oxlint.config.ts +++ b/packages/stryker-js/oxlint.config.ts @@ -10,7 +10,6 @@ export default defineConfig({ 'typescript/no-non-null-assertion': 'error', 'no-restricted-globals': ['error', { name: 'process', message: 'use @effect/platform instead' }], }, - overrides: [{ files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }], ignorePatterns: [ ...(recommended.ignorePatterns ?? []), '**/testResources/**', diff --git a/packages/stryker-js/tsconfig.app.json b/packages/stryker-js/tsconfig.app.json index 40b1cb0f4..61a480913 100644 --- a/packages/stryker-js/tsconfig.app.json +++ b/packages/stryker-js/tsconfig.app.json @@ -19,7 +19,50 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/opentelemetry/OtelTracer", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node-shared/NodeSocket", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "@effect/platform-node/NodeStdio", + "@effect/platform-node/NodeTerminal", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/PlatformError", + "effect/Stdio", + "effect/ai/McpProtocol", + "effect/ai/McpServer", + "effect/ai/Tool", + "effect/ai/Toolkit", + "effect/cli/Argument", + "effect/cli/CliConfig", + "effect/cli/CliError", + "effect/cli/Command", + "effect/cli/Flag", + "effect/cli/GlobalFlag", + "effect/crypto/SecureRandom", + "effect/http/Headers", + "effect/net/NetAddress", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner", + "effect/rpc/Rpc", + "effect/rpc/RpcClient", + "effect/rpc/RpcClientError", + "effect/rpc/RpcGroup", + "effect/rpc/RpcMessage", + "effect/rpc/RpcSerialization", + "effect/rpc/RpcServer", + "effect/socket/Socket", + "effect/socket/SocketServer" + ] } ] }, diff --git a/packages/stryker-js/tsconfig.test.json b/packages/stryker-js/tsconfig.test.json index b0101a39f..b773dccfa 100644 --- a/packages/stryker-js/tsconfig.test.json +++ b/packages/stryker-js/tsconfig.test.json @@ -20,7 +20,50 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/opentelemetry/OtelTracer", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node-shared/NodeSocket", + "@effect/platform-node-shared/NodeSocketServer", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "@effect/platform-node/NodeStdio", + "@effect/platform-node/NodeTerminal", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/PlatformError", + "effect/Stdio", + "effect/ai/McpProtocol", + "effect/ai/McpServer", + "effect/ai/Tool", + "effect/ai/Toolkit", + "effect/cli/Argument", + "effect/cli/CliConfig", + "effect/cli/CliError", + "effect/cli/Command", + "effect/cli/Flag", + "effect/cli/GlobalFlag", + "effect/crypto/SecureRandom", + "effect/http/Headers", + "effect/net/NetAddress", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner", + "effect/rpc/Rpc", + "effect/rpc/RpcClient", + "effect/rpc/RpcClientError", + "effect/rpc/RpcGroup", + "effect/rpc/RpcMessage", + "effect/rpc/RpcSerialization", + "effect/rpc/RpcServer", + "effect/socket/Socket", + "effect/socket/SocketServer" + ] } ] }, diff --git a/packages/toolchain/tsdown-config/tsconfig.app.json b/packages/toolchain/tsdown-config/tsconfig.app.json index 3f9c97582..3cf164758 100644 --- a/packages/toolchain/tsdown-config/tsconfig.app.json +++ b/packages/toolchain/tsdown-config/tsconfig.app.json @@ -1,6 +1,8 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["@systemfsoftware/tsconfig/tsc/dom/library-monorepo"], + "extends": [ + "@systemfsoftware/tsconfig/tsc/dom/library-monorepo" + ], "compilerOptions": { "composite": true, "noEmit": false, @@ -11,9 +13,14 @@ "checkJs": true, "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "effect/Arbitrary" + ] } ] }, - "include": ["lib"] + "include": [ + "lib" + ] } diff --git a/packages/toolchain/tsdown-config/tsconfig.test.json b/packages/toolchain/tsdown-config/tsconfig.test.json index 47fa03623..7a8e99b79 100644 --- a/packages/toolchain/tsdown-config/tsconfig.test.json +++ b/packages/toolchain/tsdown-config/tsconfig.test.json @@ -1,6 +1,8 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["@systemfsoftware/tsconfig/tsc/dom/library-monorepo"], + "extends": [ + "@systemfsoftware/tsconfig/tsc/dom/library-monorepo" + ], "compilerOptions": { "composite": true, "noEmit": false, @@ -9,11 +11,16 @@ "outDir": "node_modules/.cache/tsc/test", "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "effect/Arbitrary" + ] } ] }, - "include": ["tests"], + "include": [ + "tests" + ], "references": [ { "path": "./tsconfig.app.json" diff --git a/packages/toolchain/vitest-config/tsconfig.app.json b/packages/toolchain/vitest-config/tsconfig.app.json index 3f9c97582..b9d1211d3 100644 --- a/packages/toolchain/vitest-config/tsconfig.app.json +++ b/packages/toolchain/vitest-config/tsconfig.app.json @@ -1,6 +1,8 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["@systemfsoftware/tsconfig/tsc/dom/library-monorepo"], + "extends": [ + "@systemfsoftware/tsconfig/tsc/dom/library-monorepo" + ], "compilerOptions": { "composite": true, "noEmit": false, @@ -11,9 +13,17 @@ "checkJs": true, "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "effect/http/FetchHttpClient", + "effect/observability/OtlpExporter", + "effect/observability/OtlpSerialization", + "effect/observability/OtlpTracer" + ] } ] }, - "include": ["lib"] + "include": [ + "lib" + ] } diff --git a/packages/toolchain/vitest-config/tsconfig.test.json b/packages/toolchain/vitest-config/tsconfig.test.json index 5a3a77d3f..1f8ed7b55 100644 --- a/packages/toolchain/vitest-config/tsconfig.test.json +++ b/packages/toolchain/vitest-config/tsconfig.test.json @@ -1,19 +1,36 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["@systemfsoftware/tsconfig/tsc/dom/library-monorepo"], + "extends": [ + "@systemfsoftware/tsconfig/tsc/dom/library-monorepo" + ], "compilerOptions": { "composite": true, "noEmit": false, "emitDeclarationOnly": true, "tsBuildInfoFile": "node_modules/.cache/tsconfig.test.tsbuildinfo", "outDir": "node_modules/.cache/tsc/test", - "types": ["node", "vitest/importMeta"], + "types": [ + "node", + "vitest/importMeta" + ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "effect/http/FetchHttpClient", + "effect/observability/OtlpExporter", + "effect/observability/OtlpSerialization", + "effect/observability/OtlpTracer" + ] } ] }, - "include": ["tests"], - "references": [{ "path": "./tsconfig.app.json" }] + "include": [ + "tests" + ], + "references": [ + { + "path": "./tsconfig.app.json" + } + ] } diff --git a/test/bench/tsconfig.app.json b/test/bench/tsconfig.app.json index 3b494d467..967dfe061 100644 --- a/test/bench/tsconfig.app.json +++ b/test/bench/tsconfig.app.json @@ -25,7 +25,19 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/PlatformError", + "effect/crypto/Digest", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/test/bench/tsconfig.test.json b/test/bench/tsconfig.test.json index 1a1de461c..eb83a6499 100644 --- a/test/bench/tsconfig.test.json +++ b/test/bench/tsconfig.test.json @@ -26,7 +26,19 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeCrypto", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/PlatformError", + "effect/crypto/Digest", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/test/checker-parity/oxlint.config.ts b/test/checker-parity/oxlint.config.ts index c23aebee6..b7c141479 100644 --- a/test/checker-parity/oxlint.config.ts +++ b/test/checker-parity/oxlint.config.ts @@ -33,7 +33,6 @@ export default defineConfig({ }, overrides: [ - { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: pureCore, rules: { diff --git a/test/checker-parity/tsconfig.app.json b/test/checker-parity/tsconfig.app.json index 09746635d..cb0171381 100644 --- a/test/checker-parity/tsconfig.app.json +++ b/test/checker-parity/tsconfig.app.json @@ -21,7 +21,34 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodeHttpServer", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/Stdio", + "effect/Terminal", + "effect/cli/Argument", + "effect/cli/CliError", + "effect/cli/Command", + "effect/cli/Flag", + "effect/http/HttpServer", + "effect/http/HttpServerRequest", + "effect/http/HttpServerResponse", + "effect/net/NetAddress", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner", + "effect/rpc/RpcClient", + "effect/rpc/RpcClientError", + "effect/rpc/RpcGroup" + ] } ] }, diff --git a/test/checker-parity/tsconfig.test.json b/test/checker-parity/tsconfig.test.json index 308f06e47..1430d1a30 100644 --- a/test/checker-parity/tsconfig.test.json +++ b/test/checker-parity/tsconfig.test.json @@ -22,7 +22,34 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/opentelemetry/NodeSdk", + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodeHttpServer", + "@effect/platform-node/NodePath", + "@effect/platform-node/NodeRuntime", + "@effect/platform-node/NodeServices", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/Stdio", + "effect/Terminal", + "effect/cli/Argument", + "effect/cli/CliError", + "effect/cli/Command", + "effect/cli/Flag", + "effect/http/HttpServer", + "effect/http/HttpServerRequest", + "effect/http/HttpServerResponse", + "effect/net/NetAddress", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner", + "effect/rpc/RpcClient", + "effect/rpc/RpcClientError", + "effect/rpc/RpcGroup" + ] } ] }, diff --git a/test/e2e-core/oxlint.config.ts b/test/e2e-core/oxlint.config.ts index 6d1307887..5bd98d239 100644 --- a/test/e2e-core/oxlint.config.ts +++ b/test/e2e-core/oxlint.config.ts @@ -26,7 +26,6 @@ export default defineConfig({ }, overrides: [ - { files: ['**/*.ts'], rules: { 'effecttsgo/unstable-api-usage': 'off' } }, { files: ['src/**'], rules: { diff --git a/test/e2e-core/tsconfig.app.json b/test/e2e-core/tsconfig.app.json index 30786cc59..429e83b8c 100644 --- a/test/e2e-core/tsconfig.app.json +++ b/test/e2e-core/tsconfig.app.json @@ -25,7 +25,17 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, diff --git a/test/e2e-core/tsconfig.test.json b/test/e2e-core/tsconfig.test.json index 11215c7ec..dfa3785cd 100644 --- a/test/e2e-core/tsconfig.test.json +++ b/test/e2e-core/tsconfig.test.json @@ -26,7 +26,17 @@ ], "plugins": [ { - "name": "@effect/language-service" + "name": "@effect/language-service", + "allowedUnstableApis": [ + "@effect/platform-node-shared/NodeChildProcessSpawner", + "@effect/platform-node/NodeFileSystem", + "@effect/platform-node/NodePath", + "effect/Arbitrary", + "effect/FileSystem", + "effect/Path", + "effect/process/ChildProcess", + "effect/process/ChildProcessSpawner" + ] } ] }, From f4f8472fdc46a6f50dc9851ad81c3ea3948ce35f Mon Sep 17 00:00:00 2001 From: systemfsoftware-bot Date: Thu, 29 Oct 2026 17:38:32 -0400 Subject: [PATCH 4/4] build(deps): record the dev-toolchain-only packages as no-release intents Claude-Session: https://claude.ai/code/session_017rX35xUAHEjVVaDKVVzubW --- .changeset/effect-4-1-dev-toolchain.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .changeset/effect-4-1-dev-toolchain.md diff --git a/.changeset/effect-4-1-dev-toolchain.md b/.changeset/effect-4-1-dev-toolchain.md new file mode 100644 index 000000000..93a616f88 --- /dev/null +++ b/.changeset/effect-4-1-dev-toolchain.md @@ -0,0 +1,13 @@ +--- +"@systemfsoftware/oxlint-ignorer-config": none +"@systemfsoftware/stryker-framework-interface": none +"@systemfsoftware/stryker-ignorer-angular": none +"@systemfsoftware/stryker-ignorer-effect-schema-declarations": none +"@systemfsoftware/stryker-ignorer-in-source-vitest-block": none +"@systemfsoftware/stryker-ignorer-interface": none +"@systemfsoftware/stryker-ignorer-kit": none +"@systemfsoftware/stryker-js-angular": none +"@systemfsoftware/stryker-js-svelte": none +--- + +Build and lint with effect 4.1.0 and @effect/tsgo 0.63.0; the published code is unchanged.