@sarj/eslint-plugin 4.1.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -86,8 +86,10 @@ interface RuleOptions$2 {
86
86
  * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
87
87
  * }]
88
88
  *
89
- * Supplying `allow` REPLACES the defaults, so include the test patterns if you
90
- * still want test files exempt.
89
+ * Supplying `allow` REPLACES the default CLIENT-LAYER patterns. Test files are
90
+ * no longer part of that list — they are recognised unconditionally by the
91
+ * shared `isTestFile` predicate — so a repo that overrides `allow` keeps its
92
+ * test tree exempt without having to remember the test patterns.
91
93
  *
92
94
  * CORPUS SWEEP (2220 files, zod / TanStack Query / react-router / swr /
93
95
  * zustand, 2026-07): 96 raw hits. The defaults missed three path conventions
@@ -103,6 +105,44 @@ interface RuleOptions$2 {
103
105
  * - `__testfixtures__/` — 8 hits from jscodeshift fixtures such as
104
106
  * `query/packages/query-codemods/src/v5/remove-overloads/__testfixtures__/bug-reports.input.tsx`,
105
107
  * which are input/output text for a codemod, not code that runs.
108
+ *
109
+ * SECOND SWEEP (25,508 deduped TS/TSX files across zod / trpc / dub /
110
+ * openstatus / formbricks / documenso / unkey / midday / papermark / cal.com /
111
+ * hono plus six first-party repos, 2026-07): 1,019 hits, 50 read in a seeded
112
+ * random sample — 24 true positives, 21 false positives, 5 arguable. At a 42%
113
+ * false-positive rate this was the loudest rule of the five audited, and the
114
+ * cause was the same one the first sweep found, just further along: the reports
115
+ * were landing ON the client layer, under names the `allow` list did not know.
116
+ *
117
+ * - **Vendor wrapper modules** — 147 findings. `*Service.ts`, `services/`,
118
+ * `connectors/` (16), `providers/` (12), `integrations/` (16),
119
+ * `notifications/<vendor>/` (29), `adapters/`, `*-fetcher.ts`. Every fetch
120
+ * in them is an absolute-URL call to ONE third-party origin — they ARE the
121
+ * module the rule wants the fetch to live in. Citable:
122
+ * `cal.com/packages/app-store/office365calendar/lib/CalendarService.ts:265`,
123
+ * `openstatus/packages/notifications/telegram/src/index.ts:81`,
124
+ * `formbricks/apps/web/lib/googleSheet/service.ts:164`.
125
+ * Recall cost: 0 of the 50 sampled true positives lived in such a path —
126
+ * every one was a `.tsx` component/page/modal or a React hook.
127
+ * - **Test-path drift** — 36 findings. The rule hand-rolled its own test-path
128
+ * list instead of using the shared `isTestFile`, so it missed `playwright/`
129
+ * (19) and the `.e2e.ts` basename. The single loudest file corpus-wide was
130
+ * `cal.com/apps/web/playwright/oauth-provider.e2e.ts` (16 findings). The
131
+ * sibling rule `require-fetch-timeout` had always used `isTestFile`; this
132
+ * was pure drift between two rules that see the same call sites.
133
+ * - **Asset / passthrough handoff** — see `isConstructedArgumentHandoff`.
134
+ *
135
+ * DELIBERATELY NOT GUARDED: restricting the rule to component/hook files. It
136
+ * would cut the residual false-positive rate from ~25% to ~4%, but costs ~80
137
+ * real positives in `.ts` background jobs (e.g.
138
+ * `papermark/lib/trigger/convert-pdf-direct.ts:332`).
139
+ *
140
+ * DELIBERATELY NOT ALLOWED: a `-provider.*` BASENAME, even though the
141
+ * `providers/` DIRECTORY is. In the corpus that basename is usually a React
142
+ * context or modal provider calling the app's own API —
143
+ * `dub/apps/web/ui/modals/modal-provider.tsx:134` is exactly the true-positive
144
+ * shape — and the two vendor files that carry it are already covered by
145
+ * `integrations/`.
106
146
  */
107
147
 
108
148
  interface RuleOptions$1 {
@@ -197,9 +237,6 @@ interface LoggingOptions {
197
237
  }
198
238
 
199
239
  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
240
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
241
  name: string;
205
242
  };
@@ -280,6 +317,12 @@ declare const rules: {
280
317
  "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
281
318
  name: string;
282
319
  };
320
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
321
+ ignoreTypeNames?: readonly string[];
322
+ requireIdenticalShape?: boolean;
323
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
324
+ name: string;
325
+ };
283
326
  "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
284
327
  name: string;
285
328
  };
