@neralabs/rerail-pack-typescript 0.1.0 → 0.1.1

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.
Files changed (24) hide show
  1. package/README.md +4 -5
  2. package/package.json +1 -1
  3. package/rules/typescript-eslint-ban-tslint-comment.json +14 -2
  4. package/rules/typescript-eslint-consistent-type-definitions.json +1 -1
  5. package/rules/typescript-eslint-default-param-last.json +2 -2
  6. package/rules/typescript-eslint-no-array-constructor.json +37 -3
  7. package/rules/typescript-eslint-no-confusing-non-null-assertion.json +40 -4
  8. package/rules/typescript-eslint-no-dupe-class-members.json +1 -1
  9. package/rules/typescript-eslint-no-duplicate-enum-values.json +11 -1
  10. package/rules/typescript-eslint-no-empty-function.json +1 -1
  11. package/rules/typescript-eslint-no-extra-non-null-assertion.json +19 -2
  12. package/rules/typescript-eslint-no-import-type-side-effects.json +40 -4
  13. package/rules/typescript-eslint-no-namespace.json +27 -3
  14. package/rules/typescript-eslint-no-non-null-asserted-optional-chain.json +37 -3
  15. package/rules/typescript-eslint-no-non-null-assertion.json +21 -1
  16. package/rules/typescript-eslint-no-unnecessary-type-constraint.json +19 -2
  17. package/rules/typescript-eslint-no-unsafe-function-type.json +6 -1
  18. package/rules/typescript-eslint-no-unused-expressions.json +1 -1
  19. package/rules/typescript-eslint-no-useless-empty-export.json +2 -2
  20. package/rules/typescript-eslint-no-wrapper-object-types.json +61 -1
  21. package/rules/typescript-eslint-prefer-as-const.json +21 -1
  22. package/rules/typescript-eslint-prefer-enum-initializers.json +2 -2
  23. package/rules/typescript-eslint-prefer-literal-enum-member.json +1 -1
  24. package/rules/typescript-eslint-prefer-namespace-keyword.json +37 -3
package/README.md CHANGED
@@ -3,9 +3,8 @@
3
3
  22 code rules for TypeScript, ported from typescript-eslint 8.70.1 (on ESLint 10.11.0), each with its default
4
4
  options. 11 start off (`"on": false`): no approved typescript-eslint configuration turns them on, so they are
5
5
  experimental. Each is scored against the tool's own findings on the tool's test fixtures and on a pinned corpus
6
- (vscode), through the engine's production workspace path, with every disagreement declared in `divergences.json`: 4
7
- today, all `rerail-unknown`, each a file the tree-sitter grammars read with a syntax error. ESLint's core rules are in
8
- the [JavaScript pack](../javascript/README.md).
6
+ (vscode), through the engine's production workspace path, with every disagreement declared in `divergences.json`
7
+ (none today). ESLint's core rules are in the [JavaScript pack](../javascript/README.md).
9
8
 
10
9
  It is checked by `npx vitest run test/engine/catalog/packs.test.ts -t "pack typescript"`, against the
11
10
  [pack structure and validation contract](../../docs/pack-format.md).
@@ -16,9 +15,9 @@ It is checked by `npx vitest run test/engine/catalog/packs.test.ts -t "pack type
16
15
  | `rules/` | The code-rule documents (`rerail.policy/v1`) |
17
16
  | `conformance.json` | Each ported rule's upstream tool and rule, how findings compare, and the capabilities it exercises; the pinned tools and the pinned corpus (vscode) |
18
17
  | `divergences.json` | Declared disagreements with the tools |
19
- | `upstream/<tool>/` | The tool's copied tests (`fixtures/`) and its recordings (`fixtures.expected.json`, `corpus-vscode.expected.json`) |
18
+ | `upstream/<tool>/` | The tool's copied tests (`fixtures/`) and its recordings (`fixtures.expected.json`, `corpus-vscode.expected.json`); `upstream/eslint-plugin-vitest/UPSTREAM.md` lists the fixtures Rerail wrote (`fixtures/*/rerail-*`), which the recorder holds and records like the copied ones |
20
19
  | `upstream/generate.mjs` | typescript-eslint's recorder; `upstream/eslint-plugin-vitest/generate.mjs` records @vitest/eslint-plugin |
21
- | `candidates/rules/` | Ports still being evaluated, never shipped: typescript-eslint and @vitest/eslint-plugin 1.6.27 ports that fail a V1 validation gate or rerail's pack contract. Each but `prefer-optional-chain` (it requires type information, which the recordings do not have) and `no-explicit-any` (the fixtures recording does not cover it yet) is listed in `conformance.json`, scored and reported on the fixtures, never gated; the vscode recording covers the shipped rules only |
20
+ | `candidates/rules/` | Ports still being evaluated, never shipped: typescript-eslint and @vitest/eslint-plugin 1.6.27 ports that fail a V1 validation gate or rerail's pack contract. Each but `prefer-optional-chain` (it requires type information, which the recordings do not have) and `no-explicit-any` (the fixtures recording does not cover it yet) is listed in `conformance.json`, scored and reported on the fixtures, never gated; the vscode recording covers the shipped rules only. The three `vitest-*.json` documents are generated: edit `scripts/generate/packs/typescript-vitest-policies.mjs`, not the JSON, and run `node scripts/generate/packs/typescript-vitest-policies.mjs` from the repository root |
22
21
  | `licenses/<tool>/` | The tool's licence and `UPSTREAM.md`, listing every copied file |
23
22
 
24
23
  Re-recording runs offline against the pinned tool versions (the recorder's header lists them):
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neralabs/rerail-pack-typescript",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Rerail rule pack: typescript-eslint rules ported to Rerail code rules.",
5
5
  "license": "Apache-2.0 AND MIT",
6
6
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-ban-tslint-comment",
4
- "revision": 1,
4
+ "revision": 2,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `ban-tslint-comment` (https://typescript-eslint.io/rules/ban-tslint-comment). Flags comments whose value matches TSLint's enable/disable directive regex; the fix deletes the comment.",
7
7
  "scope": {
@@ -26,7 +26,19 @@
26
26
  "anchor": "witness.span",
27
27
  "code": "@typescript-eslint/ban-tslint-comment",
28
28
  "message": "tslint comment detected: \"$TEXT\"",
29
- "fix": ""
29
+ "fix": "",
30
+ "suppress": {
31
+ "eslint": {
32
+ "rules": [
33
+ "@typescript-eslint/ban-tslint-comment"
34
+ ]
35
+ },
36
+ "oxlint": {
37
+ "rules": [
38
+ "ban-tslint-comment"
39
+ ]
40
+ }
41
+ }
30
42
  }
31
43
  }
32
44
  ]
@@ -1 +1 @@
1
- {"format":"rerail.policy/v1","id":"typescript-eslint-consistent-type-definitions","revision":2,"mode":"steer","description":"Port of typescript-eslint's `consistent-type-definitions` rule with its default option `interface` (https://typescript-eslint.io/rules/consistent-type-definitions). Flags type aliases whose type is an object literal type (through any parentheses) and fixes them to interfaces. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"option":{"type":"string","nullable":true,"default":null}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"has":{"kind":"type_parameters","pattern":"$TP","stopBy":"neighbor"}},{"not":{"has":{"kind":"type_parameters","stopBy":"neighbor"}}}]},"r2":{"inside":{"has":{"regex":"^global$","stopBy":"neighbor"},"kind":"ambient_declaration","stopBy":"end"}},"r3":{"has":{"kind":"type_identifier","pattern":"$N","stopBy":"neighbor"}},"r4":{"has":{"kind":"extends_type_clause","stopBy":"neighbor"}},"r5":{"has":{"kind":"interface_body","pattern":"$B","stopBy":"neighbor"}}}}},{"id":"interface-over-type","forbid":{"ast":{"language":"typescript","rule":{"kind":"type_alias_declaration","all":[{"matches":"r3"},{"has":{"matches":"object-type","stopBy":"neighbor"}},{"matches":"r1"}]},"utils":{"object-type":{"any":[{"kind":"object_type","pattern":"$B","not":{"has":{"kind":"index_signature","stopBy":"neighbor","has":{"kind":"mapped_type_clause","stopBy":"neighbor"}}}},{"kind":"parenthesized_type","has":{"matches":"object-type","stopBy":"neighbor"}}]}},"when":{"option":{"option":{"in":[null,"interface"]}}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use an `interface` instead of a `type`.","fix":"interface $N$TP $B"}},{"id":"type-over-interface","forbid":{"ast":{"language":"typescript","rule":{"kind":"interface_declaration","all":[{"matches":"r3"},{"matches":"r5"},{"matches":"r1"},{"not":{"any":[{"matches":"r4"},{"inside":{"kind":"export_statement","stopBy":"neighbor","has":{"regex":"^default$","stopBy":"neighbor"}}},{"matches":"r2"}]}}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`.","fix":"type $N$TP = $B"}},{"id":"type-over-interface-unfixed","forbid":{"ast":{"language":"typescript","rule":{"kind":"interface_declaration","all":[{"matches":"r3"},{"any":[{"matches":"r4"},{"matches":"r2"}]}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`."}},{"id":"type-over-interface-export-default","forbid":{"ast":{"language":"typescript","rule":{"kind":"export_statement","all":[{"has":{"regex":"^default$","stopBy":"neighbor"}},{"has":{"kind":"interface_declaration","stopBy":"neighbor","all":[{"matches":"r3"},{"matches":"r5"},{"matches":"r1"},{"not":{"any":[{"matches":"r4"},{"matches":"r2"}]}}]}}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`.","fix":"type $N$TP = $B\nexport default $N"}}]}
1
+ {"format":"rerail.policy/v1","id":"typescript-eslint-consistent-type-definitions","revision":4,"mode":"steer","description":"Port of typescript-eslint's `consistent-type-definitions` rule with its default option `interface` (https://typescript-eslint.io/rules/consistent-type-definitions). Flags type aliases whose type is an object literal type (through any parentheses) and fixes them to interfaces. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"option":{"type":"string","nullable":true,"default":null}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"has":{"kind":"type_parameters","pattern":"$TP","stopBy":"neighbor"}},{"not":{"has":{"kind":"type_parameters","stopBy":"neighbor"}}}]},"r2":{"inside":{"has":{"regex":"^global$","stopBy":"neighbor"},"kind":"ambient_declaration","stopBy":"end"}},"r3":{"has":{"kind":"type_identifier","pattern":"$N","stopBy":"neighbor"}},"r4":{"has":{"kind":"extends_type_clause","stopBy":"neighbor"}},"r5":{"has":{"kind":"interface_body","pattern":"$B","stopBy":"neighbor"}}}}},{"id":"interface-over-type","forbid":{"ast":{"language":"typescript","rule":{"kind":"type_alias_declaration","all":[{"matches":"r3"},{"has":{"matches":"object-type","stopBy":"neighbor"}},{"matches":"r1"}]},"utils":{"object-type":{"any":[{"kind":"object_type","pattern":"$B","not":{"has":{"kind":"index_signature","stopBy":"neighbor","has":{"kind":"mapped_type_clause","stopBy":"neighbor"}}}},{"kind":"parenthesized_type","has":{"matches":"object-type","stopBy":"neighbor"}}]}},"when":{"option":{"option":{"in":[null,"interface"]}}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use an `interface` instead of a `type`.","fix":"interface $N$TP $B","suppress":{"eslint":{"rules":["@typescript-eslint/consistent-type-definitions"]},"oxlint":{"rules":["consistent-type-definitions"]},"biome":{"rules":["lint/style/useConsistentTypeDefinitions"]}}}},{"id":"type-over-interface","forbid":{"ast":{"language":"typescript","rule":{"kind":"interface_declaration","all":[{"matches":"r3"},{"matches":"r5"},{"matches":"r1"},{"not":{"any":[{"matches":"r4"},{"inside":{"kind":"export_statement","stopBy":"neighbor","has":{"regex":"^default$","stopBy":"neighbor"}}},{"matches":"r2"}]}}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`.","fix":"type $N$TP = $B","suppress":{"eslint":{"rules":["@typescript-eslint/consistent-type-definitions"]},"oxlint":{"rules":["consistent-type-definitions"]},"biome":{"rules":["lint/style/useConsistentTypeDefinitions"]}}}},{"id":"type-over-interface-unfixed","forbid":{"ast":{"language":"typescript","rule":{"kind":"interface_declaration","all":[{"matches":"r3"},{"any":[{"matches":"r4"},{"matches":"r2"}]}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`.","suppress":{"eslint":{"rules":["@typescript-eslint/consistent-type-definitions"]},"oxlint":{"rules":["consistent-type-definitions"]},"biome":{"rules":["lint/style/useConsistentTypeDefinitions"]}}}},{"id":"type-over-interface-export-default","forbid":{"ast":{"language":"typescript","rule":{"kind":"export_statement","all":[{"has":{"regex":"^default$","stopBy":"neighbor"}},{"has":{"kind":"interface_declaration","stopBy":"neighbor","all":[{"matches":"r3"},{"matches":"r5"},{"matches":"r1"},{"not":{"any":[{"matches":"r4"},{"matches":"r2"}]}}]}}]},"when":{"option":{"option":"type"}}}},"violation":{"anchor":"capture.N","code":"@typescript-eslint/consistent-type-definitions","message":"Use a `type` instead of an `interface`.","fix":"type $N$TP = $B\nexport default $N","suppress":{"eslint":{"rules":["@typescript-eslint/consistent-type-definitions"]},"oxlint":{"rules":["consistent-type-definitions"]},"biome":{"rules":["lint/style/useConsistentTypeDefinitions"]}}}}]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-default-param-last",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `default-param-last` rule (https://typescript-eslint.io/rules/default-param-last), identical to the ESLint base port. Reports a defaulted or optional parameter of a function with a body that is followed by a required, non-rest parameter.",
7
7
  "scope": { "include": ["**/*"], "exclude": [] },
