@isentinel/eslint-config 6.0.0-beta.26 → 6.0.0-beta.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +20 -20
- package/dist/index.mjs +1 -0
- package/dist/lint-cli.mjs +1 -1
- package/dist/oxlint.d.mts +71 -20
- package/dist/oxlint.mjs +208 -58
- package/package.json +3 -3
package/dist/cli.mjs
CHANGED
|
@@ -9,7 +9,7 @@ import path from "node:path";
|
|
|
9
9
|
import { existsSync, readFileSync } from "fs";
|
|
10
10
|
import { execSync } from "node:child_process";
|
|
11
11
|
//#region package.json
|
|
12
|
-
var version = "6.0.0-beta.
|
|
12
|
+
var version = "6.0.0-beta.28";
|
|
13
13
|
var package_default = {
|
|
14
14
|
name: "@isentinel/eslint-config",
|
|
15
15
|
version,
|
package/dist/index.d.mts
CHANGED
|
@@ -7092,102 +7092,102 @@ interface RuleOptions {
|
|
|
7092
7092
|
'eslint-plugin/unique-test-case-names'?: Linter.RuleEntry<[]>;
|
|
7093
7093
|
/**
|
|
7094
7094
|
* Enforce arrow function return style based on line length
|
|
7095
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7095
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/arrow-return-style/documentation.md
|
|
7096
7096
|
*/
|
|
7097
7097
|
'flawless/arrow-return-style'?: Linter.RuleEntry<FlawlessArrowReturnStyle>;
|
|
7098
7098
|
/**
|
|
7099
7099
|
* Disallow shorthand boolean JSX attributes
|
|
7100
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7100
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/jsx-shorthand-boolean/documentation.md
|
|
7101
7101
|
*/
|
|
7102
7102
|
'flawless/jsx-shorthand-boolean'?: Linter.RuleEntry<[]>;
|
|
7103
7103
|
/**
|
|
7104
7104
|
* Enforce a consistent fragment form: the shorthand `<>...</>` or a named fragment
|
|
7105
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7105
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/jsx-shorthand-fragment/documentation.md
|
|
7106
7106
|
*/
|
|
7107
7107
|
'flawless/jsx-shorthand-fragment'?: Linter.RuleEntry<FlawlessJsxShorthandFragment>;
|
|
7108
7108
|
/**
|
|
7109
7109
|
* Enforce a maximum number of lines of code in a function
|
|
7110
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7110
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/max-lines-per-function/documentation.md
|
|
7111
7111
|
*/
|
|
7112
7112
|
'flawless/max-lines-per-function'?: Linter.RuleEntry<FlawlessMaxLinesPerFunction>;
|
|
7113
7113
|
/**
|
|
7114
7114
|
* Enforce naming conventions for everything across a codebase
|
|
7115
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7115
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/naming-convention/documentation.md
|
|
7116
7116
|
*/
|
|
7117
7117
|
'flawless/naming-convention'?: Linter.RuleEntry<FlawlessNamingConvention>;
|
|
7118
7118
|
/**
|
|
7119
7119
|
* Disallow conditional logic in tests
|
|
7120
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7120
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-conditional-in-test/documentation.md
|
|
7121
7121
|
*/
|
|
7122
7122
|
'flawless/no-conditional-in-test'?: Linter.RuleEntry<FlawlessNoConditionalInTest>;
|
|
7123
7123
|
/**
|
|
7124
7124
|
* Disallow anonymous arrow functions as export default declarations
|
|
7125
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7125
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-export-default-arrow/documentation.md
|
|
7126
7126
|
*/
|
|
7127
7127
|
'flawless/no-export-default-arrow'?: Linter.RuleEntry<[]>;
|
|
7128
7128
|
/**
|
|
7129
7129
|
* Disallow tsconfig options that redundantly re-set a value already provided by an extended config
|
|
7130
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7130
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-redundant-tsconfig-options/documentation.md
|
|
7131
7131
|
*/
|
|
7132
7132
|
'flawless/no-redundant-tsconfig-options'?: Linter.RuleEntry<[]>;
|
|
7133
7133
|
/**
|
|
7134
7134
|
* Disallow unnecessary usage of 'useCallback'
|
|
7135
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7135
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-unnecessary-use-callback/documentation.md
|
|
7136
7136
|
*/
|
|
7137
7137
|
'flawless/no-unnecessary-use-callback'?: Linter.RuleEntry<[]>;
|
|
7138
7138
|
/**
|
|
7139
7139
|
* Disallow unnecessary usage of 'useMemo'
|
|
7140
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7140
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-unnecessary-use-memo/documentation.md
|
|
7141
7141
|
*/
|
|
7142
7142
|
'flawless/no-unnecessary-use-memo'?: Linter.RuleEntry<[]>;
|
|
7143
7143
|
/**
|
|
7144
7144
|
* Enforce a blank line after `expect.assertions` and `expect.hasAssertions`
|
|
7145
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7145
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/padding-after-expect-assertions/documentation.md
|
|
7146
7146
|
*/
|
|
7147
7147
|
'flawless/padding-after-expect-assertions'?: Linter.RuleEntry<[]>;
|
|
7148
7148
|
/**
|
|
7149
7149
|
* Enforce destructuring assignment for component props
|
|
7150
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7150
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-destructuring-assignment/documentation.md
|
|
7151
7151
|
*/
|
|
7152
7152
|
'flawless/prefer-destructuring-assignment'?: Linter.RuleEntry<[]>;
|
|
7153
7153
|
/**
|
|
7154
7154
|
* Prefer having the last statement in a test be an assertion
|
|
7155
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7155
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-ending-with-an-expect/documentation.md
|
|
7156
7156
|
*/
|
|
7157
7157
|
'flawless/prefer-ending-with-an-expect'?: Linter.RuleEntry<FlawlessPreferEndingWithAnExpect>;
|
|
7158
7158
|
/**
|
|
7159
7159
|
* Prefer `expect.assertions(<count>)` over `expect.hasAssertions()`
|
|
7160
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7160
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-expect-assertions-count/documentation.md
|
|
7161
7161
|
*/
|
|
7162
7162
|
'flawless/prefer-expect-assertions-count'?: Linter.RuleEntry<[]>;
|
|
7163
7163
|
/**
|
|
7164
7164
|
* Enforce destructuring parameters in the function signature
|
|
7165
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7165
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-parameter-destructuring/documentation.md
|
|
7166
7166
|
*/
|
|
7167
7167
|
'flawless/prefer-parameter-destructuring'?: Linter.RuleEntry<FlawlessPreferParameterDestructuring>;
|
|
7168
7168
|
/**
|
|
7169
7169
|
* Enforce that function component props are read-only
|
|
7170
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7170
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-read-only-props/documentation.md
|
|
7171
7171
|
*/
|
|
7172
7172
|
'flawless/prefer-read-only-props'?: Linter.RuleEntry<FlawlessPreferReadOnlyProps>;
|
|
7173
7173
|
/**
|
|
7174
7174
|
* Disallow impure calls such as `math.random` or `os.clock` during render
|
|
7175
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7175
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/purity/documentation.md
|
|
7176
7176
|
*/
|
|
7177
7177
|
'flawless/purity'?: Linter.RuleEntry<FlawlessPurity>;
|
|
7178
7178
|
/**
|
|
7179
7179
|
* Prefer named imports for React runtime values and the React namespace for React types
|
|
7180
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7180
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/react-namespace/documentation.md
|
|
7181
7181
|
*/
|
|
7182
7182
|
'flawless/react-namespace'?: Linter.RuleEntry<[]>;
|
|
7183
7183
|
/**
|
|
7184
7184
|
* Enforce a configured sort order for TOML keys and tables
|
|
7185
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7185
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/toml-sort-keys/documentation.md
|
|
7186
7186
|
*/
|
|
7187
7187
|
'flawless/toml-sort-keys'?: Linter.RuleEntry<FlawlessTomlSortKeys>;
|
|
7188
7188
|
/**
|
|
7189
7189
|
* Enforce blank lines around top-level YAML block collection keys
|
|
7190
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
7190
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/yaml-block-key-blank-lines/documentation.md
|
|
7191
7191
|
*/
|
|
7192
7192
|
'flawless/yaml-block-key-blank-lines'?: Linter.RuleEntry<[]>;
|
|
7193
7193
|
/**
|
package/dist/index.mjs
CHANGED
|
@@ -15662,6 +15662,7 @@ const oxlintRuleMapping = {
|
|
|
15662
15662
|
"vitest/no-hooks": "native",
|
|
15663
15663
|
"vitest/no-identical-title": "native",
|
|
15664
15664
|
"vitest/no-import-node-test": "native",
|
|
15665
|
+
"vitest/no-importing-vitest-globals": "native",
|
|
15665
15666
|
"vitest/no-interpolation-in-snapshots": "native",
|
|
15666
15667
|
"vitest/no-large-snapshots": "native",
|
|
15667
15668
|
"vitest/no-mocks-import": "native",
|
package/dist/lint-cli.mjs
CHANGED
|
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
36
36
|
}) : target, mod));
|
|
37
37
|
//#endregion
|
|
38
38
|
//#region package.json
|
|
39
|
-
var version = "6.0.0-beta.
|
|
39
|
+
var version = "6.0.0-beta.28";
|
|
40
40
|
//#endregion
|
|
41
41
|
//#region src/lint-cli/lib/cli/types.ts
|
|
42
42
|
/**
|
package/dist/oxlint.d.mts
CHANGED
|
@@ -2906,6 +2906,46 @@ interface OxlintReactRuleDefaults {
|
|
|
2906
2906
|
"react-naming-convention/ref-name": {
|
|
2907
2907
|
"*": "error";
|
|
2908
2908
|
};
|
|
2909
|
+
"react-perf/jsx-no-jsx-as-prop": {
|
|
2910
|
+
game_roblox: ["error", {
|
|
2911
|
+
"nativeAllowList": "all";
|
|
2912
|
+
}];
|
|
2913
|
+
game_std: "error";
|
|
2914
|
+
package_roblox: ["error", {
|
|
2915
|
+
"nativeAllowList": "all";
|
|
2916
|
+
}];
|
|
2917
|
+
package_std: "error";
|
|
2918
|
+
};
|
|
2919
|
+
"react-perf/jsx-no-new-array-as-prop": {
|
|
2920
|
+
game_roblox: ["error", {
|
|
2921
|
+
"nativeAllowList": "all";
|
|
2922
|
+
}];
|
|
2923
|
+
game_std: "error";
|
|
2924
|
+
package_roblox: ["error", {
|
|
2925
|
+
"nativeAllowList": "all";
|
|
2926
|
+
}];
|
|
2927
|
+
package_std: "error";
|
|
2928
|
+
};
|
|
2929
|
+
"react-perf/jsx-no-new-function-as-prop": {
|
|
2930
|
+
game_roblox: ["error", {
|
|
2931
|
+
"nativeAllowList": "all";
|
|
2932
|
+
}];
|
|
2933
|
+
game_std: "error";
|
|
2934
|
+
package_roblox: ["error", {
|
|
2935
|
+
"nativeAllowList": "all";
|
|
2936
|
+
}];
|
|
2937
|
+
package_std: "error";
|
|
2938
|
+
};
|
|
2939
|
+
"react-perf/jsx-no-new-object-as-prop": {
|
|
2940
|
+
game_roblox: ["error", {
|
|
2941
|
+
"nativeAllowList": "all";
|
|
2942
|
+
}];
|
|
2943
|
+
game_std: "error";
|
|
2944
|
+
package_roblox: ["error", {
|
|
2945
|
+
"nativeAllowList": "all";
|
|
2946
|
+
}];
|
|
2947
|
+
package_std: "error";
|
|
2948
|
+
};
|
|
2909
2949
|
"react-x/error-boundaries": {
|
|
2910
2950
|
"*": "error";
|
|
2911
2951
|
};
|
|
@@ -4240,102 +4280,102 @@ interface RuleOptions {
|
|
|
4240
4280
|
'eslint-plugin/unique-test-case-names'?: Linter.RuleEntry<[]>;
|
|
4241
4281
|
/**
|
|
4242
4282
|
* Enforce arrow function return style based on line length
|
|
4243
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4283
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/arrow-return-style/documentation.md
|
|
4244
4284
|
*/
|
|
4245
4285
|
'flawless/arrow-return-style'?: Linter.RuleEntry<FlawlessArrowReturnStyle>;
|
|
4246
4286
|
/**
|
|
4247
4287
|
* Disallow shorthand boolean JSX attributes
|
|
4248
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4288
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/jsx-shorthand-boolean/documentation.md
|
|
4249
4289
|
*/
|
|
4250
4290
|
'flawless/jsx-shorthand-boolean'?: Linter.RuleEntry<[]>;
|
|
4251
4291
|
/**
|
|
4252
4292
|
* Enforce a consistent fragment form: the shorthand `<>...</>` or a named fragment
|
|
4253
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4293
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/jsx-shorthand-fragment/documentation.md
|
|
4254
4294
|
*/
|
|
4255
4295
|
'flawless/jsx-shorthand-fragment'?: Linter.RuleEntry<FlawlessJsxShorthandFragment>;
|
|
4256
4296
|
/**
|
|
4257
4297
|
* Enforce a maximum number of lines of code in a function
|
|
4258
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4298
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/max-lines-per-function/documentation.md
|
|
4259
4299
|
*/
|
|
4260
4300
|
'flawless/max-lines-per-function'?: Linter.RuleEntry<FlawlessMaxLinesPerFunction>;
|
|
4261
4301
|
/**
|
|
4262
4302
|
* Enforce naming conventions for everything across a codebase
|
|
4263
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4303
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/naming-convention/documentation.md
|
|
4264
4304
|
*/
|
|
4265
4305
|
'flawless/naming-convention'?: Linter.RuleEntry<FlawlessNamingConvention>;
|
|
4266
4306
|
/**
|
|
4267
4307
|
* Disallow conditional logic in tests
|
|
4268
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4308
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-conditional-in-test/documentation.md
|
|
4269
4309
|
*/
|
|
4270
4310
|
'flawless/no-conditional-in-test'?: Linter.RuleEntry<FlawlessNoConditionalInTest>;
|
|
4271
4311
|
/**
|
|
4272
4312
|
* Disallow anonymous arrow functions as export default declarations
|
|
4273
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4313
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-export-default-arrow/documentation.md
|
|
4274
4314
|
*/
|
|
4275
4315
|
'flawless/no-export-default-arrow'?: Linter.RuleEntry<[]>;
|
|
4276
4316
|
/**
|
|
4277
4317
|
* Disallow tsconfig options that redundantly re-set a value already provided by an extended config
|
|
4278
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4318
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-redundant-tsconfig-options/documentation.md
|
|
4279
4319
|
*/
|
|
4280
4320
|
'flawless/no-redundant-tsconfig-options'?: Linter.RuleEntry<[]>;
|
|
4281
4321
|
/**
|
|
4282
4322
|
* Disallow unnecessary usage of 'useCallback'
|
|
4283
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4323
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-unnecessary-use-callback/documentation.md
|
|
4284
4324
|
*/
|
|
4285
4325
|
'flawless/no-unnecessary-use-callback'?: Linter.RuleEntry<[]>;
|
|
4286
4326
|
/**
|
|
4287
4327
|
* Disallow unnecessary usage of 'useMemo'
|
|
4288
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4328
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/no-unnecessary-use-memo/documentation.md
|
|
4289
4329
|
*/
|
|
4290
4330
|
'flawless/no-unnecessary-use-memo'?: Linter.RuleEntry<[]>;
|
|
4291
4331
|
/**
|
|
4292
4332
|
* Enforce a blank line after `expect.assertions` and `expect.hasAssertions`
|
|
4293
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4333
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/padding-after-expect-assertions/documentation.md
|
|
4294
4334
|
*/
|
|
4295
4335
|
'flawless/padding-after-expect-assertions'?: Linter.RuleEntry<[]>;
|
|
4296
4336
|
/**
|
|
4297
4337
|
* Enforce destructuring assignment for component props
|
|
4298
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4338
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-destructuring-assignment/documentation.md
|
|
4299
4339
|
*/
|
|
4300
4340
|
'flawless/prefer-destructuring-assignment'?: Linter.RuleEntry<[]>;
|
|
4301
4341
|
/**
|
|
4302
4342
|
* Prefer having the last statement in a test be an assertion
|
|
4303
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4343
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-ending-with-an-expect/documentation.md
|
|
4304
4344
|
*/
|
|
4305
4345
|
'flawless/prefer-ending-with-an-expect'?: Linter.RuleEntry<FlawlessPreferEndingWithAnExpect>;
|
|
4306
4346
|
/**
|
|
4307
4347
|
* Prefer `expect.assertions(<count>)` over `expect.hasAssertions()`
|
|
4308
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4348
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-expect-assertions-count/documentation.md
|
|
4309
4349
|
*/
|
|
4310
4350
|
'flawless/prefer-expect-assertions-count'?: Linter.RuleEntry<[]>;
|
|
4311
4351
|
/**
|
|
4312
4352
|
* Enforce destructuring parameters in the function signature
|
|
4313
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4353
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-parameter-destructuring/documentation.md
|
|
4314
4354
|
*/
|
|
4315
4355
|
'flawless/prefer-parameter-destructuring'?: Linter.RuleEntry<FlawlessPreferParameterDestructuring>;
|
|
4316
4356
|
/**
|
|
4317
4357
|
* Enforce that function component props are read-only
|
|
4318
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4358
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/prefer-read-only-props/documentation.md
|
|
4319
4359
|
*/
|
|
4320
4360
|
'flawless/prefer-read-only-props'?: Linter.RuleEntry<FlawlessPreferReadOnlyProps>;
|
|
4321
4361
|
/**
|
|
4322
4362
|
* Disallow impure calls such as `math.random` or `os.clock` during render
|
|
4323
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4363
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/purity/documentation.md
|
|
4324
4364
|
*/
|
|
4325
4365
|
'flawless/purity'?: Linter.RuleEntry<FlawlessPurity>;
|
|
4326
4366
|
/**
|
|
4327
4367
|
* Prefer named imports for React runtime values and the React namespace for React types
|
|
4328
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4368
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/react-namespace/documentation.md
|
|
4329
4369
|
*/
|
|
4330
4370
|
'flawless/react-namespace'?: Linter.RuleEntry<[]>;
|
|
4331
4371
|
/**
|
|
4332
4372
|
* Enforce a configured sort order for TOML keys and tables
|
|
4333
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4373
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/toml-sort-keys/documentation.md
|
|
4334
4374
|
*/
|
|
4335
4375
|
'flawless/toml-sort-keys'?: Linter.RuleEntry<FlawlessTomlSortKeys>;
|
|
4336
4376
|
/**
|
|
4337
4377
|
* Enforce blank lines around top-level YAML block collection keys
|
|
4338
|
-
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.
|
|
4378
|
+
* @see https://github.com/christopher-buss/eslint-plugin-flawless/blob/v1.4.2/src/rules/yaml-block-key-blank-lines/documentation.md
|
|
4339
4379
|
*/
|
|
4340
4380
|
'flawless/yaml-block-key-blank-lines'?: Linter.RuleEntry<[]>;
|
|
4341
4381
|
/**
|
|
@@ -32498,6 +32538,17 @@ type OxlintFactoryOptions = {
|
|
|
32498
32538
|
* see no effect from this option.
|
|
32499
32539
|
*/
|
|
32500
32540
|
oxc?: boolean;
|
|
32541
|
+
/**
|
|
32542
|
+
* Warn about `overrides` entries oxlint cannot apply. Defaults to `true`.
|
|
32543
|
+
*
|
|
32544
|
+
* An override is authoritative: it applies at the scope its config option
|
|
32545
|
+
* covers whether or not the preset enables the rule. A few cannot be
|
|
32546
|
+
* honoured — a rule that needs type information oxlint has no jsPlugin
|
|
32547
|
+
* route for, a plugin that is not installed, or one dropped by
|
|
32548
|
+
* `jsPlugins: false` — and those are reported rather than discarded in
|
|
32549
|
+
* silence.
|
|
32550
|
+
*/
|
|
32551
|
+
warnDroppedOverrides?: boolean;
|
|
32501
32552
|
} & Omit<TypedOxlintConfigItem, "files" | "jsPlugins"> & OxlintOptionsConfig;
|
|
32502
32553
|
//#endregion
|
|
32503
32554
|
//#region src/oxlint/factory.d.ts
|
package/dist/oxlint.mjs
CHANGED
|
@@ -1523,6 +1523,7 @@ const oxlintRuleMapping = {
|
|
|
1523
1523
|
"vitest/no-hooks": "native",
|
|
1524
1524
|
"vitest/no-identical-title": "native",
|
|
1525
1525
|
"vitest/no-import-node-test": "native",
|
|
1526
|
+
"vitest/no-importing-vitest-globals": "native",
|
|
1526
1527
|
"vitest/no-interpolation-in-snapshots": "native",
|
|
1527
1528
|
"vitest/no-large-snapshots": "native",
|
|
1528
1529
|
"vitest/no-mocks-import": "native",
|
|
@@ -1772,6 +1773,18 @@ function isOxlintCovered(rule) {
|
|
|
1772
1773
|
return rule in oxlintRuleMapping || rule in oxcCoveredRules;
|
|
1773
1774
|
}
|
|
1774
1775
|
/**
|
|
1776
|
+
* Whether the rule's oxlint side is a differently-named native oxc rule, which
|
|
1777
|
+
* {@link translateRuleToOxlint} resolves. Such rules are in
|
|
1778
|
+
* {@link excludedFromOxlint} so the preset never emits both halves, but a user
|
|
1779
|
+
* override naming one still has somewhere to go.
|
|
1780
|
+
*
|
|
1781
|
+
* @param rule - The canonical ESLint rule name.
|
|
1782
|
+
* @returns Whether an oxc rule covers the rule under another name.
|
|
1783
|
+
*/
|
|
1784
|
+
function isOxcCoveredRule(rule) {
|
|
1785
|
+
return rule in oxcCoveredRules;
|
|
1786
|
+
}
|
|
1787
|
+
/**
|
|
1775
1788
|
* Whether the rule runs via oxlint-tsgolint (`oxlint --type-aware`); such rules
|
|
1776
1789
|
* are noise without type information, so they are gated on `typeAware`.
|
|
1777
1790
|
*
|
|
@@ -2660,6 +2673,76 @@ function commentLengthRules({ maxLength, multiLineMaxLength, semanticComments, t
|
|
|
2660
2673
|
};
|
|
2661
2674
|
}
|
|
2662
2675
|
//#endregion
|
|
2676
|
+
//#region src/oxlint/override-diagnostics.ts
|
|
2677
|
+
const REASON_TEXT = {
|
|
2678
|
+
"eslint-only": "oxlint cannot run this rule; it stays in ESLint",
|
|
2679
|
+
"missing-plugin": "the plugin that owns it is not installed",
|
|
2680
|
+
"native-only": "it needs a jsPlugin, and `jsPlugins: false` is set"
|
|
2681
|
+
};
|
|
2682
|
+
/**
|
|
2683
|
+
* Override diagnostics for the config build in progress: the entries that never
|
|
2684
|
+
* reached the generated config, and the oxlint names of the ones that did.
|
|
2685
|
+
*
|
|
2686
|
+
* The splitter runs deep inside the config modules, which return config
|
|
2687
|
+
* fragments and have no channel for diagnostics — and an override can be
|
|
2688
|
+
* dropped without leaving a fragment behind at all. The factory drains both
|
|
2689
|
+
* buffers per build, which is safe because it builds synchronously from start
|
|
2690
|
+
* to finish.
|
|
2691
|
+
*/
|
|
2692
|
+
const droppedOverrides = [];
|
|
2693
|
+
const overrideRules = /* @__PURE__ */ new Set();
|
|
2694
|
+
/**
|
|
2695
|
+
* Record an override that never reached the generated config.
|
|
2696
|
+
*
|
|
2697
|
+
* @param entry - The dropped override and the reason it was dropped.
|
|
2698
|
+
*/
|
|
2699
|
+
function recordDroppedOverride(entry) {
|
|
2700
|
+
droppedOverrides.push(entry);
|
|
2701
|
+
}
|
|
2702
|
+
/**
|
|
2703
|
+
* Record the oxlint names of overrides that made it into a fragment, so a later
|
|
2704
|
+
* pass that deletes rules (native-only mode) can tell a user's entry from the
|
|
2705
|
+
* preset's.
|
|
2706
|
+
*
|
|
2707
|
+
* @param rules - The oxlint rule names.
|
|
2708
|
+
*/
|
|
2709
|
+
function recordOverrideRules(rules) {
|
|
2710
|
+
for (const rule of rules) overrideRules.add(rule);
|
|
2711
|
+
}
|
|
2712
|
+
/**
|
|
2713
|
+
* Take everything recorded since the last call, emptying both buffers.
|
|
2714
|
+
*
|
|
2715
|
+
* @returns The dropped overrides (deduplicated by rule and reason) and the
|
|
2716
|
+
* oxlint names of the overrides that were emitted.
|
|
2717
|
+
*/
|
|
2718
|
+
function takeOverrideDiagnostics() {
|
|
2719
|
+
const taken = droppedOverrides.splice(0);
|
|
2720
|
+
const emitted = new Set(overrideRules);
|
|
2721
|
+
overrideRules.clear();
|
|
2722
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2723
|
+
return {
|
|
2724
|
+
dropped: taken.filter(({ reason, rule }) => {
|
|
2725
|
+
const key = `${rule} ${reason}`;
|
|
2726
|
+
if (seen.has(key)) return false;
|
|
2727
|
+
seen.add(key);
|
|
2728
|
+
return true;
|
|
2729
|
+
}),
|
|
2730
|
+
emitted
|
|
2731
|
+
};
|
|
2732
|
+
}
|
|
2733
|
+
/**
|
|
2734
|
+
* Warn about `overrides` entries that could not be applied. An override is a
|
|
2735
|
+
* deliberate instruction, so a silently discarded one leaves a rule reporting
|
|
2736
|
+
* (or not reporting) with no way to tell why.
|
|
2737
|
+
*
|
|
2738
|
+
* @param entries - What was dropped, and why; an empty list warns nothing.
|
|
2739
|
+
*/
|
|
2740
|
+
function warnDroppedOverrides(entries) {
|
|
2741
|
+
if (entries.length === 0) return;
|
|
2742
|
+
const lines = entries.map(({ reason, rule }) => ` - "${rule}": ${REASON_TEXT[reason]}`);
|
|
2743
|
+
console.warn(`[@isentinel/eslint-config] These \`overrides\` entries could not be applied to oxlint:\n${lines.join("\n")}`);
|
|
2744
|
+
}
|
|
2745
|
+
//#endregion
|
|
2663
2746
|
//#region src/oxlint/utils.ts
|
|
2664
2747
|
/**
|
|
2665
2748
|
* Every plugin oxlint implements natively, derived from the generated rule
|
|
@@ -2681,6 +2764,7 @@ function isNativePlugin(prefix) {
|
|
|
2681
2764
|
*/
|
|
2682
2765
|
const consumerAnchor = pathToFileURL(`${process.cwd()}/`).href;
|
|
2683
2766
|
const specifierCache = /* @__PURE__ */ new Map();
|
|
2767
|
+
const NO_OVERRIDES = /* @__PURE__ */ new Set();
|
|
2684
2768
|
/**
|
|
2685
2769
|
* Resolve a jsPlugin specifier, throwing when the package is not installed.
|
|
2686
2770
|
*
|
|
@@ -2785,16 +2869,22 @@ function scopeOverridePlugins(overrides, globalPlugins) {
|
|
|
2785
2869
|
*
|
|
2786
2870
|
* @param overrides - The merged overrides (mutated).
|
|
2787
2871
|
* @param registeredPlugins - Every native plugin and jsPlugin name registered.
|
|
2872
|
+
* @returns The oxlint names of the rules that were deleted.
|
|
2788
2873
|
*/
|
|
2789
2874
|
function stripUnregisteredPluginRules(overrides, registeredPlugins) {
|
|
2875
|
+
const stripped = /* @__PURE__ */ new Set();
|
|
2790
2876
|
for (const override of overrides) {
|
|
2791
2877
|
const { rules } = override;
|
|
2792
2878
|
if (rules === void 0) continue;
|
|
2793
2879
|
for (const rule of Object.keys(rules)) {
|
|
2794
2880
|
const slashIndex = rule.indexOf("/");
|
|
2795
|
-
if (slashIndex !== -1 && !registeredPlugins.has(rule.slice(0, slashIndex)))
|
|
2881
|
+
if (slashIndex !== -1 && !registeredPlugins.has(rule.slice(0, slashIndex))) {
|
|
2882
|
+
delete rules[rule];
|
|
2883
|
+
stripped.add(rule);
|
|
2884
|
+
}
|
|
2796
2885
|
}
|
|
2797
2886
|
}
|
|
2887
|
+
return stripped;
|
|
2798
2888
|
}
|
|
2799
2889
|
/**
|
|
2800
2890
|
* Split a canonical (ESLint-named) rule map into oxlint-native rules and
|
|
@@ -2804,22 +2894,32 @@ function stripUnregisteredPluginRules(overrides, registeredPlugins) {
|
|
|
2804
2894
|
* rules, which only run in standalone mode) are treated as jsPlugin rules.
|
|
2805
2895
|
* Disabled unmapped rules are skipped so that no jsPlugin is loaded solely for
|
|
2806
2896
|
* an "off" entry, unless `keepUnmappedOff` is set (user options.rules must not
|
|
2807
|
-
* silently discard an explicit disable)
|
|
2897
|
+
* silently discard an explicit disable) or the entry is a user override, which
|
|
2898
|
+
* is authoritative.
|
|
2808
2899
|
*
|
|
2809
2900
|
* @param rules - The canonical rule map.
|
|
2810
|
-
* @param
|
|
2811
|
-
*
|
|
2901
|
+
* @param options - Which entries survive the filters, and which came from the
|
|
2902
|
+
* user.
|
|
2812
2903
|
* @returns The split rules with the plugins each side requires.
|
|
2813
2904
|
*/
|
|
2814
|
-
function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
2905
|
+
function splitOxlintRules(rules, { keepUnmappedOff = false, overrides = NO_OVERRIDES } = {}) {
|
|
2815
2906
|
const nativeRules = {};
|
|
2816
2907
|
const jsPluginRules = {};
|
|
2817
2908
|
const nativePlugins = /* @__PURE__ */ new Set();
|
|
2818
2909
|
const jsPluginPrefixes = /* @__PURE__ */ new Set();
|
|
2819
2910
|
const tsCollapsed = /* @__PURE__ */ new Set();
|
|
2911
|
+
const overrideRules = /* @__PURE__ */ new Set();
|
|
2820
2912
|
const entries = Object.entries(rules ?? {});
|
|
2821
2913
|
for (const [rule, value] of entries) {
|
|
2822
|
-
if (value === void 0
|
|
2914
|
+
if (value === void 0) continue;
|
|
2915
|
+
const isOverride = overrides.has(rule);
|
|
2916
|
+
if (excludedFromOxlint.has(rule) && (!isOverride || !isOxcCoveredRule(rule))) {
|
|
2917
|
+
if (isOverride) recordDroppedOverride({
|
|
2918
|
+
reason: "eslint-only",
|
|
2919
|
+
rule
|
|
2920
|
+
});
|
|
2921
|
+
continue;
|
|
2922
|
+
}
|
|
2823
2923
|
const covered = isOxlintCovered(rule);
|
|
2824
2924
|
const severity = Array.isArray(value) ? value[0] : value;
|
|
2825
2925
|
const isOff = severity === "off" || severity === 0;
|
|
@@ -2827,7 +2927,8 @@ function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
|
2827
2927
|
const slashIndex = translated.indexOf("/");
|
|
2828
2928
|
const prefix = slashIndex === -1 ? "eslint" : translated.slice(0, slashIndex);
|
|
2829
2929
|
const nativePrefix = isNativePlugin(prefix) ? prefix : void 0;
|
|
2830
|
-
if (
|
|
2930
|
+
if (isOverride) overrideRules.add(translated);
|
|
2931
|
+
if (!covered && isOff && (keepUnmappedOff || isOverride)) {
|
|
2831
2932
|
if (nativePrefix !== void 0) {
|
|
2832
2933
|
nativeRules[translated] = value;
|
|
2833
2934
|
nativePlugins.add(nativePrefix);
|
|
@@ -2836,7 +2937,10 @@ function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
|
2836
2937
|
if (specifier !== void 0 && canResolveJsPlugin(specifier)) {
|
|
2837
2938
|
jsPluginRules[translated] = value;
|
|
2838
2939
|
jsPluginPrefixes.add(prefix);
|
|
2839
|
-
}
|
|
2940
|
+
} else if (isOverride) recordDroppedOverride({
|
|
2941
|
+
reason: "missing-plugin",
|
|
2942
|
+
rule
|
|
2943
|
+
});
|
|
2840
2944
|
}
|
|
2841
2945
|
continue;
|
|
2842
2946
|
}
|
|
@@ -2846,10 +2950,11 @@ function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
|
2846
2950
|
jsPluginPrefixes.add(prefix);
|
|
2847
2951
|
continue;
|
|
2848
2952
|
}
|
|
2953
|
+
if (!isOverride && overrideRules.has(translated) && (collapsesToTsCoreRule(rule) || isTsCoreCounterpartRule(rule))) continue;
|
|
2849
2954
|
if (collapsesToTsCoreRule(rule)) {
|
|
2850
2955
|
tsCollapsed.add(translated);
|
|
2851
2956
|
nativeRules[translated] = value;
|
|
2852
|
-
} else if (!isTsCoreCounterpartRule(rule) || !tsCollapsed.has(translated)) nativeRules[translated] = value;
|
|
2957
|
+
} else if (isOverride || !isTsCoreCounterpartRule(rule) || !tsCollapsed.has(translated)) nativeRules[translated] = value;
|
|
2853
2958
|
if (nativePrefix !== void 0) nativePlugins.add(nativePrefix);
|
|
2854
2959
|
}
|
|
2855
2960
|
const jsPlugins = [];
|
|
@@ -2865,7 +2970,8 @@ function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
|
2865
2970
|
jsPluginRules,
|
|
2866
2971
|
jsPlugins,
|
|
2867
2972
|
nativePlugins: [...nativePlugins],
|
|
2868
|
-
nativeRules
|
|
2973
|
+
nativeRules,
|
|
2974
|
+
overrideRules: [...overrideRules]
|
|
2869
2975
|
};
|
|
2870
2976
|
}
|
|
2871
2977
|
/**
|
|
@@ -2875,8 +2981,15 @@ function splitOxlintRules(rules, keepUnmappedOff = false) {
|
|
|
2875
2981
|
* @param options - The fragment options.
|
|
2876
2982
|
* @returns The generated config fragments.
|
|
2877
2983
|
*/
|
|
2878
|
-
function createOxlintConfigs({ name, excludeFiles, files, globals, keepUnmappedOff = false, rules, settings }) {
|
|
2879
|
-
const { jsPluginRules, jsPlugins, nativePlugins, nativeRules } = splitOxlintRules(rules
|
|
2984
|
+
function createOxlintConfigs({ name, excludeFiles, files, globals, keepUnmappedOff = false, overrides, rules, settings }) {
|
|
2985
|
+
const { jsPluginRules, jsPlugins, nativePlugins, nativeRules, overrideRules } = splitOxlintRules(overrides === void 0 ? rules : {
|
|
2986
|
+
...rules,
|
|
2987
|
+
...overrides
|
|
2988
|
+
}, {
|
|
2989
|
+
keepUnmappedOff,
|
|
2990
|
+
overrides: new Set(Object.keys(overrides ?? {}))
|
|
2991
|
+
});
|
|
2992
|
+
recordOverrideRules(overrideRules);
|
|
2880
2993
|
const fragments = [];
|
|
2881
2994
|
if (Object.keys(nativeRules).length > 0) fragments.push({
|
|
2882
2995
|
name,
|
|
@@ -3295,14 +3408,12 @@ function oxlintE18e({ excludeFiles, files = [GLOB_SRC], modernization = true, no
|
|
|
3295
3408
|
name: "isentinel/e18e",
|
|
3296
3409
|
...excludeFiles ? { excludeFiles } : {},
|
|
3297
3410
|
files: files.flat(),
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
...overrides
|
|
3305
|
-
}
|
|
3411
|
+
overrides,
|
|
3412
|
+
rules: e18eRules({
|
|
3413
|
+
modernization,
|
|
3414
|
+
nodeMajor,
|
|
3415
|
+
performanceImprovements
|
|
3416
|
+
})
|
|
3306
3417
|
}), ...createOxlintConfigs({
|
|
3307
3418
|
name: "isentinel/e18e/disables/test",
|
|
3308
3419
|
files: [...GLOB_TESTS],
|
|
@@ -3365,10 +3476,8 @@ function oxlintEslintPlugin(options = {}) {
|
|
|
3365
3476
|
return createOxlintConfigs({
|
|
3366
3477
|
name: "isentinel/eslint-plugin",
|
|
3367
3478
|
files: options.files?.flat() ?? ["**/*.{,c,m}[jt]s{,x}"],
|
|
3368
|
-
|
|
3369
|
-
|
|
3370
|
-
...overrides
|
|
3371
|
-
}
|
|
3479
|
+
overrides,
|
|
3480
|
+
rules: eslintPluginRules()
|
|
3372
3481
|
});
|
|
3373
3482
|
}
|
|
3374
3483
|
//#endregion
|
|
@@ -3817,14 +3926,12 @@ function oxlintJavascript(options = {}) {
|
|
|
3817
3926
|
navigator: "readonly",
|
|
3818
3927
|
window: "readonly"
|
|
3819
3928
|
},
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
...overrides
|
|
3827
|
-
}
|
|
3929
|
+
overrides,
|
|
3930
|
+
rules: javascriptRules({
|
|
3931
|
+
isInEditor,
|
|
3932
|
+
roblox,
|
|
3933
|
+
stylistic
|
|
3934
|
+
})
|
|
3828
3935
|
});
|
|
3829
3936
|
}
|
|
3830
3937
|
function toGlobals(source, override) {
|
|
@@ -4583,24 +4690,52 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
|
|
|
4583
4690
|
}
|
|
4584
4691
|
//#endregion
|
|
4585
4692
|
//#region src/oxlint/configs/react.ts
|
|
4693
|
+
/**
|
|
4694
|
+
* React configs for oxlint: the shared react family plus oxlint's native
|
|
4695
|
+
* `react-perf/*` rules, which have no ESLint counterpart here and so only run
|
|
4696
|
+
* under oxlint.
|
|
4697
|
+
*
|
|
4698
|
+
* The perf rules are emitted as a raw fragment (`plugins: ["react-perf"]` with
|
|
4699
|
+
* literal rule names) rather than through `createOxlintConfigs`, since the
|
|
4700
|
+
* canonical-name translation layer only knows rules that exist on the ESLint
|
|
4701
|
+
* side, and the raw form keeps the `nativeAllowList` option typed by
|
|
4702
|
+
* `OxlintRules`.
|
|
4703
|
+
*
|
|
4704
|
+
* Unlike `oxlintOxc`, the roblox flag is not split across a complement overlay:
|
|
4705
|
+
* `nativeAllowList` is a noise knob rather than a correctness one, so the extra
|
|
4706
|
+
* overrides would buy nothing.
|
|
4707
|
+
*
|
|
4708
|
+
* @param options - Shared rule options.
|
|
4709
|
+
* @returns The react config fragments.
|
|
4710
|
+
*/
|
|
4586
4711
|
function oxlintReact(options = {}) {
|
|
4587
|
-
const { filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, stylistic = true } = options;
|
|
4588
|
-
|
|
4712
|
+
const { filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, roblox = true, stylistic = true } = options;
|
|
4713
|
+
const files = options.files?.flat() ?? ["**/*.{,c,m}jsx", "**/*.{,c,m}tsx"];
|
|
4714
|
+
const performanceRule = roblox ? ["error", { nativeAllowList: "all" }] : "error";
|
|
4715
|
+
return [...createOxlintConfigs({
|
|
4589
4716
|
name: "isentinel/react",
|
|
4590
|
-
files
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
...overrides
|
|
4598
|
-
},
|
|
4717
|
+
files,
|
|
4718
|
+
overrides,
|
|
4719
|
+
rules: reactRules({
|
|
4720
|
+
filenameCase,
|
|
4721
|
+
reactCompiler,
|
|
4722
|
+
stylistic
|
|
4723
|
+
}),
|
|
4599
4724
|
settings: { "react-x": {
|
|
4600
4725
|
importSource: importSource ?? "@rbxts",
|
|
4601
4726
|
version: "17.0.2"
|
|
4602
4727
|
} }
|
|
4603
|
-
})
|
|
4728
|
+
}), {
|
|
4729
|
+
name: "isentinel/react/perf",
|
|
4730
|
+
files,
|
|
4731
|
+
plugins: ["react-perf"],
|
|
4732
|
+
rules: {
|
|
4733
|
+
"react-perf/jsx-no-jsx-as-prop": performanceRule,
|
|
4734
|
+
"react-perf/jsx-no-new-array-as-prop": performanceRule,
|
|
4735
|
+
"react-perf/jsx-no-new-function-as-prop": performanceRule,
|
|
4736
|
+
"react-perf/jsx-no-new-object-as-prop": performanceRule
|
|
4737
|
+
}
|
|
4738
|
+
}];
|
|
4604
4739
|
}
|
|
4605
4740
|
//#endregion
|
|
4606
4741
|
//#region src/rules/roblox.ts
|
|
@@ -4651,10 +4786,8 @@ function oxlintRoblox(options = {}) {
|
|
|
4651
4786
|
"**/*/*.{,c,m}tsx",
|
|
4652
4787
|
...componentExtensions.map((extension) => `**/*/*.${extension}`)
|
|
4653
4788
|
],
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
...overrides
|
|
4657
|
-
}
|
|
4789
|
+
overrides,
|
|
4790
|
+
rules: robloxRules({ stylistic })
|
|
4658
4791
|
});
|
|
4659
4792
|
}
|
|
4660
4793
|
//#endregion
|
|
@@ -5159,6 +5292,10 @@ function oxlintTest({ files = GLOB_TESTS, isInEditor = false, jest = false, over
|
|
|
5159
5292
|
if (enableJest) configs.push(...createOxlintConfigs({
|
|
5160
5293
|
name: "isentinel/test/jest",
|
|
5161
5294
|
files: jestOptions.files?.flat() ?? files.flat(),
|
|
5295
|
+
overrides: {
|
|
5296
|
+
...overrides,
|
|
5297
|
+
...jestOptions.overrides
|
|
5298
|
+
},
|
|
5162
5299
|
rules: {
|
|
5163
5300
|
...jestRules({
|
|
5164
5301
|
extended: jestOptions.extended === true,
|
|
@@ -5169,9 +5306,7 @@ function oxlintTest({ files = GLOB_TESTS, isInEditor = false, jest = false, over
|
|
|
5169
5306
|
...sonarjsTestRules({
|
|
5170
5307
|
jest: true,
|
|
5171
5308
|
roblox: isRoblox
|
|
5172
|
-
})
|
|
5173
|
-
...overrides,
|
|
5174
|
-
...jestOptions.overrides
|
|
5309
|
+
})
|
|
5175
5310
|
},
|
|
5176
5311
|
settings: { jest: {
|
|
5177
5312
|
globalPackage: "@rbxts/jest-globals",
|
|
@@ -5186,15 +5321,17 @@ function oxlintTest({ files = GLOB_TESTS, isInEditor = false, jest = false, over
|
|
|
5186
5321
|
if (enableVitest) configs.push(...createOxlintConfigs({
|
|
5187
5322
|
name: "isentinel/test/vitest",
|
|
5188
5323
|
files: vitestOptions.files?.flat() ?? files.flat(),
|
|
5324
|
+
overrides: {
|
|
5325
|
+
...overrides,
|
|
5326
|
+
...vitestOptions.overrides
|
|
5327
|
+
},
|
|
5189
5328
|
rules: {
|
|
5190
5329
|
...vitestRules({
|
|
5191
5330
|
extended: vitestOptions.extended === true,
|
|
5192
5331
|
isInEditor,
|
|
5193
5332
|
stylistic
|
|
5194
5333
|
}),
|
|
5195
|
-
...sonarjsTestRules({ roblox: isRoblox })
|
|
5196
|
-
...overrides,
|
|
5197
|
-
...vitestOptions.overrides
|
|
5334
|
+
...sonarjsTestRules({ roblox: isRoblox })
|
|
5198
5335
|
},
|
|
5199
5336
|
settings: { vitest: { typecheck: vitestOptions.typecheck ?? false } }
|
|
5200
5337
|
}), ...createOxlintConfigs({
|
|
@@ -5465,13 +5602,13 @@ function oxlintTypescript(options = {}) {
|
|
|
5465
5602
|
name: "isentinel/typescript",
|
|
5466
5603
|
...excludeFiles ? { excludeFiles } : {},
|
|
5467
5604
|
files,
|
|
5605
|
+
overrides,
|
|
5468
5606
|
rules: {
|
|
5469
5607
|
...typescriptRecommendedOverrides(),
|
|
5470
5608
|
...typescriptStrictPresetRules(),
|
|
5471
5609
|
...typescriptRules({ stylistic }),
|
|
5472
5610
|
...gatedTypeAwareRules,
|
|
5473
|
-
...erasableOnly ? erasableSyntaxOnlyRules() : {}
|
|
5474
|
-
...overrides
|
|
5611
|
+
...erasableOnly ? erasableSyntaxOnlyRules() : {}
|
|
5475
5612
|
}
|
|
5476
5613
|
});
|
|
5477
5614
|
}
|
|
@@ -5723,7 +5860,7 @@ const NATIVE_ONLY_JS_PLUGINS = /* @__PURE__ */ new Set(["oxlint-comments"]);
|
|
|
5723
5860
|
*/
|
|
5724
5861
|
function isentinel(factoryOptions, ...userConfigs) {
|
|
5725
5862
|
const options = factoryOptions ?? { name: "isentinel" };
|
|
5726
|
-
const { categories, componentExts: componentExtensions = [], e18e: enableE18e = true, env, eslintPlugin: enableEslintPlugin = false, formatters, gitignore: enableGitignore = true, globals, ignores, jsdoc: enableJsdoc = true, jsPlugins: userJsPlugins, jsx: enableJsx = true, options: linterOptions, oxc: enableOxc = true, react: enableReact = false, root: customRootGlobs, rules = {}, spellCheck: enableSpellCheck, test: enableTest = false } = options;
|
|
5863
|
+
const { categories, componentExts: componentExtensions = [], e18e: enableE18e = true, env, eslintPlugin: enableEslintPlugin = false, formatters, gitignore: enableGitignore = true, globals, ignores, jsdoc: enableJsdoc = true, jsPlugins: userJsPlugins, jsx: enableJsx = true, options: linterOptions, oxc: enableOxc = true, react: enableReact = false, root: customRootGlobs, rules = {}, spellCheck: enableSpellCheck, test: enableTest = false, warnDroppedOverrides: enableDroppedOverrideWarning = true } = options;
|
|
5727
5864
|
const rootGlobs = mergeGlobs(GLOB_ROOT, customRootGlobs);
|
|
5728
5865
|
const enableRoblox = options.roblox !== false;
|
|
5729
5866
|
const nativeOnly = userJsPlugins === false;
|
|
@@ -5839,6 +5976,7 @@ function isentinel(factoryOptions, ...userConfigs) {
|
|
|
5839
5976
|
if (enableReact !== false) {
|
|
5840
5977
|
const reactOptions = typeof enableReact === "object" ? enableReact : {};
|
|
5841
5978
|
configs.push(oxlintReact({
|
|
5979
|
+
roblox: enableRoblox,
|
|
5842
5980
|
stylistic: stylisticOptions,
|
|
5843
5981
|
...reactOptions
|
|
5844
5982
|
}));
|
|
@@ -5907,9 +6045,12 @@ function isentinel(factoryOptions, ...userConfigs) {
|
|
|
5907
6045
|
if (override.excludeFiles !== void 0) override.excludeFiles = override.excludeFiles.map(anchorOxlintGlob);
|
|
5908
6046
|
overrides.push(override);
|
|
5909
6047
|
}
|
|
6048
|
+
const removedRules = /* @__PURE__ */ new Set();
|
|
5910
6049
|
for (const fragment of configs.flat()) {
|
|
5911
6050
|
if (nativeOnly && droppedByNativeOnly(fragment)) {
|
|
5912
6051
|
if (fragment.settings) Object.assign(mergedSettings, fragment.settings);
|
|
6052
|
+
const fragmentRules = Object.keys(fragment.rules ?? {});
|
|
6053
|
+
for (const rule of fragmentRules) removedRules.add(rule);
|
|
5913
6054
|
continue;
|
|
5914
6055
|
}
|
|
5915
6056
|
mergeFragment(fragment);
|
|
@@ -5933,12 +6074,21 @@ function isentinel(factoryOptions, ...userConfigs) {
|
|
|
5933
6074
|
});
|
|
5934
6075
|
for (const userConfig of userConfigs) mergeFragment(userConfig);
|
|
5935
6076
|
if (Array.isArray(userJsPlugins)) for (const jsPlugin of userJsPlugins) jsPlugins.set(jsPluginKey(jsPlugin), jsPlugin);
|
|
5936
|
-
if (nativeOnly)
|
|
6077
|
+
if (nativeOnly) {
|
|
6078
|
+
const stripped = stripUnregisteredPluginRules(overrides, /* @__PURE__ */ new Set([...nativePlugins, ...jsPlugins.keys()]));
|
|
6079
|
+
for (const rule of stripped) removedRules.add(rule);
|
|
6080
|
+
}
|
|
5937
6081
|
scopeOverridePlugins(overrides, globalPlugins);
|
|
5938
6082
|
if (defaultSeverity) {
|
|
5939
6083
|
const severityExcludeRules = /* @__PURE__ */ new Set(["sonar/todo-tag"]);
|
|
5940
6084
|
for (const override of overrides) if (override.rules) override.rules = overrideRuleSeverity(override.rules, defaultSeverity, severityExcludeRules);
|
|
5941
6085
|
}
|
|
6086
|
+
const { dropped, emitted } = takeOverrideDiagnostics();
|
|
6087
|
+
for (const rule of removedRules) if (emitted.has(rule)) dropped.push({
|
|
6088
|
+
reason: "native-only",
|
|
6089
|
+
rule
|
|
6090
|
+
});
|
|
6091
|
+
if (enableDroppedOverrideWarning) warnDroppedOverrides(dropped);
|
|
5942
6092
|
return defineConfig({
|
|
5943
6093
|
categories: {
|
|
5944
6094
|
...DEFAULT_CATEGORIES,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isentinel/eslint-config",
|
|
3
|
-
"version": "6.0.0-beta.
|
|
3
|
+
"version": "6.0.0-beta.28",
|
|
4
4
|
"description": "iSentinel's ESLint config",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"eslint-config",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"eslint-plugin-better-max-params": "1.0.0",
|
|
77
77
|
"eslint-plugin-comment-length": "2.3.1",
|
|
78
78
|
"eslint-plugin-de-morgan": "2.1.3",
|
|
79
|
-
"eslint-plugin-flawless": "1.4.
|
|
79
|
+
"eslint-plugin-flawless": "1.4.2",
|
|
80
80
|
"eslint-plugin-format-lua": "2.0.0",
|
|
81
81
|
"eslint-plugin-import-lite": "0.6.0",
|
|
82
82
|
"eslint-plugin-jsdoc": "63.2.0",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"typescript": "6.0.3",
|
|
143
143
|
"unplugin-unused": "0.5.7",
|
|
144
144
|
"vitest": "4.1.10",
|
|
145
|
-
"@isentinel/eslint-config": "6.0.0-beta.
|
|
145
|
+
"@isentinel/eslint-config": "6.0.0-beta.28"
|
|
146
146
|
},
|
|
147
147
|
"peerDependencies": {
|
|
148
148
|
"@vitest/eslint-plugin": "^1.6.4",
|