fallow 2.97.0 → 2.98.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fallow",
3
- "version": "2.97.0",
3
+ "version": "2.98.0",
4
4
  "description": "Deterministic codebase intelligence for TypeScript and JavaScript. Quality, risk, architecture, dependencies, duplication, and safe cleanup evidence for humans, CI, and agents. Optional runtime intelligence layer (Fallow Runtime) adds production execution evidence. Rust-native, sub-second, zero-config framework support.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -83,13 +83,13 @@
83
83
  "@tanstack/intent": "0.0.42"
84
84
  },
85
85
  "optionalDependencies": {
86
- "@fallow-cli/darwin-arm64": "2.97.0",
87
- "@fallow-cli/darwin-x64": "2.97.0",
88
- "@fallow-cli/linux-x64-gnu": "2.97.0",
89
- "@fallow-cli/linux-arm64-gnu": "2.97.0",
90
- "@fallow-cli/linux-x64-musl": "2.97.0",
91
- "@fallow-cli/linux-arm64-musl": "2.97.0",
92
- "@fallow-cli/win32-arm64-msvc": "2.97.0",
93
- "@fallow-cli/win32-x64-msvc": "2.97.0"
86
+ "@fallow-cli/darwin-arm64": "2.98.0",
87
+ "@fallow-cli/darwin-x64": "2.98.0",
88
+ "@fallow-cli/linux-x64-gnu": "2.98.0",
89
+ "@fallow-cli/linux-arm64-gnu": "2.98.0",
90
+ "@fallow-cli/linux-x64-musl": "2.98.0",
91
+ "@fallow-cli/linux-arm64-musl": "2.98.0",
92
+ "@fallow-cli/win32-arm64-msvc": "2.98.0",
93
+ "@fallow-cli/win32-x64-msvc": "2.98.0"
94
94
  }
95
95
  }
package/schema.json CHANGED
@@ -159,6 +159,9 @@
159
159
  "unrendered-components": "warn",
160
160
  "unused-component-props": "warn",
161
161
  "unused-component-emits": "warn",
162
+ "unused-component-inputs": "warn",
163
+ "unused-component-outputs": "warn",
164
+ "unused-svelte-events": "warn",
162
165
  "unused-server-actions": "warn",
163
166
  "unused-load-data-keys": "warn",
164
167
  "prop-drilling": "off",
@@ -1052,6 +1055,21 @@
1052
1055
  "$ref": "#/$defs/Severity",
1053
1056
  "default": "error"
1054
1057
  },
1058
+ "unused-component-inputs": {
1059
+ "description": "Angular `@Input()` / signal `input()` / `model()` declared input read\nnowhere inside its own component (neither the inline/external template nor\nthe class body). The single-file dead-input direction, the Angular\nanalogue of `unused-component-prop`. Defaults to `warn`, not `error`: an\ninput can be part of a deliberately-stable public component API, so\nanalyzer confidence is lower; warn encodes that without failing CI.",
1060
+ "$ref": "#/$defs/Severity",
1061
+ "default": "error"
1062
+ },
1063
+ "unused-component-outputs": {
1064
+ "description": "Angular `@Output()` / signal `output()` declared output emitted nowhere\ninside its own component (no `this.<output>.emit(...)`). The single-file\ndead-output direction, the Angular analogue of `unused-component-emit`.\nDefaults to `warn`, not `error`: an output can be part of a\ndeliberately-stable public component API, so analyzer confidence is lower;\nwarn encodes that without failing CI.",
1065
+ "$ref": "#/$defs/Severity",
1066
+ "default": "error"
1067
+ },
1068
+ "unused-svelte-events": {
1069
+ "description": "Svelte component dispatching a custom event via `createEventDispatcher()`\nwhose event name is listened to nowhere in the analyzed project. The\ncross-file dead-output direction (no eslint-plugin-svelte / svelte-check\nrule covers the listener side). Defaults to `warn`, not `error`: a\ndispatched event can be part of a deliberately-stable public component\nAPI, or a listener may be added later, so analyzer confidence is lower;\nwarn encodes that without failing CI.",
1070
+ "$ref": "#/$defs/Severity",
1071
+ "default": "warn"
1072
+ },
1055
1073
  "unused-server-actions": {
1056
1074
  "description": "Next.js Server Action (an export of a `\"use server\"` file) referenced by\nno code in the project: no import-and-call, no `action={fn}` binding, no\n`<form action={fn}>`. Cross-graph dead-export direction, reclassified out\nof `unused-export` for `\"use server\"` files. Defaults to `warn`, not\n`error`: the rule is new and false-negative-preferring, and reflective\naction-dispatch shapes can hide a real consumer; warn encodes that\nwithout failing CI until corpus-validated.",
1057
1075
  "$ref": "#/$defs/Severity",
@@ -1731,6 +1749,36 @@
1731
1749
  }