@@ -49,7 +49,7 @@
49
49
  }
50
50
  }
51
51
  },
52
- "violation": { "anchor": "witness.span", "code": "@typescript-eslint/default-param-last", "message": "Default parameters should be last." }
52
+ "violation": { "anchor": "witness.span", "code": "@typescript-eslint/default-param-last", "message": "Default parameters should be last.", "suppress": { "eslint": { "rules": ["@typescript-eslint/default-param-last"] }, "oxlint": { "rules": ["default-param-last"] }, "biome": { "rules": ["lint/style/useDefaultParameterLast"] } } }
53
53
  }
54
54
  ]
55
55
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-array-constructor",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-array-constructor` rule (https://typescript-eslint.io/rules/no-array-constructor). Flags `Array(...)` / `new Array(...)` unless called with exactly one argument or type arguments (no scope check: typescript-eslint's version does not resolve `Array`), and fixes to an array literal. Comments inside the argument list are not carried by the `$$$A` capture, so those calls get no fix.",
7
7
  "scope": {
@@ -131,7 +131,24 @@
131
131
  "anchor": "witness.span",
132
132
  "code": "@typescript-eslint/no-array-constructor",
133
133
  "message": "The array literal notation [] is preferable.",
134
- "fix": "[$$$A]"
134
+ "fix": "[$$$A]",
135
+ "suppress": {
136
+ "eslint": {
137
+ "rules": [
138
+ "@typescript-eslint/no-array-constructor"
139
+ ]
140
+ },
141
+ "oxlint": {
142
+ "rules": [
143
+ "no-array-constructor"
144
+ ]
145
+ },
146
+ "biome": {
147
+ "rules": [
148
+ "lint/style/useArrayLiterals"
149
+ ]
150
+ }
151
+ }
135
152
  }
136
153
  },
137
154
  {
@@ -231,7 +248,24 @@
231
248
  "violation": {
232
249
  "anchor": "witness.span",
233
250
  "code": "@typescript-eslint/no-array-constructor",
234
- "message": "The array literal notation [] is preferable."
251
+ "message": "The array literal notation [] is preferable.",
252
+ "suppress": {
253
+ "eslint": {
254
+ "rules": [
255
+ "@typescript-eslint/no-array-constructor"
256
+ ]
257
+ },
258
+ "oxlint": {
259
+ "rules": [
260
+ "no-array-constructor"
261
+ ]
262
+ },
263
+ "biome": {
264
+ "rules": [
265
+ "lint/style/useArrayLiterals"
266
+ ]
267
+ }
268
+ }
235
269
  }
236
270
  }
