@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/README.md +135 -1
- package/dist/index.cjs +2035 -223
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +284 -10
- package/dist/index.d.ts +284 -10
- package/dist/index.js +2041 -223
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
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"
|
|
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 [
|
|
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"
|
|
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 [
|
|
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
|
};
|