@@ -352,19 +395,15 @@ declare const rules: {
352
395
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
353
396
  name: string;
354
397
  };
355
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
356
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
398
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
357
399
  name: string;
358
400
  };
359
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
401
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
360
402
  name: string;
361
403
  };
362
404
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
363
405
  name: string;
364
406
  };
365
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
366
- name: string;
367
- };
368
407
  };
369
408
  declare const plugin: {
370
409
  meta: {
@@ -372,9 +411,6 @@ declare const plugin: {
372
411
  version: string;
373
412
  };
374
413
  rules: {
375
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
376
- name: string;
377
- };
378
414
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
379
415
  name: string;
380
416
  };
@@ -455,6 +491,12 @@ declare const plugin: {
455
491
  "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
456
492
  name: string;
457
493
  };
494
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
495
+ ignoreTypeNames?: readonly string[];
496
+ requireIdenticalShape?: boolean;
497
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
498
+ name: string;
499
+ };
458
500
  "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
459
501
  name: string;
460
502
  };
@@ -527,19 +569,15 @@ declare const plugin: {
527
569
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
528
570
  name: string;
529
571
  };
530
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
531
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
572
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
532
573
  name: string;
533
574
  };
534
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
575
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
535
576
  name: string;
536
577
  };
537
578
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
538
579
  name: string;
539
580
  };
540
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
541
- name: string;
542
- };
543
581
  };
