@systemfsoftware/stryker-js 22.0.0 → 23.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @systemfsoftware/stryker-js
2
2
 
3
+ ## 23.0.1
4
+
5
+ The workspace dogfoods @systemfsoftware/stryker-js 23.0.0 and the TypeScript checker 10.0.0, and every package resolves one @systemfsoftware/effect-cell-types (12.1.4). The TypeScript checker and the vitest runner bundle 12.1.4 in place of 12.0.0, and stryker-js and the checker bundle @jsr/std__jsonc 1.0.3 in place of 1.0.2. Every package that takes @systemfsoftware/effect-cell-types from the catalog publishes the range ^12.1.4 in place of ^12.0.0.
6
+
7
+ ## 23.0.0
8
+
9
+ `effect` is a peer dependency (`^4.1.2`) of every package whose library entry points import it, so a consumer's schemas, layers and errors and these packages' share one effect instance.
10
+
11
+ - cli-contract, plugin-interface, instrumenter, typescript-checker and plugin-runtime declared `effect` as a dependency. A consumer on another 4.1.x got a second copy, and the contract's `ShardPlan` no longer type-checked against the consumer's effect. They now peer on it; install `effect` yourself.
12
+ - stryker-js and the html-reporter already peered on `effect`; the floor rises from 4.1.0 to 4.1.2, the version these packages are built and tested with.
13
+
14
+ The processes Stryker starts are unchanged: the CLI (`main.mjs`), the TypeScript checker's worker and the vitest runner's worker bundle their own effect 4.1.2. The flake package `stryker-package` now declares `effect` itself.
15
+
16
+ The install section names `pnpm add` and the npm packages instead of the flake. The workspace takes the released packages it dogfoods from npm; no published manifest changes.
17
+
3
18
  ## 22.0.0
4
19
 
5
20
  `run --since` and `plan --since` widen a project to a full run only when a Stryker config, a test-runner config, a `package.json` or a lockfile changed in that project or in one of its ancestor directories. A change to those files in a sibling package no longer widens it. The diff is read with its output format pinned (`--no-color`, `--no-ext-diff`, `--no-textconv`, `--no-relative` and the `a/`/`b/` prefixes), so a user's git config can no longer empty or misplace the diff scope.
package/README.md CHANGED
@@ -7,19 +7,12 @@ typed `./config` authoring surface.
7
7
 
8
8
  ## Install
9
9
 
10
- The CLI ships as the flake's `stryker` package, with the vitest runner, the TypeScript checker, the instrumenter, the svelte framework and both Effect ignorers beside it. Pin a release commit:
11
-
12
10
  ```bash
13
- nix run github:systemfsoftware/stryker-js-effect/<release-commit>#stryker -- run
14
- ```
15
-
16
- A bare plugin name in a config resolves from that install, so the project installs none of the plugins. To type `stryker.config.ts`, link the CLI package from the flake's output (`nix build github:systemfsoftware/stryker-js-effect/<release-commit>#stryker -o .stryker`):
17
-
18
- ```json
19
- { "devDependencies": { "@systemfsoftware/stryker-js": "link:.stryker/lib/node_modules/@systemfsoftware/stryker-js" } }
11
+ pnpm add -D @systemfsoftware/stryker-js vitest
12
+ node node_modules/@systemfsoftware/stryker-js/dist/main.mjs run
20
13
  ```
21
14
 
22
- A plugin the package does not ship is named by its `file:` URL, for example `import.meta.resolve('my-ignorer')`.
15
+ Add the runner, the TypeScript checker and the ignorers you use from npm as well, for example `pnpm add -D @systemfsoftware/stryker-js-vitest-runner @systemfsoftware/stryker-js-typescript-checker`. A bare plugin name in a config resolves from your project's dependencies. A plugin the package does not ship is named by its `file:` URL, for example `import.meta.resolve('my-ignorer')`.
23
16
 
24
17
  ## Quick Start: Vitest Runner
25
18
 
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
2
  import { i as Mutant_exports, l as Report_exports, n as mergeConfigs } from "./merge-config-BWQeU3-p.mjs";
