@sarj/eslint-plugin 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,169 @@
1
1
  import * as _typescript_eslint_utils_ts_eslint from '@typescript-eslint/utils/ts-eslint';
2
2
 
3
+ /**
4
+ * @fileoverview Keep modules that are stateless by design free of private
5
+ * storage.
6
+ *
7
+ * Some features are stateless deliberately: they derive everything they need
8
+ * from reads against the systems of record (Slack, Linear, GitHub, a CRM) plus
9
+ * markers in the artefacts they themselves produced. The reason is operational
10
+ * — such a feature can be re-run and back-filled freely, whereas a private
11
+ * table or key/value namespace immediately diverges from what a human can
12
+ * actually see and audit in the system of record. Adding a store to one of
13
+ * these modules silently deletes that property, and nothing else in the
14
+ * toolchain notices.
15
+ *
16
+ * WHAT IT CATCHES, inside the configured modules only
17
+ * db.prepare(sql) // a SQL statement
18
+ * kv.put(key, value) // a key/value write
19
+ * kv.getWithMetadata(key) // a key/value read
20
+ *
21
+ * OPT-IN BY DESIGN
22
+ * `modules` defaults to an EMPTY list, which makes the rule a no-op. That is
23
+ * deliberate: the method names alone (`put`, `prepare`) carry no type
24
+ * information, so the rule is only meaningful — and only quiet enough to live
25
+ * in a shared preset — when it is pointed at the specific directories a team
26
+ * has declared stateless.
27
+ *
28
+ * "@sarj/no-storage-in-stateless-modules": ["error", {
29
+ * "modules": ["[\\\\/]engineer-digest[\\\\/]", "[\\\\/]digest[\\\\/]"]
30
+ * }]
31
+ *
32
+ * `modules` entries are regular-expression sources matched against the absolute
33
+ * filename. `methods` overrides the storage method names if a driver names
34
+ * things differently.
35
+ *
36
+ * NOT FLAGGED
37
+ * - Anything outside the configured modules.
38
+ * - `.put()` with fewer than two arguments — a one-argument `put` is more
39
+ * often a builder or queue helper than a key/value write.
40
+ *
41
+ * If a feature genuinely cannot be expressed statelessly, that is a design
42
+ * conversation, not a disable comment.
43
+ */
44
+
45
+ interface RuleOptions$2 {
46
+ /** Regex sources matched against the filename. Empty means the rule is off. */
47
+ readonly modules?: readonly string[];
48
+ /** Storage method names to flag. Replaces the defaults. */
49
+ readonly methods?: readonly string[];
50
+ }
51
+
52
+ /**
53
+ * @fileoverview Keep outbound HTTP behind a client module.
54
+ *
55
+ * A bare `fetch()` in a route handler, server action or component opts out of
56
+ * whatever the codebase's client layer provides — retry/backoff, timeouts,
57
+ * status handling, auth headers, structured log breadcrumbs. It is also the
58
+ * shape that cannot be stubbed in a test without monkey-patching global
59
+ * `fetch`, so the call site quietly becomes untestable.
60
+ *
61
+ * WHAT IT CATCHES
62
+ * fetch(url) // bare global
63
+ * globalThis.fetch(url) // explicit global receiver
64
+ * window.fetch(url)
65
+ *
66
+ * NOT FLAGGED
67
+ * - Files whose path matches one of the `allow` patterns. The defaults cover
68
+ * the conventions we have seen in practice — a `clients/` directory, a
69
+ * `*-client.ts` module, an `http-client.*` wrapper — plus test files.
70
+ * - A method named `fetch` on some other receiver (`cache.fetch(k)`,
71
+ * `queryClient.fetch()`): only the global is HTTP.
72
+ * - `new Request(...)` / `axios(...)` and friends. This rule is about the
73
+ * global `fetch`, not about every HTTP library.
74
+ *
75
+ * CONFIGURATION
76
+ * `allow` is a list of regular-expression sources matched against the absolute
77
+ * filename, so a repo that keeps its client layer somewhere else can say so
78
+ * rather than sprinkling disable comments:
79
+ *
80
+ * "@sarj/no-raw-fetch-outside-clients": ["error", {
81
+ * "allow": ["[\\\\/]lib[\\\\/]api[\\\\/]", "-gateway\\\\.ts$"]
82
+ * }]
83
+ *
84
+ * Supplying `allow` REPLACES the defaults, so include the test patterns if you
85
+ * still want test files exempt.
86
+ */
87
+
88
+ interface RuleOptions$1 {
89
+ /** Regular-expression sources matched against the filename. */
90
+ readonly allow?: readonly string[];
91
+ }
92
+
93
+ /**
94
+ * @fileoverview Disallow building a SQL statement out of runtime values.
95
+ *
96
+ * `db.prepare(sql)` takes a STATIC statement plus `?` / `$1` placeholders bound
97
+ * through `.bind(...)`. Interpolating a value into the statement text bypasses
98
+ * the binding layer completely: that is SQL injection, and it also defeats the
99
+ * driver's prepared-statement cache, because every distinct value produces a
100
+ * distinct statement to compile. The shape is identical across Cloudflare D1,
101
+ * better-sqlite3 and node-postgres, so the rule is driver-agnostic.
102
+ *
103
+ * WHAT IT CATCHES
104
+ * db.prepare(`select * from users where id = '${userId}'`)
105
+ * db.prepare("select * from users where id = '" + userId + "'")
106
+ * db.exec(`delete from sessions where token = '${token}'`)
107
+ *
108
+ * NOT FLAGGED
109
+ * - `${CONSTANT_CASE}` fragments. A module-level constant — the column-list
110
+ * constants several repos keep (`${CANDIDATE_COLS}`, `${TABLES.USERS}`) —
111
+ * is a compile-time value, not user input. Anything starting lowercase is
112
+ * treated as runtime data.
113
+ * - A template literal with no interpolations at all.
114
+ * - Tagged templates (`` sql`select ... ${id}` ``). A tag function receives the
115
+ * static strings and the values separately and is the parameterising
116
+ * mechanism, not a bypass of it.
117
+ * - `.prepare()` on something that is not a database. Requiring an
118
+ * interpolated runtime value keeps this rare in practice.
119
+ *
120
+ * CONFIGURATION
121
+ * `methods` is the list of statement-taking method names to inspect. Extend it
122
+ * for a driver that names things differently:
123
+ *
124
+ * "@sarj/no-dynamic-sql": ["error", { "methods": ["prepare", "exec", "raw"] }]
125
+ *
126
+ * Supplying `methods` REPLACES the defaults.
127
+ */
128
+
129
+ interface RuleOptions {
130
+ /** Statement-taking method names to inspect. Replaces the defaults. */
131
+ readonly methods?: readonly string[];
132
+ }
133
+
134
+ /**
135
+ * @fileoverview Shared helpers for recognising logging / error-reporting calls.
136
+ * Used by `no-log-only-catch`, `no-sentinel-return-on-catch` and
137
+ * `no-secret-in-log` so all three rules agree on what counts as "this call
138
+ * writes to a log sink" before deciding a catch silently swallows an error or a
139
+ * secret leaks.
140
+ *
141
+ * Two shapes are recognised:
142
+ *
143
+ * - **Receiver-shaped** — a log METHOD (`debug`/`info`/`warn`/`error`/…) on a
144
+ * logger RECEIVER: `console.error(...)`, `logger.warn(...)`,
145
+ * `this.logger.info(...)`, and builder/factory chains
146
+ * (`logger.bind({...}).info(...)`, `logging.getLogger(n).info(...)`).
147
+ * - **Free-function-shaped** — a project-declared logging function, e.g.
148
+ * `logEvent("pr_scan.failed", { repo, error })`. Structured loggers that are
149
+ * plain functions taking a meta object are the dominant real-world shape and
150
+ * have no logger receiver at all, so they are invisible to the receiver
151
+ * heuristic. Projects declare theirs via the shared `logFunctions` rule
152
+ * option; `loggerNames` extends the receiver set the same way.
153
+ *
154
+ * Both options are OFF by default (empty), so default behaviour is unchanged.
155
+ * Declaring them makes the catch rules stop reporting a correctly-logged
156
+ * degraded return AND makes `no-secret-in-log` start inspecting those calls —
157
+ * the second effect closes a real hole, since `logEvent("auth", { botToken })`
158
+ * was previously never examined.
159
+ */
160
+
161
+ /** Shared `loggerNames` / `logFunctions` option shape. */
162
+ interface LoggingOptions {
163
+ readonly loggerNames?: readonly string[];
164
+ readonly logFunctions?: readonly string[];
165
+ }
166
+
3
167
  declare const rules: {
4
168
  "enforce-file-structure": _typescript_eslint_utils_ts_eslint.RuleModule<"importsFirst" | "useServerDirective", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
5
169
  name: string;
@@ -21,13 +185,13 @@ declare const rules: {
21
185
  "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
22
186
  name: string;
23
187
  };
24
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
188
+ "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
25
189
  name: string;
26
190
  };
