@sarj/eslint-plugin 4.2.0 → 5.1.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/dist/index.d.cts CHANGED
@@ -1,5 +1,35 @@
1
1
  import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
+ /**
4
+ * @fileoverview An object type whose member comments mostly re-spell the
5
+ * members' own names and types — the VOLUME arm of the comment family, judged
6
+ * once per TYPE rather than once per comment.
7
+ *
8
+ * interface SapCredentials {
9
+ * // Database host.
10
+ * host?: string;
11
+ * // Database host port.
12
+ * port?: number;
13
+ * // Database username.
14
+ * username?: string;
15
+ * }
16
+ *
17
+ * `jsdoc-restates-signature` needs every content word covered, so it deletes
18
+ * the first row and cannot touch the second. That is the right verdict for one
19
+ * line and the wrong one for ten, so the unit of judgement here is the type.
20
+ *
21
+ * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-type-member-comment-wall.test.ts
22
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-type-member-comment-wall.md
23
+ */
24
+
25
+ /** Every threshold this rule applies; each is documented at `DEFAULTS`. */
26
+ interface RuleOptions$3 {
27
+ readonly minCommentedMembers: number;
28
+ readonly minCommentedRatio: number;
29
+ readonly minRestatedRatio: number;
30
+ readonly maxNovelWords: number;
31
+ }
32
+
3
33
  /**
4
34
  * @fileoverview Keep modules that are stateless by design free of private
5
35
  * storage.
@@ -86,8 +116,10 @@ interface RuleOptions$2 {
86
116
  * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
87
117
  * }]
88
118
  *
89
- * Supplying `allow` REPLACES the defaults, so include the test patterns if you
90
- * still want test files exempt.
119
+ * Supplying `allow` REPLACES the default CLIENT-LAYER patterns. Test files are
120
+ * no longer part of that list — they are recognised unconditionally by the
121
+ * shared `isTestFile` predicate — so a repo that overrides `allow` keeps its
122
+ * test tree exempt without having to remember the test patterns.
91
123
  *
92
124
  * CORPUS SWEEP (2220 files, zod / TanStack Query / react-router / swr /
93
125
  * zustand, 2026-07): 96 raw hits. The defaults missed three path conventions
@@ -103,6 +135,44 @@ interface RuleOptions$2 {
103
135
  * - `__testfixtures__/` — 8 hits from jscodeshift fixtures such as
104
136
  * `query/packages/query-codemods/src/v5/remove-overloads/__testfixtures__/bug-reports.input.tsx`,
105
137
  * which are input/output text for a codemod, not code that runs.
138
+ *
139
+ * SECOND SWEEP (25,508 deduped TS/TSX files across zod / trpc / dub /
140
+ * openstatus / formbricks / documenso / unkey / midday / papermark / cal.com /
141
+ * hono plus six first-party repos, 2026-07): 1,019 hits, 50 read in a seeded
142
+ * random sample — 24 true positives, 21 false positives, 5 arguable. At a 42%
143
+ * false-positive rate this was the loudest rule of the five audited, and the
144
+ * cause was the same one the first sweep found, just further along: the reports
145
+ * were landing ON the client layer, under names the `allow` list did not know.
146
+ *
147
+ * - **Vendor wrapper modules** — 147 findings. `*Service.ts`, `services/`,
148
+ * `connectors/` (16), `providers/` (12), `integrations/` (16),
149
+ * `notifications/<vendor>/` (29), `adapters/`, `*-fetcher.ts`. Every fetch
150
+ * in them is an absolute-URL call to ONE third-party origin — they ARE the
151
+ * module the rule wants the fetch to live in. Citable:
152
+ * `cal.com/packages/app-store/office365calendar/lib/CalendarService.ts:265`,
153
+ * `openstatus/packages/notifications/telegram/src/index.ts:81`,
154
+ * `formbricks/apps/web/lib/googleSheet/service.ts:164`.
155
+ * Recall cost: 0 of the 50 sampled true positives lived in such a path —
156
+ * every one was a `.tsx` component/page/modal or a React hook.
157
+ * - **Test-path drift** — 36 findings. The rule hand-rolled its own test-path
158
+ * list instead of using the shared `isTestFile`, so it missed `playwright/`
159
+ * (19) and the `.e2e.ts` basename. The single loudest file corpus-wide was
160
+ * `cal.com/apps/web/playwright/oauth-provider.e2e.ts` (16 findings). The
161
+ * sibling rule `require-fetch-timeout` had always used `isTestFile`; this
162
+ * was pure drift between two rules that see the same call sites.
163
+ * - **Asset / passthrough handoff** — see `isConstructedArgumentHandoff`.
164
+ *
165
+ * DELIBERATELY NOT GUARDED: restricting the rule to component/hook files. It
166
+ * would cut the residual false-positive rate from ~25% to ~4%, but costs ~80
167
+ * real positives in `.ts` background jobs (e.g.
168
+ * `papermark/lib/trigger/convert-pdf-direct.ts:332`).
169
+ *
170
+ * DELIBERATELY NOT ALLOWED: a `-provider.*` BASENAME, even though the
171
+ * `providers/` DIRECTORY is. In the corpus that basename is usually a React
172
+ * context or modal provider calling the app's own API —
173
+ * `dub/apps/web/ui/modals/modal-provider.tsx:134` is exactly the true-positive
174
+ * shape — and the two vendor files that carry it are already covered by
175
+ * `integrations/`.
106
176
  */
