@sarj/eslint-plugin 6.0.0 → 7.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.ts CHANGED
@@ -1,27 +1,11 @@
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.
7
- *
8
- * interface SapCredentials {
9
- * // Database host.
10
- * host?: string;
11
- * // Database host port.
12
- * port?: number;
13
- * // Database username.
14
- * username?: string;
15
- * }
16
- *
17
- * `jsdoc-restates-signature` needs every content word covered, so it deletes
18
- * the first row and cannot touch the second. That is the right verdict for one
19
- * line and the wrong one for ten, so the unit of judgement here is the type.
4
+ * @fileoverview no-type-member-comment-wall — an object type whose member comments mostly re-spell the members is a wall the reader pays for by the block.
20
5
  *
21
6
  * Examples: https://github.com/sarj-ai/standards/blob/main/packages/typescript/tests/rules/no-type-member-comment-wall.test.ts
22
7
  * Evidence: https://github.com/sarj-ai/standards/blob/main/docs/rules/no-type-member-comment-wall.md
23
8
  */
24
-
25
9
  /** Every threshold this rule applies; each is documented at `DEFAULTS`. */
26
10
  interface RuleOptions$3 {
27
11
  readonly minCommentedMembers: 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
- * }]
18
+ * @fileoverview no-storage-in-stateless-modules private storage inside a module a team declared stateless diverges from the system of record, silently.
61
19
  *
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.
65
- *
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,467 +28,336 @@ 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:
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.
114
32
  *
115
- * "@sarj/no-raw-fetch-outside-clients": ["error", {
116
- * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
117
- * }]
118
- *
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.
42
+ * @fileoverview _logging shared recognition of logging / error-reporting calls, so the catch rules and the secret rule cannot disagree.
185
43
  *
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.
192
- *
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
  };
80
+ "no-async-callback-in-wait-for": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
81
+ name: string;
82
+ };
273
83
  "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
274
84
  name: string;
275
85
  };
276
86
  "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
277
87
  name: string;
278
88
  };
279
- "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
280
- ignoreFiles?: readonly string[];
281
- }?], 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> & {
282
90
  name: string;
283
91
  };
284
- "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", 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> & {
285
93
  name: string;
286
94
  };
287
- "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], 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> & {
288
96
  name: string;
289
97
  };
290
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], 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> & {
291
101
  name: string;
292
102
  };
293
- "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], 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> & {
294
104
  name: string;
295
105
  };
296
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], 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> & {
297
110
  name: string;
298
111
  };
299
- "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", 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> & {
300
113
  name: string;
301
114
  };
302
- "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", 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> & {
303
116
  name: string;
304
117
  };
305
- "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", 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> & {
306
119
  name: string;
307
120
  };
308
- "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], 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> & {
309
122
  name: string;
310
123
  };
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> & {
124
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
314
125
  name: string;
315
126
  };
316
- "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", 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> & {
317
128
  name: string;
318
129
  };
319
- "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", 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> & {
320
131
  name: string;
321
132
  };
322
- "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], 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> & {
323
134
  name: string;
324
135
  };
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> & {
136
+ "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
328
137
  name: string;
329
138
  };
330
- "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", 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> & {
331
140
  name: string;
332
141
  };
333
- "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
142
+ "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
334
143
  name: string;
335
144
  };
336
- "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], 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> & {
337
146
  name: string;
338
147
  };
339
- "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], 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> & {
340
149
  name: string;
341
150
  };
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> & {
151
+ "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
345
152
  name: string;
346
153
  };
347
- "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], 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> & {
348
155
  name: string;
349
156
  };
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> & {
157
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
354
158
  name: string;
355
159
  };
356
- "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], 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> & {
357
161
  name: string;
358
162
  };
359
- "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
360
- allowIn?: readonly string[];
361
- }?], 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> & {
362
164
  name: string;
363
165
  };
364
- "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", 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> & {
365
167
  name: string;
366
168
  };
367
- "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
169
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
368
170
  name: string;
369
171
  };
370
- "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
172
+ "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
371
173
  name: string;
372
174
  };
373
- "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
175
+ "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
374
176
  name: string;
375
177
  };
376
- "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
178
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
377
179
  name: string;