237
271
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-confusing-non-null-assertion",
4
- "revision": 1,
4
+ "revision": 2,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-confusing-non-null-assertion` rule (https://typescript-eslint.io/rules/no-confusing-non-null-assertion). Flags `=`, `==`, `===`, `in` and `instanceof` expressions whose left operand ends in a non-null assertion `!` (outside parentheses).",
7
7
  "scope": {
@@ -66,7 +66,19 @@
66
66
  "violation": {
67
67
  "anchor": "witness.span",
68
68
  "code": "@typescript-eslint/no-confusing-non-null-assertion",
69
- "message": "Confusing combination of non-null assertion and assignment like `a! = b`, which looks very similar to `a != b`."
69
+ "message": "Confusing combination of non-null assertion and assignment like `a! = b`, which looks very similar to `a != b`.",
70
+ "suppress": {
71
+ "eslint": {
72
+ "rules": [
73
+ "@typescript-eslint/no-confusing-non-null-assertion"
74
+ ]
75
+ },
76
+ "oxlint": {
77
+ "rules": [
78
+ "no-confusing-non-null-assertion"
79
+ ]
80
+ }
81
+ }
70
82
  }
71
83
  },
72
84
  {
@@ -124,7 +136,19 @@
124
136
  "violation": {
125
137
  "anchor": "witness.span",
126
138
  "code": "@typescript-eslint/no-confusing-non-null-assertion",
127
- "message": "Confusing combination of non-null assertion and equality test like `a! == b`, which looks very similar to `a !== b`."
139
+ "message": "Confusing combination of non-null assertion and equality test like `a! == b`, which looks very similar to `a !== b`.",
140
+ "suppress": {
141
+ "eslint": {
142
+ "rules": [
143
+ "@typescript-eslint/no-confusing-non-null-assertion"
144
+ ]
145
+ },
146
+ "oxlint": {
147
+ "rules": [
148
+ "no-confusing-non-null-assertion"
149
+ ]
150
+ }
151
+ }
128
152
  }
129
153
  },
130
154
  {
@@ -183,7 +207,19 @@
183
207
  "violation": {
184
208
  "anchor": "witness.span",
185
209
  "code": "@typescript-eslint/no-confusing-non-null-assertion",
186
- "message": "Confusing combination of non-null assertion and `$OP` operator like `a! $OP b`, which might be misinterpreted as `!(a $OP b)`."
210
+ "message": "Confusing combination of non-null assertion and `$OP` operator like `a! $OP b`, which might be misinterpreted as `!(a $OP b)`.",
211
+ "suppress": {
212
+ "eslint": {
213
+ "rules": [
214
+ "@typescript-eslint/no-confusing-non-null-assertion"
215
+ ]
216
+ },
217
+ "oxlint": {
218
+ "rules": [
219
+ "no-confusing-non-null-assertion"
220
+ ]
221
+ }
222
+ }
187
223
  }
188
224
  }
189
225
  ]
@@ -1 +1 @@
1
- {"format":"rerail.policy/v1","id":"typescript-eslint-no-dupe-class-members","revision":4,"mode":"steer","description":"Port of typescript-eslint's `no-dupe-class-members` rule (https://typescript-eslint.io/rules/no-dupe-class-members). ESLint's base rule over non-computed members only, ignoring overload signatures: flags a class member whose static name (`compare` text `key`) repeats an earlier member of the same class and staticness; a getter may pair with a setter.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"duplicate-member","forbid":{"ast":{"language":"typescript","rule":{"all":[{"matches":"member"},{"pattern":"$P"},{"any":[{"has":{"stopBy":"neighbor","matches":"key","not":{"kind":"computed_property_name"},"pattern":"$K"}},{"has":{"stopBy":"neighbor","matches":"key","kind":"computed_property_name","has":{"stopBy":"neighbor","not":{"regex":"^[\\[\\]]$"},"pattern":"$K"}}}]},{"any":[{"all":[{"matches":"static"},{"matches":"get"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"},{"not":{"matches":"set"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"matches":"static"},{"matches":"set"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"},{"not":{"matches":"get"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"matches":"static"},{"all":[{"not":{"matches":"get"}},{"not":{"matches":"set"}}]},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"matches":"get"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}},{"not":{"matches":"set"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"matches":"set"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}},{"not":{"matches":"get"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"all":[{"not":{"matches":"get"}},{"not":{"matches":"set"}}]},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]}]}]},"utils":{"member":{"all":[{"any":[{"kind":"method_definition"},{"kind":"public_field_definition"}]},{"inside":{"kind":"class_body","stopBy":"neighbor"}},{"not":{"matches":"ctor"}},{"not":{"has":{"stopBy":"neighbor","regex":"^abstract$","not":{"kind":"property_identifier"}}}},{"not":{"has":{"stopBy":"neighbor","regex":"^accessor$","not":{"kind":"property_identifier"}}}},{"not":{"has":{"stopBy":"neighbor","kind":"computed_property_name"}}}]},"key":{"any":[{"kind":"property_identifier"},{"kind":"string"},{"kind":"number"},{"kind":"computed_property_name"},{"kind":"private_property_identifier"}],"not":{"follows":{"stopBy":"end","regex":"^[=(]$"}}},"static":{"has":{"stopBy":"neighbor","regex":"^static$","not":{"kind":"property_identifier"}}},"get":{"kind":"method_definition","has":{"stopBy":"neighbor","regex":"^get$","not":{"kind":"property_identifier"}}},"set":{"kind":"method_definition","has":{"stopBy":"neighbor","regex":"^set$","not":{"kind":"property_identifier"}}},"ctor":{"kind":"method_definition","not":{"has":{"stopBy":"neighbor","regex":"^static$","not":{"kind":"property_identifier"}}},"has":{"stopBy":"neighbor","matches":"key","any":[{"kind":"property_identifier","regex":"^constructor$"},{"kind":"string","value":{"eq":"constructor"}}]}}},"transform":{"KT":{"substring":{"source":"$K","value":true}}}}},"violation":{"anchor":"capture.K","code":"@typescript-eslint/no-dupe-class-members","message":"Duplicate name '$KT'."}}]}
1
+ {"format":"rerail.policy/v1","id":"typescript-eslint-no-dupe-class-members","revision":6,"mode":"steer","description":"Port of typescript-eslint's `no-dupe-class-members` rule (https://typescript-eslint.io/rules/no-dupe-class-members). ESLint's base rule over non-computed members only, ignoring overload signatures: flags a class member whose static name (`compare` text `key`) repeats an earlier member of the same class and staticness; a getter may pair with a setter.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"duplicate-member","forbid":{"ast":{"language":"typescript","rule":{"all":[{"matches":"member"},{"pattern":"$P"},{"any":[{"has":{"stopBy":"neighbor","matches":"key","not":{"kind":"computed_property_name"},"pattern":"$K"}},{"has":{"stopBy":"neighbor","matches":"key","kind":"computed_property_name","has":{"stopBy":"neighbor","not":{"regex":"^[\\[\\]]$"},"pattern":"$K"}}}]},{"any":[{"all":[{"matches":"static"},{"matches":"get"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"},{"not":{"matches":"set"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"matches":"static"},{"matches":"set"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"},{"not":{"matches":"get"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"matches":"static"},{"all":[{"not":{"matches":"get"}},{"not":{"matches":"set"}}]},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"matches":"static"}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"matches":"get"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}},{"not":{"matches":"set"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"matches":"set"},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}},{"not":{"matches":"get"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]},{"all":[{"not":{"matches":"static"}},{"all":[{"not":{"matches":"get"}},{"not":{"matches":"set"}}]},{"count":{"follows":{"stopBy":"end","all":[{"matches":"member"},{"not":{"matches":"static"}}],"pattern":"$Q","compare":{"left":"Q","op":"eq","right":"P","text":"key"}},"min":1}}]}]}]},"utils":{"member":{"all":[{"any":[{"kind":"method_definition"},{"kind":"public_field_definition"}]},{"inside":{"kind":"class_body","stopBy":"neighbor"}},{"not":{"matches":"ctor"}},{"not":{"has":{"stopBy":"neighbor","regex":"^abstract$","not":{"kind":"property_identifier"}}}},{"not":{"has":{"stopBy":"neighbor","regex":"^accessor$","not":{"kind":"property_identifier"}}}},{"not":{"has":{"stopBy":"neighbor","kind":"computed_property_name"}}}]},"key":{"any":[{"kind":"property_identifier"},{"kind":"string"},{"kind":"number"},{"kind":"computed_property_name"},{"kind":"private_property_identifier"}],"not":{"follows":{"stopBy":"end","regex":"^[=(]$"}}},"static":{"has":{"stopBy":"neighbor","regex":"^static$","not":{"kind":"property_identifier"}}},"get":{"kind":"method_definition","has":{"stopBy":"neighbor","regex":"^get$","not":{"kind":"property_identifier"}}},"set":{"kind":"method_definition","has":{"stopBy":"neighbor","regex":"^set$","not":{"kind":"property_identifier"}}},"ctor":{"kind":"method_definition","not":{"has":{"stopBy":"neighbor","regex":"^static$","not":{"kind":"property_identifier"}}},"has":{"stopBy":"neighbor","matches":"key","any":[{"kind":"property_identifier","regex":"^constructor$"},{"kind":"string","value":{"eq":"constructor"}}]}}},"transform":{"KT":{"substring":{"source":"$K","value":true}}}}},"violation":{"anchor":"capture.K","code":"@typescript-eslint/no-dupe-class-members","message":"Duplicate name '$KT'.","suppress":{"eslint":{"rules":["@typescript-eslint/no-dupe-class-members"]},"oxlint":{"rules":["no-dupe-class-members"]},"biome":{"rules":["lint/suspicious/noDuplicateClassMembers"]}}}}]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-duplicate-enum-values",
4
- "revision": 3,
4
+ "revision": 5,
5
5
  "mode": "steer",
6
6
  "description": "typescript-eslint 8.70.1 @typescript-eslint/no-duplicate-enum-values, default options. Port of typescript-eslint's `no-duplicate-enum-values` rule (https://typescript-eslint.io/rules/no-duplicate-enum-values). Flags an enum member whose initializer (a string, number or static template literal under any chain of unary + and -) has the same value, by Object.is, as an earlier member's; NaN values and other initializers are ignored.",
7
7
  "scope": {
@@ -170,6 +170,16 @@
170
170
  "rules": [
171
171
  "@typescript-eslint/no-duplicate-enum-values"
172
172
  ]
173
+ },
174
+ "oxlint": {
175
+ "rules": [
176
+ "no-duplicate-enum-values"
177
+ ]
178
+ },
179
+ "biome": {
180
+ "rules": [
181
+ "lint/suspicious/noDuplicateEnumValues"
182
+ ]
173
183
  }
174
184
  }
175
185
  }
@@ -1 +1 @@
1
- {"format":"rerail.policy/v1","id":"typescript-eslint-no-empty-function","revision":4,"mode":"steer","description":"Port of typescript-eslint's `no-empty-function` rule (https://typescript-eslint.io/rules/no-empty-function). Reports a function, method or arrow body `{}` that holds no statement and no comment; constructors with parameter properties are exempt. Default options (allow: []). Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allow":{"type":"array","items":"string","default":[]}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"kind":"identifier"},{"kind":"property_identifier"}]},"r2":{"any":[{"kind":"property_identifier","pattern":"$NAME"},{"kind":"number","pattern":"$NAME"},{"kind":"string","pattern":"$NAME"},{"has":{"any":[{"kind":"string"},{"kind":"number"},{"kind":"template_string","not":{"has":{"kind":"template_substitution"}}}],"pattern":"$NAME"},"kind":"computed_property_name"}]},"r3":{"all":[{"kind":"method_definition"},{"not":{"has":{"not":{"matches":"r1"},"regex":"^static$"}}},{"has":{"any":[{"kind":"property_identifier","regex":"^constructor$"},{"has":{"kind":"string_fragment","regex":"^constructor$"},"kind":"string"}],"field":"name"}},{"inside":{"kind":"class_body"}}]},"r4":{"any":[{"kind":"function_expression"},{"kind":"function_declaration"}]},"r5":{"has":{"not":{"matches":"r1"},"regex":"^async$"}},"r6":{"any":[{"matches":"r13"},{"regex":"^"}]},"r7":{"not":{"inside":{"any":[{"kind":"pair"},{"kind":"public_field_definition"}],"field":"value","stopBy":{"not":{"kind":"parenthesized_expression"}}}}},"r8":{"has":{"field":"name","kind":"identifier","pattern":"$FID"}},"r9":{"kind":"private_property_identifier","pattern":"$PN"},"r10":{"any":[{"kind":"generator_function"},{"kind":"generator_function_declaration"}]},"r11":{"has":{"not":{"matches":"r1"},"pattern":"$$ST","regex":"^static$"}},"r12":{"follows":{"kind":"decorator","stopBy":{"not":{"kind":"comment"}}}},"r13":{"has":{"not":{"matches":"r1"},"pattern":"$$AS","regex":"^async$"}},"r14":{"any":[{"has":{"pattern":"$$GN","regex":"^\\*$"}},{"regex":"^"}]},"r15":{"all":[{"matches":"r4"},{"not":{"matches":"r5"}}]},"r16":{"has":{"not":{"matches":"r1"},"regex":"^get$"}},"r17":{"has":{"not":{"matches":"r1"},"regex":"^set$"}}}}},{"id":"method","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"kind":"method_definition"},{"not":{"matches":"r3"}},{"any":[{"matches":"r16"},{"matches":"r17"},{"has":{"regex":"^\\*$"}},{"all":[{"matches":"r5"},{"not":{"has":{"regex":"^\\*$"}}}]},{"$option":"allow","cases":{"[\"methods\"]":[]},"default":[{"all":[{"not":{"matches":"r16"}},{"not":{"matches":"r17"}},{"not":{"has":{"regex":"^\\*$"}}},{"not":{"matches":"r5"}}]}],"spread":true}]},{"any":[{"matches":"r11"},{"kind":"method_definition"}]},{"any":[{"matches":"r13"},{"kind":"method_definition"}]},{"any":[{"has":{"regex":"^\\*$","pattern":"$$GN"}},{"kind":"method_definition"}]},{"any":[{"has":{"regex":"^[gs]et$","not":{"matches":"r1"},"pattern":"$$KW"}},{"has":{"field":"parameters","pattern":"$$KW"}}]},{"any":[{"has":{"field":"name","matches":"r9"}},{"has":{"field":"name","matches":"r2"}},{"regex":"^"}]},{"$option":"allow","cases":{"[\"decoratedFunctions\"]":[{"not":{"$option":"allow","cases":{"[\"overrideMethods\"]":{"has":{"kind":"override_modifier"}}},"default":{"matches":"r12"}}}],"[\"overrideMethods\"]":[{"not":{"$option":"allow","cases":{"[\"overrideMethods\"]":{"has":{"kind":"override_modifier"}}},"default":{"matches":"r12"}}}]},"default":[],"spread":true}]}},"transform":{"STW":{"replace":{"source":"$ST","replace":"^.+$","by":"static "}},"PW":{"replace":{"source":"$PN","replace":"^.+$","by":"private "}},"PNQ":{"replace":{"source":"$PN","replace":"^(.+)$","by":" ${1}"}},"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"NQ":{"replace":{"source":"$NAME","value":true,"replace":"(?s)^(.*)$","by":" '${1}'"}},"KWW":{"replace":{"source":"$KW","replace":"(?s)^\\(.*$","by":"method"}},"KWX":{"replace":{"source":"$KWW","replace":"^([gs])et$","by":"${1}etter"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $STW$PW$ASW$GNW$KWX$NQ$PNQ."}},{"id":"constructor","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"matches":"r3"},{"not":{"has":{"field":"parameters","has":{"any":[{"kind":"required_parameter"},{"kind":"optional_parameter"}],"has":{"any":[{"kind":"accessibility_modifier"},{"kind":"override_modifier"},{"regex":"^readonly$","not":{"matches":"r1"}}]}}}}},{"$option":"allow","cases":{"[\"private-constructors\"]":[{"not":{"has":{"kind":"accessibility_modifier","regex":{"$option":"allow","cases":{"[\"protected-constructors\"]":"^protected$"},"default":"^private$"}}}}],"[\"protected-constructors\"]":[{"not":{"has":{"kind":"accessibility_modifier","regex":{"$option":"allow","cases":{"[\"protected-constructors\"]":"^protected$"},"default":"^private$"}}}}]},"default":[],"spread":true}]}},"when":{"option":{"allow":{"in":[[],["methods"],["private-constructors"],["protected-constructors"],["decoratedFunctions"],["overrideMethods"]]}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty constructor."}},{"id":"member-function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"any":[{"matches":"r15"},{"all":[{"matches":"r4"},{"matches":"r5"}]},{"matches":"r10"},{"kind":"arrow_function"}]},{"matches":"r6"},{"matches":"r14"},{"inside":{"field":"value","stopBy":{"not":{"kind":"parenthesized_expression"}},"any":[{"kind":"pair"},{"kind":"public_field_definition"}],"all":[{"any":[{"matches":"r11"},{"regex":"^"}]},{"any":[{"all":[{"kind":"pair"},{"any":[{"has":{"field":"key","matches":"r9"}},{"has":{"field":"key","matches":"r2"}},{"has":{"field":"value","matches":"r8"}},{"regex":"^"}]}]},{"all":[{"kind":"public_field_definition"},{"any":[{"has":{"field":"name","matches":"r9"}},{"has":{"field":"name","matches":"r2"}},{"has":{"field":"value","matches":"r8"}},{"regex":"^"}]}]}]}]}}]}},"transform":{"STW":{"replace":{"source":"$ST","replace":"^.+$","by":"static "}},"PW":{"replace":{"source":"$PN","replace":"^.+$","by":"private "}},"PNQ":{"replace":{"source":"$PN","replace":"^(.+)$","by":" ${1}"}},"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"NQ":{"replace":{"source":"$NAME","value":true,"replace":"(?s)^(.*)$","by":" '${1}'"}},"FQ":{"replace":{"source":"$FID","replace":"^(.+)$","by":" '${1}'"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $STW$PW$ASW$GNWmethod$NQ$PNQ$FQ."}},{"id":"function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"any":[{"matches":"r15"},{"all":[{"matches":"r4"},{"matches":"r5"}]},{"matches":"r10"}]},{"matches":"r7"},{"matches":"r6"},{"matches":"r14"},{"any":[{"matches":"r8"},{"regex":"^"}]}]}},"transform":{"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"FQ":{"replace":{"source":"$FID","replace":"^(.+)$","by":" '${1}'"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $ASW$GNWfunction$FQ."}},{"id":"arrow-function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"kind":"arrow_function"},{"matches":"r7"},{"matches":"r6"}]}},"transform":{"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $ASWarrow function."}}]}
1
+ {"format":"rerail.policy/v1","id":"typescript-eslint-no-empty-function","revision":6,"mode":"steer","description":"Port of typescript-eslint's `no-empty-function` rule (https://typescript-eslint.io/rules/no-empty-function). Reports a function, method or arrow body `{}` that holds no statement and no comment; constructors with parameter properties are exempt. Default options (allow: []). Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allow":{"type":"array","items":"string","default":[]}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"kind":"identifier"},{"kind":"property_identifier"}]},"r2":{"any":[{"kind":"property_identifier","pattern":"$NAME"},{"kind":"number","pattern":"$NAME"},{"kind":"string","pattern":"$NAME"},{"has":{"any":[{"kind":"string"},{"kind":"number"},{"kind":"template_string","not":{"has":{"kind":"template_substitution"}}}],"pattern":"$NAME"},"kind":"computed_property_name"}]},"r3":{"all":[{"kind":"method_definition"},{"not":{"has":{"not":{"matches":"r1"},"regex":"^static$"}}},{"has":{"any":[{"kind":"property_identifier","regex":"^constructor$"},{"has":{"kind":"string_fragment","regex":"^constructor$"},"kind":"string"}],"field":"name"}},{"inside":{"kind":"class_body"}}]},"r4":{"any":[{"kind":"function_expression"},{"kind":"function_declaration"}]},"r5":{"has":{"not":{"matches":"r1"},"regex":"^async$"}},"r6":{"any":[{"matches":"r13"},{"regex":"^"}]},"r7":{"not":{"inside":{"any":[{"kind":"pair"},{"kind":"public_field_definition"}],"field":"value","stopBy":{"not":{"kind":"parenthesized_expression"}}}}},"r8":{"has":{"field":"name","kind":"identifier","pattern":"$FID"}},"r9":{"kind":"private_property_identifier","pattern":"$PN"},"r10":{"any":[{"kind":"generator_function"},{"kind":"generator_function_declaration"}]},"r11":{"has":{"not":{"matches":"r1"},"pattern":"$$ST","regex":"^static$"}},"r12":{"follows":{"kind":"decorator","stopBy":{"not":{"kind":"comment"}}}},"r13":{"has":{"not":{"matches":"r1"},"pattern":"$$AS","regex":"^async$"}},"r14":{"any":[{"has":{"pattern":"$$GN","regex":"^\\*$"}},{"regex":"^"}]},"r15":{"all":[{"matches":"r4"},{"not":{"matches":"r5"}}]},"r16":{"has":{"not":{"matches":"r1"},"regex":"^get$"}},"r17":{"has":{"not":{"matches":"r1"},"regex":"^set$"}}}}},{"id":"method","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"kind":"method_definition"},{"not":{"matches":"r3"}},{"any":[{"matches":"r16"},{"matches":"r17"},{"has":{"regex":"^\\*$"}},{"all":[{"matches":"r5"},{"not":{"has":{"regex":"^\\*$"}}}]},{"$option":"allow","cases":{"[\"methods\"]":[]},"default":[{"all":[{"not":{"matches":"r16"}},{"not":{"matches":"r17"}},{"not":{"has":{"regex":"^\\*$"}}},{"not":{"matches":"r5"}}]}],"spread":true}]},{"any":[{"matches":"r11"},{"kind":"method_definition"}]},{"any":[{"matches":"r13"},{"kind":"method_definition"}]},{"any":[{"has":{"regex":"^\\*$","pattern":"$$GN"}},{"kind":"method_definition"}]},{"any":[{"has":{"regex":"^[gs]et$","not":{"matches":"r1"},"pattern":"$$KW"}},{"has":{"field":"parameters","pattern":"$$KW"}}]},{"any":[{"has":{"field":"name","matches":"r9"}},{"has":{"field":"name","matches":"r2"}},{"regex":"^"}]},{"$option":"allow","cases":{"[\"decoratedFunctions\"]":[{"not":{"$option":"allow","cases":{"[\"overrideMethods\"]":{"has":{"kind":"override_modifier"}}},"default":{"matches":"r12"}}}],"[\"overrideMethods\"]":[{"not":{"$option":"allow","cases":{"[\"overrideMethods\"]":{"has":{"kind":"override_modifier"}}},"default":{"matches":"r12"}}}]},"default":[],"spread":true}]}},"transform":{"STW":{"replace":{"source":"$ST","replace":"^.+$","by":"static "}},"PW":{"replace":{"source":"$PN","replace":"^.+$","by":"private "}},"PNQ":{"replace":{"source":"$PN","replace":"^(.+)$","by":" ${1}"}},"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"NQ":{"replace":{"source":"$NAME","value":true,"replace":"(?s)^(.*)$","by":" '${1}'"}},"KWW":{"replace":{"source":"$KW","replace":"(?s)^\\(.*$","by":"method"}},"KWX":{"replace":{"source":"$KWW","replace":"^([gs])et$","by":"${1}etter"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $STW$PW$ASW$GNW$KWX$NQ$PNQ.","suppress":{"eslint":{"rules":["@typescript-eslint/no-empty-function"]},"oxlint":{"rules":["no-empty-function"]},"biome":{"rules":["lint/suspicious/noEmptyBlockStatements"]}}}},{"id":"constructor","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"matches":"r3"},{"not":{"has":{"field":"parameters","has":{"any":[{"kind":"required_parameter"},{"kind":"optional_parameter"}],"has":{"any":[{"kind":"accessibility_modifier"},{"kind":"override_modifier"},{"regex":"^readonly$","not":{"matches":"r1"}}]}}}}},{"$option":"allow","cases":{"[\"private-constructors\"]":[{"not":{"has":{"kind":"accessibility_modifier","regex":{"$option":"allow","cases":{"[\"protected-constructors\"]":"^protected$"},"default":"^private$"}}}}],"[\"protected-constructors\"]":[{"not":{"has":{"kind":"accessibility_modifier","regex":{"$option":"allow","cases":{"[\"protected-constructors\"]":"^protected$"},"default":"^private$"}}}}]},"default":[],"spread":true}]}},"when":{"option":{"allow":{"in":[[],["methods"],["private-constructors"],["protected-constructors"],["decoratedFunctions"],["overrideMethods"]]}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty constructor.","suppress":{"eslint":{"rules":["@typescript-eslint/no-empty-function"]},"oxlint":{"rules":["no-empty-function"]},"biome":{"rules":["lint/suspicious/noEmptyBlockStatements"]}}}},{"id":"member-function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"any":[{"matches":"r15"},{"all":[{"matches":"r4"},{"matches":"r5"}]},{"matches":"r10"},{"kind":"arrow_function"}]},{"matches":"r6"},{"matches":"r14"},{"inside":{"field":"value","stopBy":{"not":{"kind":"parenthesized_expression"}},"any":[{"kind":"pair"},{"kind":"public_field_definition"}],"all":[{"any":[{"matches":"r11"},{"regex":"^"}]},{"any":[{"all":[{"kind":"pair"},{"any":[{"has":{"field":"key","matches":"r9"}},{"has":{"field":"key","matches":"r2"}},{"has":{"field":"value","matches":"r8"}},{"regex":"^"}]}]},{"all":[{"kind":"public_field_definition"},{"any":[{"has":{"field":"name","matches":"r9"}},{"has":{"field":"name","matches":"r2"}},{"has":{"field":"value","matches":"r8"}},{"regex":"^"}]}]}]}]}}]}},"transform":{"STW":{"replace":{"source":"$ST","replace":"^.+$","by":"static "}},"PW":{"replace":{"source":"$PN","replace":"^.+$","by":"private "}},"PNQ":{"replace":{"source":"$PN","replace":"^(.+)$","by":" ${1}"}},"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"NQ":{"replace":{"source":"$NAME","value":true,"replace":"(?s)^(.*)$","by":" '${1}'"}},"FQ":{"replace":{"source":"$FID","replace":"^(.+)$","by":" '${1}'"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $STW$PW$ASW$GNWmethod$NQ$PNQ$FQ.","suppress":{"eslint":{"rules":["@typescript-eslint/no-empty-function"]},"oxlint":{"rules":["no-empty-function"]},"biome":{"rules":["lint/suspicious/noEmptyBlockStatements"]}}}},{"id":"function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"any":[{"matches":"r15"},{"all":[{"matches":"r4"},{"matches":"r5"}]},{"matches":"r10"}]},{"matches":"r7"},{"matches":"r6"},{"matches":"r14"},{"any":[{"matches":"r8"},{"regex":"^"}]}]}},"transform":{"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}},"GNW":{"replace":{"source":"$GN","replace":"^.+$","by":"generator "}},"FQ":{"replace":{"source":"$FID","replace":"^(.+)$","by":" '${1}'"}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $ASW$GNWfunction$FQ.","suppress":{"eslint":{"rules":["@typescript-eslint/no-empty-function"]},"oxlint":{"rules":["no-empty-function"]},"biome":{"rules":["lint/suspicious/noEmptyBlockStatements"]}}}},{"id":"arrow-function","forbid":{"ast":{"language":"typescript","rule":{"kind":"statement_block","regex":"^\\{\\s*\\}","inside":{"field":"body","all":[{"kind":"arrow_function"},{"matches":"r7"},{"matches":"r6"}]}},"transform":{"ASW":{"replace":{"source":"$AS","replace":"^.+$","by":"async "}}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-empty-function","message":"Unexpected empty $ASWarrow function.","suppress":{"eslint":{"rules":["@typescript-eslint/no-empty-function"]},"oxlint":{"rules":["no-empty-function"]},"biome":{"rules":["lint/suspicious/noEmptyBlockStatements"]}}}}]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-extra-non-null-assertion",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-extra-non-null-assertion` rule (https://typescript-eslint.io/rules/no-extra-non-null-assertion). Flags a non-null assertion that is itself asserted non-null again, or that is the object/callee of an optional chain (parentheses are transparent, as in ESTree).",
7
7
  "scope": {
@@ -77,7 +77,24 @@
77
77
  "anchor": "witness.span",
78
78
  "code": "@typescript-eslint/no-extra-non-null-assertion",
79
79
  "message": "Forbidden extra non-null assertion.",
80
- "fix": "$E"
80
+ "fix": "$E",
81
+ "suppress": {
82
+ "eslint": {
83
+ "rules": [
84
+ "@typescript-eslint/no-extra-non-null-assertion"
85
+ ]
86
+ },
87
+ "oxlint": {
88
+ "rules": [
89
+ "no-extra-non-null-assertion"
90
+ ]
91
+ },
92
+ "biome": {
93
+ "rules": [
94
+ "lint/suspicious/noExtraNonNullAssertion"
95
+ ]
96
+ }
97
+ }
81
98
  }
82
99
  }