107
177
 
108
178
  interface RuleOptions$1 {
@@ -197,9 +267,6 @@ interface LoggingOptions {
197
267
  }
198
268
 
199
269
  declare const rules: {
200
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
201
- name: string;
202
- };
203
270
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
271
  name: string;
205
272
  };
@@ -352,25 +419,24 @@ declare const rules: {
352
419
  "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
353
420
  name: string;
354
421
  };
422
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
423
+ name: string;
424
+ };
355
425
  "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
356
426
  name: string;
357
427
  };
358
428
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
359
429
  name: string;
360
430
  };
361
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
362
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
431
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
363
432
  name: string;
364
433
  };
365
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
434
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
366
435
  name: string;
367
436
  };
368
437
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
369
438
  name: string;
370
439
  };
371
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
372
- name: string;
373
- };
374
440
  };
375
441
  declare const plugin: {
376
442
  meta: {
@@ -378,9 +444,6 @@ declare const plugin: {
378
444
  version: string;
379
445
  };
380
446
  rules: {
381
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
382
- name: string;
383
- };
384
447
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
385
448
  name: string;
386
449
  };
@@ -533,25 +596,24 @@ declare const plugin: {
533
596
  "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
534
597
  name: string;
535
598
  };
599
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
600
+ name: string;
601
+ };
536
602
  "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
537
603
  name: string;
538
604
  };
539
605
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
540
606
  name: string;
541
607
  };
542
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
543
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
608
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
544
609
  name: string;
545
610
  };
546
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
611
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
547
612
  name: string;
548
613
  };
549
614
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
550
615
  name: string;
551
616
  };
552
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
553
- name: string;
554
- };
555
617
  };
