@systemfsoftware/stryker-js 8.0.0 → 9.0.0

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,11 @@
1
1
  # @systemfsoftware/stryker-js
2
2
 
3
+ ## 9.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - The incremental file now carries `incrementalVersion` (the Stryker package version). Stryker writes it on every incremental run and discards an incremental file it cannot parse or whose `incrementalVersion` differs from the running version, falling back to a full mutation testing run instead of failing. `IncrementalReportSchema` requires `incrementalVersion`, and `decodeIncrementalReport` and `IncrementalReportError` are no longer exported.
8
+
3
9
  ## 8.0.0
4
10
 
5
11
  ### Major Changes
package/dist/index.d.mts CHANGED
@@ -1110,6 +1110,7 @@ declare interface ImportSpecifier extends Span$1 {
1110
1110
  }
1111
1111
 
1112
1112
  export declare const IncrementalReportSchema: S.StructWithRest<S.Struct<{
1113
+ readonly incrementalVersion: S.String;
1113
1114
  readonly schemaVersion: S.String;
1114
1115
  readonly thresholds: S.Struct<{
1115
1116
  readonly high: S.Finite;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as StrykerError, $t as FileResultSchema, A as describeErrors, At as RunStarted, B as WorkerLauncher, Bt as defaultOptions, C as matchesFile, Ct as Heartbeat, D as reporterWorkerFactory, Dt as RunFailed, E as REPORTER_EVENT_BATCH_BOUND, Et as PlanKnown, F as mergeConfigs, Ft as verdictExitClass, G as ChildProcessCrashedError, Gt as CheckerCheckResult, H as makeWorkerClient, Ht as isModuleSpecifier, I as readConfig, It as CONFIG_SYNTAX_HELP, J as VmRunner, Jt as CheckerMutantWire, K as OutOfMemoryError, Kt as CheckerFailed, L as validateOptions, Lt as SUPPORTED_CONFIG_FILE_NAMES, M as importModule, Mt as EXIT_CODE, N as initialExtendsStepState, Nt as highestExitClass, O as spawnReporterWorker, Ot as RunMutantTested, P as loadConfigCell, Pt as resolveExitCode, Q as vmTestRunner, Qt as ExitClass, R as buildTestRunner, Rt as createDefaultOptions, S as createFileMatcher, St as RunIdentity, T as RunEnvironment, Tt as PhaseEntered, U as IdGenerator, Ut as isWarningEnabled, V as connectRetry, Vt as findUnserializables, W as classifyWorkerExit, Wt as optionsPath, X as vmRunnerCapabilities, Xt as CheckerRpcs, Y as isVmRunner, Yt as CheckerRequest, Z as vmRunnerName, Zt as DryRunCompleted, _ as checkerMutantsSkipped, _n as MutantStatusSchema, _t as forkOptionsSchema, a as shouldKeepTempDir, an as MutationTestingPlanReady, at as ConfigFileUnsupportedError, b as CheckerAnsweredUnrequested, bt as StageError, c as buildVerdictEnvelope, cn as ReporterEventBatch, ct as ExtendsStepRead, d as strykerVersion, dn as StrykerOptionsSchema, dt as ExtendsStepStateSchema, en as MetricsSchema, et as ConfigDocumentSchema, f as calculateMetrics, fn as TestRunnerConfigSchema, ft as ImportedModuleSchema, g as checkerMutantsChecked, gn as MutantActivationSchema, gt as extendsPropertySchema, h as checkerDuration, hn as LocationSchema, ht as ReadConfigCommand, i as mutationTestCell, in as MutationTestResultSchema, it as ConfigFileUnreadableError, j as forkCoreSchema, jt as VerdictReached, k as decideExtendsStep, kt as RunPhase, l as generateRunId, ln as ReporterInitOptions, lt as ExtendsStepRefused, m as checkGroupedPlans, mn as WorkerPluginKind, mt as MergeResult, n as RUN_EVENTS_QUEUE_BOUND, nn as MutantTested, nt as ConfigFileInvalidError, o as ACTIONABLE_STATUSES, on as ReporterAck, ot as ExtendsStepDocumentSchema, p as countMutants, pn as TraceContextMiddleware, pt as MergeCommand, q as WorkerBootTimeoutError, qt as CheckerGroupResult, r as makeRunLayer, rn as MutationTestReportReady, rt as ConfigFileNotFoundError, s as VERDICT_ENVELOPE_SCHEMA_VERSION, sn as ReporterDrained, st as ExtendsStepDone, t as strykerCell, tn as MutantResultSchema, tt as ConfigError, u as isActionableStatus, un as ReporterRpcs, ut as ExtendsStepResolve, v as checkerProcessCrashes, vn as PositionSchema, vt as survivorsPriorReport, w as IncrementalReportSchema, wt as HelpRendered, x as CheckerSkippedRequested, xt as RunEvents, y as checkerRpcFailures, yt as toRelativeNormalizedFileName, z as isCommandRunner, zt as deepFreeze } from "./src-WMC3thmX.mjs";
1
+ import { $ as StrykerError, $t as FileResultSchema, A as describeErrors, At as RunStarted, B as WorkerLauncher, Bt as defaultOptions, C as strykerVersion, Ct as Heartbeat, D as reporterWorkerFactory, Dt as RunFailed, E as REPORTER_EVENT_BATCH_BOUND, Et as PlanKnown, F as mergeConfigs, Ft as verdictExitClass, G as ChildProcessCrashedError, Gt as CheckerCheckResult, H as makeWorkerClient, Ht as isModuleSpecifier, I as readConfig, It as CONFIG_SYNTAX_HELP, J as VmRunner, Jt as CheckerMutantWire, K as OutOfMemoryError, Kt as CheckerFailed, L as validateOptions, Lt as SUPPORTED_CONFIG_FILE_NAMES, M as importModule, Mt as EXIT_CODE, N as initialExtendsStepState, Nt as highestExitClass, O as spawnReporterWorker, Ot as RunMutantTested, P as loadConfigCell, Pt as resolveExitCode, Q as vmTestRunner, Qt as ExitClass, R as buildTestRunner, Rt as createDefaultOptions, S as matchesFile, St as RunIdentity, T as RunEnvironment, Tt as PhaseEntered, U as IdGenerator, Ut as isWarningEnabled, V as connectRetry, Vt as findUnserializables, W as classifyWorkerExit, Wt as optionsPath, X as vmRunnerCapabilities, Xt as CheckerRpcs, Y as isVmRunner, Yt as CheckerRequest, Z as vmRunnerName, Zt as DryRunCompleted, _ as checkerProcessCrashes, _n as MutantStatusSchema, _t as forkOptionsSchema, a as shouldKeepTempDir, an as MutationTestingPlanReady, at as ConfigFileUnsupportedError, b as CheckerSkippedRequested, bt as StageError, c as buildVerdictEnvelope, cn as ReporterEventBatch, ct as ExtendsStepRead, d as calculateMetrics, dn as StrykerOptionsSchema, dt as ExtendsStepStateSchema, en as MetricsSchema, et as ConfigDocumentSchema, f as countMutants, fn as TestRunnerConfigSchema, ft as ImportedModuleSchema, g as checkerMutantsSkipped, gn as MutantActivationSchema, gt as extendsPropertySchema, h as checkerMutantsChecked, hn as LocationSchema, ht as ReadConfigCommand, i as mutationTestCell, in as MutationTestResultSchema, it as ConfigFileUnreadableError, j as forkCoreSchema, jt as VerdictReached, k as decideExtendsStep, kt as RunPhase, l as generateRunId, ln as ReporterInitOptions, lt as ExtendsStepRefused, m as checkerDuration, mn as WorkerPluginKind, mt as MergeResult, n as RUN_EVENTS_QUEUE_BOUND, nn as MutantTested, nt as ConfigFileInvalidError, o as ACTIONABLE_STATUSES, on as ReporterAck, ot as ExtendsStepDocumentSchema, p as checkGroupedPlans, pn as TraceContextMiddleware, pt as MergeCommand, q as WorkerBootTimeoutError, qt as CheckerGroupResult, r as makeRunLayer, rn as MutationTestReportReady, rt as ConfigFileNotFoundError, s as VERDICT_ENVELOPE_SCHEMA_VERSION, sn as ReporterDrained, st as ExtendsStepDone, t as strykerCell, tn as MutantResultSchema, tt as ConfigError, u as isActionableStatus, un as ReporterRpcs, ut as ExtendsStepResolve, v as checkerRpcFailures, vn as PositionSchema, vt as survivorsPriorReport, w as IncrementalReportSchema, wt as HelpRendered, x as createFileMatcher, xt as RunEvents, y as CheckerAnsweredUnrequested, yt as toRelativeNormalizedFileName, z as isCommandRunner, zt as deepFreeze } from "./src-BQuaL-fB.mjs";
2
2
  export { ACTIONABLE_STATUSES, CONFIG_SYNTAX_HELP, CheckerAnsweredUnrequested, CheckerCheckResult, CheckerFailed, CheckerGroupResult, CheckerMutantWire, CheckerRequest, CheckerRpcs, CheckerSkippedRequested, ChildProcessCrashedError, ConfigDocumentSchema, ConfigError, ConfigFileInvalidError, ConfigFileNotFoundError, ConfigFileUnreadableError, ConfigFileUnsupportedError, DryRunCompleted, EXIT_CODE, ExitClass, ExtendsStepDocumentSchema, ExtendsStepDone, ExtendsStepRead, ExtendsStepRefused, ExtendsStepResolve, ExtendsStepStateSchema, FileResultSchema, Heartbeat, HelpRendered, IdGenerator, ImportedModuleSchema, IncrementalReportSchema, LocationSchema, MergeCommand, MergeResult, MetricsSchema, MutantActivationSchema, MutantResultSchema, MutantStatusSchema, MutantTested, MutationTestReportReady, MutationTestResultSchema, MutationTestingPlanReady, OutOfMemoryError, PhaseEntered, PlanKnown, PositionSchema, REPORTER_EVENT_BATCH_BOUND, RUN_EVENTS_QUEUE_BOUND, ReadConfigCommand, ReporterAck, ReporterDrained, ReporterEventBatch, ReporterInitOptions, ReporterRpcs, RunEnvironment, RunEvents, RunFailed, RunIdentity, RunMutantTested, RunPhase, RunStarted, SUPPORTED_CONFIG_FILE_NAMES, StageError, StrykerError, StrykerOptionsSchema, TestRunnerConfigSchema, TraceContextMiddleware, VERDICT_ENVELOPE_SCHEMA_VERSION, VerdictReached, VmRunner, WorkerBootTimeoutError, WorkerLauncher, WorkerPluginKind, buildTestRunner, buildVerdictEnvelope, calculateMetrics, checkGroupedPlans, checkerDuration, checkerMutantsChecked, checkerMutantsSkipped, checkerProcessCrashes, checkerRpcFailures, classifyWorkerExit, connectRetry, countMutants, createDefaultOptions, createFileMatcher, decideExtendsStep, deepFreeze, defaultOptions, describeErrors, extendsPropertySchema, findUnserializables, forkCoreSchema, forkOptionsSchema, generateRunId, highestExitClass, importModule, initialExtendsStepState, isActionableStatus, isCommandRunner, isModuleSpecifier, isVmRunner, isWarningEnabled, loadConfigCell, makeRunLayer, makeWorkerClient, matchesFile, mergeConfigs, mutationTestCell, optionsPath, readConfig, reporterWorkerFactory, resolveExitCode, shouldKeepTempDir, spawnReporterWorker, strykerCell, strykerVersion, survivorsPriorReport, toRelativeNormalizedFileName, validateOptions, verdictExitClass, vmRunnerCapabilities, vmRunnerName, vmTestRunner };
package/dist/main.mjs CHANGED
@@ -3072,6 +3072,8 @@ const succeed$9 = (success) => {
3072
3072
  a.success = success;
3073
3073
  return a;
3074
3074
  };
3075
+ /** @internal */
3076
+ const getSuccess$1 = (self) => isFailure$2(self) ? none$1 : some$1(self.success);
3075
3077
  //#endregion
3076
3078
  //#region ../../node_modules/.pnpm/effect@4.0.0-rc.112/node_modules/effect/dist/Order.js
3077
3079
  /**
@@ -4879,6 +4881,36 @@ const isFailure$1 = isFailure$2;
4879
4881
  */
4880
4882
  const isSuccess$1 = isSuccess$2;
4881
4883
  /**
4884
+ * Extracts the success value as an `Option`, discarding the failure.
4885
+ *
4886
+ * **When to use**
4887
+ *
4888
+ * Use when you need to extract the success value from a `Result` as an
4889
+ * `Option` and discard failure information.
4890
+ *
4891
+ * **Details**
4892
+ *
4893
+ * - `Success<A>` becomes `Some<A>`
4894
+ * - `Failure<E>` becomes `None`
4895
+ *
4896
+ * **Example** (Extracting the success as an Option)
4897
+ *
4898
+ * ```ts import.meta.vitest
4899
+ * import { Option, Result } from "effect"
4900
+ *
4901
+ * Result.getSuccess(Result.succeed("ok")) // => Option.some("ok")
4902
+ *
4903
+ * Result.getSuccess(Result.fail("err")) // => Option.none()
4904
+ * ```
4905
+ *
4906
+ * @see {@link getFailure} to extract the error instead
4907
+ * @see {@link fromOption} for the reverse conversion
4908
+ *
4909
+ * @category getters
4910
+ * @since 4.0.0
4911
+ */
4912
+ const getSuccess = getSuccess$1;
4913
+ /**
4882
4914
  * Transforms the failure channel of a `Result`, leaving the success channel unchanged.
4883
4915
  *
4884
4916
  * **When to use**
@@ -24365,7 +24397,7 @@ const layer$12 = (loggers, options) => effect(CurrentLoggers, withFiber$1(fnUntr
24365
24397
  //#region package.json
24366
24398
  var package_default = {
24367
24399
  name: "@systemfsoftware/stryker-js",
24368
- version: "8.0.0",
24400
+ version: "9.0.0",
24369
24401
  repository: {
24370
24402
  "type": "git",
24371
24403
  "url": "git+https://github.com/systemfsoftware/stryker-js-effect.git",
@@ -25737,7 +25769,7 @@ function String$3() {
25737
25769
  function Number$3() {
25738
25770
  return transform$3(globalThis.Number);
25739
25771
  }
25740
- function parseJson$1(options) {
25772
+ function parseJson(options) {
25741
25773
  return onSome((input, parseOptions) => try_({
25742
25774
  try: () => some(JSON.parse(input, options?.reviver)),
25743
25775
  catch: () => new InvalidValue$1({ expected: "a valid JSON string" }, input, parseOptions)
@@ -26458,7 +26490,7 @@ const defectFromJson = (options) => transform$2({
26458
26490
  * @since 4.0.0
26459
26491
  */
26460
26492
  function fromJsonString$1(options) {
26461
- return new Transformation(parseJson$1(options ?? {}), stringifyJson(options));
26493
+ return new Transformation(parseJson(options ?? {}), stringifyJson(options));
26462
26494
  }
26463
26495
  //#endregion
26464
26496
  //#region ../../node_modules/.pnpm/effect@4.0.0-rc.112/node_modules/effect/dist/SchemaAST.js
@@ -43603,11 +43635,11 @@ function replaceFirstMatch(path, original, replacement) {
43603
43635
  */
43604
43636
  function toApiLocation(startOffset, endOffset, lineTable, offset) {
43605
43637
  return {
43606
- start: toPosition$1(positionFromLineTable(startOffset, lineTable), offset),
43607
- end: toPosition$1(positionFromLineTable(endOffset, lineTable), offset)
43638
+ start: toPosition(positionFromLineTable(startOffset, lineTable), offset),
43639
+ end: toPosition(positionFromLineTable(endOffset, lineTable), offset)
43608
43640
  };
43609
43641
  }
43610
- function toPosition$1(source, offset) {
43642
+ function toPosition(source, offset) {
43611
43643
  let columnOffset = 0;
43612
43644
  if (source.line === 1) columnOffset = offset.column;
43613
43645
  return {
@@ -53905,8 +53937,8 @@ const labelCheckOf = (parts) => match$6(repeatedLabel(parts), {
53905
53937
  onNone: () => LabelsDistinct.make({}),
53906
53938
  onSome: (label) => DuplicateLabelFound.make({ label })
53907
53939
  });
53908
- const decide = (command) => value(labelCheckOf(command.parts)).pipe(tag("DuplicateLabelFound", (found) => fail$4(DuplicatePackageLabel.make({ label: found.label }))), tag("LabelsDistinct", () => decideMerge(command)), exhaustive);
53909
- const mergeReportParts = Workflow_exports.make(MergeReportPartsCommand, decide);
53940
+ const decide$1 = (command) => value(labelCheckOf(command.parts)).pipe(tag("DuplicateLabelFound", (found) => fail$4(DuplicatePackageLabel.make({ label: found.label }))), tag("LabelsDistinct", () => decideMerge(command)), exhaustive);
53941
+ const mergeReportParts = Workflow_exports.make(MergeReportPartsCommand, decide$1);
53910
53942
  //#endregion
53911
53943
  //#region src/merge-reports.schema.ts
53912
53944
  var MergeReportsFailed = class extends TaggedError()("MergeReportsFailed", { reason: String$1 }) {};
@@ -99077,6 +99109,7 @@ const TestFileLikeSchema = Struct({
99077
99109
  tests: ArraySchema(TestDefinitionLikeSchema)
99078
99110
  });
99079
99111
  const IncrementalReportSchema = StructWithRest(Struct({
99112
+ incrementalVersion: String$1,
99080
99113
  schemaVersion: String$1,
99081
99114
  thresholds: Struct({
99082
99115
  high: Finite,
@@ -99085,7 +99118,85 @@ const IncrementalReportSchema = StructWithRest(Struct({
99085
99118
  files: Record(String$1, FileResultLikeSchema),
99086
99119
  testFiles: optional$4(Record(String$1, TestFileLikeSchema))
99087
99120
  }), [Record(String$1, Unknown)]);
99088
- var IncrementalReportError = class extends TaggedError()("IncrementalReportError", { message: String$1 }) {};
99121
+ //#endregion
99122
+ //#region src/admit-incremental-report.workflow.ts
99123
+ var AdmitIncrementalReportCommand = class extends TaggedClass()("AdmitIncrementalReportCommand", {
99124
+ report: optional$4(IncrementalReportSchema),
99125
+ expectedVersion: String$1
99126
+ }) {};
99127
+ const IncrementalReportDecisionTypeId = Symbol.for("@systemfsoftware/stryker-js/IncrementalReportDecision");
99128
+ var IncrementalReportKeep = class extends TaggedClass()("IncrementalReportKeep", { report: IncrementalReportSchema }) {
99129
+ [IncrementalReportDecisionTypeId] = IncrementalReportDecisionTypeId;
99130
+ };
99131
+ var IncrementalReportDiscard = class extends TaggedClass()("IncrementalReportDiscard", {
99132
+ actual: optional$4(String$1),
99133
+ expected: String$1
99134
+ }) {
99135
+ [IncrementalReportDecisionTypeId] = IncrementalReportDecisionTypeId;
99136
+ };
99137
+ const decide = (command) => match$6(fromUndefinedOr(command.report), {
99138
+ onNone: () => IncrementalReportDiscard.make({
99139
+ actual: void 0,
99140
+ expected: command.expectedVersion
99141
+ }),
99142
+ onSome: (report) => value(report.incrementalVersion === command.expectedVersion).pipe(when(true, () => IncrementalReportKeep.make({ report })), orElse(() => IncrementalReportDiscard.make({
99143
+ actual: report.incrementalVersion,
99144
+ expected: command.expectedVersion
99145
+ })))
99146
+ });
99147
+ const admitIncrementalReport = Workflow_exports.total(AdmitIncrementalReportCommand, (command) => succeed$8(decide(command)));
99148
+ //#endregion
99149
+ //#region src/stryker-package.schema.ts
99150
+ const PackageJsonSchema = Struct({ version: String$1 });
99151
+ //#endregion
99152
+ //#region src/stryker-package.ts
99153
+ const rawPackageJson = package_default;
99154
+ const strykerVersion = decodeUnknownSync(PackageJsonSchema)(rawPackageJson).version;
99155
+ //#endregion
99156
+ //#region src/incremental-report.cell.ts
99157
+ const parseAndDecodeIncrementalReport = decodeUnknownResult(fromJsonString(IncrementalReportSchema));
99158
+ const readIncrementalReportRaw = (input) => {
99159
+ if (!input.incremental) return succeed$4({
99160
+ incremental: false,
99161
+ incrementalFile: input.incrementalFile,
99162
+ contents: void 0
99163
+ });
99164
+ return gen(function* () {
99165
+ const contents = yield* (yield* FileSystem).readFileString(input.incrementalFile).pipe(catchTag("PlatformError", (error) => value(error.reason).pipe(tag("NotFound", () => logInfo(`No incremental result file found at ${input.incrementalFile}, a full mutation testing run will be performed.`).pipe(as(void 0))), orElse(() => fail(error)))));
99166
+ return {
99167
+ incremental: true,
99168
+ incrementalFile: input.incrementalFile,
99169
+ contents
99170
+ };
99171
+ });
99172
+ };
99173
+ const decodeIncrementalReportRaw = (raw) => succeed$8(AdmitIncrementalReportCommand.make({
99174
+ report: getOrUndefined$1(flatMap$5(fromUndefinedOr(raw.contents), (text) => getSuccess(parseAndDecodeIncrementalReport(text)))),
99175
+ expectedVersion: strykerVersion
99176
+ }));
99177
+ const writeIncrementalReportOutcome = (outcome, raw) => match$5(outcome, {
99178
+ onFailure: (error) => fail(error),
99179
+ onSuccess: (decision) => value(decision).pipe(tag("IncrementalReportKeep", (keep) => {
99180
+ const report = keep.report;
99181
+ return succeedSome(report);
99182
+ }), tag("IncrementalReportDiscard", (discard) => {
99183
+ if (!raw.incremental) return succeedNone;
99184
+ return match$6(fromUndefinedOr(raw.contents), {
99185
+ onNone: () => succeedNone,
99186
+ onSome: () => match$6(fromUndefinedOr(discard.actual), {
99187
+ onNone: () => logInfo(`Unable to parse incremental result file at ${raw.incrementalFile}; a full mutation testing run will be performed.`).pipe(as(none())),
99188
+ onSome: (actual) => logInfo(`Incremental result file at ${raw.incrementalFile} version ${actual} does not match expected version ${discard.expected}; a full mutation testing run will be performed.`).pipe(as(none()))
99189
+ })
99190
+ });
99191
+ }), exhaustive)
99192
+ });
99193
+ const incrementalReportCell = Cell_exports.layer({
99194
+ read: readIncrementalReportRaw,
99195
+ decode: decodeIncrementalReportRaw,
99196
+ decide: admitIncrementalReport,
99197
+ encode: (outcome) => outcome,
99198
+ write: writeIncrementalReportOutcome
99199
+ });
99089
99200
  //#endregion
99090
99201
  //#region src/Project.ts
99091
99202
  const DEFAULT_GLOB$1 = "**/*.{js,ts,jsx,tsx,html,vue,mjs,mts,cts,cjs}";
@@ -99307,54 +99418,6 @@ const selectFiles = (input) => ({
99307
99418
  fileDescriptions: resolveFileDescriptionsPure(input.inputFileNames, input.mutatePatterns, input.targetMutatePatterns, input.basePath),
99308
99419
  testFiles: resolveTestFilesPure(input.inputFileNames, input.testFilePatterns, input.basePath)
99309
99420
  });
99310
- const toPosition = (position) => ({
99311
- line: position.line,
99312
- column: position.column
99313
- });
99314
- const toLocation = (location) => ({
99315
- start: toPosition(location.start),
99316
- end: toPosition(location.end)
99317
- });
99318
- const toOpenEndLocation = (location) => match$6(fromUndefinedOr(location.end), {
99319
- onNone: () => ({ start: toPosition(location.start) }),
99320
- onSome: (end) => ({
99321
- start: toPosition(location.start),
99322
- end: toPosition(end)
99323
- })
99324
- });
99325
- const withMappedMutantLocations = (report) => Object.fromEntries(Object.entries(report.files).map(([fileName, file]) => [fileName, {
99326
- ...file,
99327
- mutants: file.mutants.map((mutant) => ({
99328
- ...mutant,
99329
- location: toLocation(mutant.location)
99330
- }))
99331
- }]));
99332
- const withMappedTestLocations = (testFiles) => Object.fromEntries(Object.entries(testFiles).map(([fileName, file]) => [fileName, {
99333
- ...file,
99334
- tests: file.tests.map((test) => match$6(fromUndefinedOr(test.location), {
99335
- onNone: () => ({ ...test }),
99336
- onSome: (location) => ({
99337
- ...test,
99338
- location: toOpenEndLocation(location)
99339
- })
99340
- }))
99341
- }]));
99342
- const reshape = (decoded) => match$6(fromUndefinedOr(decoded.testFiles), {
99343
- onNone: () => ({
99344
- ...decoded,
99345
- files: withMappedMutantLocations(decoded)
99346
- }),
99347
- onSome: (testFiles) => ({
99348
- ...decoded,
99349
- files: withMappedMutantLocations(decoded),
99350
- testFiles: withMappedTestLocations(testFiles)
99351
- })
99352
- });
99353
- const decodeIncrementalReport = (raw) => match$5(decodeUnknownResult(IncrementalReportSchema)(raw), {
99354
- onFailure: () => fail$4(IncrementalReportError.make({ message: "The incremental report is not a mutation testing report; delete it or re-run without --incremental." })),
99355
- onSuccess: (decoded) => succeed$8(reshape(decoded))
99356
- });
99357
- const parseJson = (text) => JSON.parse(text);
99358
99421
  const stringArrayEquivalence = Array_(String$4);
99359
99422
  function makeProjectFile(name, mutate, content, originalContent) {
99360
99423
  return {
@@ -99511,23 +99574,6 @@ function resolveInputFileNames(ignoreRules, basePath) {
99511
99574
  return yield* crawlDir(basePath, basePath);
99512
99575
  });
99513
99576
  }
99514
- function parseIncrementalReport(contents) {
99515
- return match$6(fromUndefinedOr(contents), {
99516
- onNone: () => succeedNone,
99517
- onSome: (text) => gen(function* () {
99518
- const parsed = yield* try_(() => parseJson(text));
99519
- const rawReport = yield* fromResult(decodeIncrementalReport(parsed));
99520
- const isMutationTestResult = (_value) => true;
99521
- if (!isMutationTestResult(rawReport)) throw new Error("Invalid incremental report shape");
99522
- return fromUndefinedOr(rawReport);
99523
- })
99524
- });
99525
- }
99526
- function readIncrementalReport(incremental, incrementalFile) {
99527
- return value(incremental).pipe(when(false, () => succeedNone), orElse(() => gen(function* () {
99528
- return yield* parseIncrementalReport(yield* (yield* FileSystem).readFileString(incrementalFile).pipe(catchTag("PlatformError", (error) => value(error.reason).pipe(tag("NotFound", () => logInfo(`No incremental result file found at ${incrementalFile}, a full mutation testing run will be performed.`).pipe(as(void 0))), orElse(() => fail(error))))));
99529
- })));
99530
- }
99531
99577
  function readProject(options, targetMutatePatterns, basePath) {
99532
99578
  const { mutate, tempDirName, ignorePatterns, incremental, incrementalFile, progressStreamFile, htmlReporter, jsonReporter, testFiles } = options;
99533
99579
  const mutatePatterns = mutate;
@@ -99579,7 +99625,10 @@ function readProject(options, targetMutatePatterns, basePath) {
99579
99625
  basePath
99580
99626
  }).testFiles.length === 0) yield* logWarning(`Glob pattern "${pattern}" did not match any test files.`);
99581
99627
  }));
99582
- const incrementalReport = yield* readIncrementalReport(incremental, incrementalFile);
99628
+ const incrementalReport = yield* incrementalReportCell.run({
99629
+ incremental,
99630
+ incrementalFile
99631
+ });
99583
99632
  return makeProject(decision.fileDescriptions, getOrUndefined$1(incrementalReport), [...decision.testFiles]);
99584
99633
  });
99585
99634
  }
@@ -100827,13 +100876,6 @@ const assembleTestFiles = (input) => {
100827
100876
  return Object.fromEntries(entries);
100828
100877
  };
100829
100878
  //#endregion
100830
- //#region src/stryker-package.schema.ts
100831
- const PackageJsonSchema = Struct({ version: String$1 });
100832
- //#endregion
100833
- //#region src/stryker-package.ts
100834
- const rawPackageJson = package_default;
100835
- const strykerVersion = decodeUnknownSync(PackageJsonSchema)(rawPackageJson).version;
100836
- //#endregion
100837
100879
  //#region ../../node_modules/.pnpm/@noble+hashes@2.4.0/node_modules/@noble/hashes/utils.js
100838
100880
  /**
100839
100881
  * Checks if something is Uint8Array. Be careful: nodejs Buffer will return true.
@@ -101399,7 +101441,10 @@ const makeMutationReportingService = (input) => {
101399
101441
  const fs = yield* FileSystem;
101400
101442
  const dir = pathService.dirname(input.options.incrementalFile);
101401
101443
  yield* fs.makeDirectory(dir, { recursive: true });
101402
- const json = yield* encodeEffect(fromJsonString(Unknown, { space: 2 }))(report).pipe(orDie);
101444
+ const json = yield* encodeEffect(fromJsonString(Unknown, { space: 2 }))({
101445
+ incrementalVersion: strykerVersion,
101446
+ ...report
101447
+ }).pipe(orDie);
101403
101448
  yield* fs.writeFileString(input.options.incrementalFile, json);
101404
101449
  }
101405
101450
  return {
@@ -101418,6 +101463,7 @@ const makeMutationReportingService = (input) => {
101418
101463
  const slimIncrementalReport = (results) => gen(function* () {
101419
101464
  const { files, testFiles } = yield* assembleReport(results);
101420
101465
  return {
101466
+ incrementalVersion: strykerVersion,
101421
101467
  schemaVersion: "1.0",
101422
101468
  thresholds: input.options.thresholds,
101423
101469
  files,
@@ -1777,59 +1777,6 @@ interface SpawnReporterWorkerParams {
1777
1777
  }
1778
1778
  declare const spawnReporterWorker: (params: SpawnReporterWorkerParams) => Effect$1.Effect<ReporterWorkerClient, WorkerBootError, Scope.Scope | WorkerLauncher>;
1779
1779
  //#endregion
1780
- //#region src/IncrementalReport.schema.d.ts
1781
- declare const IncrementalReportSchema: S.StructWithRest<S.Struct<{
1782
- readonly schemaVersion: S.String;
1783
- readonly thresholds: S.Struct<{
1784
- readonly high: S.Finite;
1785
- readonly low: S.Finite;
1786
- }>;
1787
- readonly files: S.$Record<S.String, S.Struct<{
1788
- readonly language: S.String;
1789
- readonly source: S.String;
1790
- readonly mutants: S.$Array<S.Struct<{
1791
- readonly id: S.String;
1792
- readonly mutatorName: S.String;
1793
- readonly replacement: S.String;
1794
- readonly location: S.Struct<{
1795
- readonly start: S.Struct<{
1796
- readonly line: S.Finite;
1797
- readonly column: S.Finite;
1798
- }>;
1799
- readonly end: S.Struct<{
1800
- readonly line: S.Finite;
1801
- readonly column: S.Finite;
1802
- }>;
1803
- }>;
1804
- readonly status: S.Literals<readonly ["Killed", "Survived", "NoCoverage", "Timeout", "CompileError", "RuntimeError", "Ignored", "Pending"]>;
1805
- readonly killedBy: S.optional<S.$Array<S.String>>;
1806
- readonly coveredBy: S.optional<S.$Array<S.String>>;
1807
- readonly static: S.optional<S.Boolean>;
1808
- readonly statusReason: S.optional<S.String>;
1809
- readonly testsCompleted: S.optional<S.Finite>;
1810
- readonly description: S.optional<S.String>;
1811
- readonly duration: S.optional<S.Finite>;
1812
- }>>;
1813
- }>>;
1814
- readonly testFiles: S.optional<S.$Record<S.String, S.Struct<{
1815
- readonly source: S.optional<S.String>;
1816
- readonly tests: S.$Array<S.Struct<{
1817
- readonly id: S.String;
1818
- readonly name: S.String;
1819
- readonly location: S.optional<S.Struct<{
1820
- readonly start: S.Struct<{
1821
- readonly line: S.Finite;
1822
- readonly column: S.Finite;
1823
- }>;
1824
- readonly end: S.optional<S.Struct<{
1825
- readonly line: S.Finite;
1826
- readonly column: S.Finite;
1827
- }>>;
1828
- }>>;
1829
- }>>;
1830
- }>>>;
1831
- }>, readonly [S.$Record<S.String, S.Unknown>]>;
1832
- //#endregion
1833
1780
  //#region src/Project.d.ts
1834
1781
  interface ProjectFile extends FileDescription {
1835
1782
  readonly name: string;
@@ -1914,4 +1861,4 @@ interface MutationTestDone {
1914
1861
  readonly verdict: ExitClass | null;
1915
1862
  }
1916
1863
  //#endregion
1917
- export { PluginDescriptorOf as $, ExtendsStepDecision as A, connectRetry as At, MergeCommand as B, ConfigDocumentSchema as C, SpawnedSocketWorker as Ct, ConfigFileUnreadableError as D, WorkerLauncher as Dt, ConfigFileNotFoundError as E, WorkerExit as Et, ExtendsStepRefused as F, StageError as Ft, survivorsPriorReport as G, ReadConfigCommand as H, ExtendsStepResolve as I, AnyWorkerPluginSource as J, AnyPluginDescriptor as K, ExtendsStepState as L, ExtendsStepDocumentSchema as M, ChildProcessCrashedError as Mt, ExtendsStepDone as N, OutOfMemoryError as Nt, ConfigFileUnsupportedError as O, WorkerLauncherShape as Ot, ExtendsStepRead as P, WorkerBootTimeoutError as Pt, PluginDescriptor as Q, ExtendsStepStateSchema as R, spawnReporterWorker as S, VerdictReached as St, ConfigFileInvalidError as T, WorkerClientParams as Tt, extendsPropertySchema as U, MergeResult as V, forkOptionsSchema as W, EvaluatorPluginSource as X, EvaluatorPluginDescriptor as Y, LoadedPlugins as Z, REPORTER_EVENT_BATCH_BOUND as _, RunFailed as _t, WiredRunLayer as a, IdGenerator as at, SpawnReporterWorkerParams as b, RunStarted as bt, PrepareDone as c, TestCoverage as ct, RunEnvironmentShape as d, RunIdentityShape as dt, PluginKind as et, SandboxHandle as f, Heartbeat as ft, IncrementalReportSchema as g, RunEvent as gt, ProjectFile as h, PlanKnown as ht, StageServices as i, Ignorer as it, ExtendsStepDocument as j, makeWorkerClient as jt, ExtendsRefusalReason as k, WorkerSpawnParams as kt, PrepareExecutorArgs as l, RunEvents as lt, Project as m, PhaseEntered as mt, EnginePorts as n, WorkerPluginDescriptor as nt, DryRunDone as o, IdGeneratorShape as ot, StrykerError as p, HelpRendered as pt, AnyWorkerPluginDescriptor as q, RunStageServices as r, WorkerPluginSource as rt, InstrumentDone as s, classifyWorkerExit as st, MutationTestDone as t, PluginSource as tt, RunEnvironment as u, RunIdentity as ut, ReporterStage as v, RunMutantTested as vt, ConfigError as w, WorkerBootError as wt, reporterWorkerFactory as x, RunTerminalEvent as xt, ReporterWorkerClient as y, RunPhase as yt, ImportedModuleSchema as z };
1864
+ export { PluginKind as $, ExtendsStepDocument as A, makeWorkerClient as At, MergeResult as B, ConfigError as C, WorkerBootError as Ct, ConfigFileUnsupportedError as D, WorkerLauncherShape as Dt, ConfigFileUnreadableError as E, WorkerLauncher as Et, ExtendsStepResolve as F, AnyPluginDescriptor as G, extendsPropertySchema as H, ExtendsStepState as I, EvaluatorPluginDescriptor as J, AnyWorkerPluginDescriptor as K, ExtendsStepStateSchema as L, ExtendsStepDone as M, OutOfMemoryError as Mt, ExtendsStepRead as N, WorkerBootTimeoutError as Nt, ExtendsRefusalReason as O, WorkerSpawnParams as Ot, ExtendsStepRefused as P, StageError as Pt, PluginDescriptorOf as Q, ImportedModuleSchema as R, ConfigDocumentSchema as S, SpawnedSocketWorker as St, ConfigFileNotFoundError as T, WorkerExit as Tt, forkOptionsSchema as U, ReadConfigCommand as V, survivorsPriorReport as W, LoadedPlugins as X, EvaluatorPluginSource as Y, PluginDescriptor as Z, ReporterStage as _, RunMutantTested as _t, WiredRunLayer as a, IdGeneratorShape as at, reporterWorkerFactory as b, RunTerminalEvent as bt, PrepareDone as c, RunEvents as ct, RunEnvironmentShape as d, Heartbeat as dt, PluginSource as et, SandboxHandle as f, HelpRendered as ft, REPORTER_EVENT_BATCH_BOUND as g, RunFailed as gt, ProjectFile as h, RunEvent as ht, StageServices as i, IdGenerator as it, ExtendsStepDocumentSchema as j, ChildProcessCrashedError as jt, ExtendsStepDecision as k, connectRetry as kt, PrepareExecutorArgs as l, RunIdentity as lt, Project as m, PlanKnown as mt, EnginePorts as n, WorkerPluginSource as nt, DryRunDone as o, classifyWorkerExit as ot, StrykerError as p, PhaseEntered as pt, AnyWorkerPluginSource as q, RunStageServices as r, Ignorer as rt, InstrumentDone as s, TestCoverage as st, MutationTestDone as t, WorkerPluginDescriptor as tt, RunEnvironment as u, RunIdentityShape as ut, ReporterWorkerClient as v, RunPhase as vt, ConfigFileInvalidError as w, WorkerClientParams as wt, spawnReporterWorker as x, VerdictReached as xt, SpawnReporterWorkerParams as y, RunStarted as yt, MergeCommand as z };
@@ -1,5 +1,5 @@
1
1
  import { L as PartialStrykerOptions } from "./output-mode-CE6VNHfH.mjs";
2
- import { t as MutationTestDone } from "./mutation-test.cell-Ch-QUquW.mjs";
2
+ import { t as MutationTestDone } from "./mutation-test.cell-BTa-up9u.mjs";
3
3
  //#region src/promises/index.d.ts
4
4
  export declare const run: (options: PartialStrykerOptions, targetMutatePatterns?: readonly string[]) => Promise<MutationTestDone>;
5
5
  //#endregion
package/dist/promises.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as strykerCell } from "./src-WMC3thmX.mjs";
1
+ import { t as strykerCell } from "./src-BQuaL-fB.mjs";
2
2
  import * as Layer from "effect/Layer";
3
3
  import * as NodeFileSystem from "@effect/platform-node-shared/NodeFileSystem";
4
4
  import * as NodePath from "@effect/platform-node-shared/NodePath";
@@ -6204,11 +6204,11 @@ function replaceFirstMatch(path, original, replacement) {
6204
6204
  */
6205
6205
  function toApiLocation(startOffset, endOffset, lineTable, offset) {
6206
6206
  return {
6207
- start: toPosition$1(positionFromLineTable(startOffset, lineTable), offset),
6208
- end: toPosition$1(positionFromLineTable(endOffset, lineTable), offset)
6207
+ start: toPosition(positionFromLineTable(startOffset, lineTable), offset),
6208
+ end: toPosition(positionFromLineTable(endOffset, lineTable), offset)
6209
6209
  };
6210
6210
  }
6211
- function toPosition$1(source, offset) {
6211
+ function toPosition(source, offset) {
6212
6212
  let columnOffset = 0;
6213
6213
  if (source.line === 1) columnOffset = offset.column;
6214
6214
  return {
@@ -11805,12 +11805,193 @@ const ThresholdsLikeSchema = S.Struct({
11805
11805
  low: S.Finite
11806
11806
  });
11807
11807
  const IncrementalReportSchema = S.StructWithRest(S.Struct({
11808
+ incrementalVersion: S.String,
11808
11809
  schemaVersion: S.String,
11809
11810
  thresholds: ThresholdsLikeSchema,
11810
11811
  files: S.Record(S.String, FileResultLikeSchema),
11811
11812
  testFiles: S.optional(S.Record(S.String, TestFileLikeSchema))
11812
11813
  }), [S.Record(S.String, S.Unknown)]);
11813
- var IncrementalReportError = class extends S.TaggedError()("IncrementalReportError", { message: S.String }) {};
11814
+ //#endregion
11815
+ //#region src/admit-incremental-report.workflow.ts
11816
+ var AdmitIncrementalReportCommand = class extends S.TaggedClass()("AdmitIncrementalReportCommand", {
11817
+ report: S.optional(IncrementalReportSchema),
11818
+ expectedVersion: S.String
11819
+ }) {};
11820
+ const IncrementalReportDecisionTypeId = Symbol.for("@systemfsoftware/stryker-js/IncrementalReportDecision");
11821
+ var IncrementalReportKeep = class extends S.TaggedClass()("IncrementalReportKeep", { report: IncrementalReportSchema }) {
11822
+ [IncrementalReportDecisionTypeId] = IncrementalReportDecisionTypeId;
11823
+ };
11824
+ var IncrementalReportDiscard = class extends S.TaggedClass()("IncrementalReportDiscard", {
11825
+ actual: S.optional(S.String),
11826
+ expected: S.String
11827
+ }) {
11828
+ [IncrementalReportDecisionTypeId] = IncrementalReportDecisionTypeId;
11829
+ };
11830
+ const decide = (command) => Option.match(Option.fromUndefinedOr(command.report), {
11831
+ onNone: () => IncrementalReportDiscard.make({
11832
+ actual: void 0,
11833
+ expected: command.expectedVersion
11834
+ }),
11835
+ onSome: (report) => Match.value(report.incrementalVersion === command.expectedVersion).pipe(Match.when(true, () => IncrementalReportKeep.make({ report })), Match.orElse(() => IncrementalReportDiscard.make({
11836
+ actual: report.incrementalVersion,
11837
+ expected: command.expectedVersion
11838
+ })))
11839
+ });
11840
+ const admitIncrementalReport = Workflow.total(AdmitIncrementalReportCommand, (command) => Result.succeed(decide(command)));
11841
+ //#endregion
11842
+ //#region package.json
11843
+ var package_default = {
11844
+ name: "@systemfsoftware/stryker-js",
11845
+ version: "9.0.0",
11846
+ repository: {
11847
+ "type": "git",
11848
+ "url": "git+https://github.com/systemfsoftware/stryker-js-effect.git",
11849
+ "directory": "packages/stryker-js"
11850
+ },
11851
+ homepage: "https://github.com/systemfsoftware/stryker-js-effect",
11852
+ bugs: { "url": "https://github.com/systemfsoftware/stryker-js-effect/issues" },
11853
+ description: "The Stryker mutation testing tool — the stryker executable, the run engine, and the configuration surface.",
11854
+ type: "module",
11855
+ files: ["dist"],
11856
+ bin: { "stryker": "./dist/main.mjs" },
11857
+ scripts: {
11858
+ "clean": "rimraf dist",
11859
+ "build": "rimraf dist && tsdown --config tsdown.bin.config.ts && tsdown --config tsdown.config.ts",
11860
+ "typecheck": "tsc --noEmit --incremental && tsc -p tsconfig.node.json --noEmit",
11861
+ "test": "vitest run",
11862
+ "mutation": "stryker run",
11863
+ "attw": "attw --pack .",
11864
+ "lint": "f=${OXLINT_FORMAT:-${AGENT:+agent}}; oxlint . --format=${f:-default}",
11865
+ "api:check": "api-extractor run",
11866
+ "api:update": "api-extractor run --local",
11867
+ "lint:tsgo": "effect-tsgo diagnostics --project tsconfig.json --format ${TSGO_FORMAT:-text}"
11868
+ },
11869
+ license: "Apache-2.0",
11870
+ engines: { "node": ">=22.18.0" },
11871
+ dependencies: {
11872
+ "@effect/opentelemetry": "4.0.0-rc.112",
11873
+ "@effect/platform-node": "catalog:",
11874
+ "@effect/platform-node-shared": "catalog:",
11875
+ "@noble/hashes": "catalog:",
11876
+ "@opentelemetry/api": "^1.9.0",
11877
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.208.0",
11878
+ "@opentelemetry/exporter-trace-otlp-http": "^0.208.0",
11879
+ "@opentelemetry/sdk-metrics": "^2.2.0",
11880
+ "@opentelemetry/sdk-trace-base": "^2.2.0",
11881
+ "@systemfsoftware/effect-cell-types": "catalog:"
11882
+ },
11883
+ peerDependencies: { "effect": "catalog:" },
11884
+ devDependencies: {
11885
+ "@effect/tsgo": "catalog:",
11886
+ "@effect/vitest": "catalog:",
11887
+ "@microsoft/api-extractor": "catalog:",
11888
+ "@oxc-parser/binding-wasm32-wasi": "catalog:",
11889
+ "@std/jsonc": "catalog:",
11890
+ "@systemfsoftware/all": "catalog:",
11891
+ "@systemfsoftware/arethetypeswrong-cli": "catalog:",
11892
+ "@systemfsoftware/effect-gherkin-spec": "catalog:",
11893
+ "@systemfsoftware/effect-schema-law": "catalog:",
11894
+ "@systemfsoftware/effect-schema-vite": "catalog:",
11895
+ "@systemfsoftware/stryker-config": "workspace:^",
11896
+ "@systemfsoftware/stryker-ignorer-effect-schema-declarations": "catalog:stryker",
11897
+ "@systemfsoftware/stryker-ignorer-in-source-vitest-block": "catalog:stryker",
11898
+ "@systemfsoftware/stryker-ignorer-interface": "workspace:^",
11899
+ "@systemfsoftware/stryker-js": "catalog:stryker",
11900
+ "@systemfsoftware/stryker-js-html-reporter": "workspace:^",
11901
+ "@systemfsoftware/stryker-js-instrumenter": "workspace:^",
11902
+ "@systemfsoftware/stryker-js-plugin-interface": "workspace:^",
11903
+ "@systemfsoftware/stryker-js-plugin-runtime": "workspace:^",
11904
+ "@systemfsoftware/stryker-js-typescript-checker": "catalog:stryker",
11905
+ "@systemfsoftware/stryker-js-vitest-runner": "catalog:stryker",
11906
+ "@systemfsoftware/stryker-test-contribution": "catalog:stryker",
11907
+ "@systemfsoftware/tsconfig": "catalog:",
11908
+ "@systemfsoftware/tsdown-config": "workspace:^",
11909
+ "@systemfsoftware/vitest-config": "workspace:^",
11910
+ "@types/node": "catalog:",
11911
+ "@vitest/coverage-v8": "catalog:",
11912
+ "concurrently": "catalog:",
11913
+ "mutation-testing-elements": "catalog:stryker",
11914
+ "oxc-parser": "catalog:",
11915
+ "oxlint": "catalog:",
11916
+ "oxlint-tsgolint": "catalog:",
11917
+ "rimraf": "catalog:",
11918
+ "tsdown": "catalog:",
11919
+ "typescript": "catalog:",
11920
+ "vitest": "catalog:"
11921
+ },
11922
+ publishConfig: {
11923
+ "access": "public",
11924
+ "provenance": true,
11925
+ "exports": {
11926
+ ".": {
11927
+ "types": "./dist/index.d.mts",
11928
+ "default": "./dist/index.mjs"
11929
+ },
11930
+ "./config": {
11931
+ "types": "./dist/config.d.mts",
11932
+ "default": "./dist/config.mjs"
11933
+ },
11934
+ "./promises": {
11935
+ "types": "./dist/promises.d.mts",
11936
+ "default": "./dist/promises.mjs"
11937
+ },
11938
+ "./package.json": "./package.json"
11939
+ }
11940
+ },
11941
+ exports: { "./package.json": "./package.json" }
11942
+ };
11943
+ //#endregion
11944
+ //#region src/stryker-package.schema.ts
11945
+ const PackageJsonSchema = Schema.Struct({ version: Schema.String });
11946
+ //#endregion
11947
+ //#region src/stryker-package.ts
11948
+ const rawPackageJson = package_default;
11949
+ const strykerVersion = Schema.decodeUnknownSync(PackageJsonSchema)(rawPackageJson).version;
11950
+ //#endregion
11951
+ //#region src/incremental-report.cell.ts
11952
+ const parseAndDecodeIncrementalReport = S.decodeUnknownResult(S.fromJsonString(IncrementalReportSchema));
11953
+ const readIncrementalReportRaw = (input) => {
11954
+ if (!input.incremental) return Effect$1.succeed({
11955
+ incremental: false,
11956
+ incrementalFile: input.incrementalFile,
11957
+ contents: void 0
11958
+ });
11959
+ return Effect$1.gen(function* () {
11960
+ const contents = yield* (yield* FileSystem.FileSystem).readFileString(input.incrementalFile).pipe(Effect$1.catchTag("PlatformError", (error) => Match.value(error.reason).pipe(Match.tag("NotFound", () => Effect$1.logInfo(`No incremental result file found at ${input.incrementalFile}, a full mutation testing run will be performed.`).pipe(Effect$1.as(void 0))), Match.orElse(() => Effect$1.fail(error)))));
11961
+ return {
11962
+ incremental: true,
11963
+ incrementalFile: input.incrementalFile,
11964
+ contents
11965
+ };
11966
+ });
11967
+ };
11968
+ const decodeIncrementalReportRaw = (raw) => Result.succeed(AdmitIncrementalReportCommand.make({
11969
+ report: Option.getOrUndefined(Option.flatMap(Option.fromUndefinedOr(raw.contents), (text) => Result.getSuccess(parseAndDecodeIncrementalReport(text)))),
11970
+ expectedVersion: strykerVersion
11971
+ }));
11972
+ const writeIncrementalReportOutcome = (outcome, raw) => Result.match(outcome, {
11973
+ onFailure: (error) => Effect$1.fail(error),
11974
+ onSuccess: (decision) => Match.value(decision).pipe(Match.tag("IncrementalReportKeep", (keep) => {
11975
+ const report = keep.report;
11976
+ return Effect$1.succeedSome(report);
11977
+ }), Match.tag("IncrementalReportDiscard", (discard) => {
11978
+ if (!raw.incremental) return Effect$1.succeedNone;
11979
+ return Option.match(Option.fromUndefinedOr(raw.contents), {
11980
+ onNone: () => Effect$1.succeedNone,
11981
+ onSome: () => Option.match(Option.fromUndefinedOr(discard.actual), {
11982
+ onNone: () => Effect$1.logInfo(`Unable to parse incremental result file at ${raw.incrementalFile}; a full mutation testing run will be performed.`).pipe(Effect$1.as(Option.none())),
11983
+ onSome: (actual) => Effect$1.logInfo(`Incremental result file at ${raw.incrementalFile} version ${actual} does not match expected version ${discard.expected}; a full mutation testing run will be performed.`).pipe(Effect$1.as(Option.none()))
11984
+ })
11985
+ });
11986
+ }), Match.exhaustive)
11987
+ });
11988
+ const incrementalReportCell = Cell.layer({
11989
+ read: readIncrementalReportRaw,
11990
+ decode: decodeIncrementalReportRaw,
11991
+ decide: admitIncrementalReport,
11992
+ encode: (outcome) => outcome,
11993
+ write: writeIncrementalReportOutcome
11994
+ });
11814
11995
  //#endregion
11815
11996
  //#region src/Project.ts
11816
11997
  const DEFAULT_GLOB$1 = "**/*.{js,ts,jsx,tsx,html,vue,mjs,mts,cts,cjs}";
@@ -12032,54 +12213,6 @@ const selectFiles = (input) => ({
12032
12213
  fileDescriptions: resolveFileDescriptionsPure(input.inputFileNames, input.mutatePatterns, input.targetMutatePatterns, input.basePath),
12033
12214
  testFiles: resolveTestFilesPure(input.inputFileNames, input.testFilePatterns, input.basePath)
12034
12215
  });
12035
- const toPosition = (position) => ({
12036
- line: position.line,
12037
- column: position.column
12038
- });
12039
- const toLocation = (location) => ({
12040
- start: toPosition(location.start),
12041
- end: toPosition(location.end)
12042
- });
12043
- const toOpenEndLocation = (location) => Option.match(Option.fromUndefinedOr(location.end), {
12044
- onNone: () => ({ start: toPosition(location.start) }),
12045
- onSome: (end) => ({
12046
- start: toPosition(location.start),
12047
- end: toPosition(end)
12048
- })
12049
- });
12050
- const withMappedMutantLocations = (report) => Object.fromEntries(Object.entries(report.files).map(([fileName, file]) => [fileName, {
12051
- ...file,
12052
- mutants: file.mutants.map((mutant) => ({
12053
- ...mutant,
12054
- location: toLocation(mutant.location)
12055
- }))
12056
- }]));
12057
- const withMappedTestLocations = (testFiles) => Object.fromEntries(Object.entries(testFiles).map(([fileName, file]) => [fileName, {
12058
- ...file,
12059
- tests: file.tests.map((test) => Option.match(Option.fromUndefinedOr(test.location), {
12060
- onNone: () => ({ ...test }),
12061
- onSome: (location) => ({
12062
- ...test,
12063
- location: toOpenEndLocation(location)
12064
- })
12065
- }))
12066
- }]));
12067
- const reshape = (decoded) => Option.match(Option.fromUndefinedOr(decoded.testFiles), {
12068
- onNone: () => ({
12069
- ...decoded,
12070
- files: withMappedMutantLocations(decoded)
12071
- }),
12072
- onSome: (testFiles) => ({
12073
- ...decoded,
12074
- files: withMappedMutantLocations(decoded),
12075
- testFiles: withMappedTestLocations(testFiles)
12076
- })
12077
- });
12078
- const decodeIncrementalReport = (raw) => Result.match(S.decodeUnknownResult(IncrementalReportSchema)(raw), {
12079
- onFailure: () => Result.fail(IncrementalReportError.make({ message: "The incremental report is not a mutation testing report; delete it or re-run without --incremental." })),
12080
- onSuccess: (decoded) => Result.succeed(reshape(decoded))
12081
- });
12082
- const parseJson = (text) => JSON.parse(text);
12083
12216
  const stringArrayEquivalence = Equivalence.Array(Equivalence.String);
12084
12217
  function makeProjectFile(name, mutate, content, originalContent) {
12085
12218
  return {
@@ -12236,23 +12369,6 @@ function resolveInputFileNames(ignoreRules, basePath) {
12236
12369
  return yield* crawlDir(basePath, basePath);
12237
12370
  });
12238
12371
  }
12239
- function parseIncrementalReport(contents) {
12240
- return Option.match(Option.fromUndefinedOr(contents), {
12241
- onNone: () => Effect$1.succeedNone,
12242
- onSome: (text) => Effect$1.gen(function* () {
12243
- const parsed = yield* Effect$1.try(() => parseJson(text));
12244
- const rawReport = yield* Effect$1.fromResult(decodeIncrementalReport(parsed));
12245
- const isMutationTestResult = (_value) => true;
12246
- if (!isMutationTestResult(rawReport)) throw new Error("Invalid incremental report shape");
12247
- return Option.fromUndefinedOr(rawReport);
12248
- })
12249
- });
12250
- }
12251
- function readIncrementalReport(incremental, incrementalFile) {
12252
- return Match.value(incremental).pipe(Match.when(false, () => Effect$1.succeedNone), Match.orElse(() => Effect$1.gen(function* () {
12253
- return yield* parseIncrementalReport(yield* (yield* FileSystem.FileSystem).readFileString(incrementalFile).pipe(Effect$1.catchTag("PlatformError", (error) => Match.value(error.reason).pipe(Match.tag("NotFound", () => Effect$1.logInfo(`No incremental result file found at ${incrementalFile}, a full mutation testing run will be performed.`).pipe(Effect$1.as(void 0))), Match.orElse(() => Effect$1.fail(error))))));
12254
- })));
12255
- }
12256
12372
  function readProject(options, targetMutatePatterns, basePath) {
12257
12373
  const { mutate, tempDirName, ignorePatterns, incremental, incrementalFile, progressStreamFile, htmlReporter, jsonReporter, testFiles } = options;
12258
12374
  const mutatePatterns = mutate;
@@ -12304,7 +12420,10 @@ function readProject(options, targetMutatePatterns, basePath) {
12304
12420
  basePath
12305
12421
  }).testFiles.length === 0) yield* Effect$1.logWarning(`Glob pattern "${pattern}" did not match any test files.`);
12306
12422
  }));
12307
- const incrementalReport = yield* readIncrementalReport(incremental, incrementalFile);
12423
+ const incrementalReport = yield* incrementalReportCell.run({
12424
+ incremental,
12425
+ incrementalFile
12426
+ });
12308
12427
  return makeProject(decision.fileDescriptions, Option.getOrUndefined(incrementalReport), [...decision.testFiles]);
12309
12428
  });
