@sarj/eslint-plugin 6.1.0 → 7.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.ts CHANGED
@@ -1,29 +1,13 @@
1
1
  import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
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.
4
+ * @fileoverview _comment-wall the shared judgement behind the comment-VOLUME rules: a run of member comments that mostly re-spell their members is a wall.
7
5
  *
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
6
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_comment-wall.md
23
7
  */
24
8
 
25
- /** Every threshold this rule applies; each is documented at `DEFAULTS`. */
26
- interface RuleOptions$3 {
9
+ /** Every threshold the wall rules apply; each is documented at `WALL_DEFAULTS`. */
10
+ interface WallOptions {
27
11
  readonly minCommentedMembers: number;
28
12
  readonly minCommentedRatio: number;
29
13
  readonly minRestatedRatio: number;
@@ -31,47 +15,11 @@ interface RuleOptions$3 {
31
15
  }
32
16
 
33
17
  /**
34
- * @fileoverview Keep modules that are stateless by design free of private
35
- * storage.
36
- *
37
- * Some features are stateless deliberately: they derive everything they need
38
- * from reads against the systems of record (Slack, Linear, GitHub, a CRM) plus
39
- * markers in the artefacts they themselves produced. The reason is operational
40
- * — such a feature can be re-run and back-filled freely, whereas a private
41
- * table or key/value namespace immediately diverges from what a human can
42
- * actually see and audit in the system of record. Adding a store to one of
43
- * these modules silently deletes that property, and nothing else in the
44
- * toolchain notices.
45
- *
46
- * WHAT IT CATCHES, inside the configured modules only
47
- * db.prepare(sql) // a SQL statement
48
- * kv.put(key, value) // a key/value write
49
- * kv.getWithMetadata(key) // a key/value read
50
- *
51
- * OPT-IN BY DESIGN
52
- * `modules` defaults to an EMPTY list, which makes the rule a no-op. That is
53
- * deliberate: the method names alone (`put`, `prepare`) carry no type
54
- * information, so the rule is only meaningful — and only quiet enough to live
55
- * in a shared preset — when it is pointed at the specific directories a team
56
- * has declared stateless.
57
- *
58
- * "@sarj/no-storage-in-stateless-modules": ["error", {
59
- * "modules": ["[\\\\/]engineer-digest[\\\\/]", "[\\\\/]digest[\\\\/]"]
60
- * }]
61
- *
62
- * `modules` entries are regular-expression sources matched against the absolute
63
- * filename. `methods` overrides the storage method names if a driver names
64
- * things differently.
18
+ * @fileoverview no-storage-in-stateless-modules private storage inside a module a team declared stateless diverges from the system of record, silently.
65
19
  *
66
- * NOT FLAGGED
67
- * - Anything outside the configured modules.
68
- * - `.put()` with fewer than two arguments — a one-argument `put` is more
69
- * often a builder or queue helper than a key/value write.
70
- *
71
- * If a feature genuinely cannot be expressed statelessly, that is a design
72
- * conversation, not a disable comment.
20
+ * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-storage-in-stateless-modules.test.ts
21
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-storage-in-stateless-modules.md
73
22
  */
74
-
75
23
  interface RuleOptions$2 {
76
24
  /** Regex sources matched against the filename. Empty means the rule is off. */
77
25
  readonly modules?: readonly string[];
@@ -80,476 +28,341 @@ interface RuleOptions$2 {
80
28
  }
81
29
 
82
30
  /**
83
- * @fileoverview Keep outbound HTTP behind a client module.
84
- *
85
- * A bare `fetch()` in a route handler, server action or component opts out of
86
- * whatever the codebase's client layer provides — retry/backoff, timeouts,
87
- * status handling, auth headers, structured log breadcrumbs. It is also the
88
- * shape that cannot be stubbed in a test without monkey-patching global
89
- * `fetch`, so the call site quietly becomes untestable.
90
- *
91
- * WHAT IT CATCHES
92
- * fetch(url) // bare global
93
- * globalThis.fetch(url) // explicit global receiver
94
- * window.fetch(url)
95
- *
96
- * NOT FLAGGED
97
- * - Files whose path matches one of the `allow` patterns. The defaults cover
98
- * the conventions we have seen in practice — a `clients/` directory, a
99
- * `*-client.ts` module, an `http-client.*` wrapper, an `api/` directory or
100
- * `api.ts` / `*-api.ts` module — plus test files and codemod fixtures.
101
- * - A method named `fetch` on some other receiver (`cache.fetch(k)`,
102
- * `queryClient.fetch()`): only the global is HTTP.
103
- * - A pre-signed upload/download URL transfer (`fetch(uploadUrl, ...)`,
104
- * `fetch(file.downloadUrl)`). Those URLs are one-off storage handoffs,
105
- * not calls to a first-party service API that belongs behind a client
106
- * wrapper.
107
- * - `new Request(...)` / `axios(...)` and friends. This rule is about the
108
- * global `fetch`, not about every HTTP library.
109
- *
110
- * CONFIGURATION
111
- * `allow` is a list of regular-expression sources matched against the absolute
112
- * filename, so a repo that keeps its client layer somewhere else can say so
113
- * rather than sprinkling disable comments:
114
- *
115
- * "@sarj/no-raw-fetch-outside-clients": ["error", {
116
- * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
117
- * }]
31
+ * @fileoverview no-raw-fetch-outside-clients a bare `fetch` outside the client layer opts out of retry, timeout and status handling, and cannot be stubbed.
118
32
  *
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.
123
- *
124
- * CORPUS SWEEP (2220 files, zod / TanStack Query / react-router / swr /
125
- * zustand, 2026-07): 96 raw hits. The defaults missed three path conventions
126
- * that ARE the client layer, so the reports landed on the very modules the rule
127
- * wants the `fetch` to live in:
128
- * - `api.ts` / `api/` / `*-api.ts` — 15 hits, e.g.
129
- * `query/examples/react/star-wars/src/api.ts:7`, a module that exists solely
130
- * to own `getFilm`/`getPerson` HTTP calls. `api` is the same convention
131
- * family as `clients/`, just the other common spelling.
132
- * - Hyphenated test basenames (`*-test.ts` / `*-spec.ts`) — the default list
133
- * only knew the dotted `*.test.ts` form, so react-router's entire suite
134
- * (which names files `single-fetch-test.ts`) was unprotected.
135
- * - `__testfixtures__/` — 8 hits from jscodeshift fixtures such as
136
- * `query/packages/query-codemods/src/v5/remove-overloads/__testfixtures__/bug-reports.input.tsx`,
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/`.
33
+ * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-raw-fetch-outside-clients.test.ts
34
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-raw-fetch-outside-clients.md
176
35
  */
177
-
178
36
  interface RuleOptions$1 {
179
37
  /** Regular-expression sources matched against the filename. */
180
38
  readonly allow?: readonly string[];
181
39
  }
182
40
 
183
41
  /**
184
- * @fileoverview Disallow building a SQL statement out of runtime values.
185
- *
186
- * `db.prepare(sql)` takes a STATIC statement plus `?` / `$1` placeholders bound
187
- * through `.bind(...)`. Interpolating a value into the statement text bypasses
188
- * the binding layer completely: that is SQL injection, and it also defeats the
189
- * driver's prepared-statement cache, because every distinct value produces a
190
- * distinct statement to compile. The shape is identical across Cloudflare D1,
191
- * better-sqlite3 and node-postgres, so the rule is driver-agnostic.
42
+ * @fileoverview _logging shared recognition of logging / error-reporting calls, so the catch rules and the secret rule cannot disagree.
192
43
  *
193
- * WHAT IT CATCHES
194
- * db.prepare(`select * from users where id = '${userId}'`)
195
- * db.prepare("select * from users where id = '" + userId + "'")
196
- * db.exec(`delete from sessions where token = '${token}'`)
197
- *
198
- * NOT FLAGGED
199
- * - `${CONSTANT_CASE}` fragments. A module-level constant — the column-list
200
- * constants several repos keep (`${CANDIDATE_COLS}`, `${TABLES.USERS}`) —
201
- * is a compile-time value, not user input. Anything starting lowercase is
202
- * treated as runtime data.
203
- * - A template literal with no interpolations at all.
204
- * - Tagged templates (`` sql`select ... ${id}` ``). A tag function receives the
205
- * static strings and the values separately and is the parameterising
206
- * mechanism, not a bypass of it.
207
- * - `.prepare()` on something that is not a database. Requiring an
208
- * interpolated runtime value keeps this rare in practice.
209
- * - A statement text that contains no SQL data-statement keyword. `exec` and
210
- * `query` are not SQL-specific names: a 5-repo sweep of real TypeScript
211
- * (zod / TanStack Query / react-router / swr / zustand, 2,186 files) found
212
- * 4/4 hits were `child_process.exec` building a SHELL command line —
213
- * an `open <url>` at
214
- * react-router/integration/helpers/playwright-fixture.ts:230 and an
215
- * `npm view <pkg>@<version> version` at
216
- * react-router/scripts/changes/publish.ts:111. Requiring the statement to
217
- * actually read as SQL (`SELECT` / `INSERT INTO` / `UPDATE` / `DELETE FROM`
218
- * / DDL / `PRAGMA` / a CTE head) takes that class to zero without touching
219
- * any real injection: an interpolated statement with no SQL verb in it was
220
- * never a SQL statement.
221
- *
222
- * CONFIGURATION
223
- * `methods` is the list of statement-taking method names to inspect. Extend it
224
- * for a driver that names things differently:
225
- *
226
- * "@sarj/no-dynamic-sql": ["error", { "methods": ["prepare", "exec", "raw"] }]
227
- *
228
- * Supplying `methods` REPLACES the defaults.
44
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_logging.md
229
45
  */
230
46
 
47
+ /** Shared `loggerNames` / `logFunctions` option shape. */
48
+ interface LoggingOptions {
49
+ readonly loggerNames?: readonly string[];
50
+ readonly logFunctions?: readonly string[];
51
+ }
52
+
53
+ /**
54
+ * @fileoverview no-dynamic-sql — a runtime value interpolated into statement text is SQL injection, and it defeats the prepared-statement cache.
55
+ *
56
+ * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-dynamic-sql.test.ts
57
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-dynamic-sql.md
58
+ */
231
59
  interface RuleOptions {
232
60
  /** Statement-taking method names to inspect. Replaces the defaults. */
233
61
  readonly methods?: readonly string[];
234
62
  }
235
63
 
236
64
  /**
237
- * @fileoverview Shared helpers for recognising logging / error-reporting calls.
238
- * Used by `no-log-only-catch`, `no-sentinel-return-on-catch` and
239
- * `no-secret-in-log` so all three rules agree on what counts as "this call
240
- * writes to a log sink" before deciding a catch silently swallows an error or a
241
- * secret leaks.
242
- *
243
- * Two shapes are recognised:
65
+ * @fileoverview _renames a renamed rule keeps its old name registered as a deprecated alias, because a name that simply vanishes reads as growth to a shrink-only baseline.
244
66
  *
245
- * - **Receiver-shaped** — a log METHOD (`debug`/`info`/`warn`/`error`/…) on a
246
- * logger RECEIVER: `console.error(...)`, `logger.warn(...)`,
247
- * `this.logger.info(...)`, and builder/factory chains
248
- * (`logger.bind({...}).info(...)`, `logging.getLogger(n).info(...)`).
249
- * - **Free-function-shaped** — a project-declared logging function, e.g.
250
- * `logEvent("pr_scan.failed", { repo, error })`. Structured loggers that are
251
- * plain functions taking a meta object are the dominant real-world shape and
252
- * have no logger receiver at all, so they are invisible to the receiver
253
- * heuristic. Projects declare theirs via the shared `logFunctions` rule
254
- * option; `loggerNames` extends the receiver set the same way.
255
- *
256
- * Both options are OFF by default (empty), so default behaviour is unchanged.
257
- * Declaring them makes the catch rules stop reporting a correctly-logged
258
- * degraded return AND makes `no-secret-in-log` start inspecting those calls —
259
- * the second effect closes a real hole, since `logEvent("auth", { botToken })`
260
- * was previously never examined.
67
+ * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/_renames.md
261
68
  */
262
-
263
- /** Shared `loggerNames` / `logFunctions` option shape. */
264
- interface LoggingOptions {
265
- readonly loggerNames?: readonly string[];
266
- readonly logFunctions?: readonly string[];
267
- }
69
+ declare const renamedRules: {
70
+ readonly "jsdoc-restates-signature": "no-restated-jsdoc";
71
+ readonly "no-async-callback-in-waitfor": "no-async-callback-in-wait-for";
72
+ readonly "strict-test-assertions": "prefer-whole-object-assertion";
73
+ readonly "trailing-value-narration": "no-trailing-value-narration";
74
+ };
268
75
 
269
76
  declare const rules: {
270
77
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
271
78
  name: string;
272
79
  };
273
- "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
80
+ "no-async-callback-in-wait-for": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
274
81
  name: string;
275
82
  };
276
- "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
83
+ "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
277
84
  name: string;
278
85
  };
279
- "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
280
- ignoreFiles?: readonly string[];
281
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
86
+ "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
282
87
  name: string;
283
88
  };