556
618
  configs: {
557
619
  recommended: {
@@ -560,7 +622,6 @@ declare const plugin: {
560
622
  "@sarj/zod-naming-convention": string;
561
623
  "@sarj/require-assert-never": string;
562
624
  "@sarj/require-zod-form-validation": string;
563
- "@sarj/ban-loose-type-guards-in-tests": string;
564
625
  "@sarj/enforce-file-structure": string;
565
626
  "@sarj/no-client-side-data-fetching": string;
566
627
  "@sarj/prefer-server-actions": string;
@@ -600,12 +661,11 @@ declare const plugin: {
600
661
  "@sarj/no-restated-comment": string;
601
662
  "@sarj/jsdoc-restates-signature": string;
602
663
  "@sarj/trailing-value-narration": string;
664
+ "@sarj/no-type-member-comment-wall": string;
603
665
  "@sarj/no-tautological-expect": string;
604
666
  "@sarj/require-interface-for-injected-service": string;
605
667
  "@sarj/prefer-non-nullable-collection": string;
606
- "@sarj/no-implicit-attribute-access": string;
607
668
  "@sarj/no-async-callback-in-waitfor": string;
608
- "@sarj/prefer-setup-file-mocks": string;
609
669
  };
610
670
  };
611
671
  strict: {
@@ -614,7 +674,6 @@ declare const plugin: {
614
674
  "@sarj/zod-naming-convention": string;
615
675
  "@sarj/require-assert-never": string;
616
676
  "@sarj/require-zod-form-validation": string;
617
- "@sarj/ban-loose-type-guards-in-tests": string;
618
677
  "@sarj/enforce-file-structure": string;
619
678
  "@sarj/no-raw-env": string;
620
679
  "@sarj/no-enum": string;
@@ -658,12 +717,11 @@ declare const plugin: {
658
717
  "@sarj/no-restated-comment": string;
659
718
  "@sarj/jsdoc-restates-signature": string;
660
719
  "@sarj/trailing-value-narration": string;
720
+ "@sarj/no-type-member-comment-wall": string;
661
721
  "@sarj/no-tautological-expect": string;
662
722
  "@sarj/require-interface-for-injected-service": string;
663
723
  "@sarj/prefer-non-nullable-collection": string;
664
- "@sarj/no-implicit-attribute-access": string;
665
724
  "@sarj/no-async-callback-in-waitfor": string;
666
- "@sarj/prefer-setup-file-mocks": string;
667
725
  };
668
726
  };
669
727
  };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,35 @@
1
1
  import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
+ /**
4
+ * @fileoverview An object type whose member comments mostly re-spell the
5
+ * members' own names and types — the VOLUME arm of the comment family, judged
6
+ * once per TYPE rather than once per comment.
7
+ *
8
+ * interface SapCredentials {
9
+ * // Database host.
10
+ * host?: string;
11
+ * // Database host port.
12
+ * port?: number;
13
+ * // Database username.
14
+ * username?: string;
15
+ * }
16
+ *
17
+ * `jsdoc-restates-signature` needs every content word covered, so it deletes
18
+ * the first row and cannot touch the second. That is the right verdict for one
19
+ * line and the wrong one for ten, so the unit of judgement here is the type.
20
+ *
21
+ * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-type-member-comment-wall.test.ts
22
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-type-member-comment-wall.md
23
+ */
24
+
25
+ /** Every threshold this rule applies; each is documented at `DEFAULTS`. */
26
+ interface RuleOptions$3 {
27
+ readonly minCommentedMembers: number;
28
+ readonly minCommentedRatio: number;
29
+ readonly minRestatedRatio: number;
30
+ readonly maxNovelWords: number;
31
+ }
32
+
3
33
  /**
4
34
  * @fileoverview Keep modules that are stateless by design free of private
5
35
  * storage.
@@ -86,8 +116,10 @@ interface RuleOptions$2 {
86
116
  * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
87
117
  * }]
88
118
  *
89
- * Supplying `allow` REPLACES the defaults, so include the test patterns if you
90
- * still want test files exempt.
119
+ * Supplying `allow` REPLACES the default CLIENT-LAYER patterns. Test files are
120
+ * no longer part of that list — they are recognised unconditionally by the
121
+ * shared `isTestFile` predicate — so a repo that overrides `allow` keeps its
122
+ * test tree exempt without having to remember the test patterns.
91
123
  *
92
124
  * CORPUS SWEEP (2220 files, zod / TanStack Query / react-router / swr /
93
125
  * zustand, 2026-07): 96 raw hits. The defaults missed three path conventions
@@ -103,6 +135,44 @@ interface RuleOptions$2 {
103
135
  * - `__testfixtures__/` — 8 hits from jscodeshift fixtures such as
104
136
  * `query/packages/query-codemods/src/v5/remove-overloads/__testfixtures__/bug-reports.input.tsx`,
105
137
  * which are input/output text for a codemod, not code that runs.
138
+ *
139
+ * SECOND SWEEP (25,508 deduped TS/TSX files across zod / trpc / dub /
140
+ * openstatus / formbricks / documenso / unkey / midday / papermark / cal.com /
141
+ * hono plus six first-party repos, 2026-07): 1,019 hits, 50 read in a seeded
142
+ * random sample — 24 true positives, 21 false positives, 5 arguable. At a 42%
143
+ * false-positive rate this was the loudest rule of the five audited, and the
144
+ * cause was the same one the first sweep found, just further along: the reports
145
+ * were landing ON the client layer, under names the `allow` list did not know.
146
+ *
147
+ * - **Vendor wrapper modules** — 147 findings. `*Service.ts`, `services/`,
148
+ * `connectors/` (16), `providers/` (12), `integrations/` (16),
149
+ * `notifications/<vendor>/` (29), `adapters/`, `*-fetcher.ts`. Every fetch
150
+ * in them is an absolute-URL call to ONE third-party origin — they ARE the
151
+ * module the rule wants the fetch to live in. Citable:
152
+ * `cal.com/packages/app-store/office365calendar/lib/CalendarService.ts:265`,
153
+ * `openstatus/packages/notifications/telegram/src/index.ts:81`,
154
+ * `formbricks/apps/web/lib/googleSheet/service.ts:164`.
155
+ * Recall cost: 0 of the 50 sampled true positives lived in such a path —
156
+ * every one was a `.tsx` component/page/modal or a React hook.
157
+ * - **Test-path drift** — 36 findings. The rule hand-rolled its own test-path
158
+ * list instead of using the shared `isTestFile`, so it missed `playwright/`
159
+ * (19) and the `.e2e.ts` basename. The single loudest file corpus-wide was
160
+ * `cal.com/apps/web/playwright/oauth-provider.e2e.ts` (16 findings). The
161
+ * sibling rule `require-fetch-timeout` had always used `isTestFile`; this
162
+ * was pure drift between two rules that see the same call sites.
163
+ * - **Asset / passthrough handoff** — see `isConstructedArgumentHandoff`.
164
+ *
165
+ * DELIBERATELY NOT GUARDED: restricting the rule to component/hook files. It
166
+ * would cut the residual false-positive rate from ~25% to ~4%, but costs ~80
167
+ * real positives in `.ts` background jobs (e.g.
168
+ * `papermark/lib/trigger/convert-pdf-direct.ts:332`).
169
+ *
170
+ * DELIBERATELY NOT ALLOWED: a `-provider.*` BASENAME, even though the
171
+ * `providers/` DIRECTORY is. In the corpus that basename is usually a React
172
+ * context or modal provider calling the app's own API —
173
+ * `dub/apps/web/ui/modals/modal-provider.tsx:134` is exactly the true-positive
174
+ * shape — and the two vendor files that carry it are already covered by
175
+ * `integrations/`.
106
176
  */
107
177
 
108
178
  interface RuleOptions$1 {
@@ -197,9 +267,6 @@ interface LoggingOptions {
197
267
  }
198
268
 
199
269
  declare const rules: {
200
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
201
- name: string;
202
- };
203
270
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
271
  name: string;
205
272
  };
@@ -352,25 +419,24 @@ declare const rules: {
352
419
  "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
353
420
  name: string;
354
421
  };
422
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
423
+ name: string;
424
+ };
355
425
  "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
356
426
  name: string;
357
427
  };