378
180
  };
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> & {
181
+ "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
383
182
  name: string;
384
183
  };
385
- "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
184
+ "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
386
185
  name: string;
387
186
  };
388
- "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
187
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
188
+ minElements?: number;
189
+ checkRegex?: boolean;
190
+ ignoreTestFiles?: boolean;
191
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
389
192
  name: string;
390
193
  };
391
- "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
194
+ "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
195
+ factories?: readonly string[];
196
+ ignoreTestFiles?: boolean;
197
+ minProperties?: number;
198
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
392
199
  name: string;
393
200
  };
394
- "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
201
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
395
202
  name: string;
396
203
  };
397
- "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
204
+ "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
398
205
  name: string;
399
206
  };
400
- "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
207
+ "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
208
+ requireSemanticTokens?: boolean;
209
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
401
210
  name: string;
402
211
  };
403
- "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
212
+ "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
404
213
  name: string;
405
214
  };
406
- "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
407
- minElements?: number;
408
- checkRegex?: boolean;
409
- ignoreTestFiles?: boolean;
215
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
216
+ ignoreFields?: readonly string[];
410
217
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
411
218
  name: string;
412
219
  };
413
- "jsdoc-restates-signature": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
220
+ "prefer-whole-object-assertion": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
414
221
  name: string;
415
222
  };
416
- "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
223
+ "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
417
224
  name: string;
418
225
  };
419
- "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
226
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
227
+ ignoreTypeNames?: readonly string[];
228
+ requireIdenticalShape?: boolean;
229
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
420
230
  name: string;
421
231
  };
422
- "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
232
+ "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
423
233
  name: string;
424
234
  };
425
- "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
235
+ "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
236
+ allowIn?: readonly string[];
237
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
426
238
  name: string;
427
239
  };
428
240
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
429
241
  name: string;
430
242
  };
431
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
243
+ "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
432
244
  name: string;
433
245
  };
434
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
246
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
435
247
  name: string;
436
248
  };
437
- "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
249
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
250
+ convention?: "prefix" | "suffix" | "either";
251
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
438
252
  name: string;
439
253
  };
440
254
  };