284
- "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
89
+ "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
285
90
  name: string;
286
91
  };
287
- "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
92
+ "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
288
93
  name: string;
289
94
  };
290
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
95
+ "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
291
96
  name: string;
292
97
  };
293
- "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
98
+ "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
99
+ ignoreFiles?: readonly string[];
100
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
294
101
  name: string;
295
102
  };
296
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
103
+ "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
297
104
  name: string;
298
105
  };
299
- "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
106
+ "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
107
+ allowIn?: readonly string[];
108
+ checkClientModules?: boolean;
109
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
300
110
  name: string;
301
111
  };
302
- "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
112
+ "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
303
113
  name: string;
304
114
  };
305
- "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
115
+ "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
306
116
  name: string;
307
117
  };
308
- "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
118
+ "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
309
119
  name: string;
310
120
  };
311
- "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
312
- requireSemanticTokens?: boolean;
313
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
121
+ "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
314
122
  name: string;
315
123
  };
316
- "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
124
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
317
125
  name: string;
318
126
  };
319
- "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
127
+ "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
320
128
  name: string;
321
129
  };
322
- "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
130
+ "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
323
131
  name: string;
324
132
  };
325
- "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
326
- convention?: "prefix" | "suffix" | "either";
327
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
133
+ "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
328
134
  name: string;