1732
1750
  ]
1733
1751
  },
1752
+ "unused-component-inputs": {
1753
+ "anyOf": [
1754
+ {
1755
+ "$ref": "#/$defs/Severity"
1756
+ },
1757
+ {
1758
+ "type": "null"
1759
+ }
1760
+ ]
1761
+ },
1762
+ "unused-component-outputs": {
1763
+ "anyOf": [
1764
+ {
1765
+ "$ref": "#/$defs/Severity"
1766
+ },
1767
+ {
1768
+ "type": "null"
1769
+ }
1770
+ ]
1771
+ },
1772
+ "unused-svelte-events": {
1773
+ "anyOf": [
1774
+ {
1775
+ "$ref": "#/$defs/Severity"
1776
+ },
1777
+ {
1778
+ "type": "null"
1779
+ }
1780
+ ]
1781
+ },
1734
1782
  "unused-server-actions": {
1735
1783
  "anyOf": [
1736
1784
  {
@@ -164,6 +164,9 @@ Run `fallow <command> --help` for the full flag list per command (see also refer
164
164
  | `unrendered-component` | `--unrendered-components` | - | `// fallow-ignore-next-line unrendered-component` | A Vue / Svelte component is reachable through a barrel but rendered nowhere |
165
165
  | `unused-component-prop` | `--unused-component-props` | - | `// fallow-ignore-next-line unused-component-prop` | A Vue defineProps prop or React component prop is referenced nowhere in its own component |
166
166
  | `unused-component-emit` | `--unused-component-emits` | - | `// fallow-ignore-next-line unused-component-emit` | A Vue <script setup> defineEmits event is emitted nowhere in its own component |
167
+ | `unused-component-input` | `--unused-component-inputs` | - | `// fallow-ignore-next-line unused-component-input` | An Angular @Input() / signal input() / model() is read nowhere in its own component (class body or template); needs `@angular/core` dep |
168
+ | `unused-component-output` | `--unused-component-outputs` | - | `// fallow-ignore-next-line unused-component-output` | An Angular @Output() / signal output() is emitted (.emit()) nowhere in its own component; needs `@angular/core` dep |
169
+ | `unused-svelte-event` | `--unused-svelte-events` | - | `// fallow-ignore-next-line unused-svelte-event` | A Svelte createEventDispatcher event is listened to nowhere in the project; needs `svelte` dep |
167
170
  | `unused-server-action` | `--unused-server-actions` | - | `// fallow-ignore-next-line unused-server-action` | A Next.js Server Action exported from a "use server" file is referenced by no code in the project |
168
171
  | `unused-load-data-key` | `--unused-load-data-keys` | - | `// fallow-ignore-next-line unused-load-data-key` | A SvelteKit load() return-object key is read by no consumer (needs @sveltejs/kit dep) |
169
172
  | `prop-drilling` | - | - | `// fallow-ignore-next-line prop-drilling` | A React/Preact prop is forwarded unchanged through 3+ pass-through components to a distant consumer; Opt-in: set rules.prop-drilling to warn or error to enable. Defaults to off. |
@@ -66,6 +66,9 @@ Common global flags for this command: [`--format`](#global-flags), [`--quiet`](#
66
66
  | `--unrendered-components` | A Vue / Svelte component is reachable through a barrel but rendered nowhere |
67
67
  | `--unused-component-props` | A Vue defineProps prop or React component prop is referenced nowhere in its own component |
68
68
  | `--unused-component-emits` | A Vue <script setup> defineEmits event is emitted nowhere in its own component |
69
+ | `--unused-component-inputs` | An Angular @Input() / signal input() / model() is read nowhere in its own component (class body or template); needs `@angular/core` dep |
70
+ | `--unused-component-outputs` | An Angular @Output() / signal output() is emitted (.emit()) nowhere in its own component; needs `@angular/core` dep |
71
+ | `--unused-svelte-events` | A Svelte createEventDispatcher event is listened to nowhere in the project |
69
72
  | `--unused-server-actions` | A Next.js Server Action exported from a "use server" file is referenced by no code in the project |
70
73
  | `--unused-load-data-keys` | A SvelteKit load() return-object key is read by no consumer |
71
74
  | `--unresolved-imports` | Unresolved imports |
@@ -501,7 +504,7 @@ fallow health --format json --quiet --trend
501
504
  {
502
505
  "kind": "health",
503
506
  "schema_version": 7,
504
- "version": "2.97.0",
507
+ "version": "2.98.0",
505
508
  "elapsed_ms": 32,
506
509
  "summary": {
507
510
  "files_analyzed": 482,
@@ -888,7 +891,7 @@ fallow audit \
888
891
  {
889
892
  "kind": "audit",
890
893
  "schema_version": 7,
891
- "version": "2.97.0",
894
+ "version": "2.98.0",
892
895
  "command": "audit",
893
896
  "verdict": "fail",
894
897
  "changed_files_count": 12,
@@ -963,7 +966,7 @@ fallow flags --format json --quiet --workspace my-package
963
966
  ```json
964
967
  {
965
968
  "schema_version": 7,
966
- "version": "2.97.0",
969
+ "version": "2.98.0",
967
970
  "elapsed_ms": 116,
968
971
  "feature_flags": [],
969
972
  "total_flags": 0
@@ -1063,7 +1066,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1063
1066
  {
1064
1067
  "kind": "security",
1065
1068
  "schema_version": "4",
1066
- "version": "2.97.0",
1069
+ "version": "2.98.0",
1067
1070
  "elapsed_ms": 42,
1068
1071
  "config": {
1069
1072
  "rules": {
@@ -1092,7 +1095,7 @@ fallow security --gate newly-reachable --changed-since origin/main
1092
1095
  {
1093
1096
  "kind": "security",
1094
1097
  "schema_version": "4",
1095
- "version": "2.97.0",
1098
+ "version": "2.98.0",
1096
1099
  "elapsed_ms": 42,
1097
1100
  "config": {
1098
1101
  "rules": {
@@ -1709,7 +1712,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
1709
1712
  {
1710
1713
  "kind": "dead-code",
1711
1714
  "schema_version": 7,
1712
- "version": "2.97.0",
1715
+ "version": "2.98.0",
1713
1716
  "elapsed_ms": 45,
1714
1717
  "total_issues": 12,
1715
1718
  "entry_points": {
@@ -1869,7 +1872,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
1869
1872
  {
1870
1873
  "kind": "dupes",
1871
1874
  "schema_version": 7,
1872
- "version": "2.97.0",
1875
+ "version": "2.98.0",
1873
1876
  "elapsed_ms": 82,
1874
1877
  "total_clones": 15,
1875
1878
  "total_lines_duplicated": 230,
@@ -1913,11 +1916,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
1913
1916
  {
1914
1917
  "kind": "combined",
1915
1918
  "schema_version": 7,
1916
- "version": "2.97.0",
1919
+ "version": "2.98.0",
1917
1920
  "elapsed_ms": 159,
1918
1921
  "check": {
1919
1922
  "schema_version": 7,
1920
- "version": "2.97.0",
1923
+ "version": "2.98.0",
1921
1924
  "elapsed_ms": 45,
1922
1925
  "total_issues": 12,
1923
1926
  "unused_files": [],
@@ -78,6 +78,18 @@ Don't use `--changed-since` when auditing the full project. Use it for PR checks
78
78
 
79
79
  ---
80
80
 
81
+ ## Svelte Event Findings Are Project-Wide Listener Checks
82
+
83
+ `unused-svelte-event` reports a Svelte `createEventDispatcher` event that has no reachable listener in the project. This is different from `unused-component-emit`, which checks whether a Vue component ever emits its declared event.
84
+
85
+ ```bash
86
+ fallow dead-code --format json --quiet --unused-svelte-events
87
+ ```
88
+
89
+ Dynamic event names, dispatcher values that escape the component, and projects without a declared Svelte dependency are abstained to avoid false positives.
90
+
91
+ ---
92
+
81
93
  ## Filter Flags Are Additive
82
94
 
83
95
  Issue type filter flags (`--unused-exports`, `--unused-files`, etc.) are inclusive. They select which issue types to show. Using multiple flags shows the union.
@@ -323,6 +335,10 @@ Conservative semantics: a method carrying any decorator NOT in the list still ge
323
335
 
324
336
  The default empty list preserves today's skip-all behavior, so existing NestJS / Angular / TypeORM projects see no change.
325
337
 
338
+ ### Angular `@Input()` / `@Output()` are still covered by the component rules
339
+
340
+ The skip above applies only to generic `unused-class-member` detection. The dedicated Angular component rules (`unused-component-input` for `@Input()` / signal `input()` / `model()`, and `unused-component-output` for `@Output()` / signal `output()`, both default `warn`, gated on `@angular/core`) scope usage to the component itself: an input is dead when it is read by no code in its own class body or template (inline `template` or external `templateUrl`), and an output is dead when it is emitted (`.emit()`) nowhere in its own component. The scope is the component, not the project: an input that a parent binds via `[input]="..."` but the component itself never reads IS flagged, because the parent binding is satisfied while the value goes unused inside the component. These rules abstain on the whole component for any `extends` clause, a `{...this}` spread, JS-reserved-word names, accessor (`get` / `set`) inputs, and observable-stream `@Output`s (only `new EventEmitter()` initializers are harvested); `model()` is treated as input-only. Suppress an individual finding with `// fallow-ignore-next-line unused-component-input` or `-output`.
341
+
326
342
  ---
327
343
 
328
344
  ## JSDoc Visibility Tags Keep Exports Alive
@@ -172,7 +172,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
172
172
  * Discriminant string for [`FixAction`]. Kebab-case per the JSON output
173
173
  * contract.
174
174
  */
175
- 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" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "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" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict")
175
+ 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" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "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" | "emit-component-event" | "wire-svelte-event" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict")
176
176
  /**
177
177
  * Singleton discriminant for [`SuppressLineAction`].
178
178
  */
@@ -1134,6 +1134,28 @@ unused_component_props?: UnusedComponentPropFinding[]
1134
1134
  * `warn`.
1135
1135
  */
1136
1136
  unused_component_emits?: UnusedComponentEmitFinding[]
1137
+ /**
1138
+ * Angular `@Input()` / signal `input()` / `model()` inputs read nowhere in
1139
+ * their own component (neither the template nor the class body). Wrapped in
1140
+ * [`UnusedComponentInputFinding`] so each entry carries a typed `actions`
1141
+ * array natively. Default severity is `warn`.
1142
+ */
1143
+ unused_component_inputs?: UnusedComponentInputFinding[]
1144
+ /**
1145
+ * Angular `@Output()` / signal `output()` outputs emitted nowhere in their
1146
+ * own component (no `this.<output>.emit(...)`). Wrapped in
1147
+ * [`UnusedComponentOutputFinding`] so each entry carries a typed `actions`
1148
+ * array natively. Default severity is `warn`.
1149
+ */
1150
+ unused_component_outputs?: UnusedComponentOutputFinding[]
1151
+ /**
1152
+ * Svelte components dispatching a custom event via `createEventDispatcher()`
1153
+ * whose event name is listened to nowhere project-wide (cross-file
1154
+ * dead-output direction). Wrapped in [`UnusedSvelteEventFinding`] so each
1155
+ * entry carries a typed `actions` array natively. Default severity is
1156
+ * `warn`.
1157
+ */
1158
+ unused_svelte_events?: UnusedSvelteEventFinding[]
1137
1159
  /**
1138
1160
  * Next.js Server Actions (exports of `"use server"` files) that no code in
1139
1161
  * the project references. Reclassified out of `unused_exports` for
@@ -1277,6 +1299,19 @@ unused_component_props?: number
1277
1299
  * Vue `<script setup>` emits emitted nowhere inside their own SFC.
1278
1300
  */
1279
1301
  unused_component_emits?: number
1302
+ /**
1303
+ * Angular `@Input()` bindings referenced nowhere inside their own component.
1304
+ */
1305
+ unused_component_inputs?: number
1306
+ /**
1307
+ * Angular `@Output()` bindings emitted nowhere inside their own component.
1308
+ */
1309
+ unused_component_outputs?: number
1310
+ /**
1311
+ * Svelte components dispatching a custom event via `createEventDispatcher`
1312
+ * whose name is listened to nowhere in the project.
1313
+ */
1314
+ unused_svelte_events?: number
1280
1315
  /**
1281
1316
  * Next.js Server Actions (exports of `"use server"` files) referenced by no
1282
1317
  * code in the project.
@@ -2745,7 +2780,8 @@ introduced?: (AuditIntroduced | null)
2745
2780
  /**
2746
2781
  * Wire-shape envelope for an [`UnprovidedInject`] finding. There is no safe
2747
2782
  * auto-fix: the fix is binary but judgement-bearing (add a `provide` for the
2748
- * key, or delete the dead inject). The only action is a line-level suppress.
2783
+ * key, or delete the dead inject). Actions are manual remediation guidance
2784
+ * plus a line-level suppress.
2749
2785
  */
2750
2786
  export interface UnprovidedInjectFinding {
2751
2787
  /**
@@ -2782,8 +2818,8 @@ introduced?: (AuditIntroduced | null)
2782
2818
  /**
2783
2819
  * Wire-shape envelope for an [`UnrenderedComponent`] finding. There is no safe
2784
2820
  * auto-fix: the fix is binary but judgement-bearing (render the component
2785
- * somewhere, or delete the dead component). The only action is a line-level
2786
- * suppress.
2821
+ * somewhere, or delete the dead component). Actions are manual remediation
2822
+ * guidance plus a line-level suppress.
2787
2823
  */
2788
2824
  export interface UnrenderedComponentFinding {
2789
2825
  /**
@@ -2915,8 +2951,8 @@ introduced?: (AuditIntroduced | null)
2915
2951
  /**
2916
2952
  * Wire-shape envelope for an [`UnusedComponentProp`] finding. There is no safe
2917
2953
  * auto-fix: removing a declared prop is judgement-bearing (the prop may be part
2918
- * of a deliberately-stable public component API). The only action is a
2919
- * line-level suppress at the prop declaration.
2954
+ * of a deliberately-stable public component API). Actions are manual
2955
+ * remediation guidance plus a line-level suppress at the prop declaration.
2920
2956
  */
2921
2957
  export interface UnusedComponentPropFinding {
2922
2958
  /**
@@ -2953,8 +2989,8 @@ introduced?: (AuditIntroduced | null)
2953
2989
  /**
2954
2990
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
2955
2991
  * auto-fix: removing a declared emit is judgement-bearing (the event may be
2956
- * part of a deliberately-stable public component API). The only action is a
2957
- * line-level suppress at the emit declaration.
2992
+ * part of a deliberately-stable public component API). Actions are manual
2993
+ * remediation guidance plus a line-level suppress at the emit declaration.
2958
2994
  */
2959
2995
  export interface UnusedComponentEmitFinding {
2960
2996
  /**
@@ -2988,10 +3024,126 @@ actions: IssueAction[]
2988
3024
  */
2989
3025
  introduced?: (AuditIntroduced | null)
2990
3026
  }
3027
+ /**
3028
+ * Wire-shape envelope for an [`UnusedComponentInput`] finding. There is no safe
3029
+ * auto-fix: removing a declared input is judgement-bearing (the input may be
3030
+ * part of a deliberately-stable public component API). The only action is a
3031
+ * line-level suppress at the input declaration.
3032
+ */
3033
+ export interface UnusedComponentInputFinding {
3034
+ /**
3035
+ * The Angular component/directive `.ts` file declaring the unused input.
3036
+ */
3037
+ path: string
3038
+ /**
3039
+ * The component name (the `.ts` file stem).
3040
+ */
3041
+ component_name: string
3042
+ /**
3043
+ * The declared input name that is never read.
3044
+ */
3045
+ input_name: string
3046
+ /**
3047
+ * 1-based line number of the input declaration.
3048
+ */
3049
+ line: number
3050
+ /**
3051
+ * 0-based byte column offset of the input declaration.
3052
+ */
3053
+ col: number
3054
+ /**
3055
+ * Suggested next steps. Always emitted (possibly empty for
3056
+ * forward-compat).
3057
+ */
3058
+ actions: IssueAction[]
3059
+ /**
3060
+ * Set by the audit pass when this finding is introduced relative to
3061
+ * the merge-base.
3062
+ */
3063
+ introduced?: (AuditIntroduced | null)
3064
+ }
3065
+ /**
3066
+ * Wire-shape envelope for an [`UnusedComponentOutput`] finding. There is no safe
3067
+ * auto-fix: removing a declared output is judgement-bearing (the event may be
3068
+ * part of a deliberately-stable public component API). The only action is a
3069
+ * line-level suppress at the output declaration.
3070
+ */
3071
+ export interface UnusedComponentOutputFinding {
3072
+ /**
3073
+ * The Angular component/directive `.ts` file declaring the unused output.
3074
+ */
3075
+ path: string
3076
+ /**
3077
+ * The component name (the `.ts` file stem).
3078
+ */
3079
+ component_name: string
3080
+ /**
3081
+ * The declared output name that is never emitted.
3082
+ */
3083
+ output_name: string
3084
+ /**
3085
+ * 1-based line number of the output declaration.
3086
+ */
3087
+ line: number
3088
+ /**
3089
+ * 0-based byte column offset of the output declaration.
3090
+ */
3091
+ col: number
3092
+ /**
3093
+ * Suggested next steps. Always emitted (possibly empty for
3094
+ * forward-compat).
3095
+ */
3096
+ actions: IssueAction[]
3097
+ /**
3098
+ * Set by the audit pass when this finding is introduced relative to
3099
+ * the merge-base.
3100
+ */
3101
+ introduced?: (AuditIntroduced | null)
3102
+ }
3103
+ /**
3104
+ * Wire-shape envelope for an [`UnusedSvelteEvent`] finding. There is no safe
3105
+ * auto-fix: removing a dispatched event is judgement-bearing (the event may be
3106
+ * part of a deliberately-stable public component API, or a listener may be
3107
+ * added later). Actions are manual remediation guidance plus a line-level
3108
+ * suppress at the `dispatch` call.
3109
+ */
3110
+ export interface UnusedSvelteEventFinding {
3111
+ /**
3112
+ * The `.svelte` component dispatching the unlistened event.
3113
+ */
3114
+ path: string
3115
+ /**
3116
+ * The component name (the `.svelte` file stem).
3117
+ */
3118
+ component_name: string
3119
+ /**
3120
+ * The dispatched event name that is listened to nowhere.
3121
+ */
3122
+ event_name: string
3123
+ /**
3124
+ * 1-based line number of the `dispatch('<name>')` call.
3125
+ */
3126
+ line: number
3127
+ /**
3128
+ * 0-based byte column offset of the `dispatch('<name>')` call.
3129
+ */
3130
+ col: number
3131
+ /**
3132
+ * Suggested next steps. Always emitted (possibly empty for
3133
+ * forward-compat).
3134
+ */
3135
+ actions: IssueAction[]
3136
+ /**
3137
+ * Set by the audit pass when this finding is introduced relative to
3138
+ * the merge-base.
3139
+ */
3140
+ introduced?: (AuditIntroduced | null)
3141
+ }
2991
3142
  /**
2992
3143
  * Wire-shape envelope for an [`UnusedServerAction`] finding. There is no safe
2993
3144
  * auto-fix: the fix is binary but judgement-bearing (wire the action up to a
2994
- * consumer, or delete it). The only action is a line-level suppress.
3145
+ * consumer, or delete it). Actions are manual remediation guidance plus a
3146
+ * line-level suppress.
2995
3147
  */
2996
3148
  export interface UnusedServerActionFinding {
2997
3149
  /**
@@ -3024,7 +3176,8 @@ introduced?: (AuditIntroduced | null)
3024
3176
  /**
3025
3177
  * Wire-shape envelope for an [`UnusedLoadDataKey`] finding. There is no safe
3026
3178
  * auto-fix: a `load()` fetch can have side effects, so deleting the key is a
3027
- * human call. The only action is a line-level suppress.
3179
+ * human call. Actions are manual remediation guidance plus a line-level
3180
+ * suppress.
3028
3181
  */
3029
3182
  export interface UnusedLoadDataKeyFinding {
3030
3183
  /**
@@ -7066,6 +7219,28 @@ unused_component_props?: UnusedComponentPropFinding[]
7066
7219
  * `warn`.
7067
7220
  */
7068
7221
  unused_component_emits?: UnusedComponentEmitFinding[]
7222
+ /**
7223
+ * Angular `@Input()` / signal `input()` / `model()` inputs read nowhere in
7224
+ * their own component (neither the template nor the class body). Wrapped in
7225
+ * [`UnusedComponentInputFinding`] so each entry carries a typed `actions`
7226
+ * array natively. Default severity is `warn`.
7227
+ */
7228
+ unused_component_inputs?: UnusedComponentInputFinding[]
7229
+ /**
7230
+ * Angular `@Output()` / signal `output()` outputs emitted nowhere in their
7231
+ * own component (no `this.<output>.emit(...)`). Wrapped in
7232
+ * [`UnusedComponentOutputFinding`] so each entry carries a typed `actions`
7233
+ * array natively. Default severity is `warn`.
7234
+ */
7235
+ unused_component_outputs?: UnusedComponentOutputFinding[]
7236
+ /**
7237
+ * Svelte components dispatching a custom event via `createEventDispatcher()`
7238
+ * whose event name is listened to nowhere project-wide (cross-file
7239
+ * dead-output direction). Wrapped in [`UnusedSvelteEventFinding`] so each
7240
+ * entry carries a typed `actions` array natively. Default severity is
7241
+ * `warn`.
7242
+ */
7243
+ unused_svelte_events?: UnusedSvelteEventFinding[]
7069
7244
  /**
7070
7245
  * Next.js Server Actions (exports of `"use server"` files) that no code in
7071
7246
  * the project references. Reclassified out of `unused_exports` for