12310
12429
  }
@@ -13628,115 +13747,6 @@ const assembleTestFiles = (input) => {
13628
13747
  return Object.fromEntries(entries);
13629
13748
  };
13630
13749
  //#endregion
13631
- //#region package.json
13632
- var package_default = {
13633
- name: "@systemfsoftware/stryker-js",
13634
- version: "8.0.0",
13635
- repository: {
13636
- "type": "git",
13637
- "url": "git+https://github.com/systemfsoftware/stryker-js-effect.git",
13638
- "directory": "packages/stryker-js"
13639
- },
13640
- homepage: "https://github.com/systemfsoftware/stryker-js-effect",
13641
- bugs: { "url": "https://github.com/systemfsoftware/stryker-js-effect/issues" },
13642
- description: "The Stryker mutation testing tool — the stryker executable, the run engine, and the configuration surface.",
13643
- type: "module",
13644
- files: ["dist"],
13645
- bin: { "stryker": "./dist/main.mjs" },
13646
- scripts: {
13647
- "clean": "rimraf dist",
13648
- "build": "rimraf dist && tsdown --config tsdown.bin.config.ts && tsdown --config tsdown.config.ts",
13649
- "typecheck": "tsc --noEmit --incremental && tsc -p tsconfig.node.json --noEmit",
13650
- "test": "vitest run",
13651
- "mutation": "stryker run",
13652
- "attw": "attw --pack .",
13653
- "lint": "f=${OXLINT_FORMAT:-${AGENT:+agent}}; oxlint . --format=${f:-default}",
13654
- "api:check": "api-extractor run",
13655
- "api:update": "api-extractor run --local",
13656
- "lint:tsgo": "effect-tsgo diagnostics --project tsconfig.json --format ${TSGO_FORMAT:-text}"
13657
- },
13658
- license: "Apache-2.0",
13659
- engines: { "node": ">=22.18.0" },
13660
- dependencies: {
13661
- "@effect/opentelemetry": "4.0.0-rc.112",
13662
- "@effect/platform-node": "catalog:",
13663
- "@effect/platform-node-shared": "catalog:",
13664
- "@noble/hashes": "catalog:",
13665
- "@opentelemetry/api": "^1.9.0",
13666
- "@opentelemetry/exporter-metrics-otlp-http": "^0.208.0",
13667
- "@opentelemetry/exporter-trace-otlp-http": "^0.208.0",
13668
- "@opentelemetry/sdk-metrics": "^2.2.0",
13669
- "@opentelemetry/sdk-trace-base": "^2.2.0",
13670
- "@systemfsoftware/effect-cell-types": "catalog:"
13671
- },
13672
- peerDependencies: { "effect": "catalog:" },
13673
- devDependencies: {
13674
- "@effect/tsgo": "catalog:",
13675
- "@effect/vitest": "catalog:",
13676
- "@microsoft/api-extractor": "catalog:",
13677
- "@oxc-parser/binding-wasm32-wasi": "catalog:",
13678
- "@std/jsonc": "catalog:",
13679
- "@systemfsoftware/all": "catalog:",
13680
- "@systemfsoftware/arethetypeswrong-cli": "catalog:",
13681
- "@systemfsoftware/effect-gherkin-spec": "catalog:",
13682
- "@systemfsoftware/effect-schema-law": "catalog:",
13683
- "@systemfsoftware/effect-schema-vite": "catalog:",
13684
- "@systemfsoftware/stryker-config": "workspace:^",
13685
- "@systemfsoftware/stryker-ignorer-effect-schema-declarations": "catalog:stryker",
13686
- "@systemfsoftware/stryker-ignorer-in-source-vitest-block": "catalog:stryker",
13687
- "@systemfsoftware/stryker-ignorer-interface": "workspace:^",
13688
- "@systemfsoftware/stryker-js": "catalog:stryker",
13689
- "@systemfsoftware/stryker-js-html-reporter": "workspace:^",
13690
- "@systemfsoftware/stryker-js-instrumenter": "workspace:^",
13691
- "@systemfsoftware/stryker-js-plugin-interface": "workspace:^",
13692
- "@systemfsoftware/stryker-js-plugin-runtime": "workspace:^",
13693
- "@systemfsoftware/stryker-js-typescript-checker": "catalog:stryker",
13694
- "@systemfsoftware/stryker-js-vitest-runner": "catalog:stryker",
13695
- "@systemfsoftware/stryker-test-contribution": "catalog:stryker",
13696
- "@systemfsoftware/tsconfig": "catalog:",
13697
- "@systemfsoftware/tsdown-config": "workspace:^",
13698
- "@systemfsoftware/vitest-config": "workspace:^",
13699
- "@types/node": "catalog:",
13700
- "@vitest/coverage-v8": "catalog:",
13701
- "concurrently": "catalog:",
13702
- "mutation-testing-elements": "catalog:stryker",
13703
- "oxc-parser": "catalog:",
13704
- "oxlint": "catalog:",
13705
- "oxlint-tsgolint": "catalog:",
13706
- "rimraf": "catalog:",
13707
- "tsdown": "catalog:",
13708
- "typescript": "catalog:",
13709
- "vitest": "catalog:"
13710
- },
13711
- publishConfig: {
13712
- "access": "public",
13713
- "provenance": true,
13714
- "exports": {
13715
- ".": {
13716
- "types": "./dist/index.d.mts",
13717
- "default": "./dist/index.mjs"
13718
- },
13719
- "./config": {
13720
- "types": "./dist/config.d.mts",
13721
- "default": "./dist/config.mjs"
13722
- },
13723
- "./promises": {
13724
- "types": "./dist/promises.d.mts",
13725
- "default": "./dist/promises.mjs"
13726
- },
13727
- "./package.json": "./package.json"
13728
- }
13729
- },
13730
- exports: { "./package.json": "./package.json" }
13731
- };
13732
- //#endregion
13733
- //#region src/stryker-package.schema.ts
13734
- const PackageJsonSchema = Schema.Struct({ version: Schema.String });
13735
- //#endregion
13736
- //#region src/stryker-package.ts
13737
- const rawPackageJson = package_default;
13738
- const strykerVersion = Schema.decodeUnknownSync(PackageJsonSchema)(rawPackageJson).version;
13739
- //#endregion
13740
13750
  //#region src/verdict-envelope.ts