329
135
  };
330
- "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
136
+ "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
331
137
  name: string;
332
138
  };
333
- "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
139
+ "no-restated-jsdoc": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
334
140
  name: string;
335
141
  };
336
142
  "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
337
143
  name: string;
338
144
  };
339
- "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
145
+ "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
340
146
  name: string;
341
147
  };
342
- "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
343
- ignoreFields?: readonly string[];
344
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
148
+ "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
345
149
  name: string;
346
150
  };
347
- "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
151
+ "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
348
152
  name: string;
349
153
  };
350
- "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
351
- ignoreTypeNames?: readonly string[];
352
- requireIdenticalShape?: boolean;
353
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
154
+ "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
354
155
  name: string;
355
156
  };
356
- "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
157
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
357
158
  name: string;
358
159
  };
359
- "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
360
- allowIn?: readonly string[];
361
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
160
+ "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
362
161
  name: string;
363
162
  };
364
- "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
163
+ "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
365
164
  name: string;
366
165
  };
367
- "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
166
+ "no-trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
368
167
  name: string;
369
168
  };
370
- "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
169
+ "no-declaration-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<WallOptions>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
371
170
  name: string;
372
171
  };
373
- "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
172
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<WallOptions>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
374
173
  name: string;
375
174
  };
376
- "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
175
+ "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
377
176
  name: string;