255
+ type RuleModule = (typeof rules)[keyof typeof rules];
441
256
  declare const recommendedRules: {
442
- readonly "@sarj/zod-naming-convention": "warn";
443
- readonly "@sarj/require-assert-never": "error";
444
- readonly "@sarj/require-zod-form-validation": "error";
445
257
  readonly "@sarj/enforce-file-structure": "warn";
258
+ readonly "@sarj/no-async-callback-in-wait-for": "warn";
446
259
  readonly "@sarj/no-client-side-data-fetching": "warn";
447
- readonly "@sarj/prefer-server-actions": "warn";
448
- readonly "@sarj/no-unnecessary-use-client": "warn";
449
- readonly "@sarj/prefer-schema-for-api-payload": "warn";
450
- readonly "@sarj/no-sentinel-return-on-catch": "warn";
451
- readonly "@sarj/no-log-only-catch": "warn";
260
+ readonly "@sarj/no-comment-cruft": "warn";
261
+ readonly "@sarj/no-conditional-in-test": "warn";
262
+ readonly "@sarj/no-cors-wildcard-with-credentials": "warn";
263
+ readonly "@sarj/no-dynamic-sql": "warn";
264
+ readonly "@sarj/no-fat-try-blocks": "warn";
265
+ readonly "@sarj/no-hand-rolled-sleep": "warn";
452
266
  readonly "@sarj/no-insecure-random-id": "warn";
453
267
  readonly "@sarj/no-json-stringify-error": "warn";
268
+ readonly "@sarj/no-log-only-catch": "warn";
269
+ readonly "@sarj/no-offset-pagination": "warn";
270
+ readonly "@sarj/no-positional-tuple-return": "warn";
271
+ readonly "@sarj/no-repeated-string-literal": "warn";
272
+ readonly "@sarj/no-restated-comment": "warn";
273
+ readonly "@sarj/no-restated-jsdoc": "warn";
274
+ readonly "@sarj/no-secret-in-log": "warn";
275
+ readonly "@sarj/no-select-star": "warn";
276
+ readonly "@sarj/no-sentinel-return-on-catch": "warn";
277
+ readonly "@sarj/no-silent-promise-catch": "warn";
278
+ readonly "@sarj/no-sleep-in-test-body": "warn";
454
279
  readonly "@sarj/no-string-concat-in-loop": "warn";
280
+ readonly "@sarj/no-tautological-expect": "warn";
281
+ readonly "@sarj/no-trailing-value-narration": "warn";
282
+ readonly "@sarj/no-type-member-comment-wall": "warn";
283
+ readonly "@sarj/no-unnecessary-use-client": "warn";
284
+ readonly "@sarj/no-unsafe-mock-casting": "warn";
285
+ readonly "@sarj/no-zod-native-enum": "warn";
286
+ readonly "@sarj/prefer-constant-time-secret-compare": "error";
455
287
  readonly "@sarj/prefer-discriminated-union": "warn";
456
- readonly "@sarj/no-comment-cruft": "warn";
288
+ readonly "@sarj/prefer-module-level-constant": "warn";
289
+ readonly "@sarj/prefer-module-level-schema": "warn";
290
+ readonly "@sarj/prefer-non-nullable-collection": "warn";
291
+ readonly "@sarj/prefer-schema-for-api-payload": "warn";
457
292
  readonly "@sarj/prefer-semantic-colors": readonly ["warn", {
458
293
  readonly requireSemanticTokens: true;
459
294
  }];
460
- readonly "@sarj/no-fat-try-blocks": "warn";
461
- readonly "@sarj/no-cors-wildcard-with-credentials": "warn";
462
- readonly "@sarj/no-secret-in-log": "warn";
463
- readonly "@sarj/no-unsafe-mock-casting": "warn";
295
+ readonly "@sarj/prefer-server-actions": "warn";
464
296
  readonly "@sarj/prefer-string-literal-union": "warn";
297
+ readonly "@sarj/prefer-whole-object-assertion": "warn";
465
298
  readonly "@sarj/prefer-zod-enum": "warn";
466
299
  readonly "@sarj/prefer-zod-infer": "warn";
300
+ readonly "@sarj/require-assert-never": "error";
467
301
  readonly "@sarj/require-fetch-timeout": "warn";
468
- readonly "@sarj/no-silent-promise-catch": "warn";
469
- readonly "@sarj/prefer-constant-time-secret-compare": "error";
470
- readonly "@sarj/store-insert-requires-on-conflict": "warn";
471
- readonly "@sarj/no-offset-pagination": "warn";
472
- readonly "@sarj/no-select-star": "warn";
473
- readonly "@sarj/no-hand-rolled-sleep": "warn";
474
- readonly "@sarj/no-sleep-in-test-body": "warn";
475
- readonly "@sarj/no-conditional-in-test": "warn";
476
- readonly "@sarj/no-repeated-string-literal": "warn";
477
- readonly "@sarj/no-positional-tuple-return": "warn";
478
- readonly "@sarj/no-dynamic-sql": "warn";
479
- readonly "@sarj/no-zod-native-enum": "warn";
480
- readonly "@sarj/prefer-module-level-constant": "warn";
481
- readonly "@sarj/no-restated-comment": "warn";
482
- readonly "@sarj/jsdoc-restates-signature": "warn";
483
- readonly "@sarj/trailing-value-narration": "warn";
484
- readonly "@sarj/no-type-member-comment-wall": "warn";
485
- readonly "@sarj/no-tautological-expect": "warn";
486
302
  readonly "@sarj/require-interface-for-injected-service": "warn";
487
- readonly "@sarj/prefer-non-nullable-collection": "warn";
488
- readonly "@sarj/no-async-callback-in-waitfor": "warn";
489
- readonly "@sarj/strict-test-assertions": "warn";
303
+ readonly "@sarj/require-zod-form-validation": "error";
304
+ readonly "@sarj/store-insert-requires-on-conflict": "warn";
305
+ readonly "@sarj/zod-naming-convention": "warn";
490
306
  };