13741
13751
  const normalizeFileName = (fileName) => fileName.replaceAll("\\", "/");
13742
13752
  const VERDICT_ENVELOPE_SCHEMA_VERSION = "1.1";
@@ -14018,7 +14028,10 @@ const makeMutationReportingService = (input) => {
14018
14028
  const fs = yield* FileSystem.FileSystem;
14019
14029
  const dir = pathService.dirname(input.options.incrementalFile);
14020
14030
  yield* fs.makeDirectory(dir, { recursive: true });
14021
- const json = yield* S.encodeEffect(S.fromJsonString(S.Unknown, { space: 2 }))(report).pipe(Effect$1.orDie);
14031
+ const json = yield* S.encodeEffect(S.fromJsonString(S.Unknown, { space: 2 }))({
14032
+ incrementalVersion: strykerVersion,
14033
+ ...report
14034
+ }).pipe(Effect$1.orDie);
14022
14035
  yield* fs.writeFileString(input.options.incrementalFile, json);
14023
14036
  }
14024
14037
  return {
@@ -14037,6 +14050,7 @@ const makeMutationReportingService = (input) => {
14037
14050
  const slimIncrementalReport = (results) => Effect$1.gen(function* () {
14038
14051
  const { files, testFiles } = yield* assembleReport(results);
14039
14052
  return {
14053
+ incrementalVersion: strykerVersion,
14040
14054
  schemaVersion: "1.0",
14041
14055
  thresholds: input.options.thresholds,
14042
14056
  files,
@@ -15612,4 +15626,4 @@ const strykerCell = (options, targetMutatePatterns) => Effect$1.gen(function* ()
15612
15626
  }, prepareCommandOf(options, patterns));
15613
15627
  });
15614
15628
  //#endregion
15615
- export { StrykerError as $, FileResultSchema as $t, describeErrors as A, RunStarted as At, WorkerLauncher as B, defaultOptions$1 as Bt, matchesFile as C, Heartbeat as Ct, reporterWorkerFactory as D, RunFailed as Dt, REPORTER_EVENT_BATCH_BOUND as E, PlanKnown as Et, mergeConfigs as F, verdictExitClass as Ft, ChildProcessCrashedError as G, CheckerCheckResult as Gt, makeWorkerClient as H, isModuleSpecifier$1 as Ht, readConfig as I, CONFIG_SYNTAX_HELP$1 as It, VmRunner as J, CheckerMutantWire as Jt, OutOfMemoryError as K, CheckerFailed as Kt, validateOptions as L, SUPPORTED_CONFIG_FILE_NAMES$1 as Lt, importModule as M, EXIT_CODE as Mt, initialExtendsStepState as N, highestExitClass as Nt, spawnReporterWorker as O, RunMutantTested as Ot, loadConfigCell as P, resolveExitCode as Pt, vmTestRunner as Q, ExitClass as Qt, buildTestRunner as R, createDefaultOptions$1 as Rt, createFileMatcher as S, RunIdentity as St, RunEnvironment as T, PhaseEntered as Tt, IdGenerator as U, isWarningEnabled$1 as Ut, connectRetry as V, findUnserializables$1 as Vt, classifyWorkerExit as W, optionsPath$1 as Wt, vmRunnerCapabilities as X, CheckerRpcs as Xt, isVmRunner as Y, CheckerRequest as Yt, vmRunnerName as Z, DryRunCompleted as Zt, checkerMutantsSkipped as _, MutantStatusSchema as _n, forkOptionsSchema as _t, shouldKeepTempDir as a, MutationTestingPlanReady as an, ConfigFileUnsupportedError as at, CheckerAnsweredUnrequested as b, StageError as bt, buildVerdictEnvelope as c, ReporterEventBatch as cn, ExtendsStepRead as ct, strykerVersion as d, StrykerOptionsSchema as dn, ExtendsStepStateSchema as dt, MetricsSchema as en, ConfigDocumentSchema as et, calculateMetrics as f, TestRunnerConfigSchema as fn, ImportedModuleSchema as ft, checkerMutantsChecked as g, MutantActivationSchema as gn, extendsPropertySchema as gt, checkerDuration as h, LocationSchema$1 as hn, ReadConfigCommand as ht, mutationTestCell as i, MutationTestResultSchema$1 as in, ConfigFileUnreadableError as it, forkCoreSchema as j, VerdictReached as jt, decideExtendsStep as k, RunPhase as kt, generateRunId as l, ReporterInitOptions as ln, ExtendsStepRefused as lt, checkGroupedPlans as m, WorkerPluginKind as mn, MergeResult as mt, RUN_EVENTS_QUEUE_BOUND as n, MutantTested as nn, ConfigFileInvalidError as nt, ACTIONABLE_STATUSES as o, ReporterAck as on, ExtendsStepDocumentSchema as ot, countMutants as p, TraceContextMiddleware as pn, MergeCommand as pt, WorkerBootTimeoutError as q, CheckerGroupResult as qt, makeRunLayer as r, MutationTestReportReady as rn, ConfigFileNotFoundError as rt, VERDICT_ENVELOPE_SCHEMA_VERSION as s, ReporterDrained as sn, ExtendsStepDone as st, strykerCell as t, MutantResultSchema as tn, ConfigError as tt, isActionableStatus as u, ReporterRpcs as un, ExtendsStepResolve as ut, checkerProcessCrashes as v, PositionSchema$2 as vn, survivorsPriorReport as vt, IncrementalReportSchema as w, HelpRendered as wt, CheckerSkippedRequested as x, RunEvents as xt, checkerRpcFailures as y, toRelativeNormalizedFileName as yt, isCommandRunner as z, deepFreeze$1 as zt };
15629
+ export { StrykerError as $, FileResultSchema as $t, describeErrors as A, RunStarted as At, WorkerLauncher as B, defaultOptions$1 as Bt, strykerVersion as C, Heartbeat as Ct, reporterWorkerFactory as D, RunFailed as Dt, REPORTER_EVENT_BATCH_BOUND as E, PlanKnown as Et, mergeConfigs as F, verdictExitClass as Ft, ChildProcessCrashedError as G, CheckerCheckResult as Gt, makeWorkerClient as H, isModuleSpecifier$1 as Ht, readConfig as I, CONFIG_SYNTAX_HELP$1 as It, VmRunner as J, CheckerMutantWire as Jt, OutOfMemoryError as K, CheckerFailed as Kt, validateOptions as L, SUPPORTED_CONFIG_FILE_NAMES$1 as Lt, importModule as M, EXIT_CODE as Mt, initialExtendsStepState as N, highestExitClass as Nt, spawnReporterWorker as O, RunMutantTested as Ot, loadConfigCell as P, resolveExitCode as Pt, vmTestRunner as Q, ExitClass as Qt, buildTestRunner as R, createDefaultOptions$1 as Rt, matchesFile as S, RunIdentity as St, RunEnvironment as T, PhaseEntered as Tt, IdGenerator as U, isWarningEnabled$1 as Ut, connectRetry as V, findUnserializables$1 as Vt, classifyWorkerExit as W, optionsPath$1 as Wt, vmRunnerCapabilities as X, CheckerRpcs as Xt, isVmRunner as Y, CheckerRequest as Yt, vmRunnerName as Z, DryRunCompleted as Zt, checkerProcessCrashes as _, MutantStatusSchema as _n, forkOptionsSchema as _t, shouldKeepTempDir as a, MutationTestingPlanReady as an, ConfigFileUnsupportedError as at, CheckerSkippedRequested as b, StageError as bt, buildVerdictEnvelope as c, ReporterEventBatch as cn, ExtendsStepRead as ct, calculateMetrics as d, StrykerOptionsSchema as dn, ExtendsStepStateSchema as dt, MetricsSchema as en, ConfigDocumentSchema as et, countMutants as f, TestRunnerConfigSchema as fn, ImportedModuleSchema as ft, checkerMutantsSkipped as g, MutantActivationSchema as gn, extendsPropertySchema as gt, checkerMutantsChecked as h, LocationSchema$1 as hn, ReadConfigCommand as ht, mutationTestCell as i, MutationTestResultSchema$1 as in, ConfigFileUnreadableError as it, forkCoreSchema as j, VerdictReached as jt, decideExtendsStep as k, RunPhase as kt, generateRunId as l, ReporterInitOptions as ln, ExtendsStepRefused as lt, checkerDuration as m, WorkerPluginKind as mn, MergeResult as mt, RUN_EVENTS_QUEUE_BOUND as n, MutantTested as nn, ConfigFileInvalidError as nt, ACTIONABLE_STATUSES as o, ReporterAck as on, ExtendsStepDocumentSchema as ot, checkGroupedPlans as p, TraceContextMiddleware as pn, MergeCommand as pt, WorkerBootTimeoutError as q, CheckerGroupResult as qt, makeRunLayer as r, MutationTestReportReady as rn, ConfigFileNotFoundError as rt, VERDICT_ENVELOPE_SCHEMA_VERSION as s, ReporterDrained as sn, ExtendsStepDone as st, strykerCell as t, MutantResultSchema as tn, ConfigError as tt, isActionableStatus as u, ReporterRpcs as un, ExtendsStepResolve as ut, checkerRpcFailures as v, PositionSchema$2 as vn, survivorsPriorReport as vt, IncrementalReportSchema as w, HelpRendered as wt, createFileMatcher as x, RunEvents as xt, CheckerAnsweredUnrequested as y, toRelativeNormalizedFileName as yt, isCommandRunner as z, deepFreeze$1 as zt };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@systemfsoftware/stryker-js",
3
- "version": "8.0.0",
3
+ "version": "9.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/systemfsoftware/stryker-js-effect.git",
@@ -66,13 +66,13 @@
66
66
  "tsdown": "^0.23.0",
67
67
  "typescript": "^7",
68
68
  "vitest": "^4",
69
+ "@systemfsoftware/stryker-config": "^0.1.0",
70
+ "@systemfsoftware/stryker-ignorer-interface": "^0.1.0",
69
71
  "@systemfsoftware/stryker-js-html-reporter": "^4.0.3",
70
72
  "@systemfsoftware/stryker-js-instrumenter": "^8.0.0",
71
- "@systemfsoftware/stryker-config": "^0.1.0",
72
73
  "@systemfsoftware/stryker-js-plugin-interface": "^7.0.0",
73
- "@systemfsoftware/tsdown-config": "^0.1.0",
74
74
  "@systemfsoftware/stryker-js-plugin-runtime": "^5.0.2",
75
- "@systemfsoftware/stryker-ignorer-interface": "^0.1.0",
75
+ "@systemfsoftware/tsdown-config": "^0.1.0",
76
76
  "@systemfsoftware/vitest-config": "^0.1.0"
77
77
  },
78
78
  "publishConfig": {