378
177
  };
379
- "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
380
- allowIn?: readonly string[];
381
- checkClientModules?: boolean;
382
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
178
+ "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
383
179
  name: string;
384
180
  };
385
- "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
181
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
386
182
  name: string;
387
183
  };
388
184
  "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
389
185
  name: string;
390
186
  };
391
- "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
187
+ "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
392
188
  name: string;
393
189
  };
394
- "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
190
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
191
+ minElements?: number;
192
+ checkRegex?: boolean;
193
+ ignoreTestFiles?: boolean;
194
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
395
195
  name: string;
396
196
  };
397
- "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
197
+ "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
198
+ factories?: readonly string[];
199
+ ignoreTestFiles?: boolean;
200
+ minProperties?: number;
201
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
398
202
  name: string;
399
203
  };
400
- "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
401
205
  name: string;
402
206
  };
403
- "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
207
+ "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
404
208
  name: string;
405
209
  };
406
- "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
407
- minElements?: number;
408
- checkRegex?: boolean;
409
- ignoreTestFiles?: boolean;
210
+ "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
211
+ requireSemanticTokens?: boolean;
410
212
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
411
213
  name: string;
412
214
  };
413
- "jsdoc-restates-signature": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
215
+ "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
414
216
  name: string;
415
217
  };
416
- "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
218
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
219
+ ignoreFields?: readonly string[];
220
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
417
221
  name: string;
418
222
  };
419
- "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
223
+ "prefer-whole-object-assertion": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
420
224
  name: string;
421
225
  };
422
- "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
226
+ "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
423
227
  name: string;
424
228
  };
425
- "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
229
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
230
+ ignoreTypeNames?: readonly string[];
231
+ requireIdenticalShape?: boolean;
232
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
426
233
  name: string;
427
234
  };
428
- "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
235
+ "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
429
236
  name: string;
430
237
  };
431
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
238
+ "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
239
+ allowIn?: readonly string[];
240
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
432
241
  name: string;
433
242
  };
434
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
243
+ "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
435
244
  name: string;
436
245
  };
437
- "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
246
+ "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
438
247
  name: string;
439
248
  };
440
- "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
441
- factories?: readonly string[];
442
- ignoreTestFiles?: boolean;
443
- minProperties?: number;
249
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
250
+ name: string;
251
+ };
252
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
253
+ convention?: "prefix" | "suffix" | "either";
444
254
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
445
255
  name: string;
446
256
  };
447
257
  };