491
307
  declare const strictRules: {
492
- readonly "@sarj/zod-naming-convention": "error";
493
- readonly "@sarj/require-assert-never": "error";
494
- readonly "@sarj/require-zod-form-validation": "error";
495
308
  readonly "@sarj/enforce-file-structure": "error";
496
- readonly "@sarj/no-raw-env": "error";
497
- readonly "@sarj/no-enum": "error";
309
+ readonly "@sarj/no-async-callback-in-wait-for": "error";
498
310
  readonly "@sarj/no-client-side-data-fetching": "error";
499
- readonly "@sarj/prefer-server-actions": "error";
500
- readonly "@sarj/no-unnecessary-use-client": "error";
501
- readonly "@sarj/prefer-schema-for-api-payload": "error";
502
- readonly "@sarj/no-sentinel-return-on-catch": "error";
503
- readonly "@sarj/no-log-only-catch": "error";
311
+ readonly "@sarj/no-comment-cruft": "error";
312
+ readonly "@sarj/no-conditional-in-test": "error";
313
+ readonly "@sarj/no-cors-wildcard-with-credentials": "error";
314
+ readonly "@sarj/no-dynamic-sql": "error";
315
+ readonly "@sarj/no-enum": "error";
316
+ readonly "@sarj/no-fat-try-blocks": "error";
317
+ readonly "@sarj/no-hand-rolled-sleep": "error";
504
318
  readonly "@sarj/no-insecure-random-id": "error";
505
319
  readonly "@sarj/no-json-stringify-error": "error";
320
+ readonly "@sarj/no-log-only-catch": "error";
321
+ readonly "@sarj/no-offset-pagination": "error";
322
+ readonly "@sarj/no-positional-tuple-return": "error";
323
+ readonly "@sarj/no-raw-env": "error";
324
+ readonly "@sarj/no-raw-fetch-outside-clients": "error";
325
+ readonly "@sarj/no-repeated-string-literal": "error";
326
+ readonly "@sarj/no-restated-comment": "error";
327
+ readonly "@sarj/no-restated-jsdoc": "error";
328
+ readonly "@sarj/no-secret-in-log": "error";
329
+ readonly "@sarj/no-select-star": "error";
330
+ readonly "@sarj/no-sentinel-return-on-catch": "error";
331
+ readonly "@sarj/no-silent-promise-catch": "error";
332
+ readonly "@sarj/no-sleep-in-test-body": "error";
333
+ readonly "@sarj/no-storage-in-stateless-modules": "error";
506
334
  readonly "@sarj/no-string-concat-in-loop": "error";
335
+ readonly "@sarj/no-tautological-expect": "error";
336
+ readonly "@sarj/no-trailing-value-narration": "error";
337
+ readonly "@sarj/no-type-member-comment-wall": "error";
338
+ readonly "@sarj/no-unnecessary-use-client": "error";
339
+ readonly "@sarj/no-unsafe-mock-casting": "error";
340
+ readonly "@sarj/no-zod-native-enum": "error";
341
+ readonly "@sarj/prefer-constant-time-secret-compare": "error";
507
342
  readonly "@sarj/prefer-discriminated-union": "error";
508
- readonly "@sarj/no-comment-cruft": "error";
343
+ readonly "@sarj/prefer-module-level-constant": "error";
344
+ readonly "@sarj/prefer-module-level-schema": "error";
345
+ readonly "@sarj/prefer-non-nullable-collection": "error";
346
+ readonly "@sarj/prefer-schema-for-api-payload": "error";
509
347
  readonly "@sarj/prefer-semantic-colors": readonly ["error", {
510
348
  readonly requireSemanticTokens: true;
511
349
  }];
512
- readonly "@sarj/no-fat-try-blocks": "error";
513
- readonly "@sarj/no-cors-wildcard-with-credentials": "error";
514
- readonly "@sarj/no-secret-in-log": "error";
515
- readonly "@sarj/no-unsafe-mock-casting": "error";
350
+ readonly "@sarj/prefer-server-actions": "error";
516
351
  readonly "@sarj/prefer-string-literal-union": "error";
352
+ readonly "@sarj/prefer-whole-object-assertion": "error";
517
353
  readonly "@sarj/prefer-zod-enum": "error";
518
354
  readonly "@sarj/prefer-zod-infer": "error";
355
+ readonly "@sarj/require-assert-never": "error";
519
356
  readonly "@sarj/require-fetch-timeout": "error";
520
- readonly "@sarj/no-silent-promise-catch": "error";
521
- readonly "@sarj/prefer-constant-time-secret-compare": "error";
522
- readonly "@sarj/store-insert-requires-on-conflict": "error";
523
- readonly "@sarj/no-offset-pagination": "error";
524
- readonly "@sarj/no-select-star": "error";
525
- readonly "@sarj/no-hand-rolled-sleep": "error";
526
- readonly "@sarj/no-sleep-in-test-body": "error";
527
- readonly "@sarj/no-conditional-in-test": "error";
528
- readonly "@sarj/no-repeated-string-literal": "error";
529
- readonly "@sarj/no-positional-tuple-return": "error";
530
- readonly "@sarj/no-dynamic-sql": "error";
531
- readonly "@sarj/no-raw-fetch-outside-clients": "error";
532
- readonly "@sarj/no-storage-in-stateless-modules": "error";
533
- readonly "@sarj/no-zod-native-enum": "error";
534
- readonly "@sarj/prefer-module-level-constant": "error";
535
- readonly "@sarj/no-restated-comment": "error";
536
- readonly "@sarj/jsdoc-restates-signature": "error";
537
- readonly "@sarj/trailing-value-narration": "error";
538
- readonly "@sarj/no-type-member-comment-wall": "error";
539
- readonly "@sarj/no-tautological-expect": "error";
540
357
  readonly "@sarj/require-interface-for-injected-service": "error";
541
- readonly "@sarj/prefer-non-nullable-collection": "error";
542
- readonly "@sarj/no-async-callback-in-waitfor": "error";
543
- readonly "@sarj/strict-test-assertions": "error";
358
+ readonly "@sarj/require-zod-form-validation": "error";
359
+ readonly "@sarj/store-insert-requires-on-conflict": "error";
360
+ readonly "@sarj/zod-naming-convention": "error";
544
361
  };