83
100
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-import-type-side-effects",
4
- "revision": 1,
4
+ "revision": 2,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-import-type-side-effects` rule (https://typescript-eslint.io/rules/no-import-type-side-effects). Flags an import whose specifiers are all inline `type` specifiers.",
7
7
  "scope": {
@@ -103,7 +103,19 @@
103
103
  "violation": {
104
104
  "anchor": "witness.span",
105
105
  "code": "@typescript-eslint/no-import-type-side-effects",
106
- "message": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import."
106
+ "message": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import.",
107
+ "suppress": {
108
+ "eslint": {
109
+ "rules": [
110
+ "@typescript-eslint/no-import-type-side-effects"
111
+ ]
112
+ },
113
+ "oxlint": {
114
+ "rules": [
115
+ "no-import-type-side-effects"
116
+ ]
117
+ }
118
+ }
107
119
  }
108
120
  },
109
121
  {
@@ -219,7 +231,19 @@
219
231
  "anchor": "witness.span",
220
232
  "code": "@typescript-eslint/no-import-type-side-effects",
221
233
  "message": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import.",
222
- "fix": "import type { $A } from $S;"
234
+ "fix": "import type { $A } from $S;",
235
+ "suppress": {
236
+ "eslint": {
237
+ "rules": [
238
+ "@typescript-eslint/no-import-type-side-effects"
239
+ ]
240
+ },
241
+ "oxlint": {
242
+ "rules": [
243
+ "no-import-type-side-effects"
244
+ ]
245
+ }
246
+ }
223
247
  }
224
248
  },
225
249
  {
@@ -329,7 +353,19 @@
329
353
  "anchor": "witness.span",
330
354
  "code": "@typescript-eslint/no-import-type-side-effects",
331
355
  "message": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import.",
332
- "fix": "import type { $A as $B } from $S;"
356
+ "fix": "import type { $A as $B } from $S;",
357
+ "suppress": {
358
+ "eslint": {
359
+ "rules": [
360
+ "@typescript-eslint/no-import-type-side-effects"
361
+ ]
362
+ },
363
+ "oxlint": {
364
+ "rules": [
365
+ "no-import-type-side-effects"
366
+ ]
367
+ }
368
+ }
333
369
  }
334
370
  }
335
371
  ]
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-namespace",
4
- "revision": 3,
4
+ "revision": 6,
5
5
  "mode": "steer",
6
- "description": "typescript-eslint 8.70.1 @typescript-eslint/no-namespace, default options. allowDefinitionFiles is fixed at its default (true): a file whose name typescript-eslint's isDefinitionFile matches (`\\.d\\.(ts|cts|mts|.*\\.ts)$`) is not checked. Port of typescript-eslint's `no-namespace` rule (https://typescript-eslint.io/rules/no-namespace). Flags `namespace X {}` and `module X {}` (not `declare global` or `declare module 'name'`) with its defaults: declared namespaces are flagged, and definition files (*.d.ts, *.d.cts, *.d.mts, *.d.*.ts) are exempt through the document scope. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.",
6
+ "description": "typescript-eslint 8.70.1 @typescript-eslint/no-namespace, default options. allowDefinitionFiles is fixed at its default (true): a file whose name typescript-eslint's isDefinitionFile matches (`\\.d\\.(ts|cts|mts|.*\\.ts)$`) is not checked. Port of typescript-eslint's `no-namespace` rule (https://typescript-eslint.io/rules/no-namespace). Flags `namespace X {}` and `module X {}` (not `declare global`, `global {}` inside `declare module 'name'`, or `declare module 'name'`) with its defaults: declared namespaces are flagged, and definition files (*.d.ts, *.d.cts, *.d.mts, *.d.*.ts) are exempt through the document scope. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.",
7
7
  "scope": {
8
8
  "include": [
9
9
  "**/*.ts",
@@ -38,7 +38,11 @@
38
38
  "r1": {
39
39
  "any": [
40
40
  {
41
- "kind": "internal_module"
41
+ "kind": "internal_module",
42
+ "has": {
43
+ "regex": "^namespace$",
44
+ "stopBy": "neighbor"
45
+ }
42
46
  },
43
47
  {
44
48
  "kind": "module",
@@ -107,6 +111,16 @@
107
111
  "rules": [
108
112
  "@typescript-eslint/no-namespace"
109
113
  ]
114
+ },
115
+ "oxlint": {
116
+ "rules": [
117
+ "no-namespace"
118
+ ]
119
+ },
120
+ "biome": {
121
+ "rules": [
122
+ "lint/style/noNamespace"
123
+ ]
110
124
  }
111
125
  }
112
126
  }
@@ -149,6 +163,16 @@
149
163
  "rules": [
150
164
  "@typescript-eslint/no-namespace"
151
165
  ]
166
+ },
167
+ "oxlint": {
168
+ "rules": [
169
+ "no-namespace"
170
+ ]
171
+ },
172
+ "biome": {
173
+ "rules": [
174
+ "lint/style/noNamespace"
175
+ ]
152
176
  }
153
177
  }
154
178
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-non-null-asserted-optional-chain",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-non-null-asserted-optional-chain` rule (https://typescript-eslint.io/rules/no-non-null-asserted-optional-chain). Flags a non-null assertion that ends an optional chain (`x?.y!`), and a parenthesized optional chain that is non-null asserted (`(x?.y)!`, reported at the chain).",
7
7
  "scope": {
@@ -100,7 +100,24 @@
100
100
  "violation": {
101
101
  "anchor": "witness.span",
102
102
  "code": "@typescript-eslint/no-non-null-asserted-optional-chain",
103
- "message": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong."
103
+ "message": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.",
104
+ "suppress": {
105
+ "eslint": {
106
+ "rules": [
107
+ "@typescript-eslint/no-non-null-asserted-optional-chain"
108
+ ]
109
+ },
110
+ "oxlint": {
111
+ "rules": [
112
+ "no-non-null-asserted-optional-chain"
113
+ ]
114
+ },
115
+ "biome": {
116
+ "rules": [
117
+ "lint/suspicious/noNonNullAssertedOptionalChain"
118
+ ]
119
+ }
120
+ }
104
121
  }
105
122
  },
106
123
  {
@@ -166,7 +183,24 @@
166
183
  "violation": {
167
184
  "anchor": "capture.CHAIN",
168
185
  "code": "@typescript-eslint/no-non-null-asserted-optional-chain",
169
- "message": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong."
186
+ "message": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.",
187
+ "suppress": {
188
+ "eslint": {
189
+ "rules": [
190
+ "@typescript-eslint/no-non-null-asserted-optional-chain"
191
+ ]
192
+ },
193
+ "oxlint": {
194
+ "rules": [
195
+ "no-non-null-asserted-optional-chain"
196
+ ]
197
+ },
198
+ "biome": {
199
+ "rules": [
200
+ "lint/suspicious/noNonNullAssertedOptionalChain"
201
+ ]
202
+ }
203
+ }
170
204
  }
171
205
  }
172
206
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-non-null-assertion",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "typescript-eslint 8.70.1 @typescript-eslint/no-non-null-assertion, default options. Port of typescript-eslint's `no-non-null-assertion` rule (https://typescript-eslint.io/rules/no-non-null-assertion). Flags every non-null assertion `x!`. Where the grammar misparses a prefix operator applied to an assertion (`!x!` as `(!x)!`), the finding starts at the real operand.",
7
7
  "scope": {
@@ -93,6 +93,16 @@
93
93
  "rules": [
94
94
  "@typescript-eslint/no-non-null-assertion"
95
95
  ]
96
+ },
97
+ "oxlint": {
98
+ "rules": [
99
+ "no-non-null-assertion"
100
+ ]
101
+ },
102
+ "biome": {
103
+ "rules": [
104
+ "lint/style/noNonNullAssertion"
105
+ ]
96
106
  }
97
107
  }