258
+ type RuleModule = (typeof rules)[keyof typeof rules];
448
259
  declare const recommendedRules: {
449
- readonly "@sarj/zod-naming-convention": "warn";
450
- readonly "@sarj/require-assert-never": "error";
451
- readonly "@sarj/require-zod-form-validation": "error";
452
260
  readonly "@sarj/enforce-file-structure": "warn";
261
+ readonly "@sarj/no-async-callback-in-wait-for": "warn";
453
262
  readonly "@sarj/no-client-side-data-fetching": "warn";
454
- readonly "@sarj/prefer-server-actions": "warn";
455
- readonly "@sarj/no-unnecessary-use-client": "warn";
456
- readonly "@sarj/prefer-schema-for-api-payload": "warn";
457
- readonly "@sarj/no-sentinel-return-on-catch": "warn";
458
- readonly "@sarj/no-log-only-catch": "warn";
263
+ readonly "@sarj/no-comment-cruft": "warn";
264
+ readonly "@sarj/no-conditional-in-test": "warn";
265
+ readonly "@sarj/no-cors-wildcard-with-credentials": "warn";
266
+ readonly "@sarj/no-dynamic-sql": "warn";
267
+ readonly "@sarj/no-fat-try-blocks": "warn";
268
+ readonly "@sarj/no-hand-rolled-sleep": "warn";
459
269
  readonly "@sarj/no-insecure-random-id": "warn";
460
270
  readonly "@sarj/no-json-stringify-error": "warn";
271
+ readonly "@sarj/no-log-only-catch": "warn";
272
+ readonly "@sarj/no-offset-pagination": "warn";
273
+ readonly "@sarj/no-positional-tuple-return": "warn";
274
+ readonly "@sarj/no-repeated-string-literal": "warn";
275
+ readonly "@sarj/no-restated-comment": "warn";
276
+ readonly "@sarj/no-restated-jsdoc": "warn";
277
+ readonly "@sarj/no-secret-in-log": "warn";
278
+ readonly "@sarj/no-select-star": "warn";
279
+ readonly "@sarj/no-sentinel-return-on-catch": "warn";
280
+ readonly "@sarj/no-silent-promise-catch": "warn";
281
+ readonly "@sarj/no-sleep-in-test-body": "warn";
461
282
  readonly "@sarj/no-string-concat-in-loop": "warn";
283
+ readonly "@sarj/no-tautological-expect": "warn";
284
+ readonly "@sarj/no-trailing-value-narration": "warn";
285
+ readonly "@sarj/no-declaration-comment-wall": "warn";
286
+ readonly "@sarj/no-type-member-comment-wall": "warn";
287
+ readonly "@sarj/no-unnecessary-use-client": "warn";
288
+ readonly "@sarj/no-unsafe-mock-casting": "warn";
289
+ readonly "@sarj/no-zod-native-enum": "warn";
290
+ readonly "@sarj/prefer-constant-time-secret-compare": "error";
462
291
  readonly "@sarj/prefer-discriminated-union": "warn";
463
- readonly "@sarj/no-comment-cruft": "warn";
292
+ readonly "@sarj/prefer-module-level-constant": "warn";
293
+ readonly "@sarj/prefer-module-level-schema": "warn";
294
+ readonly "@sarj/prefer-non-nullable-collection": "warn";
295
+ readonly "@sarj/prefer-schema-for-api-payload": "warn";
464
296
  readonly "@sarj/prefer-semantic-colors": readonly ["warn", {
465
297
  readonly requireSemanticTokens: true;
466
298
  }];
467
- readonly "@sarj/no-fat-try-blocks": "warn";
468
- readonly "@sarj/no-cors-wildcard-with-credentials": "warn";
469
- readonly "@sarj/no-secret-in-log": "warn";
470
- readonly "@sarj/no-unsafe-mock-casting": "warn";
299
+ readonly "@sarj/prefer-server-actions": "warn";
471
300
  readonly "@sarj/prefer-string-literal-union": "warn";
301
+ readonly "@sarj/prefer-whole-object-assertion": "warn";
472
302
  readonly "@sarj/prefer-zod-enum": "warn";
473
303
  readonly "@sarj/prefer-zod-infer": "warn";
304
+ readonly "@sarj/require-assert-never": "error";
474
305
  readonly "@sarj/require-fetch-timeout": "warn";
475
- readonly "@sarj/no-silent-promise-catch": "warn";
476
- readonly "@sarj/prefer-constant-time-secret-compare": "error";
477
- readonly "@sarj/store-insert-requires-on-conflict": "warn";
478
- readonly "@sarj/no-offset-pagination": "warn";
479
- readonly "@sarj/no-select-star": "warn";
480
- readonly "@sarj/no-hand-rolled-sleep": "warn";
481
- readonly "@sarj/no-sleep-in-test-body": "warn";
482
- readonly "@sarj/no-conditional-in-test": "warn";
483
- readonly "@sarj/no-repeated-string-literal": "warn";
484
- readonly "@sarj/no-positional-tuple-return": "warn";
485
- readonly "@sarj/no-dynamic-sql": "warn";
486
- readonly "@sarj/no-zod-native-enum": "warn";
487
- readonly "@sarj/prefer-module-level-constant": "warn";
488
- readonly "@sarj/no-restated-comment": "warn";
489
- readonly "@sarj/jsdoc-restates-signature": "warn";
490
- readonly "@sarj/trailing-value-narration": "warn";
491
- readonly "@sarj/no-type-member-comment-wall": "warn";
492
- readonly "@sarj/no-tautological-expect": "warn";
493
306
  readonly "@sarj/require-interface-for-injected-service": "warn";
494
- readonly "@sarj/prefer-non-nullable-collection": "warn";
495
- readonly "@sarj/no-async-callback-in-waitfor": "warn";
496
- readonly "@sarj/prefer-module-level-schema": "warn";
497
- readonly "@sarj/strict-test-assertions": "warn";
307
+ readonly "@sarj/require-zod-form-validation": "error";
308
+ readonly "@sarj/store-insert-requires-on-conflict": "warn";
309
+ readonly "@sarj/zod-naming-convention": "warn";
498
310
  };