545
362
  type FlatPreset = {
546
363
  readonly name: string;
@@ -548,201 +365,195 @@ type FlatPreset = {
548
365
  readonly rules: Record<string, unknown>;
549
366
  };
550
367
  /**
551
- * The presets, as FLAT config objects.
552
- *
553
- * Both used to declare `plugins: ["@sarj"]` -- eslintrc syntax -- and ESLint
554
- * rejects that outright:
555
- *
556
- * Config (unnamed): Key "plugins": This appears to be in eslintrc format
557
- * (array of strings) rather than flat config format (object).
558
- *
559
- * So `sarj.configs.strict`, the "just extend the plugin, do not copy the file"
560
- * path, threw for anyone who tried it, and copying `eslint.strict.mjs` and
561
- * editing the copy was the only thing that worked -- exactly the vendoring
562
- * these presets exist to prevent. `plugins` is now the object form flat config
563
- * wants, so both presets go straight into an `eslint.config.mjs` array (no
564
- * spread):
565
- *
566
- * import sarj from "@sarj/eslint-plugin";
567
- * export default [sarj.configs.strict];
568
- *
569
- * Neither preset sets `files` or a parser. They carry rules and nothing else,
570
- * so they compose with whatever a repo already has rather than narrowing it.
368
+ * The presets, as FLAT config objects — `plugins` is the object form, so both go
369
+ * straight into an `eslint.config.mjs` array with no spread. Neither sets
370
+ * `files` or a parser, so they compose with whatever a repo already has.
571
371
  */
572
372
  declare const plugin: {
573
373
  meta: {
574
374
  readonly name: "@sarj/eslint-plugin";
575
- readonly version: "6.0.0";
375
+ readonly version: "7.0.0";
576
376
  };
577
377
  rules: {
378
+ "jsdoc-restates-signature": RuleModule;
379
+ "no-async-callback-in-waitfor": RuleModule;
380
+ "strict-test-assertions": RuleModule;
381
+ "trailing-value-narration": RuleModule;
578
382
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
579
383
  name: string;
580
384
  };
385
+ "no-async-callback-in-wait-for": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
386
+ name: string;
387
+ };
581
388
  "no-client-side-data-fetching": _typescript_eslint_utils_ts_eslint.RuleModule<"noClientFetch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
582
389
  name: string;
583
390
  };