98
108
  }
@@ -187,6 +197,16 @@
187
197
  "rules": [
188
198
  "@typescript-eslint/no-non-null-assertion"
189
199
  ]
200
+ },
201
+ "oxlint": {
202
+ "rules": [
203
+ "no-non-null-assertion"
204
+ ]
205
+ },
206
+ "biome": {
207
+ "rules": [
208
+ "lint/style/noNonNullAssertion"
209
+ ]
190
210
  }
191
211
  }
192
212
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-unnecessary-type-constraint",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-unnecessary-type-constraint` (https://typescript-eslint.io/rules/no-unnecessary-type-constraint). Flags type parameters constrained to `any` or `unknown`.",
7
7
  "scope": {
@@ -59,7 +59,24 @@
59
59
  "violation": {
60
60
  "anchor": "witness.span",
61
61
  "code": "@typescript-eslint/no-unnecessary-type-constraint",
62
- "message": "Constraining the generic type `$NAME` to `$CONSTRAINT` does nothing and is unnecessary."
62
+ "message": "Constraining the generic type `$NAME` to `$CONSTRAINT` does nothing and is unnecessary.",
63
+ "suppress": {
64
+ "eslint": {
65
+ "rules": [
66
+ "@typescript-eslint/no-unnecessary-type-constraint"
67
+ ]
68
+ },
69
+ "oxlint": {
70
+ "rules": [
71
+ "no-unnecessary-type-constraint"
72
+ ]
73
+ },
74
+ "biome": {
75
+ "rules": [
76
+ "lint/complexity/noUselessTypeConstraint"
77
+ ]
78
+ }
79
+ }
63
80
  }
64
81
  }