544
582
  configs: {
545
583
  recommended: {
@@ -548,7 +586,6 @@ declare const plugin: {
548
586
  "@sarj/zod-naming-convention": string;
549
587
  "@sarj/require-assert-never": string;
550
588
  "@sarj/require-zod-form-validation": string;
551
- "@sarj/ban-loose-type-guards-in-tests": string;
552
589
  "@sarj/enforce-file-structure": string;
553
590
  "@sarj/no-client-side-data-fetching": string;
554
591
  "@sarj/prefer-server-actions": string;
@@ -570,6 +607,7 @@ declare const plugin: {
570
607
  "@sarj/no-unsafe-mock-casting": string;
571
608
  "@sarj/prefer-string-literal-union": string;
572
609
  "@sarj/prefer-zod-enum": string;
610
+ "@sarj/prefer-zod-infer": string;
573
611
  "@sarj/require-fetch-timeout": string;
574
612
  "@sarj/no-silent-promise-catch": string;
575
613
  "@sarj/prefer-constant-time-secret-compare": string;
@@ -590,9 +628,7 @@ declare const plugin: {
590
628
  "@sarj/no-tautological-expect": string;
591
629
  "@sarj/require-interface-for-injected-service": string;
592
630
  "@sarj/prefer-non-nullable-collection": string;
593
- "@sarj/no-implicit-attribute-access": string;
594
631
  "@sarj/no-async-callback-in-waitfor": string;
595
- "@sarj/prefer-setup-file-mocks": string;
596
632
  };
597
633
  };
598
634
  strict: {
@@ -601,7 +637,6 @@ declare const plugin: {
601
637
  "@sarj/zod-naming-convention": string;
602
638
  "@sarj/require-assert-never": string;
603
639
  "@sarj/require-zod-form-validation": string;
604
- "@sarj/ban-loose-type-guards-in-tests": string;
605
640
  "@sarj/enforce-file-structure": string;
606
641
  "@sarj/no-raw-env": string;
607
642
  "@sarj/no-enum": string;
@@ -625,6 +660,7 @@ declare const plugin: {
625
660
  "@sarj/no-unsafe-mock-casting": string;
626
661
  "@sarj/prefer-string-literal-union": string;
627
662
  "@sarj/prefer-zod-enum": string;
663
+ "@sarj/prefer-zod-infer": string;
628
664
  "@sarj/require-fetch-timeout": string;
629
665
  "@sarj/no-silent-promise-catch": string;
630
666
  "@sarj/prefer-constant-time-secret-compare": string;
@@ -647,9 +683,7 @@ declare const plugin: {
647
683
  "@sarj/no-tautological-expect": string;
648
684
  "@sarj/require-interface-for-injected-service": string;
649
685
  "@sarj/prefer-non-nullable-collection": string;
650
- "@sarj/no-implicit-attribute-access": string;
651
686
  "@sarj/no-async-callback-in-waitfor": string;
652
- "@sarj/prefer-setup-file-mocks": string;
653
687
  };
654
688
  };
655
689
  };
package/dist/index.d.ts CHANGED
@@ -86,8 +86,10 @@ interface RuleOptions$2 {
86
86
  * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
87
87
  * }]
88
88
  *
89
- * Supplying `allow` REPLACES the defaults, so include the test patterns if you
90
- * still want test files exempt.
89
+ * Supplying `allow` REPLACES the default CLIENT-LAYER patterns. Test files are
90
+ * no longer part of that list — they are recognised unconditionally by the
91
+ * shared `isTestFile` predicate — so a repo that overrides `allow` keeps its
92
+ * test tree exempt without having to remember the test patterns.
91
93
  *
92
94
  * CORPUS SWEEP (2220 files, zod / TanStack Query / react-router / swr /
93
95
  * zustand, 2026-07): 96 raw hits. The defaults missed three path conventions
@@ -103,6 +105,44 @@ interface RuleOptions$2 {
103
105
  * - `__testfixtures__/` — 8 hits from jscodeshift fixtures such as
104
106
  * `query/packages/query-codemods/src/v5/remove-overloads/__testfixtures__/bug-reports.input.tsx`,
105
107
  * which are input/output text for a codemod, not code that runs.
108
+ *
109
+ * SECOND SWEEP (25,508 deduped TS/TSX files across zod / trpc / dub /
110
+ * openstatus / formbricks / documenso / unkey / midday / papermark / cal.com /
111
+ * hono plus six first-party repos, 2026-07): 1,019 hits, 50 read in a seeded
112
+ * random sample — 24 true positives, 21 false positives, 5 arguable. At a 42%
113
+ * false-positive rate this was the loudest rule of the five audited, and the
114
+ * cause was the same one the first sweep found, just further along: the reports
115
+ * were landing ON the client layer, under names the `allow` list did not know.
116
+ *
117
+ * - **Vendor wrapper modules** — 147 findings. `*Service.ts`, `services/`,
118
+ * `connectors/` (16), `providers/` (12), `integrations/` (16),
119
+ * `notifications/<vendor>/` (29), `adapters/`, `*-fetcher.ts`. Every fetch
120
+ * in them is an absolute-URL call to ONE third-party origin — they ARE the
121
+ * module the rule wants the fetch to live in. Citable:
122
+ * `cal.com/packages/app-store/office365calendar/lib/CalendarService.ts:265`,
123
+ * `openstatus/packages/notifications/telegram/src/index.ts:81`,
124
+ * `formbricks/apps/web/lib/googleSheet/service.ts:164`.
125
+ * Recall cost: 0 of the 50 sampled true positives lived in such a path —
126
+ * every one was a `.tsx` component/page/modal or a React hook.
127
+ * - **Test-path drift** — 36 findings. The rule hand-rolled its own test-path
128
+ * list instead of using the shared `isTestFile`, so it missed `playwright/`
129
+ * (19) and the `.e2e.ts` basename. The single loudest file corpus-wide was
130
+ * `cal.com/apps/web/playwright/oauth-provider.e2e.ts` (16 findings). The
131
+ * sibling rule `require-fetch-timeout` had always used `isTestFile`; this
132
+ * was pure drift between two rules that see the same call sites.
133
+ * - **Asset / passthrough handoff** — see `isConstructedArgumentHandoff`.
134
+ *
135
+ * DELIBERATELY NOT GUARDED: restricting the rule to component/hook files. It
136
+ * would cut the residual false-positive rate from ~25% to ~4%, but costs ~80
137
+ * real positives in `.ts` background jobs (e.g.
138
+ * `papermark/lib/trigger/convert-pdf-direct.ts:332`).
139
+ *
140
+ * DELIBERATELY NOT ALLOWED: a `-provider.*` BASENAME, even though the
141
+ * `providers/` DIRECTORY is. In the corpus that basename is usually a React
142
+ * context or modal provider calling the app's own API —
143
+ * `dub/apps/web/ui/modals/modal-provider.tsx:134` is exactly the true-positive
144
+ * shape — and the two vendor files that carry it are already covered by
145
+ * `integrations/`.
106
146
  */
107
147
 
108
148
  interface RuleOptions$1 {
@@ -197,9 +237,6 @@ interface LoggingOptions {
197
237
  }
198
238
 
199
239
  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
240
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
241
  name: string;
205
242
  };
@@ -280,6 +317,12 @@ declare const rules: {
280
317
  "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
281
318
  name: string;
282
319
  };
320
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
321
+ ignoreTypeNames?: readonly string[];
322
+ requireIdenticalShape?: boolean;
323
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
324
+ name: string;
325
+ };
283
326
  "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
284
327
  name: string;
285
328
  };
@@ -352,19 +395,15 @@ declare const rules: {
352
395
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
353
396
  name: string;
354
397
  };
355
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
356
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
398
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
357
399
  name: string;
358
400
  };
359
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
401
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
360
402
  name: string;
361
403
  };