584
391
  "no-comment-cruft": _typescript_eslint_utils_ts_eslint.RuleModule<"commentedOutCode" | "sectionBanner" | "fileHeaderPreamble" | "redundantNarration" | "untrackedTodo", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
585
392
  name: string;
586
393
  };
587
- "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
588
- ignoreFiles?: readonly string[];
589
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
394
+ "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
590
395
  name: string;
591
396
  };
592
- "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
397
+ "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
593
398
  name: string;
594
399
  };
595
- "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
400
+ "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
596
401
  name: string;
597
402
  };
598
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
403
+ "no-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"noEnum", readonly [{
404
+ ignoreFiles?: readonly string[];
405
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
599
406
  name: string;
600
407
  };
601
- "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
408
+ "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
602
409
  name: string;
603
410
  };
604
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
411
+ "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
412
+ allowIn?: readonly string[];
413
+ checkClientModules?: boolean;
414
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
605
415
  name: string;
606
416
  };
607
- "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
417
+ "no-insecure-random-id": _typescript_eslint_utils_ts_eslint.RuleModule<"insecureRandomId", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
608
418
  name: string;
609
419
  };
610
- "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
420
+ "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
611
421
  name: string;
612
422
  };
613
- "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
423
+ "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
614
424
  name: string;
615
425
  };
616
- "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
426
+ "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
617
427
  name: string;
618
428
  };
619
- "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
620
- requireSemanticTokens?: boolean;
621
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
429
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
622
430
  name: string;
623
431
  };
624
- "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
432
+ "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
625
433
  name: string;
626
434
  };
627
- "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
435
+ "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
628
436
  name: string;
629
437
  };
630
- "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
438
+ "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
631
439
  name: string;
632
440
  };
633
- "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
634
- convention?: "prefix" | "suffix" | "either";
635
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
441
+ "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
636
442
  name: string;
637
443
  };
638
- "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
444
+ "no-restated-jsdoc": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
639
445
  name: string;
640
446
  };
641
- "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
447
+ "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
642
448
  name: string;
643
449
  };
644
- "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog" | "noRawBodyInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
450
+ "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
645
451
  name: string;
646
452
  };
647
- "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
453
+ "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
648
454
  name: string;
649
455
  };
650
- "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
651
- ignoreFields?: readonly string[];
652
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
456
+ "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
653
457
  name: string;
654
458
  };
655
- "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
459
+ "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
656
460
  name: string;
657
461
  };
658
- "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
659
- ignoreTypeNames?: readonly string[];
660
- requireIdenticalShape?: boolean;
661
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
462
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
662
463
  name: string;
663
464
  };
664
- "no-silent-promise-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"silentCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
465
+ "no-string-concat-in-loop": _typescript_eslint_utils_ts_eslint.RuleModule<"noStringConcatInLoop", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
665
466
  name: string;
666
467
  };
667
- "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
668
- allowIn?: readonly string[];
669
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
468
+ "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
670
469
  name: string;
671
470
  };
672
- "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
471
+ "no-trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
673
472
  name: string;
674
473
  };
675
- "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
474
+ "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
676
475
  name: string;
677
476
  };
678
- "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
477
+ "no-unnecessary-use-client": _typescript_eslint_utils_ts_eslint.RuleModule<"unnecessaryUseClient", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
679
478
  name: string;
680
479
  };
681
- "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
480
+ "no-unsafe-mock-casting": _typescript_eslint_utils_ts_eslint.RuleModule<"unsafeMockCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
682
481
  name: string;
683
482
  };
684
- "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
483
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
685
484
  name: string;
686
485
  };
687
- "no-hand-rolled-sleep": _typescript_eslint_utils_ts_eslint.RuleModule<"handRolledSleep" | "handRolledTimeoutRace", readonly [{
688
- allowIn?: readonly string[];
689
- checkClientModules?: boolean;
690
- }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
486
+ "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
691
487
  name: string;
692
488
  };
693
- "no-conditional-in-test": _typescript_eslint_utils_ts_eslint.RuleModule<"noConditionalInTest", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
489
+ "prefer-discriminated-union": _typescript_eslint_utils_ts_eslint.RuleModule<"preferDiscriminatedUnion", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
694
490
  name: string;