3
- import { $ as IncrementalReportSchema, $t as checkCell, A as optionalField, At as ExtendsStepDone, B as nodePlatformLayer, Bt as createDefaultOptions, C as offerSkipsIfAny, Ct as WorkerLauncher, D as dryRunChoiceOf, Dt as importModule, E as reusedTestCoverage, Et as decideExtendsStep, F as diffScopeDecisionOf, Ft as ConfigError, G as git_diff_service_exports, Gt as ImportedModuleSchema, H as SourceParser, Ht as ConfigDocumentSchema, I as DryRunCoverageReused, It as ConfigFileInvalidError, J as git_diff_schema_exports, Jt as ReadConfigCommand, K as ChangedSince, Kt as MergeCommand, L as scoped$1, Lt as ConfigFileNotFoundError, M as relativeNormalizedFileName, Mt as ExtendsStepRefused, N as requireDryRun, Nt as ExtendsStepResolve, O as requireDryRunCommandOf, Ot as initialExtendsStepState, P as readProjectCell, Pt as FileMatcher, Q as classifyWorkerExit, Qt as groupCell, R as makeCheckerPoolHandle, Rt as ConfigFileUnreadableError, S as instrumentFiles, St as makeWorkerClient, T as readIncrementalReuse, Tt as ReproducerSchema, U as source_parser_service_exports, Ut as ExtendsStepDocumentSchema, V as layerWorkerProtocol, Vt as defaultOptions, W as GitDiff, Wt as ExtendsStepStateSchema, X as ClassifyWorkerExitCommand, Xt as forkOptionsSchema, Y as EmptyDirectory, Yt as extendsPropertySchema, Z as ClassifyWorkerExitDecision, Zt as survivorsPriorReport, _ as testRunnerConfigOf, _t as metricsResultFromFiles, a as HtmlReporter_exports, an as ShardPlan, at as RunEnvironment, b as planPrepare, bt as spawnReporterWorker, c as instrumentCell, cn as SpanTaxonomy_exports, ct as SurfacingFields, d as isCommandRunner, dn as CheckerSkippedRequested, dt as RunEvents, en as ChildProcessCrashedError, et as validateOptions, f as mutantDetailEventsOf, ft as RunIdentity, g as isVmRunner, gt as staticVerdictOf, h as readPrepare, ht as VerdictEnvelope, i as MachineConsole, in as RunEvent_exports$1, it as readConfig, j as import_closure_cell_exports, jt as ExtendsStepRead, k as incrementalReportTextsOf, kt as StrykerError, l as buildTestRunner, ln as CheckerAnsweredUnrequested, lt as SurvivorRef, m as admitPreparedProject, mt as generateRunId, n as RunEventDrain, nn as WorkerBootTimeoutError, nt as describeErrors, o as mutationTestCell, on as ShardPlanVersion, ot as IdGenerator, p as concurrencyCell, pt as buildVerdictEnvelope, q as WholeProject, qt as MergeResult, r as makeRunEventStream, rn as OutputMode_exports, rt as forkCoreSchema, s as prepareCell, sn as ShardProject, st as surfacedSurvivorsOf, t as strykerCell, tn as OutOfMemoryError, tt as loadConfigCell, u as makeChildProcessTestRunner, un as CheckerIgnoredWithoutRule, ut as StrykerPackage, v as vmRunnerPluginUrl, vt as MetricsResultFromReport, w as planInstrumentation, wt as make, x as enteringInstrumentPhase, xt as withPhaseSpan, y as vmTestRunnerConfig, yt as reporterWorkerFactory, z as programDigestOf, zt as ConfigFileUnsupportedError } from "./run-stages-BnFibYAg.mjs";
3
+ import { $ as IncrementalReportSchema, $t as checkCell, A as optionalField, At as ExtendsStepDone, B as nodePlatformLayer, Bt as createDefaultOptions, C as offerSkipsIfAny, Ct as WorkerLauncher, D as dryRunChoiceOf, Dt as importModule, E as reusedTestCoverage, Et as decideExtendsStep, F as diffScopeDecisionOf, Ft as ConfigError, G as git_diff_service_exports, Gt as ImportedModuleSchema, H as SourceParser, Ht as ConfigDocumentSchema, I as DryRunCoverageReused, It as ConfigFileInvalidError, J as git_diff_schema_exports, Jt as ReadConfigCommand, K as ChangedSince, Kt as MergeCommand, L as scoped$1, Lt as ConfigFileNotFoundError, M as relativeNormalizedFileName, Mt as ExtendsStepRefused, N as requireDryRun, Nt as ExtendsStepResolve, O as requireDryRunCommandOf, Ot as initialExtendsStepState, P as readProjectCell, Pt as FileMatcher, Q as classifyWorkerExit, Qt as groupCell, R as makeCheckerPoolHandle, Rt as ConfigFileUnreadableError, S as instrumentFiles, St as makeWorkerClient, T as readIncrementalReuse, Tt as ReproducerSchema, U as source_parser_service_exports, Ut as ExtendsStepDocumentSchema, V as layerWorkerProtocol, Vt as defaultOptions, W as GitDiff, Wt as ExtendsStepStateSchema, X as ClassifyWorkerExitCommand, Xt as forkOptionsSchema, Y as EmptyDirectory, Yt as extendsPropertySchema, Z as ClassifyWorkerExitDecision, Zt as survivorsPriorReport, _ as testRunnerConfigOf, _t as metricsResultFromFiles, a as HtmlReporter_exports, an as ShardPlan, at as RunEnvironment, b as planPrepare, bt as spawnReporterWorker, c as instrumentCell, cn as SpanTaxonomy_exports, ct as SurfacingFields, d as isCommandRunner, dn as CheckerSkippedRequested, dt as RunEvents, en as ChildProcessCrashedError, et as validateOptions, f as mutantDetailEventsOf, ft as RunIdentity, g as isVmRunner, gt as staticVerdictOf, h as readPrepare, ht as VerdictEnvelope, i as MachineConsole, in as RunEvent_exports$1, it as readConfig, j as import_closure_cell_exports, jt as ExtendsStepRead, k as incrementalReportTextsOf, kt as StrykerError, l as buildTestRunner, ln as CheckerAnsweredUnrequested, lt as SurvivorRef, m as admitPreparedProject, mt as generateRunId, n as RunEventDrain, nn as WorkerBootTimeoutError, nt as describeErrors, o as mutationTestCell, on as ShardPlanVersion, ot as IdGenerator, p as concurrencyCell, pt as buildVerdictEnvelope, q as WholeProject, qt as MergeResult, r as makeRunEventStream, rn as OutputMode_exports, rt as forkCoreSchema, s as prepareCell, sn as ShardProject, st as surfacedSurvivorsOf, t as strykerCell, tn as OutOfMemoryError, tt as loadConfigCell, u as makeChildProcessTestRunner, un as CheckerIgnoredWithoutRule, ut as StrykerPackage, v as vmRunnerPluginUrl, vt as MetricsResultFromReport, w as planInstrumentation, wt as make, x as enteringInstrumentPhase, xt as withPhaseSpan, y as vmTestRunnerConfig, yt as reporterWorkerFactory, z as programDigestOf, zt as ConfigFileUnsupportedError } from "./run-stages-CNIjqDP3.mjs";
4
4
  import { n as StageError } from "./Run.schema-DuaneDGd.mjs";