362
404
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
363
405
  name: string;
364
406
  };
365
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
366
- name: string;
367
- };
368
407
  };
369
408
  declare const plugin: {
370
409
  meta: {
@@ -372,9 +411,6 @@ declare const plugin: {
372
411
  version: string;
373
412
  };
374
413
  rules: {
375
- "ban-loose-type-guards-in-tests": _typescript_eslint_utils_ts_eslint.RuleModule<"banLooseTypeGuardsInTests", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
376
- name: string;
377
- };
378
414
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
379
415
  name: string;
380
416
  };
@@ -455,6 +491,12 @@ declare const plugin: {
455
491
  "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
456
492
  name: string;
457
493
  };
494
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
495
+ ignoreTypeNames?: readonly string[];
496
+ requireIdenticalShape?: boolean;
497
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
498
+ name: string;
499
+ };
458
500
  "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
459
501
  name: string;
460
502
  };
@@ -527,19 +569,15 @@ declare const plugin: {
527
569
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
528
570
  name: string;
529
571
  };
530
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener>;
531
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
572
+ "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
532
573
  name: string;
533
574
  };
534
- "no-implicit-attribute-access": _typescript_eslint_utils_ts_eslint.RuleModule<"noImplicitAttributeAccess", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
575
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
535
576
  name: string;
536
577
  };
537
578
  "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
538
579
  name: string;
539
580
  };
540
- "prefer-setup-file-mocks": _typescript_eslint_utils_ts_eslint.RuleModule<"preferSetupFileMocks", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
541
- name: string;
542
- };
543
581
  };
544
582
  configs: {
545
583
  recommended: {
@@ -548,7 +586,6 @@ declare const plugin: {
548
586
  "@sarj/zod-naming-convention": string;
549
587
  "@sarj/require-assert-never": string;
550
588
  "@sarj/require-zod-form-validation": string;
551
- "@sarj/ban-loose-type-guards-in-tests": string;
552
589
  "@sarj/enforce-file-structure": string;
553
590
  "@sarj/no-client-side-data-fetching": string;
554
591
  "@sarj/prefer-server-actions": string;
@@ -570,6 +607,7 @@ declare const plugin: {
570
607
  "@sarj/no-unsafe-mock-casting": string;
571
608
  "@sarj/prefer-string-literal-union": string;
572
609
  "@sarj/prefer-zod-enum": string;
610
+ "@sarj/prefer-zod-infer": string;
573
611
  "@sarj/require-fetch-timeout": string;
574
612
  "@sarj/no-silent-promise-catch": string;
575
613
  "@sarj/prefer-constant-time-secret-compare": string;
@@ -590,9 +628,7 @@ declare const plugin: {
590
628
  "@sarj/no-tautological-expect": string;
591
629
  "@sarj/require-interface-for-injected-service": string;
592
630
  "@sarj/prefer-non-nullable-collection": string;
593
- "@sarj/no-implicit-attribute-access": string;
594
631
  "@sarj/no-async-callback-in-waitfor": string;
595
- "@sarj/prefer-setup-file-mocks": string;
596
632
  };
597
633
  };
598
634
  strict: {
@@ -601,7 +637,6 @@ declare const plugin: {
601
637
  "@sarj/zod-naming-convention": string;
602
638
  "@sarj/require-assert-never": string;
603
639
  "@sarj/require-zod-form-validation": string;
604
- "@sarj/ban-loose-type-guards-in-tests": string;
605
640
  "@sarj/enforce-file-structure": string;
606
641
  "@sarj/no-raw-env": string;
607
642
  "@sarj/no-enum": string;
@@ -625,6 +660,7 @@ declare const plugin: {
625
660
  "@sarj/no-unsafe-mock-casting": string;
626
661
  "@sarj/prefer-string-literal-union": string;
627
662
  "@sarj/prefer-zod-enum": string;
663
+ "@sarj/prefer-zod-infer": string;
628
664
  "@sarj/require-fetch-timeout": string;
629
665
  "@sarj/no-silent-promise-catch": string;
630
666
  "@sarj/prefer-constant-time-secret-compare": string;
@@ -647,9 +683,7 @@ declare const plugin: {
647
683
  "@sarj/no-tautological-expect": string;
648
684
  "@sarj/require-interface-for-injected-service": string;
649
685
  "@sarj/prefer-non-nullable-collection": string;
650
- "@sarj/no-implicit-attribute-access": string;
651
686
  "@sarj/no-async-callback-in-waitfor": string;
652
- "@sarj/prefer-setup-file-mocks": string;
653
687
  };
654
688
  };
655
689
  };