65
82
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-unsafe-function-type",
4
- "revision": 1,
4
+ "revision": 2,
5
5
  "mode": "steer",
6
6
  "description": "typescript-eslint 8.70.1 @typescript-eslint/no-unsafe-function-type, default options. Port of typescript-eslint's `no-unsafe-function-type` rule (https://typescript-eslint.io/rules/no-unsafe-function-type). Flags the global `Function` type used as a type reference, class implements or interface extends: a `type_identifier` reference that `resolves` to no file-local type binding.",
7
7
  "scope": {
@@ -42,6 +42,11 @@
42
42
  "rules": [
43
43
  "@typescript-eslint/no-unsafe-function-type"
44
44
  ]
45
+ },
46
+ "oxlint": {
47
+ "rules": [
48
+ "no-unsafe-function-type"
49
+ ]
45
50
  }
46
51
  }
47
52
  }
@@ -1 +1 @@
1
- {"format":"rerail.policy/v1","id":"typescript-eslint-no-unused-expressions","revision":2,"mode":"steer","description":"Port of typescript-eslint's `no-unused-expressions` (https://typescript-eslint.io/rules/no-unused-expressions), an extension of ESLint's rule,; same document shape as the ESLint port. Flags an expression statement whose expression (through parentheses and TS `as`/`<T>`/`!`/instantiation wrappers) is not a call, `new`, assignment, update, `await`, `yield`, `import()`, `void` or `delete`; directive prologue strings are exempt. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allowShortCircuit":{"type":"boolean","nullable":true,"default":null},"allowTernary":{"type":"boolean","nullable":true,"default":null}}}},{"id":"unused-expression","forbid":{"ast":{"language":"typescript","rule":{"kind":"expression_statement","all":[{"not":{"matches":"directive"}},{"has":{"stopBy":"neighbor","matches":"disallowed"}}]},"utils":{"disallowed":{"any":[{"kind":"array"},{"kind":"arrow_function"},{"kind":"class"},{"kind":"function_expression"},{"kind":"generator_function"},{"kind":"identifier"},{"kind":"undefined"},{"kind":"number"},{"kind":"string"},{"kind":"true"},{"kind":"false"},{"kind":"null"},{"kind":"regex"},{"kind":"template_string"},{"kind":"member_expression"},{"kind":"subscript_expression"},{"kind":"meta_property"},{"kind":"object"},{"kind":"sequence_expression"},{"kind":"this"},{"kind":"super"},{"kind":"unary_expression","not":{"has":{"regex":"^(void|delete)$","stopBy":"neighbor"}}},{"kind":"parenthesized_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"as_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"type_assertion","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"non_null_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"instantiation_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"$option":"allowShortCircuit","cases":{"true":[]},"default":[{"kind":"binary_expression"}],"spread":true},{"$option":"allowShortCircuit","cases":{"true":[{"kind":"binary_expression","not":{"has":{"regex":"^(&&|\\|\\||\\?\\?)$","stopBy":"neighbor"}}}]},"default":[],"spread":true},{"$option":"allowShortCircuit","cases":{"true":[{"kind":"binary_expression","has":{"stopBy":"neighbor","follows":{"regex":"^(&&|\\|\\||\\?\\?)$","stopBy":"neighbor"},"matches":"disallowed"}}]},"default":[],"spread":true},{"$option":"allowTernary","cases":{"true":[]},"default":[{"kind":"ternary_expression"}],"spread":true},{"$option":"allowTernary","cases":{"true":[{"kind":"ternary_expression","has":{"stopBy":"neighbor","matches":"disallowed","follows":{"regex":"^[?:]$","stopBy":"neighbor"}}}]},"default":[],"spread":true},{"kind":"call_expression","has":{"kind":"template_string","stopBy":"neighbor"}}]},"directive-like":{"kind":"expression_statement","has":{"kind":"string","stopBy":"neighbor"}},"directive":{"all":[{"matches":"directive-like"},{"inside":{"stopBy":"neighbor","any":[{"kind":"program"},{"kind":"statement_block","inside":{"stopBy":"neighbor","any":[{"kind":"function_declaration"},{"kind":"function_expression"},{"kind":"arrow_function"},{"kind":"generator_function"},{"kind":"generator_function_declaration"},{"kind":"method_definition"},{"kind":"module"},{"kind":"internal_module"}]}}]}},{"not":{"follows":{"stopBy":"end","all":[{"not":{"kind":"comment"}},{"not":{"kind":"hash_bang_line"}},{"not":{"regex":"^\\{$"}},{"not":{"matches":"directive-like"}}]}}}]}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-unused-expressions","message":"Expected an assignment or function call and instead saw an expression."}}]}
1
+ {"format":"rerail.policy/v1","id":"typescript-eslint-no-unused-expressions","revision":4,"mode":"steer","description":"Port of typescript-eslint's `no-unused-expressions` (https://typescript-eslint.io/rules/no-unused-expressions), an extension of ESLint's rule,; same document shape as the ESLint port. Flags an expression statement whose expression (through parentheses and TS `as`/`<T>`/`!`/instantiation wrappers) is not a call, `new`, assignment, update, `await`, `yield`, `import()`, `void` or `delete`; directive prologue strings are exempt. tree-sitter reads `e as A.B.C` and `e satisfies A.B.C` (a type name with two or more dots) as a member access on `e as A.B` / `e satisfies A.B`; such a member access is treated as the `as` (unwrapped) or `satisfies` (never flagged, as upstream) it is. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allowShortCircuit":{"type":"boolean","nullable":true,"default":null},"allowTernary":{"type":"boolean","nullable":true,"default":null}}}},{"id":"unused-expression","forbid":{"ast":{"language":"typescript","rule":{"kind":"expression_statement","all":[{"not":{"matches":"directive"}},{"has":{"stopBy":"neighbor","matches":"disallowed"}}]},"utils":{"disallowed":{"any":[{"kind":"array"},{"kind":"arrow_function"},{"kind":"class"},{"kind":"function_expression"},{"kind":"generator_function"},{"kind":"identifier"},{"kind":"undefined"},{"kind":"number"},{"kind":"string"},{"kind":"true"},{"kind":"false"},{"kind":"null"},{"kind":"regex"},{"kind":"template_string"},{"kind":"member_expression","not":{"has":{"field":"object","stopBy":"neighbor","any":[{"kind":"as_expression"},{"kind":"satisfies_expression"}]}}},{"kind":"member_expression","has":{"field":"object","stopBy":"neighbor","kind":"as_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}}},{"kind":"subscript_expression"},{"kind":"meta_property"},{"kind":"object"},{"kind":"sequence_expression"},{"kind":"this"},{"kind":"super"},{"kind":"unary_expression","not":{"has":{"regex":"^(void|delete)$","stopBy":"neighbor"}}},{"kind":"parenthesized_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"as_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"type_assertion","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"non_null_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"kind":"instantiation_expression","has":{"stopBy":"neighbor","all":[{"not":{"kind":"type_arguments"}},{"matches":"disallowed"}]}},{"$option":"allowShortCircuit","cases":{"true":[]},"default":[{"kind":"binary_expression"}],"spread":true},{"$option":"allowShortCircuit","cases":{"true":[{"kind":"binary_expression","not":{"has":{"regex":"^(&&|\\|\\||\\?\\?)$","stopBy":"neighbor"}}}]},"default":[],"spread":true},{"$option":"allowShortCircuit","cases":{"true":[{"kind":"binary_expression","has":{"stopBy":"neighbor","follows":{"regex":"^(&&|\\|\\||\\?\\?)$","stopBy":"neighbor"},"matches":"disallowed"}}]},"default":[],"spread":true},{"$option":"allowTernary","cases":{"true":[]},"default":[{"kind":"ternary_expression"}],"spread":true},{"$option":"allowTernary","cases":{"true":[{"kind":"ternary_expression","has":{"stopBy":"neighbor","matches":"disallowed","follows":{"regex":"^[?:]$","stopBy":"neighbor"}}}]},"default":[],"spread":true},{"kind":"call_expression","has":{"kind":"template_string","stopBy":"neighbor"}}]},"directive-like":{"kind":"expression_statement","has":{"kind":"string","stopBy":"neighbor"}},"directive":{"all":[{"matches":"directive-like"},{"inside":{"stopBy":"neighbor","any":[{"kind":"program"},{"kind":"statement_block","inside":{"stopBy":"neighbor","any":[{"kind":"function_declaration"},{"kind":"function_expression"},{"kind":"arrow_function"},{"kind":"generator_function"},{"kind":"generator_function_declaration"},{"kind":"method_definition"},{"kind":"module"},{"kind":"internal_module"}]}}]}},{"not":{"follows":{"stopBy":"end","all":[{"not":{"kind":"comment"}},{"not":{"kind":"hash_bang_line"}},{"not":{"regex":"^\\{$"}},{"not":{"matches":"directive-like"}}]}}}]}}}},"violation":{"anchor":"witness.span","code":"@typescript-eslint/no-unused-expressions","message":"Expected an assignment or function call and instead saw an expression.","suppress":{"eslint":{"rules":["@typescript-eslint/no-unused-expressions"]},"oxlint":{"rules":["no-unused-expressions"]}}}}]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-useless-empty-export",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `no-useless-empty-export` rule (https://typescript-eslint.io/rules/no-useless-empty-export). Flags `export {}` when a sibling statement of the same module body is already an import or export; declaration files are excluded by scope.",
7
7
  "scope": { "include": ["**/*"], "exclude": ["**/*.d.ts", "**/*.d.mts", "**/*.d.cts"] },
@@ -32,7 +32,7 @@
32
32
  }
33
33
  }
34
34
  },
35
- "violation": { "anchor": "witness.span", "code": "@typescript-eslint/no-useless-empty-export", "message": "Empty export does nothing and can be removed.", "fix": "" }
35
+ "violation": { "anchor": "witness.span", "code": "@typescript-eslint/no-useless-empty-export", "message": "Empty export does nothing and can be removed.", "fix": "", "suppress": { "eslint": { "rules": ["@typescript-eslint/no-useless-empty-export"] }, "oxlint": { "rules": ["no-useless-empty-export"] }, "biome": { "rules": ["lint/complexity/noUselessEmptyExport"] } } }
36
36
  }
37
37
  ]
38
38
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-no-wrapper-object-types",
4
- "revision": 1,
4
+ "revision": 2,
5
5
  "mode": "steer",
6
6
  "description": "typescript-eslint 8.70.1 @typescript-eslint/no-wrapper-object-types, default options. Port of typescript-eslint's `no-wrapper-object-types` rule (https://typescript-eslint.io/rules/no-wrapper-object-types). Flags type references, `implements` and interface `extends` naming BigInt/Boolean/Number/Object/String/Symbol when the name `resolves` to no file-local type binding. Type references are fixed to the lowercase primitive.",
7
7
  "scope": {
@@ -61,6 +61,11 @@
61
61
  "rules": [
62
62
  "@typescript-eslint/no-wrapper-object-types"
63
63
  ]
64
+ },
65
+ "oxlint": {
66
+ "rules": [
67
+ "no-wrapper-object-types"
68
+ ]
64
69
  }
65
70
  }
66
71
  }
@@ -108,6 +113,11 @@
108
113
  "rules": [
109
114
  "@typescript-eslint/no-wrapper-object-types"
110
115
  ]
116
+ },
117
+ "oxlint": {
118
+ "rules": [
119
+ "no-wrapper-object-types"
120
+ ]
111
121
  }
112
122
  }
113
123
  }
@@ -155,6 +165,11 @@
155
165
  "rules": [
156
166
  "@typescript-eslint/no-wrapper-object-types"
157
167
  ]
168
+ },
169
+ "oxlint": {
170
+ "rules": [
171
+ "no-wrapper-object-types"
172
+ ]
158
173
  }
159
174
  }