27
191
  "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
28
192
  name: string;
29
193
  };
30
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
194
+ "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
31
195
  name: string;
32
196
  };
33
197
  "no-sequential-await": _typescript_eslint_utils_ts_eslint.RuleModule<"noSequentialAwait", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -60,7 +224,9 @@ declare const rules: {
60
224
  "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
61
225
  name: string;
62
226
  };
63
- "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
227
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
228
+ convention?: "prefix" | "suffix" | "either";
229
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
64
230
  name: string;
65
231
  };
66
232
  "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -69,13 +235,15 @@ declare const rules: {
69
235
  "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
70
236
  name: string;
71
237
  };
72
- "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
238
+ "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
73
239
  name: string;
74
240
  };
75
241
  "no-unsafe-cast": _typescript_eslint_utils_ts_eslint.RuleModule<"asAny" | "doubleCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
76
242
  name: string;
77
243
  };
78
- "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
244
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
245
+ ignoreFields?: readonly string[];
246
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
79
247
  name: string;
80
248
  };
81
249
  "single-public-export": _typescript_eslint_utils_ts_eslint.RuleModule<"renameJunkDrawer", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -92,6 +260,46 @@ declare const rules: {
92
260
  "require-schema-validate-search": _typescript_eslint_utils_ts_eslint.RuleModule<"castInValidateSearch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
93
261
  name: string;
94
262
  };