695
491
  };
696
- "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
492
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
493
+ minElements?: number;
494
+ checkRegex?: boolean;
495
+ ignoreTestFiles?: boolean;
496
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
697
497
  name: string;
698
498
  };
699
- "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
499
+ "prefer-module-level-schema": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistSchema", readonly [{
500
+ factories?: readonly string[];
501
+ ignoreTestFiles?: boolean;
502
+ minProperties?: number;
503
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
700
504
  name: string;
701
505
  };
702
- "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
506
+ "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
703
507
  name: string;
704
508
  };
705
- "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
509
+ "prefer-schema-for-api-payload": _typescript_eslint_utils_ts_eslint.RuleModule<"unparsedJsonAccess", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
706
510
  name: string;
707
511
  };
708
- "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
512
+ "prefer-semantic-colors": _typescript_eslint_utils_ts_eslint.RuleModule<"rawPalette" | "arbitraryColor" | "inlineColor", readonly [{
513
+ requireSemanticTokens?: boolean;
514
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
709
515
  name: string;
710
516
  };
711
- "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
517
+ "prefer-server-actions": _typescript_eslint_utils_ts_eslint.RuleModule<"preferServerAction", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
712
518
  name: string;
713
519
  };
714
- "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
715
- minElements?: number;
716
- checkRegex?: boolean;
717
- ignoreTestFiles?: boolean;
520
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
521
+ ignoreFields?: readonly string[];
718
522
  }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
719
523
  name: string;
720
524
  };
721
- "jsdoc-restates-signature": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesSignature" | "deleteBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
525
+ "prefer-whole-object-assertion": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
722
526
  name: string;
723
527
  };
724
- "no-restated-comment": _typescript_eslint_utils_ts_eslint.RuleModule<"restatesLineBelow", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
528
+ "prefer-zod-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"preferEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
725
529
  name: string;
726
530
  };
727
- "trailing-value-narration": _typescript_eslint_utils_ts_eslint.RuleModule<"narratesValue", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
531
+ "prefer-zod-infer": _typescript_eslint_utils_ts_eslint.RuleModule<"handWrittenTwin", readonly [{
532
+ ignoreTypeNames?: readonly string[];
533
+ requireIdenticalShape?: boolean;
534
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
728
535
  name: string;
729
536
  };
730
- "no-type-member-comment-wall": _typescript_eslint_utils_ts_eslint.RuleModule<"commentWall", readonly [Partial<RuleOptions$3>?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
537
+ "require-assert-never": _typescript_eslint_utils_ts_eslint.RuleModule<"missingAssertNever", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
731
538
  name: string;
732
539
  };
733
- "no-tautological-expect": _typescript_eslint_utils_ts_eslint.RuleModule<"tautologicalComparison" | "tautologicalMatcher", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
540
+ "require-fetch-timeout": _typescript_eslint_utils_ts_eslint.RuleModule<"missingSignal", readonly [{
541
+ allowIn?: readonly string[];
542
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
734
543
  name: string;
735
544
  };
736
545
  "require-interface-for-injected-service": _typescript_eslint_utils_ts_eslint.RuleModule<"requireInterface", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
737
546
  name: string;
738
547
  };
739
- "strict-test-assertions": _typescript_eslint_utils_ts_eslint.RuleModule<"combineAssertions" | "assertArrayOnce", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
548
+ "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
740
549
  name: string;
741
550
  };
742
- "prefer-non-nullable-collection": _typescript_eslint_utils_ts_eslint.RuleModule<"preferNonNullableCollection", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
551
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
743
552
  name: string;
744
553
  };
745
- "no-async-callback-in-waitfor": _typescript_eslint_utils_ts_eslint.RuleModule<"noAsyncCallbackInWaitFor", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
554
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
555
+ convention?: "prefix" | "suffix" | "either";
556
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
746
557
  name: string;
747
558
  };
748
559
  };
@@ -752,4 +563,4 @@ declare const plugin: {
752
563
  };
753
564
  };
754
565
 
755
- export { plugin as default, recommendedRules, rules, strictRules };
566
+ export { plugin as default, recommendedRules, renamedRules, rules, strictRules };