160
175
  }
@@ -202,6 +217,11 @@
202
217
  "rules": [
203
218
  "@typescript-eslint/no-wrapper-object-types"
204
219
  ]
220
+ },
221
+ "oxlint": {
222
+ "rules": [
223
+ "no-wrapper-object-types"
224
+ ]
205
225
  }
206
226
  }
207
227
  }
@@ -249,6 +269,11 @@
249
269
  "rules": [
250
270
  "@typescript-eslint/no-wrapper-object-types"
251
271
  ]
272
+ },
273
+ "oxlint": {
274
+ "rules": [
275
+ "no-wrapper-object-types"
276
+ ]
252
277
  }
253
278
  }
254
279
  }
@@ -296,6 +321,11 @@
296
321
  "rules": [
297
322
  "@typescript-eslint/no-wrapper-object-types"
298
323
  ]
324
+ },
325
+ "oxlint": {
326
+ "rules": [
327
+ "no-wrapper-object-types"
328
+ ]
299
329
  }
300
330
  }
301
331
  }
@@ -340,6 +370,11 @@
340
370
  "rules": [
341
371
  "@typescript-eslint/no-wrapper-object-types"
342
372
  ]
373
+ },
374
+ "oxlint": {
375
+ "rules": [
376
+ "no-wrapper-object-types"
377
+ ]
343
378
  }
344
379
  }
345
380
  }
@@ -384,6 +419,11 @@
384
419
  "rules": [
385
420
  "@typescript-eslint/no-wrapper-object-types"
386
421
  ]
422
+ },
423
+ "oxlint": {
424
+ "rules": [
425
+ "no-wrapper-object-types"
426
+ ]
387
427
  }
388
428
  }
389
429
  }
@@ -428,6 +468,11 @@
428
468
  "rules": [
429
469
  "@typescript-eslint/no-wrapper-object-types"
430
470
  ]
471
+ },
472
+ "oxlint": {
473
+ "rules": [
474
+ "no-wrapper-object-types"
475
+ ]
431
476
  }
432
477
  }
433
478
  }
@@ -472,6 +517,11 @@
472
517
  "rules": [
473
518
  "@typescript-eslint/no-wrapper-object-types"
474
519
  ]
520
+ },
521
+ "oxlint": {
522
+ "rules": [
523
+ "no-wrapper-object-types"
524
+ ]
475
525
  }
476
526
  }
477
527
  }
@@ -516,6 +566,11 @@
516
566
  "rules": [
517
567
  "@typescript-eslint/no-wrapper-object-types"
518
568
  ]
569
+ },
570
+ "oxlint": {
571
+ "rules": [
572
+ "no-wrapper-object-types"
573
+ ]
519
574
  }
520
575
  }
521
576
  }
@@ -560,6 +615,11 @@
560
615
  "rules": [
561
616
  "@typescript-eslint/no-wrapper-object-types"
562
617
  ]
618
+ },
619
+ "oxlint": {
620
+ "rules": [
621
+ "no-wrapper-object-types"
622
+ ]
563
623
  }
564
624
  }
565
625
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-prefer-as-const",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "typescript-eslint 8.70.1 @typescript-eslint/prefer-as-const, default options. Port of typescript-eslint's `prefer-as-const` rule (https://typescript-eslint.io/rules/prefer-as-const). Flags a literal type that repeats the raw text of the literal it asserts (`x as 'a'`, `<'a'>x`) or annotates (`let v: 'a' = 'a'`, class fields); assertions are fixed to `const`.",
7
7
  "scope": {
@@ -119,6 +119,16 @@
119
119
  "rules": [
120
120
  "@typescript-eslint/prefer-as-const"
121
121
  ]
122
+ },
123
+ "oxlint": {
124
+ "rules": [
125
+ "prefer-as-const"
126
+ ]
127
+ },
128
+ "biome": {
129
+ "rules": [
130
+ "lint/style/useAsConstAssertion"
131
+ ]
122
132
  }
123
133
  }
124
134
  }
@@ -216,6 +226,16 @@
216
226
  "rules": [
217
227
  "@typescript-eslint/prefer-as-const"
218
228
  ]
229
+ },
230
+ "oxlint": {
231
+ "rules": [
232
+ "prefer-as-const"
233
+ ]
234
+ },
235
+ "biome": {
236
+ "rules": [
237
+ "lint/style/useAsConstAssertion"
238
+ ]
219
239
  }
220
240
  }
221
241
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-prefer-enum-initializers",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `prefer-enum-initializers` rule (https://typescript-eslint.io/rules/prefer-enum-initializers). Flags enum members without an initializer.",
7
7
  "scope": { "include": ["**/*"], "exclude": [] },
@@ -20,7 +20,7 @@
20
20
  }
21
21
  }
22
22
  },
23
- "violation": { "anchor": "witness.span", "code": "@typescript-eslint/prefer-enum-initializers", "message": "The value of the member '$NAME' should be explicitly defined." }
23
+ "violation": { "anchor": "witness.span", "code": "@typescript-eslint/prefer-enum-initializers", "message": "The value of the member '$NAME' should be explicitly defined.", "suppress": { "eslint": { "rules": ["@typescript-eslint/prefer-enum-initializers"] }, "oxlint": { "rules": ["prefer-enum-initializers"] }, "biome": { "rules": ["lint/style/useEnumInitializers"] } } }
24
24
  }
25
25
  ]
26
26
  }