263
+ "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
264
+ name: string;
265
+ };
266
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
267
+ name: string;
268
+ };
269
+ "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
270
+ name: string;
271
+ };
272
+ "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
273
+ name: string;
274
+ };
275
+ "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
276
+ name: string;
277
+ };
278
+ "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
279
+ name: string;
280
+ };
281
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
282
+ name: string;
283
+ };
284
+ "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
285
+ name: string;
286
+ };
287
+ "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
288
+ name: string;
289
+ };
290
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
291
+ name: string;
292
+ };
293
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
294
+ name: string;
295
+ };
296
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
297
+ minElements?: number;
298
+ checkRegex?: boolean;
299
+ ignoreTestFiles?: boolean;
300
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
301
+ name: string;
302
+ };
95
303
  };
96
304
  declare const plugin: {
97
305
  meta: {
@@ -119,13 +327,13 @@ declare const plugin: {
119
327
  "no-json-stringify-error": _typescript_eslint_utils_ts_eslint.RuleModule<"noJsonStringifyError", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
120
328
  name: string;
121
329
  };
122
- "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
330
+ "no-log-only-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noLogOnlyCatch" | "emptyCatch", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
123
331
  name: string;
124
332
  };
125
333
  "no-raw-env": _typescript_eslint_utils_ts_eslint.RuleModule<"noRawEnv", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
126
334
  name: string;
127
335
  };
128
- "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
336
+ "no-sentinel-return-on-catch": _typescript_eslint_utils_ts_eslint.RuleModule<"noSentinelReturn", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
129
337
  name: string;
130
338
  };
131
339
  "no-sequential-await": _typescript_eslint_utils_ts_eslint.RuleModule<"noSequentialAwait", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -158,7 +366,9 @@ declare const plugin: {
158
366
  "require-zod-form-validation": _typescript_eslint_utils_ts_eslint.RuleModule<"missingZodValidation", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
159
367
  name: string;
160
368
  };