499
311
  declare const strictRules: {
500
- readonly "@sarj/zod-naming-convention": "error";
501
- readonly "@sarj/require-assert-never": "error";
502
- readonly "@sarj/require-zod-form-validation": "error";
503
312
  readonly "@sarj/enforce-file-structure": "error";
504
- readonly "@sarj/no-raw-env": "error";
505
- readonly "@sarj/no-enum": "error";
313
+ readonly "@sarj/no-async-callback-in-wait-for": "error";
506
314
  readonly "@sarj/no-client-side-data-fetching": "error";
507
- readonly "@sarj/prefer-server-actions": "error";
508
- readonly "@sarj/no-unnecessary-use-client": "error";
509
- readonly "@sarj/prefer-schema-for-api-payload": "error";
510
- readonly "@sarj/no-sentinel-return-on-catch": "error";
511
- readonly "@sarj/no-log-only-catch": "error";
315
+ readonly "@sarj/no-comment-cruft": "error";
316
+ readonly "@sarj/no-conditional-in-test": "error";
317
+ readonly "@sarj/no-cors-wildcard-with-credentials": "error";
318
+ readonly "@sarj/no-dynamic-sql": "error";
319
+ readonly "@sarj/no-enum": "error";
320
+ readonly "@sarj/no-fat-try-blocks": "error";
321
+ readonly "@sarj/no-hand-rolled-sleep": "error";
512
322
  readonly "@sarj/no-insecure-random-id": "error";
513
323
  readonly "@sarj/no-json-stringify-error": "error";
324
+ readonly "@sarj/no-log-only-catch": "error";
325
+ readonly "@sarj/no-offset-pagination": "error";
326
+ readonly "@sarj/no-positional-tuple-return": "error";
327
+ readonly "@sarj/no-raw-env": "error";
328
+ readonly "@sarj/no-raw-fetch-outside-clients": "error";
329
+ readonly "@sarj/no-repeated-string-literal": "error";
330
+ readonly "@sarj/no-restated-comment": "error";
331
+ readonly "@sarj/no-restated-jsdoc": "error";
332
+ readonly "@sarj/no-secret-in-log": "error";
333
+ readonly "@sarj/no-select-star": "error";
334
+ readonly "@sarj/no-sentinel-return-on-catch": "error";
335
+ readonly "@sarj/no-silent-promise-catch": "error";
336
+ readonly "@sarj/no-sleep-in-test-body": "error";
337
+ readonly "@sarj/no-storage-in-stateless-modules": "error";
514
338
  readonly "@sarj/no-string-concat-in-loop": "error";
339
+ readonly "@sarj/no-tautological-expect": "error";
340
+ readonly "@sarj/no-trailing-value-narration": "error";
341
+ readonly "@sarj/no-declaration-comment-wall": "error";
342
+ readonly "@sarj/no-type-member-comment-wall": "error";
343
+ readonly "@sarj/no-unnecessary-use-client": "error";
344
+ readonly "@sarj/no-unsafe-mock-casting": "error";
345
+ readonly "@sarj/no-zod-native-enum": "error";
346
+ readonly "@sarj/prefer-constant-time-secret-compare": "error";
515
347
  readonly "@sarj/prefer-discriminated-union": "error";
516
- readonly "@sarj/no-comment-cruft": "error";
348
+ readonly "@sarj/prefer-module-level-constant": "error";
349
+ readonly "@sarj/prefer-module-level-schema": "error";
350
+ readonly "@sarj/prefer-non-nullable-collection": "error";
351
+ readonly "@sarj/prefer-schema-for-api-payload": "error";
517
352
  readonly "@sarj/prefer-semantic-colors": readonly ["error", {
518
353
  readonly requireSemanticTokens: true;
519
354
  }];
520
- readonly "@sarj/no-fat-try-blocks": "error";
521
- readonly "@sarj/no-cors-wildcard-with-credentials": "error";
522
- readonly "@sarj/no-secret-in-log": "error";
523
- readonly "@sarj/no-unsafe-mock-casting": "error";
355
+ readonly "@sarj/prefer-server-actions": "error";
524
356
  readonly "@sarj/prefer-string-literal-union": "error";
357
+ readonly "@sarj/prefer-whole-object-assertion": "error";
525
358
  readonly "@sarj/prefer-zod-enum": "error";
526
359
  readonly "@sarj/prefer-zod-infer": "error";
360
+ readonly "@sarj/require-assert-never": "error";
527
361
  readonly "@sarj/require-fetch-timeout": "error";
528
- readonly "@sarj/no-silent-promise-catch": "error";
529
- readonly "@sarj/prefer-constant-time-secret-compare": "error";
530
- readonly "@sarj/store-insert-requires-on-conflict": "error";
531
- readonly "@sarj/no-offset-pagination": "error";
532
- readonly "@sarj/no-select-star": "error";
533
- readonly "@sarj/no-hand-rolled-sleep": "error";
534
- readonly "@sarj/no-sleep-in-test-body": "error";
535
- readonly "@sarj/no-conditional-in-test": "error";
536
- readonly "@sarj/no-repeated-string-literal": "error";
537
- readonly "@sarj/no-positional-tuple-return": "error";
538
- readonly "@sarj/no-dynamic-sql": "error";
539
- readonly "@sarj/no-raw-fetch-outside-clients": "error";
540
- readonly "@sarj/no-storage-in-stateless-modules": "error";
541
- readonly "@sarj/no-zod-native-enum": "error";
542
- readonly "@sarj/prefer-module-level-constant": "error";
543
- readonly "@sarj/no-restated-comment": "error";
544
- readonly "@sarj/jsdoc-restates-signature": "error";
545
- readonly "@sarj/trailing-value-narration": "error";
546
- readonly "@sarj/no-type-member-comment-wall": "error";
547
- readonly "@sarj/no-tautological-expect": "error";
548
362
  readonly "@sarj/require-interface-for-injected-service": "error";
549
- readonly "@sarj/prefer-non-nullable-collection": "error";
550
- readonly "@sarj/no-async-callback-in-waitfor": "error";
551
- readonly "@sarj/prefer-module-level-schema": "error";
552
- readonly "@sarj/strict-test-assertions": "error";
363
+ readonly "@sarj/require-zod-form-validation": "error";
364
+ readonly "@sarj/store-insert-requires-on-conflict": "error";
365
+ readonly "@sarj/zod-naming-convention": "error";
553
366
  };