@@ -1 +1 @@
1
- {"format":"rerail.policy/v1","id":"typescript-eslint-prefer-literal-enum-member","revision":2,"mode":"steer","description":"Port of typescript-eslint's `prefer-literal-enum-member` rule (https://typescript-eslint.io/rules/prefer-literal-enum-member). Reports an enum member initialized with anything but a literal, a template literal without substitutions, or a signed one. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allowBitwiseExpressions":{"type":"boolean","nullable":true,"default":null}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"kind":"comment"},{"regex":"^(&|\\^|<<|>>|>>>|\\|)$"},{"regex":"^[-+~()]$"}]},"r2":{"has":{"kind":"string_fragment","pattern":"$SM","stopBy":"neighbor"},"kind":"string"},"r3":{"has":{"kind":"identifier","pattern":"$EN","stopBy":"neighbor"}},"r4":{"has":{"regex":"^(&|\\^|<<|>>|>>>|\\|)$","stopBy":"neighbor"}}}}},{"id":"non-literal-member","forbid":{"ast":{"language":"typescript","utils":{"literal":{"any":[{"kind":"number"},{"kind":"string"},{"kind":"true"},{"kind":"false"},{"kind":"null"},{"kind":"regex"},{"kind":"template_string","not":{"has":{"kind":"template_substitution","stopBy":"neighbor"}}}]},"allowed":{"any":[{"kind":"parenthesized_expression","all":[{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}}]},{"matches":"literal"},{"kind":"unary_expression","all":[{"has":{"regex":"^[-+]$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}}]},{"$option":"allowBitwiseExpressions","cases":{"true":[{"kind":"unary_expression","all":[{"has":{"regex":"^~$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]}]},"default":[],"spread":true},{"$option":"allowBitwiseExpressions","cases":{"true":[{"kind":"binary_expression","all":[{"matches":"r4"},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]}]},"default":[],"spread":true}]},"allowed-bitwise":{"any":[{"kind":"parenthesized_expression","all":[{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"matches":"literal"},{"kind":"unary_expression","all":[{"has":{"regex":"^[-+]$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"kind":"unary_expression","all":[{"has":{"regex":"^~$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"kind":"binary_expression","all":[{"matches":"r4"},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"matches":"self-member"}]},"member-named":{"any":[{"kind":"property_identifier","pattern":"$SM"},{"matches":"r2"},{"kind":"enum_assignment","has":{"any":[{"kind":"property_identifier","pattern":"$SM"},{"matches":"r2"}],"stopBy":"neighbor"}}]},"self-member":{"any":[{"kind":"identifier","pattern":"$SM","inside":{"stopBy":"end","kind":"enum_body","has":{"matches":"member-named","stopBy":"neighbor"}}},{"all":[{"any":[{"kind":"member_expression","has":{"kind":"property_identifier","pattern":"$SM","stopBy":"neighbor"}},{"kind":"subscript_expression","has":{"stopBy":"neighbor","matches":"r2"}}]},{"matches":"r3"},{"inside":{"stopBy":"end","kind":"enum_declaration","all":[{"matches":"r3"},{"has":{"kind":"enum_body","has":{"matches":"member-named","stopBy":"neighbor"},"stopBy":"neighbor"}}]}}]}]}},"rule":{"kind":"enum_assignment","all":[{"has":{"any":[{"kind":"property_identifier"},{"kind":"string"},{"kind":"computed_property_name"},{"kind":"number"}],"pattern":"$NAME","precedes":{"regex":"^=$","stopBy":"end"},"stopBy":"neighbor"}},{"has":{"not":{"kind":"comment"},"follows":{"regex":"^=$","stopBy":"end"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}]}}},"violation":{"anchor":"capture.NAME","code":"@typescript-eslint/prefer-literal-enum-member","message":{"$option":"allowBitwiseExpressions","cases":{"true":"Explicit enum value must only be a literal value (string or number) or a bitwise expression."},"default":"Explicit enum value must only be a literal value (string or number)."}}}]}
1
+ {"format":"rerail.policy/v1","id":"typescript-eslint-prefer-literal-enum-member","revision":4,"mode":"steer","description":"Port of typescript-eslint's `prefer-literal-enum-member` rule (https://typescript-eslint.io/rules/prefer-literal-enum-member). Reports an enum member initialized with anything but a literal, a template literal without substitutions, or a signed one. Options are declared in the `options` define (the rule's defaults); a variant is a config patch.","scope":{"include":["**/*"],"exclude":[]},"clauses":[{"id":"options","define":{"options":{"allowBitwiseExpressions":{"type":"boolean","nullable":true,"default":null}}}},{"id":"shared","define":{"language":"typescript","utils":{"r1":{"any":[{"kind":"comment"},{"regex":"^(&|\\^|<<|>>|>>>|\\|)$"},{"regex":"^[-+~()]$"}]},"r2":{"has":{"kind":"string_fragment","pattern":"$SM","stopBy":"neighbor"},"kind":"string"},"r3":{"has":{"kind":"identifier","pattern":"$EN","stopBy":"neighbor"}},"r4":{"has":{"regex":"^(&|\\^|<<|>>|>>>|\\|)$","stopBy":"neighbor"}}}}},{"id":"non-literal-member","forbid":{"ast":{"language":"typescript","utils":{"literal":{"any":[{"kind":"number"},{"kind":"string"},{"kind":"true"},{"kind":"false"},{"kind":"null"},{"kind":"regex"},{"kind":"template_string","not":{"has":{"kind":"template_substitution","stopBy":"neighbor"}}}]},"allowed":{"any":[{"kind":"parenthesized_expression","all":[{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}}]},{"matches":"literal"},{"kind":"unary_expression","all":[{"has":{"regex":"^[-+]$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}}]},{"$option":"allowBitwiseExpressions","cases":{"true":[{"kind":"unary_expression","all":[{"has":{"regex":"^~$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]}]},"default":[],"spread":true},{"$option":"allowBitwiseExpressions","cases":{"true":[{"kind":"binary_expression","all":[{"matches":"r4"},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]}]},"default":[],"spread":true}]},"allowed-bitwise":{"any":[{"kind":"parenthesized_expression","all":[{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"matches":"literal"},{"kind":"unary_expression","all":[{"has":{"regex":"^[-+]$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"kind":"unary_expression","all":[{"has":{"regex":"^~$","stopBy":"neighbor"}},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"kind":"binary_expression","all":[{"matches":"r4"},{"not":{"has":{"not":{"matches":"r1"},"all":[{"not":{"matches":"allowed-bitwise"}}],"stopBy":"neighbor"}}}]},{"matches":"self-member"}]},"member-named":{"any":[{"kind":"property_identifier","pattern":"$SM"},{"matches":"r2"},{"kind":"enum_assignment","has":{"any":[{"kind":"property_identifier","pattern":"$SM"},{"matches":"r2"}],"stopBy":"neighbor"}}]},"self-member":{"any":[{"kind":"identifier","pattern":"$SM","inside":{"stopBy":"end","kind":"enum_body","has":{"matches":"member-named","stopBy":"neighbor"}}},{"all":[{"any":[{"kind":"member_expression","has":{"kind":"property_identifier","pattern":"$SM","stopBy":"neighbor"}},{"kind":"subscript_expression","has":{"stopBy":"neighbor","matches":"r2"}}]},{"matches":"r3"},{"inside":{"stopBy":"end","kind":"enum_declaration","all":[{"matches":"r3"},{"has":{"kind":"enum_body","has":{"matches":"member-named","stopBy":"neighbor"},"stopBy":"neighbor"}}]}}]}]}},"rule":{"kind":"enum_assignment","all":[{"has":{"any":[{"kind":"property_identifier"},{"kind":"string"},{"kind":"computed_property_name"},{"kind":"number"}],"pattern":"$NAME","precedes":{"regex":"^=$","stopBy":"end"},"stopBy":"neighbor"}},{"has":{"not":{"kind":"comment"},"follows":{"regex":"^=$","stopBy":"end"},"all":[{"not":{"matches":"allowed"}}],"stopBy":"neighbor"}}]}}},"violation":{"anchor":"capture.NAME","code":"@typescript-eslint/prefer-literal-enum-member","message":{"$option":"allowBitwiseExpressions","cases":{"true":"Explicit enum value must only be a literal value (string or number) or a bitwise expression."},"default":"Explicit enum value must only be a literal value (string or number)."},"suppress":{"eslint":{"rules":["@typescript-eslint/prefer-literal-enum-member"]},"oxlint":{"rules":["prefer-literal-enum-member"]},"biome":{"rules":["lint/style/useLiteralEnumMembers"]}}}}]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "format": "rerail.policy/v1",
3
3
  "id": "typescript-eslint-prefer-namespace-keyword",
4
- "revision": 1,
4
+ "revision": 3,
5
5
  "mode": "steer",
6
6
  "description": "Port of typescript-eslint's `prefer-namespace-keyword` rule (https://typescript-eslint.io/rules/prefer-namespace-keyword). Flags `module Name {}` declarations with an identifier name; reports the whole declaration (from `declare` when present) and fixes the keyword.",
7
7
  "scope": {
@@ -49,7 +49,24 @@
49
49
  "anchor": "capture.D",
50
50
  "code": "@typescript-eslint/prefer-namespace-keyword",
51
51
  "message": "Use 'namespace' instead of 'module' to declare custom TypeScript modules.",
52
- "fix": "namespace"
52
+ "fix": "namespace",
53
+ "suppress": {
54
+ "eslint": {
55
+ "rules": [
56
+ "@typescript-eslint/prefer-namespace-keyword"
57
+ ]
58
+ },
59
+ "oxlint": {
60
+ "rules": [
61
+ "prefer-namespace-keyword"
62
+ ]
63
+ },
64
+ "biome": {
65
+ "rules": [
66
+ "lint/suspicious/useNamespaceKeyword"
67
+ ]
68
+ }
69
+ }
53
70
  }
54
71
  },
55
72
  {
@@ -91,7 +108,24 @@
91
108
  "anchor": "capture.M",
92
109
  "code": "@typescript-eslint/prefer-namespace-keyword",
93
110
  "message": "Use 'namespace' instead of 'module' to declare custom TypeScript modules.",
94
- "fix": "namespace"
111
+ "fix": "namespace",
112
+ "suppress": {
113
+ "eslint": {
114
+ "rules": [
115
+ "@typescript-eslint/prefer-namespace-keyword"
116
+ ]
117
+ },
118
+ "oxlint": {
119
+ "rules": [
120
+ "prefer-namespace-keyword"
121
+ ]
122
+ },
123
+ "biome": {
124
+ "rules": [
125
+ "lint/suspicious/useNamespaceKeyword"
126
+ ]
127
+ }
128
+ }
95
129
  }
96
130
  }
97
131
  ]