161
- "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
369
+ "zod-naming-convention": _typescript_eslint_utils_ts_eslint.RuleModule<"zPrefix" | "schemaSuffix" | "zodSchemaName", readonly [{
370
+ convention?: "prefix" | "suffix" | "either";
371
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
162
372
  name: string;
163
373
  };
164
374
  "no-cors-wildcard-with-credentials": _typescript_eslint_utils_ts_eslint.RuleModule<"corsWildcardWithCredentials", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -167,13 +377,15 @@ declare const plugin: {
167
377
  "no-fat-try-blocks": _typescript_eslint_utils_ts_eslint.RuleModule<"fatTryBlock", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
168
378
  name: string;
169
379
  };
170
- "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
380
+ "no-secret-in-log": _typescript_eslint_utils_ts_eslint.RuleModule<"noSecretInLog", readonly [LoggingOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
171
381
  name: string;
172
382
  };
173
383
  "no-unsafe-cast": _typescript_eslint_utils_ts_eslint.RuleModule<"asAny" | "doubleCast", [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
174
384
  name: string;
175
385
  };
176
- "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
386
+ "prefer-string-literal-union": _typescript_eslint_utils_ts_eslint.RuleModule<"bareChoiceField" | "comparisonCluster", readonly [{
387
+ ignoreFields?: readonly string[];
388
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
177
389
  name: string;
178
390
  };
179
391
  "single-public-export": _typescript_eslint_utils_ts_eslint.RuleModule<"renameJunkDrawer", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
@@ -190,6 +402,46 @@ declare const plugin: {
190
402
  "require-schema-validate-search": _typescript_eslint_utils_ts_eslint.RuleModule<"castInValidateSearch", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
191
403
  name: string;
192
404
  };
405
+ "no-offset-pagination": _typescript_eslint_utils_ts_eslint.RuleModule<"noOffsetPagination", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
406
+ name: string;
407
+ };
408
+ "no-positional-tuple-return": _typescript_eslint_utils_ts_eslint.RuleModule<"noPositionalTupleReturn", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
409
+ name: string;
410
+ };
411
+ "no-repeated-string-literal": _typescript_eslint_utils_ts_eslint.RuleModule<"noRepeatedStringLiteral", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
412
+ name: string;
413
+ };
414
+ "no-select-star": _typescript_eslint_utils_ts_eslint.RuleModule<"noSelectStar", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
415
+ name: string;
416
+ };
417
+ "no-sleep-in-test-body": _typescript_eslint_utils_ts_eslint.RuleModule<"noSleepInTestBody", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
418
+ name: string;
419
+ };
420
+ "prefer-constant-time-secret-compare": _typescript_eslint_utils_ts_eslint.RuleModule<"preferConstantTimeSecretCompare", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
421
+ name: string;
422
+ };
423
+ "store-insert-requires-on-conflict": _typescript_eslint_utils_ts_eslint.RuleModule<"storeInsertRequiresOnConflict", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
424
+ name: string;
425
+ };
426
+ "no-dynamic-sql": _typescript_eslint_utils_ts_eslint.RuleModule<"dynamicSql", readonly [RuleOptions?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
427
+ name: string;
428
+ };
429
+ "no-raw-fetch-outside-clients": _typescript_eslint_utils_ts_eslint.RuleModule<"rawFetch", readonly [RuleOptions$1?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
430
+ name: string;
431
+ };
432
+ "no-storage-in-stateless-modules": _typescript_eslint_utils_ts_eslint.RuleModule<"storageInStatelessModule", readonly [RuleOptions$2?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
433
+ name: string;
434
+ };
435
+ "no-zod-native-enum": _typescript_eslint_utils_ts_eslint.RuleModule<"nativeEnum" | "enumOfTsEnum", readonly [], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
436
+ name: string;
437
+ };
438
+ "prefer-module-level-constant": _typescript_eslint_utils_ts_eslint.RuleModule<"hoistCollection" | "hoistRegex", readonly [{
439
+ minElements?: number;
440
+ checkRegex?: boolean;
441
+ ignoreTestFiles?: boolean;
442
+ }?], unknown, _typescript_eslint_utils_ts_eslint.RuleListener> & {
443
+ name: string;
444
+ };
193
445
  };
194
446
  configs: {
195
447
  recommended: {
@@ -221,6 +473,16 @@ declare const plugin: {
221
473
  "@sarj/require-fetch-timeout": string;
222
474
  "@sarj/no-silent-promise-catch": string;
223
475
  "@sarj/require-schema-validate-search": string;
476
+ "@sarj/prefer-constant-time-secret-compare": string;
477
+ "@sarj/store-insert-requires-on-conflict": string;
478
+ "@sarj/no-offset-pagination": string;
479
+ "@sarj/no-select-star": string;
480
+ "@sarj/no-sleep-in-test-body": string;
481
+ "@sarj/no-repeated-string-literal": string;
482
+ "@sarj/no-positional-tuple-return": string;
483
+ "@sarj/no-dynamic-sql": string;
484
+ "@sarj/no-zod-native-enum": string;
485
+ "@sarj/prefer-module-level-constant": string;
224
486
  };
225
487
  };
226
488
  strict: {
@@ -255,6 +517,18 @@ declare const plugin: {
255
517
  "@sarj/require-fetch-timeout": string;
256
518
  "@sarj/no-silent-promise-catch": string;
257
519
  "@sarj/require-schema-validate-search": string;
520
+ "@sarj/prefer-constant-time-secret-compare": string;
521
+ "@sarj/store-insert-requires-on-conflict": string;
522
+ "@sarj/no-offset-pagination": string;
523
+ "@sarj/no-select-star": string;
524
+ "@sarj/no-sleep-in-test-body": string;
525
+ "@sarj/no-repeated-string-literal": string;
526
+ "@sarj/no-positional-tuple-return": string;
527
+ "@sarj/no-dynamic-sql": string;
528
+ "@sarj/no-raw-fetch-outside-clients": string;
529
+ "@sarj/no-storage-in-stateless-modules": string;
530
+ "@sarj/no-zod-native-enum": string;
531
+ "@sarj/prefer-module-level-constant": string;
258
532
  };
259
533
  };
260
534
  };