358
428
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
359
429
  name: string;
360
430
  };
361
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
362
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
431
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
363
432
  name: string;
364
433
  };
365
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
434
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
366
435
  name: string;
367
436
  };
368
437
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
369
438
  name: string;
370
439
  };
371
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
372
- name: string;
373
- };
374
440
  };
375
441
  declare const plugin: {
376
442
  meta: {
@@ -378,9 +444,6 @@ declare const plugin: {
378
444
  version: string;
379
445
  };
380
446
  rules: {
381
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
382
- name: string;
383
- };
384
447
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
385
448
  name: string;
386
449
  };
@@ -533,25 +596,24 @@ declare const plugin: {
533
596
  "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
534
597
  name: string;
535
598
  };
599
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
600
+ name: string;
601
+ };
536
602
  "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
537
603
  name: string;
538
604
  };
539
605
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
540
606
  name: string;
541
607
  };
542
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
543
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
608
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
544
609
  name: string;
545
610
  };
546
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
611
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
547
612
  name: string;
548
613
  };
549
614
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
550
615
  name: string;
551
616
  };
552
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
553
- name: string;
554
- };
555
617
  };
556
618
  configs: {
557
619
  recommended: {
@@ -560,7 +622,6 @@ declare const plugin: {
560
622
  "@sarj/zod-naming-convention": string;
561
623
  "@sarj/require-assert-never": string;
562
624
  "@sarj/require-zod-form-validation": string;
563
- "@sarj/ban-loose-type-guards-in-tests": string;
564
625
  "@sarj/enforce-file-structure": string;
565
626
  "@sarj/no-client-side-data-fetching": string;
566
627
  "@sarj/prefer-server-actions": string;
@@ -600,12 +661,11 @@ declare const plugin: {
600
661
  "@sarj/no-restated-comment": string;
601
662
  "@sarj/jsdoc-restates-signature": string;
602
663
  "@sarj/trailing-value-narration": string;
664
+ "@sarj/no-type-member-comment-wall": string;
603
665
  "@sarj/no-tautological-expect": string;
604
666
  "@sarj/require-interface-for-injected-service": string;
605
667
  "@sarj/prefer-non-nullable-collection": string;
606
- "@sarj/no-implicit-attribute-access": string;
607
668
  "@sarj/no-async-callback-in-waitfor": string;
608
- "@sarj/prefer-setup-file-mocks": string;
609
669
  };
610
670
  };
611
671
  strict: {
@@ -614,7 +674,6 @@ declare const plugin: {
614
674
  "@sarj/zod-naming-convention": string;
615
675
  "@sarj/require-assert-never": string;
616
676
  "@sarj/require-zod-form-validation": string;
617
- "@sarj/ban-loose-type-guards-in-tests": string;
618
677
  "@sarj/enforce-file-structure": string;
619
678
  "@sarj/no-raw-env": string;
620
679
  "@sarj/no-enum": string;
@@ -658,12 +717,11 @@ declare const plugin: {
658
717
  "@sarj/no-restated-comment": string;
659
718
  "@sarj/jsdoc-restates-signature": string;
660
719
  "@sarj/trailing-value-narration": string;
720
+ "@sarj/no-type-member-comment-wall": string;
661
721
  "@sarj/no-tautological-expect": string;
662
722
  "@sarj/require-interface-for-injected-service": string;
663
723
  "@sarj/prefer-non-nullable-collection": string;
664
- "@sarj/no-implicit-attribute-access": string;
665
724
  "@sarj/no-async-callback-in-waitfor": string;
666
- "@sarj/prefer-setup-file-mocks": string;
667
725
  };
668
726
  };
669
727
  };