5
5
  import { Blueprint, Cell, Handle, Sandwich, Workflow } from "@systemfsoftware/effect-cell-types";
6
6
  import * as S from "effect/Schema";
package/dist/main.mjs CHANGED
@@ -73716,7 +73716,7 @@ var __exportAll$2 = (all, no_symbols) => {
73716
73716
  return target;
73717
73717
  };
73718
73718
  //#endregion
73719
- //#region ../../node_modules/.pnpm/@systemfsoftware+effect-cell-types@12.0.0_effect@4.1.2/node_modules/@systemfsoftware/effect-cell-types/dist/rolldown-runtime-D7D4PA-g.mjs
73719
+ //#region ../../node_modules/.pnpm/@systemfsoftware+effect-cell-types@12.1.4_effect@4.1.2/node_modules/@systemfsoftware/effect-cell-types/dist/rolldown-runtime-D7D4PA-g.mjs
73720
73720
  var __defProp$1 = Object.defineProperty;
73721
73721
  var __exportAll$1 = (all, no_symbols) => {
73722
73722
  let target = {};
@@ -73728,7 +73728,7 @@ var __exportAll$1 = (all, no_symbols) => {
73728
73728
  return target;
73729
73729
  };
73730
73730
  //#endregion
73731
- //#region ../../node_modules/.pnpm/@systemfsoftware+effect-cell-types@12.0.0_effect@4.1.2/node_modules/@systemfsoftware/effect-cell-types/dist/index.mjs
73731
+ //#region ../../node_modules/.pnpm/@systemfsoftware+effect-cell-types@12.1.4_effect@4.1.2/node_modules/@systemfsoftware/effect-cell-types/dist/index.mjs
73732
73732
  var Blueprint_exports = /* @__PURE__ */ __exportAll$1({
73733
73733
  IndexId: () => IndexId,
73734
73734
  make: () => make$3$1
@@ -77255,7 +77255,7 @@ const isEmptyNumber = (value$21) => value(value$21).pipe(when(0, () => true), or
77255
77255
  const isEmptyError = (error) => value(error).pipe(when(_undefined, () => true), when(_null, () => true), when(string, (text) => text.length === 0), when(number, isEmptyNumber), when(boolean, (value) => !value), orElse$1(() => false));
77256
77256
  const formatErrnoException = (error) => value(error.stack).pipe(when(hasText, (stack) => `${error.name}: ${error.code} (${error.syscall}) ${stack}`), orElse$1(() => `${error.name}: ${error.code} (${error.syscall})`));
77257
77257
  const formatError = (error) => value(error.stack).pipe(when(hasText, (stack) => `${error.name}: ${error.message}\n${stack}`), orElse$1(() => `${error.name}: ${error.message}`));
77258
- const isJsonPrimitive = (value$16) => value(value$16).pipe(when(number, () => true), when(boolean, () => true), when(bigint, () => true), orElse$1(() => false));
77258
+ const isJsonPrimitive = (value$15) => value(value$15).pipe(when(number, () => true), when(boolean, () => true), when(bigint, () => true), orElse$1(() => false));
77259
77259
  const jsonText = (error) => getOrElse(try_$2({
77260
77260
  try: () => textIfNonEmpty(JSON.stringify(error)),
77261
77261
  catch: () => void 0
@@ -77286,13 +77286,13 @@ function nonStringTextOf(error) {
77286
77286
  return primitiveJsonOf(error) ?? stringifyRest(error);
77287
77287
  }
77288
77288
  const errorText = (error) => value(error).pipe(when(isErrnoException, formatErrnoException), orElse$1(() => formatError(error)));
77289
- const errorNameOf = (value$15) => value(value$15).pipe(when(instanceOf(Error), (error) => textIfNonEmpty(error.name)), orElse$1(() => void 0));
77290
- const tagOf = (value$13) => value(textIfNonEmpty(fieldOf$2(value$13, "_tag"))).pipe(when(hasText, (tag) => tag), orElse$1(() => errorNameOf(value$13)));
77289
+ const errorNameOf = (value$14) => value(value$14).pipe(when(instanceOf(Error), (error) => textIfNonEmpty(error.name)), orElse$1(() => void 0));
77290
+ const tagOf = (value$12) => value(textIfNonEmpty(fieldOf$2(value$12, "_tag"))).pipe(when(hasText, (tag) => tag), orElse$1(() => errorNameOf(value$12)));
77291
77291
  const textWithNested = (own, nested) => value(own).pipe(when(hasText, (text) => appendNested(text, nested)), orElse$1(() => nested));
77292
77292
  const appendNested = (own, nested) => value(nested).pipe(when(hasText, (text) => `${own}: ${text}`), orElse$1(() => own));
77293
77293
  const errorMessage = (error) => value(error.message.length > 0).pipe(when(true, () => error.message), orElse$1(() => tagOf(error)));
77294
77294
  const errorMessageOrTag = (value$27) => value(value$27).pipe(when(instanceOf(Error), errorMessage), orElse$1(() => tagOf(value$27)));
77295
- const messageText = (value$14) => value(textIfNonEmpty(fieldOf$2(value$14, "message"))).pipe(when(hasText, (message) => message), orElse$1(() => errorMessageOrTag(value$14)));
77295
+ const messageText = (value$13) => value(textIfNonEmpty(fieldOf$2(value$13, "message"))).pipe(when(hasText, (message) => message), orElse$1(() => errorMessageOrTag(value$13)));
77296
77296
  const ownCauseText = (value$26) => value(textIfNonEmpty(fieldOf$2(value$26, "reason"))).pipe(when(hasText, (reason) => reason), orElse$1(() => messageText(value$26)));
77297
77297
  const isPastDepth = (depth) => depth > 4;
77298
77298
  const isMissingCause = (cause) => cause === void 0 || cause === null;
@@ -78271,7 +78271,7 @@ const identifierText = (node) => match$8(fromNullishOr(node), {
78271
78271
  onNone: () => none(),
78272
78272
  onSome: (present) => value(present).pipe(when(isNamedIdentifier, (name) => some$2(name.name)), when(isStringLiteral$1, (literal) => literalValueText(literal.value)), orElse$1(() => none()))
78273
78273
  });
78274
- const literalValueText = (value$18) => value(value$18).pipe(when(isString$2, (text) => some$2(text)), orElse$1(() => none()));
78274
+ const literalValueText = (value$17) => value(value$17).pipe(when(isString$2, (text) => some$2(text)), orElse$1(() => none()));
78275
78275
  const moduleExportName = (name) => getOrElse$1(identifierText(name), () => "");
78276
78276
  const staticMemberName = (member) => value(member.computed).pipe(when(false, () => identifierText(member.property)), orElse$1(() => none()));
78277
78277
  const nodesOutsideFunctions = (root) => {
@@ -80075,7 +80075,7 @@ const literalWithoutRegex = (node) => match$8(fromNullishOr(node.bigint), {
80075
80075
  const valueLiteralText = (value$30) => value(value$30).pipe(when(string, (v) => JSON.stringify(v)), orElse$1(nonStringLiteralText));
80076
80076
  const nonStringLiteralText = (value$20) => value(value$20).pipe(when(number, (v) => String(v)), orElse$1(booleanOrBigintText));
80077
80077
  const booleanOrBigintText = (value$11) => value(value$11).pipe(when(boolean, (v) => String(v)), orElse$1(bigintText));
80078
- const bigintText = (value$19) => value(value$19).pipe(when((candidate) => typeof candidate === "bigint", (v) => `${String(v)}n`), orElse$1(() => "null"));
80078
+ const bigintText = (value$18) => value(value$18).pipe(when((candidate) => typeof candidate === "bigint", (v) => `${String(v)}n`), orElse$1(() => "null"));
80079
80079
  const flagText = (present, text) => match$1(isTruthy(present), {
80080
80080
  onTrue: () => text,
80081
80081
  onFalse: () => ""
@@ -80090,7 +80090,7 @@ const objectExpressionText = (ctx, node) => match$1(node.properties.length === 0
80090
80090
  onFalse: () => `{ ${nodeListText(ctx, node.properties, PREC.Sequence)} }`
80091
80091
  });
80092
80092
  const propertyText = (ctx, node) => value(propertyFormOf(node)).pipe(when("accessor", () => `${node.kind} ${propertyKeyText(ctx, node.key, node.computed === true, PREC.Assignment)}${functionValueTailText(ctx, node.value)}`), when("method", () => `${propertyKeyText(ctx, node.key, node.computed === true, PREC.Assignment)}${functionValueTailText(ctx, node.value)}`), when("shorthand", () => identifierNameText(node.key)), when("shorthandDefault", () => shorthandDefaultPropertyText(ctx, node)), orElse$1(() => `${propertyKeyText(ctx, node.key, node.computed === true, PREC.Assignment)}: ${printNodePrec(ctx, node.value, PREC.Assignment)}`));
80093
- const functionValueTailText = (ctx, value$17) => value(value$17).pipe(when(isFunctionNode, (fn) => functionTailText(ctx, fn)), orElse$1(() => ""));
80093
+ const functionValueTailText = (ctx, value$16) => value(value$16).pipe(when(isFunctionNode, (fn) => functionTailText(ctx, fn)), orElse$1(() => ""));
80094
80094
  const shorthandDefaultPropertyText = (ctx, node) => value(node.value).pipe(when(isAssignmentPattern, (value) => `${identifierNameText(node.key)} = ${printNodePrec(ctx, value.right, PREC.Assignment)}`), orElse$1(() => ""));
80095
80095
  const propertyKeyText = (ctx, key, computed, computedPrec) => match$1(computed, {
80096
80096
  onTrue: () => `[${dispatchNode(ctx, key, computedPrec)}]`,
@@ -81219,21 +81219,12 @@ var MutantKept = class extends TaggedClass()("MutantKept", {}) {
81219
81219
  [MutantSetOutcomeTypeId] = MutantSetOutcomeTypeId;
81220
81220
  };
81221
81221
  const MutantSetDecision = ArraySchema(Union([MutantSuppressed, MutantKept]));
81222
- const canonicalForm = (text) => stripOuterParentheses(text.trim());
81223
- const stripOuterParentheses = (text) => value(wrapsWhole(text)).pipe(when(true, () => stripOuterParentheses(text.slice(1, -1).trim())), orElse$1(() => text));
81224
- const parenDepthDelta = (character) => value(character).pipe(when("(", () => 1), when(")", () => -1), orElse$1(() => 0));
81225
- const depthsAfter = (text) => text.split("").reduce((depths, character) => [...depths, getOrElse$1(last$1(depths), () => 0) + parenDepthDelta(character)], []);
81226
- const wrapsWhole = (text) => {
81227
- const depths = depthsAfter(text);
81228
- return [
81229
- text.startsWith("("),
81230
- text.endsWith(")"),
81231
- depths.length > 0,
81232
- depths.slice(0, -1).every((depth) => depth >= 1),
81233
- getOrElse$1(last$1(depths), () => 0) === 0
81234
- ].every(Boolean);
81235
- };
81236
- const defaultOnly = (policy, value$12) => value(policy).pipe(when("full", () => none()), when("default", value$12), exhaustive);
81222
+ /**
81223
+ * The code a candidate plants, as the instrumenter's printer wrote it from the node the placers plant. Two candidates
81224
+ * plant the same code exactly when these texts are equal, so the policy compares text and reparses nothing.
81225
+ */
81226
+ const canonicalForm = (text) => text.trim();
81227
+ const defaultOnly = (policy, value$19) => value(policy).pipe(when("full", () => none()), when("default", value$19), exhaustive);
81237
81228
  const printedAs = (code) => canonicalForm(code);
81238
81229
  const printsSomething = (code) => printedAs(code).length > 0;
81239
81230
  const samePrintedCode = (left, right) => [printsSomething(left), printedAs(left) === printedAs(right)].every(Boolean);
@@ -81954,6 +81945,7 @@ const mutablesFor = (frame, location, context) => {
81954
81945
  const ignorerAnswer = getOrUndefined$1(ignorerAnswerFor(frame.node, ancestors, context.ignorers));
81955
81946
  const aridReason = getOrUndefined$1(aridReasonOf(frame, context.mutantSetPolicy, context.aridImportTable));
81956
81947
  const originalCode = printNode(frame.node);
81948
+ const plantedOriginal = printNode(unwrapParenthesizedExpression(frame.node));
81957
81949
  return replacements.map(({ mutatorName, replacement }) => {
81958
81950
  const replacementCode = printNode(replacement);
81959
81951
  const tuple = {
@@ -81976,8 +81968,8 @@ const mutablesFor = (frame, location, context) => {
81976
81968
  ignorerAnswer,
81977
81969
  ...aridReason === void 0 ? {} : { aridReason },
81978
81970
  mutantSet: {
81979
- originalCode,
81980
- replacementCode
81971
+ originalCode: plantedOriginal,
81972
+ replacementCode: printNode(unwrapParenthesizedExpression(replacement))
81981
81973
  },
81982
81974
  subsumption: subsumptionReplacementOf(mutatorName, replacement)
81983
81975
  }
@@ -82770,7 +82762,7 @@ const makeHtmlReporter = dual(2, (options, _init) => (events) => build(nodeFsPat
82770
82762
  var HtmlReporter_exports = /* @__PURE__ */ __exportAll$3({ makeHtmlReporter: () => makeHtmlReporter });
82771
82763
  //#endregion
82772
82764
  //#region package.json
82773
- var version = "22.0.0";
82765
+ var version = "23.0.1";
82774
82766
  //#endregion
82775
82767
  //#region ../../node_modules/.pnpm/effect@4.1.2/node_modules/effect/dist/cli/internal/ansi.js
82776
82768
  /**
@@ -127025,7 +127017,7 @@ const withPreprocessedFiles = dual(2, (project, updates) => ({
127025
127017
  filesToMutate: replacedBy(project.filesToMutate, filter$4(updates, heldIn(project.filesToMutate)))
127026
127018
  }));
127027
127019
  //#endregion
127028
- //#region ../../node_modules/.pnpm/@jsr+std__jsonc@1.0.2/node_modules/@jsr/std__jsonc/parse.js
127020
+ //#region ../../node_modules/.pnpm/@jsr+std__jsonc@1.0.3/node_modules/@jsr/std__jsonc/parse.js
127029
127021
  /**
127030
127022
  * Converts a JSON with Comments (JSONC) string into an object.
127031
127023
  *
@@ -127128,11 +127120,16 @@ var JsoncParser = class {
127128
127120
  case "\"": {
127129
127121
  const startIndex = i;
127130
127122
  let shouldEscapeNext = false;
127123
+ let hasEndOfString = false;
127131
127124
  i++;
127132
127125
  for (; i < this.#length; i++) {
127133
- if (this.#text[i] === "\"" && !shouldEscapeNext) break;
127126
+ if (this.#text[i] === "\"" && !shouldEscapeNext) {
127127
+ hasEndOfString = true;
127128
+ break;
127129
+ }
127134
127130
  shouldEscapeNext = this.#text[i] === "\\" && !shouldEscapeNext;
127135
127131
  }
127132
+ if (!hasEndOfString) throw new SyntaxError("Cannot parse JSONC: unexpected end of JSONC input");
127136
127133
  yield {
127137
127134
  type: "String",
127138
127135
  sourceText: this.#text.substring(startIndex, i + 1),
package/dist/promises.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { B as nodePlatformLayer, t as strykerCell } from "./run-stages-BnFibYAg.mjs";
1
+ import { B as nodePlatformLayer, t as strykerCell } from "./run-stages-CNIjqDP3.mjs";
2
2
  import * as Effect from "effect/Effect";
3
3
  import { dual } from "effect/Function";
4
4
  //#region src/promises/run.ts
@@ -9005,20 +9005,11 @@ var MutantKept = class extends S.TaggedClass()("MutantKept", {}) {
9005
9005
  };
9006
9006
  const MutantSetOutcome = S.Union([MutantSuppressed, MutantKept]);
9007
9007
  const MutantSetDecision = S.Array(MutantSetOutcome);
9008
- const canonicalForm = (text) => stripOuterParentheses(text.trim());
9009
- const stripOuterParentheses = (text) => Match$1.value(wrapsWhole(text)).pipe(Match$1.when(true, () => stripOuterParentheses(text.slice(1, -1).trim())), Match$1.orElse(() => text));
9010
- const parenDepthDelta = (character) => Match$1.value(character).pipe(Match$1.when("(", () => 1), Match$1.when(")", () => -1), Match$1.orElse(() => 0));
9011
- const depthsAfter = (text) => text.split("").reduce((depths, character) => [...depths, Option$1.getOrElse(Arr.last(depths), () => 0) + parenDepthDelta(character)], []);
9012
- const wrapsWhole = (text) => {
9013
- const depths = depthsAfter(text);
9014
- return [
9015
- text.startsWith("("),
9016
- text.endsWith(")"),
9017
- depths.length > 0,
9018
- depths.slice(0, -1).every((depth) => depth >= 1),
9019
- Option$1.getOrElse(Arr.last(depths), () => 0) === 0
9020
- ].every(Boolean);
9021
- };
9008
+ /**
9009
+ * The code a candidate plants, as the instrumenter's printer wrote it from the node the placers plant. Two candidates
9010
+ * plant the same code exactly when these texts are equal, so the policy compares text and reparses nothing.
9011
+ */
9012
+ const canonicalForm = (text) => text.trim();
9022
9013
  const defaultOnly = (policy, value) => Match$1.value(policy).pipe(Match$1.when("full", () => Option$1.none()), Match$1.when("default", value), Match$1.exhaustive);
9023
9014
  const printedAs = (code) => canonicalForm(code);
9024
9015
  const printsSomething = (code) => printedAs(code).length > 0;
@@ -9741,6 +9732,7 @@ const mutablesFor = (frame, location, context) => {
9741
9732
  const ignorerAnswer = Option$1.getOrUndefined(ignorerAnswerFor(frame.node, ancestors, context.ignorers));
9742
9733
  const aridReason = Option$1.getOrUndefined(aridReasonOf(frame, context.mutantSetPolicy, context.aridImportTable));
9743
9734
  const originalCode = printNode(frame.node);
9735
+ const plantedOriginal = printNode(unwrapParenthesizedExpression(frame.node));
9744
9736
  return replacements.map(({ mutatorName, replacement }) => {
9745
9737
  const replacementCode = printNode(replacement);
9746
9738
  const tuple = {
@@ -9763,8 +9755,8 @@ const mutablesFor = (frame, location, context) => {
9763
9755
  ignorerAnswer,
9764
9756
  ...aridReason === void 0 ? {} : { aridReason },
9765
9757
  mutantSet: {
9766
- originalCode,
9767
- replacementCode
9758
+ originalCode: plantedOriginal,
9759
+ replacementCode: printNode(unwrapParenthesizedExpression(replacement))
9768
9760
  },
9769
9761
  subsumption: subsumptionReplacementOf(mutatorName, replacement)
9770
9762
  }
@@ -12208,7 +12200,7 @@ const strykerOutputFilesOf = (options) => STRYKER_OUTPUTS.map((output) => output
12208
12200
  STRYKER_OUTPUTS.map((output) => output.label);
12209
12201
  //#endregion
12210
12202
  //#region package.json
12211
- var version = "22.0.0";
12203
+ var version = "23.0.1";
12212
12204
  //#endregion
12213
12205
  //#region src/stryker-package.schema.ts
12214
12206
  var StrykerPackage = class extends S.Class("StrykerPackage")({
@@ -22999,7 +22991,7 @@ const withPreprocessedFiles = dual(2, (project, updates) => ({
22999
22991
  filesToMutate: replacedBy(project.filesToMutate, Arr.filter(updates, heldIn(project.filesToMutate)))
23000
22992
  }));
23001
22993
  //#endregion
23002
- //#region ../../node_modules/.pnpm/@jsr+std__jsonc@1.0.2/node_modules/@jsr/std__jsonc/parse.js
22994
+ //#region ../../node_modules/.pnpm/@jsr+std__jsonc@1.0.3/node_modules/@jsr/std__jsonc/parse.js
23003
22995
  /**
23004
22996
  * Converts a JSON with Comments (JSONC) string into an object.
23005
22997
  *
@@ -23102,11 +23094,16 @@ var JsoncParser = class {
23102
23094
  case "\"": {
23103
23095
  const startIndex = i;
23104
23096
  let shouldEscapeNext = false;
23097
+ let hasEndOfString = false;
23105
23098
  i++;
23106
23099
  for (; i < this.#length; i++) {
23107
- if (this.#text[i] === "\"" && !shouldEscapeNext) break;
23100
+ if (this.#text[i] === "\"" && !shouldEscapeNext) {
23101
+ hasEndOfString = true;
23102
+ break;
23103
+ }
23108
23104
  shouldEscapeNext = this.#text[i] === "\\" && !shouldEscapeNext;
23109
23105
  }
23106
+ if (!hasEndOfString) throw new SyntaxError("Cannot parse JSONC: unexpected end of JSONC input");
23110
23107
  yield {
23111
23108
  type: "String",
23112
23109
  sourceText: this.#text.substring(startIndex, i + 1),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@systemfsoftware/stryker-js",
3
- "version": "22.0.0",
3
+ "version": "23.0.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/systemfsoftware/stryker-js-effect.git",
@@ -30,12 +30,12 @@
30
30
  "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
31
31
  "@opentelemetry/sdk-metrics": "^2.11.0",
32
32
  "@opentelemetry/sdk-trace-base": "^2.2.0",
33
- "@systemfsoftware/effect-cell-types": "^12.0.0",
34
- "@systemfsoftware/stryker-js-vm-runner": "npm:@systemfsoftware/stryker-js-vitest-runner@^10.1.0",
33
+ "@systemfsoftware/effect-cell-types": "^12.1.4",
34
+ "@systemfsoftware/stryker-js-vm-runner": "npm:@systemfsoftware/stryker-js-vitest-runner@^10.1.1",
35
35
  "yaml": "^2.9.1"
36
36
  },
37
37
  "peerDependencies": {
38
- "effect": "^4.1.0"
38
+ "effect": "^4.1.2"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@effect/tsgo": "^0.63.0",
@@ -48,18 +48,18 @@
48
48
  "@systemfsoftware/effect-schema-law": "^5.0.0",
49
49
  "@systemfsoftware/oxlint-config-recommended": "^4.0.0",
50
50
  "@systemfsoftware/stryker-config": "^0.1.0",
51
- "@systemfsoftware/stryker-framework-interface": "^0.0.2",
52
- "@systemfsoftware/stryker-ignorer-effect-schema-declarations": "file:../../.deps/stryker-ignorer-effect-schema-declarations.tgz",
53
- "@systemfsoftware/stryker-ignorer-in-source-vitest-block": "file:../../.deps/stryker-ignorer-in-source-vitest-block.tgz",
54
- "@systemfsoftware/stryker-ignorer-interface": "^0.1.3",
55
- "@systemfsoftware/stryker-js": "file:../../.deps/stryker-js.tgz",
56
- "@systemfsoftware/stryker-js-cli-contract": "^2.0.0",
57
- "@systemfsoftware/stryker-js-html-reporter": "^6.0.6",
58
- "@systemfsoftware/stryker-js-instrumenter": "^15.0.0",
59
- "@systemfsoftware/stryker-js-plugin-interface": "^18.0.0",
60
- "@systemfsoftware/stryker-js-plugin-runtime": "^8.0.1",
61
- "@systemfsoftware/stryker-js-typescript-checker": "file:../../.deps/stryker-js-typescript-checker.tgz",
62
- "@systemfsoftware/stryker-js-vitest-runner": "file:../../.deps/stryker-js-vitest-runner.tgz",
51
+ "@systemfsoftware/stryker-framework-interface": "^0.0.3",
52
+ "@systemfsoftware/stryker-ignorer-effect-schema-declarations": "^0.3.1",
53
+ "@systemfsoftware/stryker-ignorer-in-source-vitest-block": "^0.1.3",
54
+ "@systemfsoftware/stryker-ignorer-interface": "^0.1.4",
55
+ "@systemfsoftware/stryker-js": "^23.0.0",
56
+ "@systemfsoftware/stryker-js-cli-contract": "^3.0.1",
57
+ "@systemfsoftware/stryker-js-html-reporter": "^7.0.1",
58
+ "@systemfsoftware/stryker-js-instrumenter": "^16.0.1",
59
+ "@systemfsoftware/stryker-js-plugin-interface": "^19.0.1",
60
+ "@systemfsoftware/stryker-js-plugin-runtime": "^9.0.1",
61
+ "@systemfsoftware/stryker-js-typescript-checker": "^10.0.0",
62
+ "@systemfsoftware/stryker-js-vitest-runner": "^10.1.0",
63
63
  "@systemfsoftware/tsconfig": "^2.0.1",
64
64
  "@systemfsoftware/tsdown-config": "^0.1.0",
65
65
  "@systemfsoftware/vitest": "^2.0.0",
@@ -105,7 +105,7 @@
105
105
  },
106
106
  "inlinedDependencies": {
107
107
  "@eslint-community/regexpp": "4.12.2",
108
- "@jsr/std__jsonc": "1.0.2",
108
+ "@jsr/std__jsonc": "1.0.3",
109
109
  "oxc-parser": "0.150.0"
110
110
  },
111
111
  "scripts": {