fallow 3.41.0 → 3.43.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/README.md +3 -1
- package/capabilities.json +200 -41
- package/issue-registry.json +98 -32
- package/package.json +9 -10
- package/schema.json +116 -8
- package/scripts/lazy-verify.js +5 -4
- package/scripts/platform-package.js +25 -0
- package/scripts/run-binary.js +149 -30
- package/scripts/verify-binary.js +25 -21
- package/skills/fallow/SKILL.md +25 -3
- package/skills/fallow/references/cli-reference.md +55 -31
- package/skills/fallow/references/gotchas.md +2 -0
- package/skills/fallow/references/issue-types.md +2 -0
- package/skills/fallow/references/mcp.md +4 -4
- package/skills/fallow/references/similar-code.md +1 -1
- package/types/output-contract.d.ts +819 -36
|
@@ -228,7 +228,15 @@ export type TypeAwareAbstentionReason = ("no-project" | "ambiguous-project" | "b
|
|
|
228
228
|
/**
|
|
229
229
|
* Schema projection for the dead-code envelope's exact version.
|
|
230
230
|
*/
|
|
231
|
-
export type CheckSchemaVersion =
|
|
231
|
+
export type CheckSchemaVersion = 11
|
|
232
|
+
/**
|
|
233
|
+
* A direct property operation. Calls are not classified as writes.
|
|
234
|
+
*/
|
|
235
|
+
export type StateOperation = ("read" | "assign" | "read_modify_write" | "update" | "delete")
|
|
236
|
+
/**
|
|
237
|
+
* Runtime relationships that static observations cannot establish.
|
|
238
|
+
*/
|
|
239
|
+
export type UnknownStateRelation = "unknown"
|
|
232
240
|
/**
|
|
233
241
|
* A suggested action attached to a finding in the JSON output. Each finding
|
|
234
242
|
* carries an `actions` array; consumers (agents, IDE clients, CI bots) can
|
|
@@ -285,7 +293,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
|
|
|
285
293
|
* Discriminant string for [`FixAction`]. Kebab-case per the JSON output
|
|
286
294
|
* contract.
|
|
287
295
|
*/
|
|
288
|
-
export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "review-component-prop" | "emit-component-event" | "wire-svelte-event" | "compose-effect-layer" | "fail-tagged-error" | "remove-catch-tag-handler" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
|
|
296
|
+
export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "review-component-prop" | "review-constant-parameter" | "emit-component-event" | "wire-svelte-event" | "compose-effect-layer" | "fail-tagged-error" | "remove-catch-tag-handler" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
|
|
289
297
|
/**
|
|
290
298
|
* Singleton discriminant for [`SuppressLineAction`].
|
|
291
299
|
*/
|
|
@@ -461,6 +469,19 @@ export type DependencyOverrideSource = ("pnpm-workspace.yaml" | "package.json")
|
|
|
461
469
|
* surfacing them statically catches the issue first.
|
|
462
470
|
*/
|
|
463
471
|
export type DependencyOverrideMisconfigReason = ("unparsable-key" | "empty-value")
|
|
472
|
+
/**
|
|
473
|
+
* Why the rule reports a parameter.
|
|
474
|
+
*/
|
|
475
|
+
export type ConstantParameterReason = ("identical-argument" | "never-passed" | "unused-default")
|
|
476
|
+
/**
|
|
477
|
+
* The evidence that a [`ConstantParameter`] finding needs beyond the
|
|
478
|
+
* syntactic call facts.
|
|
479
|
+
*/
|
|
480
|
+
export type ConstantParameterEvidence = "type-aware"
|
|
481
|
+
/**
|
|
482
|
+
* The type of a [`ConstantParameterValue`].
|
|
483
|
+
*/
|
|
484
|
+
export type ConstantParameterValueKind = ("boolean" | "null" | "undefined" | "number" | "string" | "binding")
|
|
464
485
|
/**
|
|
465
486
|
* Kind of an Effect layer definition.
|
|
466
487
|
*/
|
|
@@ -666,6 +687,8 @@ kind: "boundaries-not-configured"
|
|
|
666
687
|
} | {
|
|
667
688
|
kind: "rule-packs-not-configured"
|
|
668
689
|
} | {
|
|
690
|
+
kind: "client-server-leak-no-client-roots"
|
|
691
|
+
} | {
|
|
669
692
|
kind: "excluded-by-default-ignore"
|
|
670
693
|
/**
|
|
671
694
|
* The built-in glob that matched, verbatim (for example
|
|
@@ -1452,7 +1475,7 @@ export type DupesSchemaVersion = (4 | 10)
|
|
|
1452
1475
|
* The schema emitter registers this type by name and points the
|
|
1453
1476
|
* `ArchitectureOutput` and `ArchitectureGroupedOutput` definitions at it.
|
|
1454
1477
|
*/
|
|
1455
|
-
export type ArchitectureSchemaVersion =
|
|
1478
|
+
export type ArchitectureSchemaVersion = 2
|
|
1456
1479
|
/**
|
|
1457
1480
|
* Wire-version discriminator for [`ImpactReport`]. Independent from the global
|
|
1458
1481
|
* `SchemaVersion` (the impact report versions on its own cadence) and from the
|
|
@@ -1715,7 +1738,7 @@ export type DoctorStatus = ("pass" | "warn" | "fail")
|
|
|
1715
1738
|
/**
|
|
1716
1739
|
* Stable identifier for a doctor check. Declaration order is output order.
|
|
1717
1740
|
*/
|
|
1718
|
-
export type DoctorCheckId = ("root" | "config" | "workspaces" | "plugins" | "type-aware" | "dependencies" | "cache" | "graph-cache")
|
|
1741
|
+
export type DoctorCheckId = ("root" | "config" | "workspaces" | "plugins" | "type-aware" | "dependencies" | "cache" | "graph-cache" | "mutation-runner")
|
|
1719
1742
|
/**
|
|
1720
1743
|
* Stable category for a doctor check.
|
|
1721
1744
|
*/
|
|
@@ -1811,7 +1834,7 @@ export type MutationSchemaVersion = "2"
|
|
|
1811
1834
|
/**
|
|
1812
1835
|
* Why a run is partial.
|
|
1813
1836
|
*/
|
|
1814
|
-
export type MutationIncompleteReason = ("runtime-error" | "mutant-limit" | "time-budget" | "skipped-files" | "unloaded-files" | "test-files-not-discovered" | "baseline-failure" | "worktree-changed" | "typecheck-failed" | "worktree-unchecked")
|
|
1837
|
+
export type MutationIncompleteReason = ("runtime-error" | "mutant-limit" | "sampled-out" | "time-budget" | "skipped-files" | "unloaded-files" | "test-files-not-discovered" | "baseline-failure" | "worktree-changed" | "typecheck-failed" | "worktree-unchecked")
|
|
1815
1838
|
/**
|
|
1816
1839
|
* The quality of observed test-to-mutant evidence.
|
|
1817
1840
|
*/
|
|
@@ -1832,6 +1855,17 @@ export type MutantStatus = ("killed" | "timeout" | "survived" | "no_coverage" |
|
|
|
1832
1855
|
* How a run detected a mutant.
|
|
1833
1856
|
*/
|
|
1834
1857
|
export type MutantFailureKind = ("assertion" | "error" | "timeout")
|
|
1858
|
+
/**
|
|
1859
|
+
* Why a survivor may be equivalent: a fact of the type check or of the
|
|
1860
|
+
* call evidence. The hint is advisory and never changes the status.
|
|
1861
|
+
*/
|
|
1862
|
+
export type MutantEquivalenceHint = ("type-non-nullish" | "constant-parameter")
|
|
1863
|
+
/**
|
|
1864
|
+
* The verdict of one replay. A replay never decides that a mutant is
|
|
1865
|
+
* equivalent: equal results on both sides give `no_witness_found`, which
|
|
1866
|
+
* says only that this input shows no difference.
|
|
1867
|
+
*/
|
|
1868
|
+
export type MutationReplayVerdict = ("witness" | "no_witness_found" | "unstable" | "timeout" | "not_callable" | "not_replayable")
|
|
1835
1869
|
/**
|
|
1836
1870
|
* Why the type check did not check a survivor.
|
|
1837
1871
|
*/
|
|
@@ -1844,6 +1878,10 @@ export type MutationRecheckOutcome = ("killed" | "survived" | "no_coverage" | "t
|
|
|
1844
1878
|
* How one mutant of a compare differs from the saved report.
|
|
1845
1879
|
*/
|
|
1846
1880
|
export type MutationCompareChange = ("regressed" | "inconclusive" | "added" | "removed")
|
|
1881
|
+
/**
|
|
1882
|
+
* What a record pass keeps of the arguments.
|
|
1883
|
+
*/
|
|
1884
|
+
export type MutationRecordMode = ("shapes" | "values")
|
|
1847
1885
|
/**
|
|
1848
1886
|
* Version singleton for a mutation plan.
|
|
1849
1887
|
*/
|
|
@@ -1864,6 +1902,18 @@ export type MutationInspectStatus = ("fresh" | "stale")
|
|
|
1864
1902
|
* Why an inspect packet is stale.
|
|
1865
1903
|
*/
|
|
1866
1904
|
export type MutationStaleReason = ("file-missing" | "no-digest" | "source-changed" | "mutant-not-reproduced")
|
|
1905
|
+
/**
|
|
1906
|
+
* Where the arguments of a replay come from.
|
|
1907
|
+
*/
|
|
1908
|
+
export type MutationReplayInputSource = ("argument" | "recorded")
|
|
1909
|
+
/**
|
|
1910
|
+
* The side of one replay call.
|
|
1911
|
+
*/
|
|
1912
|
+
export type MutationReplaySide = ("original" | "mutant")
|
|
1913
|
+
/**
|
|
1914
|
+
* The outcome of one replay call.
|
|
1915
|
+
*/
|
|
1916
|
+
export type MutationReplayOutcome = ("returned" | "threw" | "timed_out" | "not_callable")
|
|
1867
1917
|
/**
|
|
1868
1918
|
* Version singleton for the open tasks of a mutation report.
|
|
1869
1919
|
*/
|
|
@@ -2054,7 +2104,7 @@ diff_risk_introduced: number
|
|
|
2054
2104
|
* The key set is OPEN. A name that a consumer does not recognize means "some
|
|
2055
2105
|
* gate", not an error.
|
|
2056
2106
|
*
|
|
2057
|
-
* The names that this build can emit are `error-severity-findings`, `regression`, `stale-baseline`, `baseline-growth`, `duplication-threshold`, `duplication-findings`, `health-min-score`, `health-min-severity`, `health-findings`, `health-coverage-gaps`, `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`, `type-aware-require` and `
|
|
2107
|
+
* The names that this build can emit are `error-severity-findings`, `regression`, `stale-baseline`, `baseline-growth`, `duplication-threshold`, `duplication-findings`, `health-min-score`, `health-min-severity`, `health-findings`, `health-coverage-gaps`, `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`, `type-aware-require`, `parse-error` and `mutation-min-score`. `GateName` describes each name and the default entries of each command.
|
|
2058
2108
|
*/
|
|
2059
2109
|
export interface GateOutcomes {
|
|
2060
2110
|
[k: string]: GateOutcome
|
|
@@ -2220,6 +2270,11 @@ symbol_impacts?: SemanticSymbolImpact[]
|
|
|
2220
2270
|
* Advisory project-local public-signature coupling.
|
|
2221
2271
|
*/
|
|
2222
2272
|
type_coupling?: (TypeCouplingReport | null)
|
|
2273
|
+
/**
|
|
2274
|
+
* The call evidence of the `constant-parameter` rule. Present when the
|
|
2275
|
+
* rule sent candidates to the companion.
|
|
2276
|
+
*/
|
|
2277
|
+
call_evidence?: (TypeAwareCallEvidenceMeta | null)
|
|
2223
2278
|
/**
|
|
2224
2279
|
* Whether the semantic companion executed at least one query.
|
|
2225
2280
|
*/
|
|
@@ -2890,6 +2945,36 @@ export interface TypeCouplingCycle {
|
|
|
2890
2945
|
*/
|
|
2891
2946
|
files: string[]
|
|
2892
2947
|
}
|
|
2948
|
+
/**
|
|
2949
|
+
* The call evidence that the `constant-parameter` rule asked the companion
|
|
2950
|
+
* for.
|
|
2951
|
+
*/
|
|
2952
|
+
export interface TypeAwareCallEvidenceMeta {
|
|
2953
|
+
/**
|
|
2954
|
+
* Parameters with a default whose arguments the companion typed.
|
|
2955
|
+
*/
|
|
2956
|
+
default_candidates: number
|
|
2957
|
+
/**
|
|
2958
|
+
* Methods of exported classes whose calls the companion read.
|
|
2959
|
+
*/
|
|
2960
|
+
method_candidates: number
|
|
2961
|
+
/**
|
|
2962
|
+
* Findings that the evidence proved.
|
|
2963
|
+
*/
|
|
2964
|
+
findings: number
|
|
2965
|
+
/**
|
|
2966
|
+
* The count of each reason that a candidate got no evidence, such as
|
|
2967
|
+
* `outside-program` or `decorator`. An open set: a later version can
|
|
2968
|
+
* add a reason.
|
|
2969
|
+
*/
|
|
2970
|
+
abstention_reasons?: {
|
|
2971
|
+
[k: string]: number
|
|
2972
|
+
}
|
|
2973
|
+
/**
|
|
2974
|
+
* Duration of the request as reported by the companion.
|
|
2975
|
+
*/
|
|
2976
|
+
elapsed_ms: number
|
|
2977
|
+
}
|
|
2893
2978
|
/**
|
|
2894
2979
|
* Closed abstention reason counts for stable machine consumption.
|
|
2895
2980
|
*/
|
|
@@ -3075,6 +3160,10 @@ total_issues: number
|
|
|
3075
3160
|
*/
|
|
3076
3161
|
entry_points?: (EntryPoints | null)
|
|
3077
3162
|
summary: CheckSummary
|
|
3163
|
+
/**
|
|
3164
|
+
* Optional architecture inventory, excluded from issue totals and gates.
|
|
3165
|
+
*/
|
|
3166
|
+
shared_state?: (SharedStateInventory | null)
|
|
3078
3167
|
/**
|
|
3079
3168
|
* Files not reachable from any entry point. Wrapped in
|
|
3080
3169
|
* [`UnusedFileFinding`] so each entry carries a typed `actions` array
|
|
@@ -3360,6 +3449,10 @@ unused_component_props?: UnusedComponentPropFinding[]
|
|
|
3360
3449
|
* Used optional component inputs absent from inspected reachable callers. Off by default.
|
|
3361
3450
|
*/
|
|
3362
3451
|
absent_component_props?: AbsentComponentPropFinding[]
|
|
3452
|
+
/**
|
|
3453
|
+
* Parameters that each visible call passes in one way. Off by default.
|
|
3454
|
+
*/
|
|
3455
|
+
constant_parameters?: ConstantParameterFinding[]
|
|
3363
3456
|
/**
|
|
3364
3457
|
* Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
|
|
3365
3458
|
* (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
|
|
@@ -3686,6 +3779,11 @@ unused_component_props?: number
|
|
|
3686
3779
|
* Optional consumed props omitted by known reachable callers, for manual review.
|
|
3687
3780
|
*/
|
|
3688
3781
|
absent_component_props?: number
|
|
3782
|
+
/**
|
|
3783
|
+
* Parameters that each visible call passes in one way, for manual review.
|
|
3784
|
+
* Absent while zero, so a run with the opt-in rule off keeps its shape.
|
|
3785
|
+
*/
|
|
3786
|
+
constant_parameters?: number
|
|
3689
3787
|
/**
|
|
3690
3788
|
* Vue `<script setup>` emits emitted nowhere inside their own SFC.
|
|
3691
3789
|
*/
|
|
@@ -3841,6 +3939,131 @@ route_collisions?: number
|
|
|
3841
3939
|
*/
|
|
3842
3940
|
dynamic_segment_name_conflicts?: number
|
|
3843
3941
|
}
|
|
3942
|
+
/**
|
|
3943
|
+
* Versioned advisory inventory. Its observations are never counted as findings.
|
|
3944
|
+
*/
|
|
3945
|
+
export interface SharedStateInventory {
|
|
3946
|
+
/**
|
|
3947
|
+
* Inventory contract version.
|
|
3948
|
+
*/
|
|
3949
|
+
version: number
|
|
3950
|
+
/**
|
|
3951
|
+
* False if source parsing or retention limits omitted supported evidence.
|
|
3952
|
+
*/
|
|
3953
|
+
complete: boolean
|
|
3954
|
+
/**
|
|
3955
|
+
* Whether bounded fact retention omitted sites.
|
|
3956
|
+
*/
|
|
3957
|
+
truncated: boolean
|
|
3958
|
+
/**
|
|
3959
|
+
* Imported value property writes.
|
|
3960
|
+
*/
|
|
3961
|
+
imported_writes: ImportedStateWrite[]
|
|
3962
|
+
/**
|
|
3963
|
+
* Exact global root/slot groups.
|
|
3964
|
+
*/
|
|
3965
|
+
globals: GlobalStateGroup[]
|
|
3966
|
+
}
|
|
3967
|
+
/**
|
|
3968
|
+
* A write through an imported value binding with one declaration origin.
|
|
3969
|
+
*/
|
|
3970
|
+
export interface ImportedStateWrite {
|
|
3971
|
+
/**
|
|
3972
|
+
* Stable observation identity.
|
|
3973
|
+
*/
|
|
3974
|
+
id: string
|
|
3975
|
+
writer: StateSite
|
|
3976
|
+
declaration: StateSite
|
|
3977
|
+
/**
|
|
3978
|
+
* Canonical exported name.
|
|
3979
|
+
*/
|
|
3980
|
+
binding: string
|
|
3981
|
+
/**
|
|
3982
|
+
* Exact property segments relative to the imported value.
|
|
3983
|
+
*/
|
|
3984
|
+
property: string[]
|
|
3985
|
+
operation: StateOperation
|
|
3986
|
+
/**
|
|
3987
|
+
* Manual guidance.
|
|
3988
|
+
*/
|
|
3989
|
+
actions: StateAction[]
|
|
3990
|
+
}
|
|
3991
|
+
/**
|
|
3992
|
+
* A retained source location.
|
|
3993
|
+
*/
|
|
3994
|
+
export interface StateSite {
|
|
3995
|
+
/**
|
|
3996
|
+
* Project-relative source path.
|
|
3997
|
+
*/
|
|
3998
|
+
path: string
|
|
3999
|
+
/**
|
|
4000
|
+
* One-based source line.
|
|
4001
|
+
*/
|
|
4002
|
+
line: number
|
|
4003
|
+
/**
|
|
4004
|
+
* One-based byte column.
|
|
4005
|
+
*/
|
|
4006
|
+
column: number
|
|
4007
|
+
/**
|
|
4008
|
+
* Original byte offset.
|
|
4009
|
+
*/
|
|
4010
|
+
offset: number
|
|
4011
|
+
}
|
|
4012
|
+
/**
|
|
4013
|
+
* Manual review guidance. Inventory observations cannot be automatically fixed.
|
|
4014
|
+
*/
|
|
4015
|
+
export interface StateAction {
|
|
4016
|
+
/**
|
|
4017
|
+
* Human-readable next step.
|
|
4018
|
+
*/
|
|
4019
|
+
description: string
|
|
4020
|
+
/**
|
|
4021
|
+
* Always false.
|
|
4022
|
+
*/
|
|
4023
|
+
auto_fixable: boolean
|
|
4024
|
+
}
|
|
4025
|
+
/**
|
|
4026
|
+
* One exact root and custom slot, with retained reads and writes across files.
|
|
4027
|
+
*/
|
|
4028
|
+
export interface GlobalStateGroup {
|
|
4029
|
+
/**
|
|
4030
|
+
* Stable observation identity.
|
|
4031
|
+
*/
|
|
4032
|
+
id: string
|
|
4033
|
+
/**
|
|
4034
|
+
* Exact root spelling. Roots are never normalized across runtimes.
|
|
4035
|
+
*/
|
|
4036
|
+
root: string
|
|
4037
|
+
/**
|
|
4038
|
+
* Direct custom slot.
|
|
4039
|
+
*/
|
|
4040
|
+
slot: string
|
|
4041
|
+
/**
|
|
4042
|
+
* Sorted read sites.
|
|
4043
|
+
*/
|
|
4044
|
+
reads: GlobalStateAccess[]
|
|
4045
|
+
/**
|
|
4046
|
+
* Sorted write sites.
|
|
4047
|
+
*/
|
|
4048
|
+
writes: GlobalStateAccess[]
|
|
4049
|
+
same_runtime: UnknownStateRelation
|
|
4050
|
+
execution_order: UnknownStateRelation
|
|
4051
|
+
/**
|
|
4052
|
+
* Manual guidance.
|
|
4053
|
+
*/
|
|
4054
|
+
actions: StateAction[]
|
|
4055
|
+
}
|
|
4056
|
+
/**
|
|
4057
|
+
* A source access within a global group.
|
|
4058
|
+
*/
|
|
4059
|
+
export interface GlobalStateAccess {
|
|
4060
|
+
site: StateSite
|
|
4061
|
+
/**
|
|
4062
|
+
* Full path, including the direct slot.
|
|
4063
|
+
*/
|
|
4064
|
+
property: string[]
|
|
4065
|
+
operation: StateOperation
|
|
4066
|
+
}
|
|
3844
4067
|
/**
|
|
3845
4068
|
* Wire-shape envelope for an [`UnusedFile`] finding. The bare finding
|
|
3846
4069
|
* flattens in via `#[serde(flatten)]`, with a typed `actions` array
|
|
@@ -6631,6 +6854,141 @@ line: number
|
|
|
6631
6854
|
*/
|
|
6632
6855
|
col: number
|
|
6633
6856
|
}
|
|
6857
|
+
/**
|
|
6858
|
+
* Wire-shape envelope for a [`ConstantParameter`] finding. No action is
|
|
6859
|
+
* auto-fixable: a change of the function and each call is a refactor that
|
|
6860
|
+
* needs the tests, and a default that differs from the constant can change
|
|
6861
|
+
* behavior.
|
|
6862
|
+
*/
|
|
6863
|
+
export interface ConstantParameterFinding {
|
|
6864
|
+
/**
|
|
6865
|
+
* Source path of the function.
|
|
6866
|
+
*/
|
|
6867
|
+
path: string
|
|
6868
|
+
/**
|
|
6869
|
+
* The module-scope binding name of the function. For a method of an
|
|
6870
|
+
* exported class, which only type-aware mode reports, `Class.method`.
|
|
6871
|
+
*/
|
|
6872
|
+
function_name: string
|
|
6873
|
+
/**
|
|
6874
|
+
* The parameter name. For an option key, the local binding of the key
|
|
6875
|
+
* in the object pattern: `abort` for `{ signal: abort }`.
|
|
6876
|
+
*/
|
|
6877
|
+
parameter_name: string
|
|
6878
|
+
/**
|
|
6879
|
+
* 0-based index of the parameter. A TypeScript `this` parameter does
|
|
6880
|
+
* not count.
|
|
6881
|
+
*/
|
|
6882
|
+
parameter_index: number
|
|
6883
|
+
/**
|
|
6884
|
+
* The property key, when the finding is about one key of an
|
|
6885
|
+
* object-pattern parameter: `retries` in `{ retries = 3 }`. Absent for
|
|
6886
|
+
* a plain parameter.
|
|
6887
|
+
*/
|
|
6888
|
+
option_key?: (string | null)
|
|
6889
|
+
/**
|
|
6890
|
+
* 1-based line of the parameter, or of the key binding.
|
|
6891
|
+
*/
|
|
6892
|
+
line: number
|
|
6893
|
+
/**
|
|
6894
|
+
* 0-based byte column of the parameter, or of the key binding.
|
|
6895
|
+
*/
|
|
6896
|
+
col: number
|
|
6897
|
+
reason: ConstantParameterReason
|
|
6898
|
+
/**
|
|
6899
|
+
* The evidence that the finding needs beyond the syntactic call facts.
|
|
6900
|
+
* Absent for a finding that the call facts prove alone.
|
|
6901
|
+
*/
|
|
6902
|
+
evidence?: (ConstantParameterEvidence | null)
|
|
6903
|
+
/**
|
|
6904
|
+
* The value that each call passes. Present if and only if `reason` is
|
|
6905
|
+
* `identical-argument`.
|
|
6906
|
+
*/
|
|
6907
|
+
value?: (ConstantParameterValue | null)
|
|
6908
|
+
/**
|
|
6909
|
+
* `true` when the parameter has the TypeScript `?` marker.
|
|
6910
|
+
*/
|
|
6911
|
+
optional: boolean
|
|
6912
|
+
/**
|
|
6913
|
+
* `true` when the parameter, or the option key, has a default value.
|
|
6914
|
+
*/
|
|
6915
|
+
has_default: boolean
|
|
6916
|
+
/**
|
|
6917
|
+
* The count of conditional tests in the function whose test is the
|
|
6918
|
+
* parameter, `!parameter` or `!!parameter`: the test of an `if`, a
|
|
6919
|
+
* `?:`, a `while`, a `do` or a `for`. Nested functions count. A
|
|
6920
|
+
* comparison such as `parameter === true` and an operand of `&&` or
|
|
6921
|
+
* `||` do not count.
|
|
6922
|
+
*/
|
|
6923
|
+
condition_reads: number
|
|
6924
|
+
/**
|
|
6925
|
+
* The count of calls that the rule read for this parameter. A
|
|
6926
|
+
* recursive call that passes the parameter on unchanged does not count.
|
|
6927
|
+
*/
|
|
6928
|
+
call_site_count: number
|
|
6929
|
+
/**
|
|
6930
|
+
* The first calls in source order, at most 20. The list is never longer
|
|
6931
|
+
* than `call_site_count`.
|
|
6932
|
+
*/
|
|
6933
|
+
inspected_call_sites: ConstantParameterCallSite[]
|
|
6934
|
+
/**
|
|
6935
|
+
* What the finding means and what static analysis does not prove.
|
|
6936
|
+
*/
|
|
6937
|
+
explanation: string
|
|
6938
|
+
/**
|
|
6939
|
+
* Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
|
|
6940
|
+
* `~<k>` suffix when several findings of one type share an identity.
|
|
6941
|
+
* Line and column are not inputs, so the id survives line shifts,
|
|
6942
|
+
* reformats and reorders. A rename of the file, the function or the
|
|
6943
|
+
* parameter gives a new id. Absent in output from older versions.
|
|
6944
|
+
*/
|
|
6945
|
+
finding_id?: (string | null)
|
|
6946
|
+
/**
|
|
6947
|
+
* Suggested next steps. Always emitted.
|
|
6948
|
+
*/
|
|
6949
|
+
actions: IssueAction[]
|
|
6950
|
+
/**
|
|
6951
|
+
* Set by the audit pass when this finding is introduced relative to
|
|
6952
|
+
* the merge-base.
|
|
6953
|
+
*/
|
|
6954
|
+
introduced?: (AuditIntroduced | null)
|
|
6955
|
+
/**
|
|
6956
|
+
* Gate severity of this finding after `rules` and `overrides[].rules`
|
|
6957
|
+
* resolve for its path. Not part of the finding identity, baseline keys
|
|
6958
|
+
* or fingerprints.
|
|
6959
|
+
*/
|
|
6960
|
+
effective_severity?: (EffectiveSeverity | null)
|
|
6961
|
+
}
|
|
6962
|
+
/**
|
|
6963
|
+
* The value that each call passes: a literal, or an immutable binding.
|
|
6964
|
+
*/
|
|
6965
|
+
export interface ConstantParameterValue {
|
|
6966
|
+
kind: ConstantParameterValueKind
|
|
6967
|
+
/**
|
|
6968
|
+
* The value as text. A number uses the JavaScript `String(n)` form,
|
|
6969
|
+
* except that negative zero is `-0`. A string is the raw value with no
|
|
6970
|
+
* quotes. `null`, `undefined`, `true` and `false` are the keyword. A
|
|
6971
|
+
* binding is its name.
|
|
6972
|
+
*/
|
|
6973
|
+
text: string
|
|
6974
|
+
}
|
|
6975
|
+
/**
|
|
6976
|
+
* One inspected call of the reported function.
|
|
6977
|
+
*/
|
|
6978
|
+
export interface ConstantParameterCallSite {
|
|
6979
|
+
/**
|
|
6980
|
+
* Caller source path.
|
|
6981
|
+
*/
|
|
6982
|
+
path: string
|
|
6983
|
+
/**
|
|
6984
|
+
* 1-based line of the call.
|
|
6985
|
+
*/
|
|
6986
|
+
line: number
|
|
6987
|
+
/**
|
|
6988
|
+
* 0-based byte column of the call.
|
|
6989
|
+
*/
|
|
6990
|
+
col: number
|
|
6991
|
+
}
|
|
6634
6992
|
/**
|
|
6635
6993
|
* Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
|
|
6636
6994
|
* auto-fix: removing a declared emit is judgement-bearing (the event may be
|
|
@@ -7928,11 +8286,11 @@ start_line: number
|
|
|
7928
8286
|
*/
|
|
7929
8287
|
end_line: number
|
|
7930
8288
|
/**
|
|
7931
|
-
* 0-based
|
|
8289
|
+
* 0-based byte column offset of the start.
|
|
7932
8290
|
*/
|
|
7933
8291
|
start_col: number
|
|
7934
8292
|
/**
|
|
7935
|
-
* 0-based
|
|
8293
|
+
* 0-based byte column offset of the end.
|
|
7936
8294
|
*/
|
|
7937
8295
|
end_col: number
|
|
7938
8296
|
/**
|
|
@@ -15236,11 +15594,11 @@ start_line: number
|
|
|
15236
15594
|
*/
|
|
15237
15595
|
end_line: number
|
|
15238
15596
|
/**
|
|
15239
|
-
* 0-based
|
|
15597
|
+
* 0-based byte column offset of the start.
|
|
15240
15598
|
*/
|
|
15241
15599
|
start_col: number
|
|
15242
15600
|
/**
|
|
15243
|
-
* 0-based
|
|
15601
|
+
* 0-based byte column offset of the end.
|
|
15244
15602
|
*/
|
|
15245
15603
|
end_col: number
|
|
15246
15604
|
/**
|
|
@@ -15378,6 +15736,10 @@ owners?: (string[] | null)
|
|
|
15378
15736
|
* Findings in this group.
|
|
15379
15737
|
*/
|
|
15380
15738
|
total_issues: number
|
|
15739
|
+
/**
|
|
15740
|
+
* Optional architecture inventory, excluded from issue totals and gates.
|
|
15741
|
+
*/
|
|
15742
|
+
shared_state?: (SharedStateInventory | null)
|
|
15381
15743
|
/**
|
|
15382
15744
|
* Files not reachable from any entry point. Wrapped in
|
|
15383
15745
|
* [`UnusedFileFinding`] so each entry carries a typed `actions` array
|
|
@@ -15663,6 +16025,10 @@ unused_component_props?: UnusedComponentPropFinding[]
|
|
|
15663
16025
|
* Used optional component inputs absent from inspected reachable callers. Off by default.
|
|
15664
16026
|
*/
|
|
15665
16027
|
absent_component_props?: AbsentComponentPropFinding[]
|
|
16028
|
+
/**
|
|
16029
|
+
* Parameters that each visible call passes in one way. Off by default.
|
|
16030
|
+
*/
|
|
16031
|
+
constant_parameters?: ConstantParameterFinding[]
|
|
15666
16032
|
/**
|
|
15667
16033
|
* Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
|
|
15668
16034
|
* (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
|
|
@@ -16277,13 +16643,13 @@ new_count: number
|
|
|
16277
16643
|
*/
|
|
16278
16644
|
export interface SecurityFinding {
|
|
16279
16645
|
/**
|
|
16280
|
-
*
|
|
16281
|
-
* rule + anchor path + line + column. An autonomous agent that triaged this
|
|
16282
|
-
* candidate on a prior run uses it to correlate the candidate after a
|
|
16283
|
-
* rebase. Equal to the SARIF `partialFingerprints["fallowSecurity/v2"]`
|
|
16284
|
-
* value for the same finding (one shared helper computes both).
|
|
16646
|
+
* Location id (rule, path, line, column), equal to SARIF `fallowSecurity/v2`; edits move it.
|
|
16285
16647
|
*/
|
|
16286
16648
|
finding_id: string
|
|
16649
|
+
/**
|
|
16650
|
+
* Line-independent id (`sec1:<hash>`, `~k` for repeats); a verdict may use it.
|
|
16651
|
+
*/
|
|
16652
|
+
stable_finding_id?: (string | null)
|
|
16287
16653
|
kind: SecurityFindingKind
|
|
16288
16654
|
/**
|
|
16289
16655
|
* The catalogue category id (e.g. `"dangerous-html"`). `Some` for
|
|
@@ -16366,9 +16732,8 @@ taint_flow?: (SecurityTaintFlow | null)
|
|
|
16366
16732
|
*/
|
|
16367
16733
|
runtime?: (SecurityRuntimeContext | null)
|
|
16368
16734
|
/**
|
|
16369
|
-
* Internal projection used by `fallow security --surface`. The CLI strips
|
|
16370
|
-
*
|
|
16371
|
-
* `attack_surface` field only when requested.
|
|
16735
|
+
* Internal projection used by `fallow security --surface`. The CLI strips this from
|
|
16736
|
+
* per-finding JSON and promotes it to the top-level `attack_surface` field only when requested.
|
|
16372
16737
|
*/
|
|
16373
16738
|
attack_surface?: (SecurityAttackSurfaceEntry | null)
|
|
16374
16739
|
}
|
|
@@ -16967,7 +17332,8 @@ elapsed_ms: ElapsedMs
|
|
|
16967
17332
|
workspace_diagnostics?: WorkspaceDiagnostic[]
|
|
16968
17333
|
summary: SecuritySurvivorsSummary
|
|
16969
17334
|
/**
|
|
16970
|
-
* Verifier-retained candidates keyed by
|
|
17335
|
+
* Verifier-retained candidates keyed by the candidate `finding_id`, also
|
|
17336
|
+
* when the verdict names the candidate by its `stable_finding_id`.
|
|
16971
17337
|
*/
|
|
16972
17338
|
survivors: {
|
|
16973
17339
|
[k: string]: SecuritySurvivor
|
|
@@ -17124,6 +17490,10 @@ total_issues: number
|
|
|
17124
17490
|
*/
|
|
17125
17491
|
entry_points?: (EntryPoints | null)
|
|
17126
17492
|
summary: CheckSummary
|
|
17493
|
+
/**
|
|
17494
|
+
* Optional architecture inventory, excluded from issue totals and gates.
|
|
17495
|
+
*/
|
|
17496
|
+
shared_state?: (SharedStateInventory | null)
|
|
17127
17497
|
/**
|
|
17128
17498
|
* Files not reachable from any entry point. Wrapped in
|
|
17129
17499
|
* [`UnusedFileFinding`] so each entry carries a typed `actions` array
|
|
@@ -17409,6 +17779,10 @@ unused_component_props?: UnusedComponentPropFinding[]
|
|
|
17409
17779
|
* Used optional component inputs absent from inspected reachable callers. Off by default.
|
|
17410
17780
|
*/
|
|
17411
17781
|
absent_component_props?: AbsentComponentPropFinding[]
|
|
17782
|
+
/**
|
|
17783
|
+
* Parameters that each visible call passes in one way. Off by default.
|
|
17784
|
+
*/
|
|
17785
|
+
constant_parameters?: ConstantParameterFinding[]
|
|
17412
17786
|
/**
|
|
17413
17787
|
* Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
|
|
17414
17788
|
* (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
|
|
@@ -18869,14 +19243,39 @@ change_shape: number
|
|
|
18869
19243
|
/**
|
|
18870
19244
|
* Runtime-weight component (paid): a hot path (runtime evidence of high
|
|
18871
19245
|
* invocation) adds an invocation-bucketed weight so it amplifies the blast
|
|
18872
|
-
* and outranks an otherwise-equal cold unit. `0` in free mode
|
|
18873
|
-
* input)
|
|
18874
|
-
* is byte-identical to the no-runtime baseline.
|
|
19246
|
+
* and outranks an otherwise-equal cold unit. `0` and omitted in free mode
|
|
19247
|
+
* (no runtime input).
|
|
18875
19248
|
*/
|
|
18876
19249
|
runtime?: number
|
|
18877
19250
|
/**
|
|
18878
|
-
*
|
|
18879
|
-
*
|
|
19251
|
+
* Churn component: the recency-weighted commit count of the file in the
|
|
19252
|
+
* churn window (90-day half-life), in capped bands. Omitted while it is
|
|
19253
|
+
* zero, which includes a test file and a run without a git history or on a
|
|
19254
|
+
* shallow clone.
|
|
19255
|
+
*/
|
|
19256
|
+
churn?: number
|
|
19257
|
+
/**
|
|
19258
|
+
* Worsened component: the functions of the file whose complexity metrics
|
|
19259
|
+
* grew against the matched base finding (`worsened_metrics`), capped.
|
|
19260
|
+
* Omitted while it is zero, which includes a run without a base.
|
|
19261
|
+
*/
|
|
19262
|
+
worsened?: number
|
|
19263
|
+
/**
|
|
19264
|
+
* Test-reach component: the changed exports of the file that no test
|
|
19265
|
+
* runs for real (`mocked-only`, `none`, or `none-file` in a project with
|
|
19266
|
+
* tests), capped. Omitted while it is zero.
|
|
19267
|
+
*/
|
|
19268
|
+
test_reach?: number
|
|
19269
|
+
/**
|
|
19270
|
+
* Mutation component: the surviving mutants on the added lines of the
|
|
19271
|
+
* file, from the `--mutation-report` file, capped. Omitted while it is
|
|
19272
|
+
* zero. Without `--mutation-report` the component is not measured, which
|
|
19273
|
+
* does not mean that no mutant survives.
|
|
19274
|
+
*/
|
|
19275
|
+
mutation?: number
|
|
19276
|
+
/**
|
|
19277
|
+
* The sum of every component, also of the components that the wire
|
|
19278
|
+
* omits because they are zero.
|
|
18880
19279
|
*/
|
|
18881
19280
|
total: number
|
|
18882
19281
|
}
|
|
@@ -20731,6 +21130,17 @@ recheck?: (MutationRecheck | null)
|
|
|
20731
21130
|
* `--compare`, and absent when this run is not complete.
|
|
20732
21131
|
*/
|
|
20733
21132
|
compare?: (MutationCompare | null)
|
|
21133
|
+
/**
|
|
21134
|
+
* The verdict of the `mutation-min-score` gate. Present only when a
|
|
21135
|
+
* minimum applies: from `--min-score`, or from `mutation.minScore` when
|
|
21136
|
+
* the run is not a recheck. The exit code of the run reads this entry.
|
|
21137
|
+
*/
|
|
21138
|
+
gate_outcomes?: (GateOutcomes | null)
|
|
21139
|
+
/**
|
|
21140
|
+
* The argument recording of the dry run. Present only with
|
|
21141
|
+
* `--record-args`. It holds counts and reasons, never argument values.
|
|
21142
|
+
*/
|
|
21143
|
+
recording?: (MutationRecordingOutput | null)
|
|
20734
21144
|
}
|
|
20735
21145
|
/**
|
|
20736
21146
|
* The completion status of a run.
|
|
@@ -20836,12 +21246,22 @@ target: string
|
|
|
20836
21246
|
test_ids: string[]
|
|
20837
21247
|
status: MutationKillMatrixTargetStatus
|
|
20838
21248
|
/**
|
|
20839
|
-
* Why the evidence of this target is incomplete, sorted.
|
|
20840
|
-
*
|
|
20841
|
-
*
|
|
21249
|
+
* Why the evidence of this target is incomplete, sorted.
|
|
21250
|
+
* `baseline-failure` means that a test failed with no active mutant, and
|
|
21251
|
+
* that the failure can affect this target: the failing test is a test
|
|
21252
|
+
* of the target or is in a test file of the target, or it covers, kills,
|
|
21253
|
+
* or ran without a mutant that a test of the target covers or kills.
|
|
21254
|
+
* `partial-mutation-run` means that the run is partial. When baseline
|
|
21255
|
+
* failures are the only cause of a partial run, only the targets with
|
|
21256
|
+
* `baseline-failure` get it. Each other cause applies to each target,
|
|
21257
|
+
* and so does `missing-test-file-metadata`.
|
|
20842
21258
|
* `incomplete-mutant-results` means that a test of this target covers a
|
|
20843
21259
|
* mutant with incomplete evidence. `unmatched-target` means that the
|
|
20844
|
-
* target selects no test.
|
|
21260
|
+
* target selects no test. With it, `not-a-test-file` means that the
|
|
21261
|
+
* runner does not list the file of the target as a test file, and
|
|
21262
|
+
* `no-planned-code` means that the file reaches no planned code, so
|
|
21263
|
+
* the dry run does not run it. A run stops only when no target selects
|
|
21264
|
+
* a test.
|
|
20845
21265
|
*/
|
|
20846
21266
|
reasons: string[]
|
|
20847
21267
|
}
|
|
@@ -20969,6 +21389,11 @@ score?: (number | null)
|
|
|
20969
21389
|
* mutants never count. `null` when no mutant is covered or unreached.
|
|
20970
21390
|
*/
|
|
20971
21391
|
coverage?: (number | null)
|
|
21392
|
+
/**
|
|
21393
|
+
* The `pending` mutants that the `--mutants-per-line` limit left out of
|
|
21394
|
+
* the plan. They are part of `counts.pending`.
|
|
21395
|
+
*/
|
|
21396
|
+
sampled_out: number
|
|
20972
21397
|
}
|
|
20973
21398
|
/**
|
|
20974
21399
|
* One mutant of a run.
|
|
@@ -21023,6 +21448,13 @@ status: MutantStatus
|
|
|
21023
21448
|
* The static rule of a `pruned` mutant, kebab-case.
|
|
21024
21449
|
*/
|
|
21025
21450
|
prune_reason?: (string | null)
|
|
21451
|
+
/**
|
|
21452
|
+
* Why a `pending` mutant did not run, kebab-case. Only `sampled-out` has
|
|
21453
|
+
* a reason: the `--mutants-per-line` limit left the mutant out of the
|
|
21454
|
+
* plan. A mutant that the mutant limit or the time budget left out has
|
|
21455
|
+
* no reason.
|
|
21456
|
+
*/
|
|
21457
|
+
pending_reason?: (string | null)
|
|
21026
21458
|
/**
|
|
21027
21459
|
* The test that killed the mutant in this run. Absent for a kill by an
|
|
21028
21460
|
* error outside a test.
|
|
@@ -21087,19 +21519,42 @@ cached?: boolean
|
|
|
21087
21519
|
* (`--resume`). The mutant did not run in this run.
|
|
21088
21520
|
*/
|
|
21089
21521
|
resumed?: boolean
|
|
21522
|
+
/**
|
|
21523
|
+
* True when the status and its evidence come from the earlier report
|
|
21524
|
+
* of a `--recheck` run: the recheck did not select the mutant, its file
|
|
21525
|
+
* has the digest of that report, and each test file of its killing
|
|
21526
|
+
* tests exists. The mutant did not run in this run, and the kill matrix
|
|
21527
|
+
* of this run has no evidence of it.
|
|
21528
|
+
*/
|
|
21529
|
+
carried?: boolean
|
|
21090
21530
|
/**
|
|
21091
21531
|
* The TypeScript diagnostic codes of the new errors of a
|
|
21092
21532
|
* `compile_error` mutant, sorted, at most 8.
|
|
21093
21533
|
*/
|
|
21094
21534
|
type_error_codes?: number[]
|
|
21535
|
+
/**
|
|
21536
|
+
* An advisory hint that the mutant may be equivalent to the original
|
|
21537
|
+
* code. The hint never changes the status: the mutant stays `survived`
|
|
21538
|
+
* and counts in the score. A person decides, and records the decision in
|
|
21539
|
+
* a verdict file. The hint can be wrong.
|
|
21540
|
+
*/
|
|
21541
|
+
equivalence_hint?: (MutantEquivalenceHint | null)
|
|
21542
|
+
/**
|
|
21543
|
+
* The replay of a recorded input. Present only after a `--record-args
|
|
21544
|
+
* values` run, for a survived or uncovered mutant with a recorded input
|
|
21545
|
+
* of its export.
|
|
21546
|
+
*/
|
|
21547
|
+
witness?: (MutantWitness | null)
|
|
21095
21548
|
}
|
|
21096
21549
|
/**
|
|
21097
21550
|
* The edit of a mutant, without project text.
|
|
21098
21551
|
*
|
|
21099
21552
|
* Each side is an operator token (for example `??` or `<=`), a fixed literal
|
|
21100
21553
|
* (`true`, `undefined`, `""`, `"fallow"`, `void 0`), a regular expression
|
|
21101
|
-
* token (`^`, `$`, `[`, `[^`, `\d`), or a placeholder for a
|
|
21102
|
-
* project code: `<condition>`, `<call>`, `<expression
|
|
21554
|
+
* token (`^`, `$`, `[`, `[^`, `+`, `{n,m}`, `\d`), or a placeholder for a
|
|
21555
|
+
* side that is project code: `<condition>`, `<call>`, `<expression>`,
|
|
21556
|
+
* `<string>`, `<template>`, `<statement>`, `<statements>`, `<array>` or
|
|
21557
|
+
* `<object>`. An
|
|
21103
21558
|
* empty side means that the edit removes the token.
|
|
21104
21559
|
*/
|
|
21105
21560
|
export interface MutantChange {
|
|
@@ -21173,6 +21628,28 @@ failure_kind?: (MutantFailureKind | null)
|
|
|
21173
21628
|
*/
|
|
21174
21629
|
detail?: (string | null)
|
|
21175
21630
|
}
|
|
21631
|
+
/**
|
|
21632
|
+
* The replay of a recorded input against a survived or uncovered mutant,
|
|
21633
|
+
* after a `fallow mutation --record-args values` run. It holds no argument
|
|
21634
|
+
* value: the values stay in the gitignored cache directory.
|
|
21635
|
+
*/
|
|
21636
|
+
export interface MutantWitness {
|
|
21637
|
+
verdict: MutationReplayVerdict
|
|
21638
|
+
/**
|
|
21639
|
+
* The recorded input of the verdict. `fallow mutation tasks` joins its
|
|
21640
|
+
* values from the cache.
|
|
21641
|
+
*/
|
|
21642
|
+
input_id?: (string | null)
|
|
21643
|
+
/**
|
|
21644
|
+
* The recorded inputs that the replay ran.
|
|
21645
|
+
*/
|
|
21646
|
+
inputs_checked: number
|
|
21647
|
+
/**
|
|
21648
|
+
* Why the replay gave no witness, for example `no witness found (2
|
|
21649
|
+
* inputs, recorded, 3 calls of each side)`. Absent for a witness.
|
|
21650
|
+
*/
|
|
21651
|
+
reason?: (string | null)
|
|
21652
|
+
}
|
|
21176
21653
|
/**
|
|
21177
21654
|
* The results of the mutants of one function.
|
|
21178
21655
|
*/
|
|
@@ -21284,9 +21761,9 @@ changed_paths: string[]
|
|
|
21284
21761
|
export interface MutationRunIssue {
|
|
21285
21762
|
/**
|
|
21286
21763
|
* A stable kebab-case code: `cache-write-failed`,
|
|
21287
|
-
* `journal-write-failed`, `runtime-error`,
|
|
21288
|
-
* `
|
|
21289
|
-
* or `worktree-check-failed`.
|
|
21764
|
+
* `duplicate-test-ids`, `journal-write-failed`, `runtime-error`,
|
|
21765
|
+
* `skipped-tests`, `static-map-miss`, `test-files-not-discovered`,
|
|
21766
|
+
* `typecheck-failed`, `worktree-changed` or `worktree-check-failed`.
|
|
21290
21767
|
*/
|
|
21291
21768
|
code: string
|
|
21292
21769
|
/**
|
|
@@ -21401,6 +21878,12 @@ checked: number
|
|
|
21401
21878
|
* `compile_error`.
|
|
21402
21879
|
*/
|
|
21403
21880
|
compile_errors: number
|
|
21881
|
+
/**
|
|
21882
|
+
* The mutants of the final report that have the `type-non-nullish`
|
|
21883
|
+
* hint. They keep the status `survived`. A verdict that makes a mutant
|
|
21884
|
+
* `equivalent` removes its hint and lowers this count.
|
|
21885
|
+
*/
|
|
21886
|
+
hinted?: number
|
|
21404
21887
|
/**
|
|
21405
21888
|
* The survivors that the checker did not check, by reason.
|
|
21406
21889
|
*/
|
|
@@ -21448,6 +21931,22 @@ unsettled: number
|
|
|
21448
21931
|
* The rechecked mutants, sorted by file, line and mutant id.
|
|
21449
21932
|
*/
|
|
21450
21933
|
mutants: MutationRecheckMutant[]
|
|
21934
|
+
/**
|
|
21935
|
+
* The mutants of the report that keep their result from the earlier
|
|
21936
|
+
* report (`carried`), because the recheck did not select them. The
|
|
21937
|
+
* summary counts them. The recheck does not run them again, so a test
|
|
21938
|
+
* that became weaker does not change their result.
|
|
21939
|
+
*/
|
|
21940
|
+
carried?: number
|
|
21941
|
+
/**
|
|
21942
|
+
* The files of the earlier report outside this run whose earlier
|
|
21943
|
+
* results do not apply, sorted: the source changed after the report,
|
|
21944
|
+
* the test file of a killing test is gone, or the report has no digest
|
|
21945
|
+
* or no readable entry for the file. The report leaves out their
|
|
21946
|
+
* mutants. Run `fallow mutation` on them for new
|
|
21947
|
+
* results.
|
|
21948
|
+
*/
|
|
21949
|
+
stale_files?: string[]
|
|
21451
21950
|
}
|
|
21452
21951
|
/**
|
|
21453
21952
|
* One rechecked mutant.
|
|
@@ -21535,6 +22034,66 @@ status?: (MutantStatus | null)
|
|
|
21535
22034
|
*/
|
|
21536
22035
|
previous_killing_tests: string[]
|
|
21537
22036
|
}
|
|
22037
|
+
/**
|
|
22038
|
+
* The argument recording of a run.
|
|
22039
|
+
*/
|
|
22040
|
+
export interface MutationRecordingOutput {
|
|
22041
|
+
mode: MutationRecordMode
|
|
22042
|
+
/**
|
|
22043
|
+
* True when the inputs are in the cache file
|
|
22044
|
+
* `<cache dir>/mutation/recorded-args.json`.
|
|
22045
|
+
*/
|
|
22046
|
+
saved: boolean
|
|
22047
|
+
/**
|
|
22048
|
+
* Why the run recorded nothing or saved nothing, for example a runner
|
|
22049
|
+
* that records no arguments. Absent when the inputs are saved.
|
|
22050
|
+
*/
|
|
22051
|
+
error?: (string | null)
|
|
22052
|
+
/**
|
|
22053
|
+
* The recorded exported functions, sorted by file and export.
|
|
22054
|
+
*/
|
|
22055
|
+
functions: MutationRecordedFunction[]
|
|
22056
|
+
}
|
|
22057
|
+
/**
|
|
22058
|
+
* The recorded arguments of one exported function.
|
|
22059
|
+
*/
|
|
22060
|
+
export interface MutationRecordedFunction {
|
|
22061
|
+
/**
|
|
22062
|
+
* The project-root-relative path of the file.
|
|
22063
|
+
*/
|
|
22064
|
+
file: string
|
|
22065
|
+
/**
|
|
22066
|
+
* The export name. `fallow mutation inspect --replay` calls it.
|
|
22067
|
+
*/
|
|
22068
|
+
export: string
|
|
22069
|
+
/**
|
|
22070
|
+
* The number of distinct inputs that the cache keeps.
|
|
22071
|
+
*/
|
|
22072
|
+
input_count: number
|
|
22073
|
+
/**
|
|
22074
|
+
* The calls whose arguments the cache does not keep, by reason.
|
|
22075
|
+
*/
|
|
22076
|
+
not_replayable: MutationNotReplayable[]
|
|
22077
|
+
}
|
|
22078
|
+
/**
|
|
22079
|
+
* The calls of one reason whose arguments a recording did not keep.
|
|
22080
|
+
*/
|
|
22081
|
+
export interface MutationNotReplayable {
|
|
22082
|
+
/**
|
|
22083
|
+
* Why the arguments cannot be replayed. One of a fixed set: `a
|
|
22084
|
+
* function`, `a symbol`, `a proxy`, `a cyclic value`, `a class
|
|
22085
|
+
* instance`, `a value that is too large`, `an accessor property`, `an
|
|
22086
|
+
* object with a symbol key`, `an object that this runtime cannot check
|
|
22087
|
+
* for a proxy`, `a value that cannot be read`, `a value under a secret
|
|
22088
|
+
* key name` or `a string that looks like a secret`. It never holds text
|
|
22089
|
+
* of the code or of a value.
|
|
22090
|
+
*/
|
|
22091
|
+
reason: string
|
|
22092
|
+
/**
|
|
22093
|
+
* The number of calls.
|
|
22094
|
+
*/
|
|
22095
|
+
count: number
|
|
22096
|
+
}
|
|
21538
22097
|
/**
|
|
21539
22098
|
* The envelope of `fallow mutation --plan`. It runs no user code.
|
|
21540
22099
|
*/
|
|
@@ -21561,7 +22120,8 @@ test_files: string[]
|
|
|
21561
22120
|
*/
|
|
21562
22121
|
no_test_files: boolean
|
|
21563
22122
|
/**
|
|
21564
|
-
* True when the plan applied the `framework-config`
|
|
22123
|
+
* True when the plan applied the `framework-config` and
|
|
22124
|
+
* `build-tool-only` prune rules.
|
|
21565
22125
|
*/
|
|
21566
22126
|
framework_config_checked: boolean
|
|
21567
22127
|
/**
|
|
@@ -21572,6 +22132,7 @@ skipped_files: MutationSkippedFile[]
|
|
|
21572
22132
|
* The paths of a `paths` scope that select no file.
|
|
21573
22133
|
*/
|
|
21574
22134
|
unmatched_paths: string[]
|
|
22135
|
+
runner: MutationPlanRunner
|
|
21575
22136
|
}
|
|
21576
22137
|
/**
|
|
21577
22138
|
* The totals of a plan.
|
|
@@ -21586,9 +22147,13 @@ total: number
|
|
|
21586
22147
|
*/
|
|
21587
22148
|
planned: number
|
|
21588
22149
|
/**
|
|
21589
|
-
* Mutants after the mutant limit.
|
|
22150
|
+
* Mutants after the mutant limit, and the sampled-out mutants.
|
|
21590
22151
|
*/
|
|
21591
22152
|
pending: number
|
|
22153
|
+
/**
|
|
22154
|
+
* The `pending` mutants that the `--mutants-per-line` limit left out.
|
|
22155
|
+
*/
|
|
22156
|
+
sampled_out: number
|
|
21592
22157
|
/**
|
|
21593
22158
|
* Mutants that no test file reaches.
|
|
21594
22159
|
*/
|
|
@@ -21609,6 +22174,10 @@ pruned_side_effect_sink: number
|
|
|
21609
22174
|
* Mutants in framework config exports.
|
|
21610
22175
|
*/
|
|
21611
22176
|
pruned_framework_config: number
|
|
22177
|
+
/**
|
|
22178
|
+
* Mutants in files that only tool config files reach. Absent when 0.
|
|
22179
|
+
*/
|
|
22180
|
+
pruned_build_tool_only?: number
|
|
21612
22181
|
}
|
|
21613
22182
|
/**
|
|
21614
22183
|
* One mutant of a plan.
|
|
@@ -21663,6 +22232,13 @@ disposition: MutationPlanDisposition
|
|
|
21663
22232
|
* The static rule of a `pruned` mutant, kebab-case.
|
|
21664
22233
|
*/
|
|
21665
22234
|
prune_reason?: (string | null)
|
|
22235
|
+
/**
|
|
22236
|
+
* Why a `pending` mutant did not run, kebab-case. Only `sampled-out` has
|
|
22237
|
+
* a reason: the `--mutants-per-line` limit left the mutant out of the
|
|
22238
|
+
* plan. A mutant that the mutant limit or the time budget left out has
|
|
22239
|
+
* no reason.
|
|
22240
|
+
*/
|
|
22241
|
+
pending_reason?: (string | null)
|
|
21666
22242
|
/**
|
|
21667
22243
|
* How tests reach the code of the mutant in the module graph. Only a
|
|
21668
22244
|
* `no_coverage` mutant has this field.
|
|
@@ -21670,7 +22246,50 @@ prune_reason?: (string | null)
|
|
|
21670
22246
|
test_reach?: (MutantTestReach | null)
|
|
21671
22247
|
}
|
|
21672
22248
|
/**
|
|
21673
|
-
* The
|
|
22249
|
+
* The test runner of a plan. The plan reads the `package.json` of the
|
|
22250
|
+
* installed runner package and runs no code. A run that starts the runner
|
|
22251
|
+
* stops when `supported` is false: with `FALLOW_MUTATION_RUNNER_UNSUPPORTED`
|
|
22252
|
+
* for a version outside the range, and with the companion error
|
|
22253
|
+
* `runner-not-found` for a runner that is not installed. A run of a plan
|
|
22254
|
+
* with no test file or no mutant starts no runner.
|
|
22255
|
+
*/
|
|
22256
|
+
export interface MutationPlanRunner {
|
|
22257
|
+
/**
|
|
22258
|
+
* The runner: `vitest`, `node-test` or `bun-test`.
|
|
22259
|
+
*/
|
|
22260
|
+
name: string
|
|
22261
|
+
/**
|
|
22262
|
+
* The package or runtime that the supported range applies to.
|
|
22263
|
+
*/
|
|
22264
|
+
package: string
|
|
22265
|
+
/**
|
|
22266
|
+
* The installed version of the package. `null` when the package is not
|
|
22267
|
+
* installed, or when `supported` is `null`.
|
|
22268
|
+
*/
|
|
22269
|
+
installed_version?: (string | null)
|
|
22270
|
+
/**
|
|
22271
|
+
* The supported range, for example `>=4.1.0 <6.0.0`.
|
|
22272
|
+
*/
|
|
22273
|
+
supported_range: string
|
|
22274
|
+
/**
|
|
22275
|
+
* True when the installed version is in the range. False when it is
|
|
22276
|
+
* outside the range or when the package is not installed. `null` for
|
|
22277
|
+
* `node-test` and `bun-test`: their range applies to the runtime, and a
|
|
22278
|
+
* run selects the runtime when it starts.
|
|
22279
|
+
*/
|
|
22280
|
+
supported?: (boolean | null)
|
|
22281
|
+
/**
|
|
22282
|
+
* The problem when `supported` is false, else `null`.
|
|
22283
|
+
*/
|
|
22284
|
+
message?: (string | null)
|
|
22285
|
+
/**
|
|
22286
|
+
* The install step when `supported` is false, else `null`.
|
|
22287
|
+
*/
|
|
22288
|
+
help?: (string | null)
|
|
22289
|
+
}
|
|
22290
|
+
/**
|
|
22291
|
+
* The envelope of `fallow mutation inspect`. It runs no user code, except
|
|
22292
|
+
* with `--replay`.
|
|
21674
22293
|
*/
|
|
21675
22294
|
export interface MutationInspectOutput {
|
|
21676
22295
|
schema_version: MutationInspectSchemaVersion
|
|
@@ -21762,6 +22381,10 @@ killing_tests: string[]
|
|
|
21762
22381
|
* True only for exact requested membership with terminal pass or fail results.
|
|
21763
22382
|
*/
|
|
21764
22383
|
kill_matrix_complete: boolean
|
|
22384
|
+
/**
|
|
22385
|
+
* The replay of the mutant. Present only with `--replay`.
|
|
22386
|
+
*/
|
|
22387
|
+
replay?: (MutationReplayOutput | null)
|
|
21765
22388
|
}
|
|
21766
22389
|
/**
|
|
21767
22390
|
* The code of one mutant, from the current file.
|
|
@@ -21784,6 +22407,95 @@ original_lines: string
|
|
|
21784
22407
|
*/
|
|
21785
22408
|
mutated_lines: string
|
|
21786
22409
|
}
|
|
22410
|
+
/**
|
|
22411
|
+
* The replay of one export on the original and on one mutant (replay
|
|
22412
|
+
* contract 1).
|
|
22413
|
+
*/
|
|
22414
|
+
export interface MutationReplayOutput {
|
|
22415
|
+
/**
|
|
22416
|
+
* The version of the replay contract of the runner companion.
|
|
22417
|
+
*/
|
|
22418
|
+
contract_version: number
|
|
22419
|
+
verdict: MutationReplayVerdict
|
|
22420
|
+
/**
|
|
22421
|
+
* Why the replay did not run or did not end. Absent otherwise.
|
|
22422
|
+
*/
|
|
22423
|
+
reason?: (string | null)
|
|
22424
|
+
/**
|
|
22425
|
+
* The export that the replay called. `null` when no export holds the
|
|
22426
|
+
* mutant.
|
|
22427
|
+
*/
|
|
22428
|
+
export?: (string | null)
|
|
22429
|
+
input: MutationReplayInput
|
|
22430
|
+
/**
|
|
22431
|
+
* The inputs that the replay ran, in order, up to the first witness.
|
|
22432
|
+
*/
|
|
22433
|
+
inputs_checked: number
|
|
22434
|
+
/**
|
|
22435
|
+
* The calls of each side. The sides take turns.
|
|
22436
|
+
*/
|
|
22437
|
+
calls_per_side: number
|
|
22438
|
+
/**
|
|
22439
|
+
* The time limit of one call, in milliseconds.
|
|
22440
|
+
*/
|
|
22441
|
+
call_timeout_ms: number
|
|
22442
|
+
/**
|
|
22443
|
+
* The fixed value of `Date.now()` in each call.
|
|
22444
|
+
*/
|
|
22445
|
+
clock_ms: number
|
|
22446
|
+
/**
|
|
22447
|
+
* The seed of `Math.random` in each call.
|
|
22448
|
+
*/
|
|
22449
|
+
seed: number
|
|
22450
|
+
/**
|
|
22451
|
+
* Each call, in call order.
|
|
22452
|
+
*/
|
|
22453
|
+
calls: MutationReplayCall[]
|
|
22454
|
+
/**
|
|
22455
|
+
* The wall time of the replay request, in milliseconds. It differs
|
|
22456
|
+
* between two replays of the same input.
|
|
22457
|
+
*/
|
|
22458
|
+
duration_ms: number
|
|
22459
|
+
}
|
|
22460
|
+
/**
|
|
22461
|
+
* The input of a replay.
|
|
22462
|
+
*/
|
|
22463
|
+
export interface MutationReplayInput {
|
|
22464
|
+
source: MutationReplayInputSource
|
|
22465
|
+
/**
|
|
22466
|
+
* The id of a recorded input. Absent for `--args`.
|
|
22467
|
+
*/
|
|
22468
|
+
input_id?: (string | null)
|
|
22469
|
+
/**
|
|
22470
|
+
* The arguments in the replay encoding: JSON values, and objects with a
|
|
22471
|
+
* `$replay` tag for `undefined`, special numbers, bigints, dates,
|
|
22472
|
+
* regular expressions, maps, sets and typed arrays.
|
|
22473
|
+
*/
|
|
22474
|
+
args: unknown[]
|
|
22475
|
+
}
|
|
22476
|
+
/**
|
|
22477
|
+
* One call of a replay.
|
|
22478
|
+
*/
|
|
22479
|
+
export interface MutationReplayCall {
|
|
22480
|
+
side: MutationReplaySide
|
|
22481
|
+
/**
|
|
22482
|
+
* The 1-based number of the call on its side.
|
|
22483
|
+
*/
|
|
22484
|
+
index: number
|
|
22485
|
+
outcome: MutationReplayOutcome
|
|
22486
|
+
/**
|
|
22487
|
+
* The returned or thrown value in the replay encoding. An error is
|
|
22488
|
+
* `{"$replay": "error", "name", "message"}`. `null` for a call that
|
|
22489
|
+
* timed out.
|
|
22490
|
+
*/
|
|
22491
|
+
value: (null | boolean | number | string | unknown[] | {
|
|
22492
|
+
|
|
22493
|
+
})
|
|
22494
|
+
/**
|
|
22495
|
+
* A short text of the value for people, at most 200 characters.
|
|
22496
|
+
*/
|
|
22497
|
+
text: string
|
|
22498
|
+
}
|
|
21787
22499
|
/**
|
|
21788
22500
|
* The envelope of `fallow mutation tasks`: the open tasks of one saved
|
|
21789
22501
|
* report, as one batch. It runs no user code.
|
|
@@ -21864,6 +22576,12 @@ original_lines?: (string | null)
|
|
|
21864
22576
|
* stale.
|
|
21865
22577
|
*/
|
|
21866
22578
|
mutated_lines?: (string | null)
|
|
22579
|
+
/**
|
|
22580
|
+
* An advisory hint that the mutant may be equivalent. The task stays
|
|
22581
|
+
* open: a person decides, and records an equivalent mutant in a verdict
|
|
22582
|
+
* file.
|
|
22583
|
+
*/
|
|
22584
|
+
equivalence_hint?: (MutantEquivalenceHint | null)
|
|
21867
22585
|
/**
|
|
21868
22586
|
* Why the current file no longer gives the mutant. Absent for a fresh
|
|
21869
22587
|
* task.
|
|
@@ -21875,6 +22593,71 @@ stale_reason?: (MutationStaleReason | null)
|
|
|
21875
22593
|
* test ids and the static test files of one mutant.
|
|
21876
22594
|
*/
|
|
21877
22595
|
covering_test_files: string[]
|
|
22596
|
+
/**
|
|
22597
|
+
* The witness of the task: a recorded input that shows a difference, with
|
|
22598
|
+
* the results of both sides. Present only after a `--record-args
|
|
22599
|
+
* values` run.
|
|
22600
|
+
*/
|
|
22601
|
+
witness?: (MutationTaskWitness | null)
|
|
22602
|
+
}
|
|
22603
|
+
/**
|
|
22604
|
+
* The witness of a task: the reference of the report, and the values from
|
|
22605
|
+
* the local cache when the cache still has them. Only the verdict
|
|
22606
|
+
* `witness` can have `args`, `original` and `mutant`.
|
|
22607
|
+
*/
|
|
22608
|
+
export interface MutationTaskWitness {
|
|
22609
|
+
verdict: MutationReplayVerdict
|
|
22610
|
+
/**
|
|
22611
|
+
* The recorded input of the verdict.
|
|
22612
|
+
*/
|
|
22613
|
+
input_id?: (string | null)
|
|
22614
|
+
/**
|
|
22615
|
+
* The recorded inputs that the replay ran.
|
|
22616
|
+
*/
|
|
22617
|
+
inputs_checked: number
|
|
22618
|
+
/**
|
|
22619
|
+
* Why the replay gave no witness. Absent for a witness.
|
|
22620
|
+
*/
|
|
22621
|
+
reason?: (string | null)
|
|
22622
|
+
/**
|
|
22623
|
+
* The command that replays the mutant again and shows both sides.
|
|
22624
|
+
*/
|
|
22625
|
+
replay_command: string
|
|
22626
|
+
/**
|
|
22627
|
+
* The arguments of the input in the replay encoding: JSON, and objects
|
|
22628
|
+
* with a `$replay` tag for other values (`{"$replay": "undefined"}`,
|
|
22629
|
+
* `{"$replay": "bigint", "value": "12"}`, and `date`, `regexp`, `map`,
|
|
22630
|
+
* `set` and `bytes`). Absent for another verdict, for a stale task, when
|
|
22631
|
+
* the cache no longer has the input (7 days), and in the markdown
|
|
22632
|
+
* output.
|
|
22633
|
+
*/
|
|
22634
|
+
args?: (unknown[] | null)
|
|
22635
|
+
/**
|
|
22636
|
+
* The result on the original code: the value that a new test asserts.
|
|
22637
|
+
* The replay ran with a fixed clock and seed, so run the new test on the
|
|
22638
|
+
* current code to confirm it.
|
|
22639
|
+
*/
|
|
22640
|
+
original?: (MutationWitnessSide | null)
|
|
22641
|
+
/**
|
|
22642
|
+
* The result on the mutant.
|
|
22643
|
+
*/
|
|
22644
|
+
mutant?: (MutationWitnessSide | null)
|
|
22645
|
+
}
|
|
22646
|
+
/**
|
|
22647
|
+
* The result of one side of a witness.
|
|
22648
|
+
*/
|
|
22649
|
+
export interface MutationWitnessSide {
|
|
22650
|
+
outcome: MutationReplayOutcome
|
|
22651
|
+
/**
|
|
22652
|
+
* The returned or thrown value in the replay encoding.
|
|
22653
|
+
*/
|
|
22654
|
+
value: (null | boolean | number | string | unknown[] | {
|
|
22655
|
+
|
|
22656
|
+
})
|
|
22657
|
+
/**
|
|
22658
|
+
* A short text of the value for people.
|
|
22659
|
+
*/
|
|
22660
|
+
text: string
|
|
21878
22661
|
}
|
|
21879
22662
|
/**
|
|
21880
22663
|
* Single CodeClimate-compatible issue inside [`CodeClimateOutput`].
|