554
367
  type FlatPreset = {
555
368
  readonly name: string;
@@ -557,207 +370,197 @@ type FlatPreset = {
557
370
  readonly rules: Record<string, unknown>;
558
371
  };
559
372
  /**
560
- * The presets, as FLAT config objects.
561
- *
562
- * Both used to declare `plugins: ["@sarj"]` -- eslintrc syntax -- and ESLint
563
- * rejects that outright:
564
- *
565
- * Config (unnamed): Key "plugins": This appears to be in eslintrc format
566
- * (array of strings) rather than flat config format (object).
567
- *
568
- * So `sarj.configs.strict`, the "just extend the plugin, do not copy the file"
569
- * path, threw for anyone who tried it, and copying `eslint.strict.mjs` and
570
- * editing the copy was the only thing that worked -- exactly the vendoring
571
- * these presets exist to prevent. `plugins` is now the object form flat config
572
- * wants, so both presets go straight into an `eslint.config.mjs` array (no
573
- * spread):
574
- *
575
- * import sarj from "@sarj/eslint-plugin";
576
- * export default [sarj.configs.strict];
577
- *
578
- * Neither preset sets `files` or a parser. They carry rules and nothing else,
579
- * so they compose with whatever a repo already has rather than narrowing it.
373
+ * The presets, as FLAT config objects — `plugins` is the object form, so both go
374
+ * straight into an `eslint.config.mjs` array with no spread. Neither sets
375
+ * `files` or a parser, so they compose with whatever a repo already has.
580
376
  */
581
377
  declare const plugin: {
582
378
  meta: {
583
379
  readonly name: "@sarj/eslint-plugin";
584
- readonly version: "6.1.0";
380
+ readonly version: "7.1.0";
585
381
  };
586
382
  rules: {
383
+ "jsdoc-restates-signature": RuleModule;
384
+ "no-async-callback-in-waitfor": RuleModule;
385
+ "strict-test-assertions": RuleModule;
386
+ "trailing-value-narration": RuleModule;
587
387
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
588
388
  name: string;
589
389
  };
590
- "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
390
+ "no-async-callback-in-wait-for": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
591
391
  name: string;
592
392
  };
593
- "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
393
+ "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
594
394
  name: string;
595
395
  };
596
- "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
597
- ignoreFiles?: readonly string[];
598
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
396
+ "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
599
397
  name: string;
600
398
  };
601
- "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
399
+ "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
602
400
  name: string;
603
401
  };
604
- "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
402
+ "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
605
403
  name: string;
606
404
  };
607
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
405
+ "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
608
406
  name: string;
609
407
  };
610
- "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
408
+ "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
409
+ ignoreFiles?: readonly string[];
410
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
611
411
  name: string;
612
412
  };
613
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
413
+ "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
614
414
  name: string;
615
415
  };
616
- "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
416
+ "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
417
+ allowIn?: readonly string[];
418
+ checkClientModules?: boolean;
419
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
617
420
  name: string;
618
421
  };
619
- "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
422
+ "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
620
423
  name: string;
621
424
  };
622
- "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
425
+ "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
623
426
  name: string;
624
427
  };
625
- "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
428
+ "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
626
429
  name: string;
627
430
  };
628
- "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
629
- requireSemanticTokens?: boolean;
630
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
431
+ "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
631
432
  name: string;
632
433
  };
633
- "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
434
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
634
435
  name: string;
635
436
  };
636
- "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
437
+ "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
637
438
  name: string;
638
439
  };
639
- "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
440
+ "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
640
441
  name: string;
641
442
  };
642
- "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
643
- convention?: "prefix" | "suffix" | "either";
644
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
443
+ "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
645
444
  name: string;
646
445
  };
647
- "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
446
+ "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
648
447
  name: string;
649
448
  };
650
- "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
449
+ "no-restated-jsdoc": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
651
450
  name: string;
652
451
  };
653
452
  "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
654
453
  name: string;
655
454
  };
656
- "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
455
+ "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
657
456
  name: string;
658
457
  };
659
- "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
660
- ignoreFields?: readonly string[];
661
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
458
+ "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
662
459
  name: string;
663
460
  };
664
- "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
461
+ "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
665
462
  name: string;
666
463
  };
667
- "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
668
- ignoreTypeNames?: readonly string[];
669
- requireIdenticalShape?: boolean;
670
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
464
+ "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
671
465
  name: string;
672
466
  };
673
- "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
467
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
674
468
  name: string;
675
469
  };
676
- "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
677
- allowIn?: readonly string[];
678
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
470
+ "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
679
471
  name: string;
680
472
  };
681
- "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
473
+ "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
682
474
  name: string;
683
475
  };
684
- "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
476
+ "no-trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
685
477
  name: string;
686
478
  };
687
- "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
479
+ "no-declaration-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<WallOptions>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
688
480
  name: string;
689
481
  };
690
- "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
482
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<WallOptions>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
691
483
  name: string;
692
484
  };
693
- "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
485
+ "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
694
486
  name: string;
695
487
  };
696
- "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
697
- allowIn?: readonly string[];
698
- checkClientModules?: boolean;
699
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
488
+ "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
700
489
  name: string;
701
490
  };
702
- "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
491
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
703
492
  name: string;
704
493
  };
705
494
  "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
706
495
  name: string;
707
496
  };
708
- "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
497
+ "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
709
498
  name: string;
710
499
  };
711
- "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
500
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
501
+ minElements?: number;
502
+ checkRegex?: boolean;
503
+ ignoreTestFiles?: boolean;
504
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
712
505
  name: string;
713
506
  };
714
- "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
507
+ "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
508
+ factories?: readonly string[];
509
+ ignoreTestFiles?: boolean;
510
+ minProperties?: number;
511
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
715
512
  name: string;
716
513
  };
717
- "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
514
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
718
515
  name: string;
719
516
  };
720
- "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
517
+ "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
721
518
  name: string;
722
519
  };
723
- "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
724
- minElements?: number;
725
- checkRegex?: boolean;
726
- ignoreTestFiles?: boolean;
520
+ "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
521
+ requireSemanticTokens?: boolean;
727
522
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
728
523
  name: string;
729
524
  };
730
- "jsdoc-restates-signature": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
525
+ "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
731
526
  name: string;
732
527
  };
733
- "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
528
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
529
+ ignoreFields?: readonly string[];
530
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
734
531
  name: string;
735
532
  };
736
- "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
533
+ "prefer-whole-object-assertion": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
737
534
  name: string;
738
535
  };
739
- "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
536
+ "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
740
537
  name: string;
741
538
  };
742
- "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
539
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
540
+ ignoreTypeNames?: readonly string[];
541
+ requireIdenticalShape?: boolean;
542
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
743
543
  name: string;
744
544
  };
745
- "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
545
+ "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
746
546
  name: string;
747
547
  };
748
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
548
+ "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
549
+ allowIn?: readonly string[];
550
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
749
551
  name: string;
750
552
  };
751
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
553
+ "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
752
554
  name: string;
753
555
  };
754
- "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
556
+ "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
755
557
  name: string;
756
558
  };
757
- "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
758
- factories?: readonly string[];
759
- ignoreTestFiles?: boolean;
760
- minProperties?: number;
559
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
560
+ name: string;
561
+ };
562
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
563
+ convention?: "prefix" | "suffix" | "either";
761
564
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
762
565
  name: string;
763
566
  };
@@ -768,4 +571,4 @@ declare const plugin: {
768
571
  };
769
572
  };
770
573
 
771
- export { plugin as default, recommendedRules, rules, strictRules };
574
+ export { plugin as default, recommendedRules, renamedRules, rules, strictRules };