@oxlint/migrate 1.48.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as preFixForJsPlugins, f as nurseryRules, p as rules_exports, u as isOffValue } from "../settings-DozKYNAk.mjs";
2
+ import { a as preFixForJsPlugins, f as buildUnsupportedRuleExplanations, m as rules_exports, p as nurseryRules, u as isOffValue } from "../settings-Bb6227Gq.mjs";
3
3
  import main from "../src/index.mjs";
4
4
  import { program } from "commander";
5
5
  import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
@@ -33,7 +33,7 @@ const loadESLintConfig = async (filePath) => {
33
33
 
34
34
  //#endregion
35
35
  //#region package.json
36
- var version = "1.48.0";
36
+ var version = "1.49.0";
37
37
 
38
38
  //#endregion
39
39
  //#region src/walker/comments/replaceRuleDirectiveComment.ts
@@ -278,6 +278,7 @@ var DefaultReporter = class {
278
278
  skippedRules = new Map([
279
279
  ["nursery", /* @__PURE__ */ new Set()],
280
280
  ["type-aware", /* @__PURE__ */ new Set()],
281
+ ["not-implemented", /* @__PURE__ */ new Set()],
281
282
  ["unsupported", /* @__PURE__ */ new Set()],
282
283
  ["js-plugins", /* @__PURE__ */ new Set()]
283
284
  ]);
@@ -297,6 +298,7 @@ var DefaultReporter = class {
297
298
  const result = {
298
299
  nursery: [],
299
300
  "type-aware": [],
301
+ "not-implemented": [],
300
302
  "js-plugins": [],
301
303
  unsupported: []
302
304
  };
@@ -307,6 +309,7 @@ var DefaultReporter = class {
307
309
 
308
310
  //#endregion
309
311
  //#region bin/output-formatter.ts
312
+ const unsupportedRuleExplanations = buildUnsupportedRuleExplanations();
310
313
  const CATEGORY_METADATA = {
311
314
  nursery: {
312
315
  label: "Nursery",
@@ -320,7 +323,14 @@ const CATEGORY_METADATA = {
320
323
  label: "JS Plugins",
321
324
  description: "Requires JS plugins:"
322
325
  },
323
- unsupported: { label: "Unsupported" }
326
+ "not-implemented": {
327
+ label: "Not Implemented",
328
+ description: "Not yet in oxlint:"
329
+ },
330
+ unsupported: {
331
+ label: "Unsupported",
332
+ description: "Won't be implemented:"
333
+ }
324
334
  };
325
335
  const MAX_LABEL_LENGTH = Math.max(...Object.values(CATEGORY_METADATA).map((meta) => meta.label.length));
326
336
  /**
@@ -336,7 +346,8 @@ function formatCategorySummary(count, category, rules, showAll) {
336
346
  return ` - ${String(count).padStart(3)} ${meta.label.padEnd(MAX_LABEL_LENGTH)} (${prefix}${exampleList}${suffix})\n`;
337
347
  }
338
348
  let output = ` - ${count} ${meta.label}\n`;
339
- for (const rule of rules) output += ` - ${rule}\n`;
349
+ for (const rule of rules) if (category === "unsupported" && unsupportedRuleExplanations[rule]) output += ` - ${rule}: ${unsupportedRuleExplanations[rule]}\n`;
350
+ else output += ` - ${rule}\n`;
340
351
  return output;
341
352
  }
342
353
  /**
@@ -360,18 +371,20 @@ function formatMigrationOutput(data) {
360
371
  const byCategory = data.skippedRulesByCategory;
361
372
  const nurseryCount = byCategory.nursery.length;
362
373
  const typeAwareCount = byCategory["type-aware"].length;
374
+ const notImplementedCount = byCategory["not-implemented"].length;
363
375
  const unsupportedCount = byCategory.unsupported.length;
364
376
  const jsPluginsCount = byCategory["js-plugins"].length;
365
- const totalSkipped = nurseryCount + typeAwareCount + unsupportedCount + jsPluginsCount;
377
+ const totalSkipped = nurseryCount + typeAwareCount + notImplementedCount + unsupportedCount + jsPluginsCount;
366
378
  if (totalSkipped > 0) {
367
379
  output += `\n Skipped ${totalSkipped} rules:\n`;
368
380
  if (nurseryCount > 0) output += formatCategorySummary(nurseryCount, "nursery", byCategory.nursery, showAll);
369
381
  if (typeAwareCount > 0) output += formatCategorySummary(typeAwareCount, "type-aware", byCategory["type-aware"], showAll);
370
382
  if (jsPluginsCount > 0) output += formatCategorySummary(jsPluginsCount, "js-plugins", byCategory["js-plugins"], showAll);
383
+ if (notImplementedCount > 0) output += formatCategorySummary(notImplementedCount, "not-implemented", byCategory["not-implemented"], showAll);
371
384
  if (unsupportedCount > 0) output += formatCategorySummary(unsupportedCount, "unsupported", byCategory.unsupported, showAll);
372
385
  if (!showAll) {
373
386
  const maxExamples = 3;
374
- if (nurseryCount > maxExamples || typeAwareCount > maxExamples || unsupportedCount > maxExamples || jsPluginsCount > maxExamples) output += `\n Tip: Use --details to see the full list.\n`;
387
+ if (nurseryCount > maxExamples || typeAwareCount > maxExamples || notImplementedCount > maxExamples || unsupportedCount > maxExamples || jsPluginsCount > maxExamples) output += `\n Tip: Use --details to see the full list.\n`;
375
388
  }
376
389
  const missingFlags = detectMissingFlags(byCategory, data.cliOptions);
377
390
  if (missingFlags.length > 0) {
@@ -391,6 +391,7 @@ const styleRules = [
391
391
  "jest/prefer-jest-mocked",
392
392
  "jest/prefer-lowercase-title",
393
393
  "jest/prefer-mock-promise-shorthand",
394
+ "jest/prefer-mock-return-shorthand",
394
395
  "jest/prefer-spy-on",
395
396
  "jest/prefer-strict-equal",
396
397
  "jest/prefer-to-be",
@@ -484,10 +485,12 @@ const styleRules = [
484
485
  "vitest/consistent-test-filename",
485
486
  "vitest/consistent-vitest-vi",
486
487
  "vitest/no-import-node-test",
488
+ "vitest/no-importing-vitest-globals",
487
489
  "vitest/prefer-called-once",
488
490
  "vitest/prefer-called-times",
489
491
  "vitest/prefer-describe-function-title",
490
492
  "vitest/prefer-expect-type-of",
493
+ "vitest/prefer-import-in-mock",
491
494
  "vitest/prefer-to-be-falsy",
492
495
  "vitest/prefer-to-be-object",
493
496
  "vitest/prefer-to-be-truthy",
@@ -535,6 +538,7 @@ const styleRules = [
535
538
  "vitest/prefer-hooks-on-top",
536
539
  "vitest/prefer-lowercase-title",
537
540
  "vitest/prefer-mock-promise-shorthand",
541
+ "vitest/prefer-mock-return-shorthand",
538
542
  "vitest/prefer-spy-on",
539
543
  "vitest/prefer-strict-equal",
540
544
  "vitest/prefer-to-be",
@@ -622,6 +626,7 @@ const restrictionRules = [
622
626
  "no-restricted-imports",
623
627
  "no-sequences",
624
628
  "no-undefined",
629
+ "no-use-before-define",
625
630
  "no-var",
626
631
  "no-void",
627
632
  "unicode-bom",
@@ -638,6 +643,7 @@ const restrictionRules = [
638
643
  "jsdoc/empty-tags",
639
644
  "jsx-a11y/anchor-ambiguous-text",
640
645
  "node/no-new-require",
646
+ "node/no-path-concat",
641
647
  "node/no-process-env",
642
648
  "promise/catch-or-return",
643
649
  "promise/spec-only",
@@ -661,7 +667,6 @@ const restrictionRules = [
661
667
  "@typescript-eslint/no-non-null-assertion",
662
668
  "@typescript-eslint/no-require-imports",
663
669
  "@typescript-eslint/no-restricted-types",
664
- "@typescript-eslint/no-use-before-define",
665
670
  "@typescript-eslint/no-var-requires",
666
671
  "@typescript-eslint/non-nullable-type-assertion-style",
667
672
  "@typescript-eslint/prefer-literal-enum-member",
@@ -685,6 +690,7 @@ const restrictionRules = [
685
690
  "@typescript-eslint/class-methods-use-this",
686
691
  "@typescript-eslint/no-empty-function",
687
692
  "@typescript-eslint/no-restricted-imports",
693
+ "@typescript-eslint/no-use-before-define",
688
694
  "import-x/extensions",
689
695
  "import-x/no-amd",
690
696
  "import-x/no-commonjs",
@@ -695,6 +701,7 @@ const restrictionRules = [
695
701
  "import-x/no-webpack-loader-syntax",
696
702
  "import-x/unambiguous",
697
703
  "n/no-new-require",
704
+ "n/no-path-concat",
698
705
  "n/no-process-env",
699
706
  "react-refresh/only-export-components"
700
707
  ];
@@ -922,8 +929,20 @@ const nurseryRules = [
922
929
  "import/named",
923
930
  "promise/no-return-in-finally",
924
931
  "react/require-render-return",
932
+ "@typescript-eslint/consistent-return",
933
+ "@typescript-eslint/consistent-type-exports",
934
+ "@typescript-eslint/dot-notation",
925
935
  "@typescript-eslint/no-unnecessary-condition",
936
+ "@typescript-eslint/no-unnecessary-qualifier",
937
+ "@typescript-eslint/no-unnecessary-type-parameters",
938
+ "@typescript-eslint/no-useless-default-assignment",
939
+ "@typescript-eslint/prefer-find",
926
940
  "@typescript-eslint/prefer-optional-chain",
941
+ "@typescript-eslint/prefer-readonly",
942
+ "@typescript-eslint/prefer-readonly-parameter-types",
943
+ "@typescript-eslint/prefer-regexp-exec",
944
+ "@typescript-eslint/prefer-string-starts-ends-with",
945
+ "@typescript-eslint/strict-void-return",
927
946
  "import-x/export",
928
947
  "import-x/named"
929
948
  ];
@@ -942,6 +961,9 @@ const perfRules = [
942
961
  ];
943
962
  const typeAwareRules = [
944
963
  "@typescript-eslint/await-thenable",
964
+ "@typescript-eslint/consistent-return",
965
+ "@typescript-eslint/consistent-type-exports",
966
+ "@typescript-eslint/dot-notation",
945
967
  "@typescript-eslint/no-array-delete",
946
968
  "@typescript-eslint/no-base-to-string",
947
969
  "@typescript-eslint/no-confusing-void-expression",
@@ -957,9 +979,11 @@ const typeAwareRules = [
957
979
  "@typescript-eslint/no-redundant-type-constituents",
958
980
  "@typescript-eslint/no-unnecessary-boolean-literal-compare",
959
981
  "@typescript-eslint/no-unnecessary-condition",
982
+ "@typescript-eslint/no-unnecessary-qualifier",
960
983
  "@typescript-eslint/no-unnecessary-template-expression",
961
984
  "@typescript-eslint/no-unnecessary-type-arguments",
962
985
  "@typescript-eslint/no-unnecessary-type-assertion",
986
+ "@typescript-eslint/no-unnecessary-type-parameters",
963
987
  "@typescript-eslint/no-unsafe-argument",
964
988
  "@typescript-eslint/no-unsafe-assignment",
965
989
  "@typescript-eslint/no-unsafe-call",
@@ -968,14 +992,20 @@ const typeAwareRules = [
968
992
  "@typescript-eslint/no-unsafe-return",
969
993
  "@typescript-eslint/no-unsafe-type-assertion",
970
994
  "@typescript-eslint/no-unsafe-unary-minus",
995
+ "@typescript-eslint/no-useless-default-assignment",
971
996
  "@typescript-eslint/non-nullable-type-assertion-style",
972
997
  "@typescript-eslint/only-throw-error",
998
+ "@typescript-eslint/prefer-find",
973
999
  "@typescript-eslint/prefer-includes",
974
1000
  "@typescript-eslint/prefer-nullish-coalescing",
975
1001
  "@typescript-eslint/prefer-optional-chain",
976
1002
  "@typescript-eslint/prefer-promise-reject-errors",
1003
+ "@typescript-eslint/prefer-readonly",
1004
+ "@typescript-eslint/prefer-readonly-parameter-types",
977
1005
  "@typescript-eslint/prefer-reduce-type-parameter",
1006
+ "@typescript-eslint/prefer-regexp-exec",
978
1007
  "@typescript-eslint/prefer-return-this-type",
1008
+ "@typescript-eslint/prefer-string-starts-ends-with",
979
1009
  "@typescript-eslint/promise-function-async",
980
1010
  "@typescript-eslint/related-getter-setter-pairs",
981
1011
  "@typescript-eslint/require-array-sort-compare",
@@ -984,6 +1014,7 @@ const typeAwareRules = [
984
1014
  "@typescript-eslint/restrict-template-expressions",
985
1015
  "@typescript-eslint/return-await",
986
1016
  "@typescript-eslint/strict-boolean-expressions",
1017
+ "@typescript-eslint/strict-void-return",
987
1018
  "@typescript-eslint/switch-exhaustiveness-check",
988
1019
  "@typescript-eslint/unbound-method",
989
1020
  "@typescript-eslint/use-unknown-in-catch-callback-variable"
@@ -1072,9 +1103,403 @@ const enableJsPluginRule = (targetConfig, rule, ruleEntry) => {
1072
1103
  return true;
1073
1104
  };
1074
1105
 
1106
+ //#endregion
1107
+ //#region src/generated/unsupported-rules.json
1108
+ var unsupportedRules = {
1109
+ "eslint/no-dupe-args": "Superseded by strict mode.",
1110
+ "eslint/no-octal": "Superseded by strict mode.",
1111
+ "eslint/no-octal-escape": "Superseded by strict mode.",
1112
+ "eslint/no-new-symbol": "Deprecated as of ESLint v9, but for a while disable manually.",
1113
+ "eslint/no-undef-init": "#6456, `unicorn/no-useless-undefined` covers this case.",
1114
+ "import/no-unresolved": "Will always contain false positives due to module resolution complexity.",
1115
+ "promise/no-native": "Handled by `eslint/no-undef`.",
1116
+ "unicorn/no-for-loop": "This rule suggests using `Array.prototype.entries` which is slow https://github.com/oxc-project/oxc/issues/11311, furthermore, `typescript/prefer-for-of` covers most cases.",
1117
+ "eslint/no-negated-in-lhs": "Replaced by `eslint/no-unsafe-negation`, which we support.",
1118
+ "eslint/no-catch-shadow": "Replaced by `eslint/no-shadow`.",
1119
+ "eslint/id-blacklist": "Replaced by `eslint/id-denylist`.",
1120
+ "eslint/no-new-object": "Replaced by `eslint/no-object-constructor`, which we support.",
1121
+ "eslint/no-native-reassign": "Replaced by `eslint/no-global-assign`, which we support.",
1122
+ "n/shebang": "Replaced by `node/hashbang`.",
1123
+ "n/no-hide-core-modules": "This rule is deprecated in eslint-plugin-n for being inherently incorrect, no need for us to implement it.",
1124
+ "unicorn/no-array-push-push": "Replaced by `unicorn/prefer-single-call`.",
1125
+ "import/imports-first": "Replaced by `import/first`, which we support.",
1126
+ "eslint/dot-notation": "Use `typescript/dot-notation` instead, which we support as a type-aware rule.",
1127
+ "eslint/consistent-return": "Use `typescript/consistent-return` instead, which we support as a type-aware rule.",
1128
+ "eslint/no-useless-default-assignment": "Use `typescript/no-useless-default-assignment` instead, which will be supported as a type-aware rule.",
1129
+ "react/jsx-sort-default-props": "Replaced by `react/sort-default-props`.",
1130
+ "vitest/no-done-callback": "[Deprecated in eslint-plugin-vitest](https://github.com/vitest-dev/eslint-plugin-vitest/issues/158).",
1131
+ "eslint/no-return-await": "Deprecated, not recommended anymore by ESLint.",
1132
+ "eslint/prefer-reflect": "Deprecated, not recommended anymore by ESLint.",
1133
+ "jsx-a11y/accessible-emoji": "Deprecated.",
1134
+ "jsx-a11y/label-has-for": "Deprecated, replaced by `jsx-a11y/label-has-associated-control`.",
1135
+ "jsx-a11y/no-onchange": "Deprecated, based on behavior of very old browsers, and so no longer necessary.",
1136
+ "eslint/camelcase": "Superseded by `@typescript-eslint/naming-convention`, which accomplishes the same behavior with more flexibility.",
1137
+ "eslint/no-invalid-this": "Superseded by TypeScript's [`noImplicitThis`](https://www.typescriptlang.org/tsconfig/#noImplicitThis) compiler option (enabled by `strict` mode).",
1138
+ "react/jsx-uses-react": "It is unnecessary to import React for JSX/TSX files with React 17+ when using the new JSX transform. This rule is also not easy to implement in Oxlint as it modifies the behavior of another rule.",
1139
+ "import/no-internal-modules": "Not necessary to implement this rule as we already have `eslint/no-restricted-imports`, which is able to cover the same use-cases.",
1140
+ "n/prefer-node-protocol": "No need to implement, already implemented by `unicorn/prefer-node-protocol`.",
1141
+ "n/no-process-exit": "No need to implement, already implemented by `unicorn/no-process-exit`.",
1142
+ "n/file-extension-in-import": "No need to implement, already implemented by `import/extensions`.",
1143
+ "import/enforce-node-protocol-usage": "No need to implement, already implemented by `unicorn/prefer-node-protocol`.",
1144
+ "import/no-deprecated": "No need to implement, already implemented by `typescript/no-deprecated` via tsgolint.",
1145
+ "n/no-restricted-import": "No need to implement, already implemented by `no-restricted-imports` rule.",
1146
+ "n/no-restricted-require": "No need to implement, already implemented by `no-restricted-imports` rule.",
1147
+ "jsdoc/type-formatting": "Experimental rule in the original plugin, may reconsider once stable.",
1148
+ "jsdoc/convert-to-jsdoc-comments": "Experimental rule in the original plugin, may reconsider once stable.",
1149
+ "jsdoc/check-examples": "Deprecated.",
1150
+ "jest/no-unnecessary-assertion": "Requires type information. Not currently possible to implement in oxlint.",
1151
+ "jest/unbound-method": "Requires type information. Not currently possible to implement in oxlint.",
1152
+ "jest/no-error-equal": "Requires type information. Not currently possible to implement in oxlint.",
1153
+ "vitest/unbound-method": "Requires type information. Not currently possible to implement in oxlint.",
1154
+ "vitest/prefer-vi-mocked": "Requires type information. Not currently possible to implement in oxlint.",
1155
+ "eslint/no-process-env": "Deprecated, replaced by `node/no-process-env`, which we already support.",
1156
+ "eslint/no-new-require": "Deprecated, replaced by `node/no-new-require`, which we already support.",
1157
+ "eslint/no-buffer-constructor": "Replaced by `node/no-deprecated-api`.",
1158
+ "eslint/no-path-concat": "Deprecated, replaced by `node/no-path-concat`.",
1159
+ "eslint/no-sync": "Deprecated, replaced by `node/no-sync`.",
1160
+ "eslint/no-process-exit": "Deprecated, replaced by `node/no-process-exit`.",
1161
+ "eslint/no-restricted-modules": "Deprecated, replaced by `node/no-restricted-require`.",
1162
+ "eslint/no-mixed-requires": "Deprecated, replaced by `node/no-mixed-requires`.",
1163
+ "eslint/global-require": "Deprecated, replaced by `node/global-require`.",
1164
+ "eslint/handle-callback-err": "Deprecated, replaced by `node/handle-callback-err`.",
1165
+ "eslint/callback-return": "Deprecated, replaced by `node/callback-return`.",
1166
+ "react/jsx-equals-spacing": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1167
+ "react/jsx-curly-spacing": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1168
+ "react/jsx-indent": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1169
+ "react/jsx-indent-props": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1170
+ "react/jsx-newline": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1171
+ "react/jsx-wrap-multilines": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1172
+ "react/jsx-props-no-multi-spaces": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1173
+ "react/jsx-tag-spacing": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1174
+ "react/jsx-space-before-closing": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1175
+ "react/jsx-closing-tag-location": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1176
+ "react/jsx-closing-bracket-location": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1177
+ "react/jsx-first-prop-new-line": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1178
+ "react/jsx-max-props-per-line": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1179
+ "react/jsx-curly-newline": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1180
+ "react/jsx-child-element-spacing": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1181
+ "react/jsx-one-expression-per-line": "Stylistic rule from eslint-plugin-react. Should use Oxfmt for stylistic rules, or use JS Plugins to enable this rule.",
1182
+ "react/config": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1183
+ "react/error-boundaries": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1184
+ "react/component-hook-factories": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1185
+ "react/gating": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1186
+ "react/globals": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1187
+ "react/immutability": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1188
+ "react/preserve-manual-memoization": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1189
+ "react/purity": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1190
+ "react/refs": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1191
+ "react/set-state-in-effect": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1192
+ "react/set-state-in-render": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1193
+ "react/static-components": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1194
+ "react/unsupported-syntax": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1195
+ "react/use-memo": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1196
+ "react/incompatible-library": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1197
+ "react/automatic-effect-dependencies": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1198
+ "react/capitalized-calls": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1199
+ "react/fbt": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1200
+ "react/fire": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1201
+ "react/invariant": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1202
+ "react/hooks": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1203
+ "react/memoized-effect-dependencies": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1204
+ "react/no-deriving-state-in-effects": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1205
+ "react/rule-suppression": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1206
+ "react/syntax": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1207
+ "react/todo": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1208
+ "react/void-use-memo": "React Compiler rules will not be implemented in oxlint for now, as they require integration with the react compiler itself. These rules can be used via JS Plugins if desired.",
1209
+ "react/default-props-match-prop-types": "This rule only applies to legacy class components, which are not widely used in modern React. Also stylistic.",
1210
+ "react/forbid-foreign-prop-types": "PropTypes are ignored in React 19, and this rule is only relevant for very specific use-cases involving it.",
1211
+ "react/forbid-prop-types": "PropTypes are ignored in React 19, and this rule is only relevant if you use the PropTypes package.",
1212
+ "react/no-access-state-in-setstate": "This rule only applies to legacy class components, which are not widely used in modern React.",
1213
+ "react/no-unused-class-component-methods": "This rule only applies to legacy class components, which are not widely used in modern React. It is also complex to implement.",
1214
+ "react/no-unused-state": "This rule only applies to legacy class components, which are not widely used in modern React. It is also complex to implement.",
1215
+ "react/no-unused-prop-types": "PropTypes are ignored in React 19, and TypeScript + the `no-unused-vars` rule already catches unused props in most cases.",
1216
+ "react/prefer-exact-props": "This rule is not relevant for TypeScript code, and PropTypes are ignored in React 19.",
1217
+ "react/sort-comp": "This rule only applies to legacy class components, which are not widely used in modern React. Also stylistic.",
1218
+ "react/sort-default-props": "`defaultProps` is removed entirely in React 19, this rule is no longer relevant. Also stylistic.",
1219
+ "react/sort-prop-types": "PropTypes are ignored in React 19, and this rule is only relevant if you use the PropTypes package. Also stylistic.",
1220
+ "react/static-property-placement": "This rule only applies to legacy class components, which are not widely used in modern React.",
1221
+ "typescript/sort-type-constituents": "Deprecated, replaced by `perfectionist/sort-intersection-types` and `perfectionist/sort-union-types` rules.",
1222
+ "typescript/no-type-alias": "Deprecated, replaced by `typescript-eslint/consistent-type-definitions` rule.",
1223
+ "typescript/typedef": "Deprecated.",
1224
+ "typescript/no-invalid-this": "This rule is checked by the TypeScript compiler when the `noImplicitThis` compiler option is enabled. In TypeScript versions prior to 6.0, this compiler option is not enabled by default, however it is a best practice to enable it.",
1225
+ "eslint/array-bracket-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1226
+ "eslint/array-bracket-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1227
+ "eslint/array-element-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1228
+ "eslint/arrow-parens": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1229
+ "eslint/arrow-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1230
+ "eslint/block-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1231
+ "eslint/brace-style": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1232
+ "eslint/comma-dangle": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1233
+ "eslint/comma-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1234
+ "eslint/comma-style": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1235
+ "eslint/computed-property-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1236
+ "eslint/dot-location": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1237
+ "eslint/eol-last": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1238
+ "eslint/func-call-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1239
+ "eslint/function-call-argument-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1240
+ "eslint/function-paren-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1241
+ "eslint/generator-star-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1242
+ "eslint/implicit-arrow-linebreak": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1243
+ "eslint/indent-legacy": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1244
+ "eslint/indent": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1245
+ "eslint/jsx-quotes": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1246
+ "eslint/key-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1247
+ "eslint/keyword-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1248
+ "eslint/line-comment-position": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1249
+ "eslint/linebreak-style": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1250
+ "eslint/lines-around-comment": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1251
+ "eslint/lines-around-directive": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1252
+ "eslint/lines-between-class-members": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1253
+ "eslint/max-len": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1254
+ "eslint/max-statements-per-line": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1255
+ "eslint/multiline-comment-style": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1256
+ "eslint/multiline-ternary": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1257
+ "eslint/new-parens": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1258
+ "eslint/newline-after-var": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1259
+ "eslint/newline-before-return": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1260
+ "eslint/newline-per-chained-call": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1261
+ "eslint/no-confusing-arrow": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1262
+ "eslint/no-extra-parens": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1263
+ "eslint/no-extra-semi": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1264
+ "eslint/no-floating-decimal": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1265
+ "eslint/no-mixed-operators": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1266
+ "eslint/no-mixed-spaces-and-tabs": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1267
+ "eslint/no-multi-spaces": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1268
+ "eslint/no-multiple-empty-lines": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1269
+ "eslint/no-spaced-func": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1270
+ "eslint/no-tabs": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1271
+ "eslint/no-trailing-spaces": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1272
+ "eslint/no-whitespace-before-property": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1273
+ "eslint/nonblock-statement-body-position": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1274
+ "eslint/object-curly-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1275
+ "eslint/object-curly-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1276
+ "eslint/object-property-newline": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1277
+ "eslint/one-var-declaration-per-line": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1278
+ "eslint/operator-linebreak": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1279
+ "eslint/padded-blocks": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1280
+ "eslint/padding-line-between-statements": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1281
+ "eslint/quote-props": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1282
+ "eslint/quotes": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1283
+ "eslint/rest-spread-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1284
+ "eslint/semi-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1285
+ "eslint/semi-style": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1286
+ "eslint/semi": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1287
+ "eslint/space-before-blocks": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1288
+ "eslint/space-before-function-paren": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1289
+ "eslint/space-in-parens": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1290
+ "eslint/space-infix-ops": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1291
+ "eslint/space-unary-ops": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1292
+ "eslint/spaced-comment": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1293
+ "eslint/switch-colon-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1294
+ "eslint/template-curly-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1295
+ "eslint/template-tag-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1296
+ "eslint/wrap-iife": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1297
+ "eslint/wrap-regex": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1298
+ "eslint/yield-star-spacing": "Deprecated stylistic rule, can be used via the stylistic eslint plugin as a JS Plugin if necessary.",
1299
+ "react/jsx-uses-vars": "Handled by `eslint/no-unused-vars`, which already evaluates whether vars are used in JSX.",
1300
+ "unicorn/no-named-default": "Implemented via `import/no-named-default`.",
1301
+ "vue/no-lone-template": "Not currently possible, as it requires Vue template parsing.",
1302
+ "vue/no-v-html": "Not currently possible, as it requires Vue template parsing.",
1303
+ "vue/this-in-template": "Not currently possible, as it requires Vue template parsing.",
1304
+ "vue/array-bracket-newline": "Stylistic rule.",
1305
+ "vue/array-bracket-spacing": "Stylistic rule.",
1306
+ "vue/array-element-newline": "Stylistic rule.",
1307
+ "vue/arrow-spacing": "Stylistic rule.",
1308
+ "vue/attribute-hyphenation": "Not currently possible, as it requires Vue template parsing.",
1309
+ "vue/attributes-order": "Not currently possible, as it requires Vue template parsing.",
1310
+ "vue/block-lang": "Not currently possible, as it requires Vue template parsing.",
1311
+ "vue/block-order": "Not currently possible, as it requires Vue template parsing.",
1312
+ "vue/block-spacing": "Stylistic rule.",
1313
+ "vue/block-tag-newline": "Stylistic rule.",
1314
+ "vue/brace-style": "Stylistic rule.",
1315
+ "vue/camelcase": "Not currently possible, as it requires Vue template parsing.",
1316
+ "vue/comma-dangle": "Stylistic rule.",
1317
+ "vue/comma-spacing": "Stylistic rule.",
1318
+ "vue/comma-style": "Stylistic rule.",
1319
+ "vue/comment-directive": "Not currently possible, as it requires Vue template parsing. Also possibly unnecessary as its own rule, as oxlint directives should be implemented at the same time as Vue template parsing.",
1320
+ "vue/component-name-in-template-casing": "Not currently possible, as it requires Vue template parsing.",
1321
+ "vue/custom-event-name-casing": "Not currently possible, as it requires Vue template parsing.",
1322
+ "vue/define-macros-order": "Stylistic rule.",
1323
+ "vue/dot-location": "Not currently possible, as it requires Vue template parsing.",
1324
+ "vue/dot-notation": "Not currently possible, as it requires Vue template parsing.",
1325
+ "vue/enforce-style-attribute": "Not currently possible, as it requires Vue template parsing.",
1326
+ "vue/eqeqeq": "Not currently possible, as it requires Vue template parsing.",
1327
+ "vue/first-attribute-linebreak": "Stylistic rule.",
1328
+ "vue/func-call-spacing": "Stylistic rule.",
1329
+ "vue/html-button-has-type": "Not currently possible, as it requires Vue template parsing.",
1330
+ "vue/html-closing-bracket-newline": "Stylistic rule.",
1331
+ "vue/html-closing-bracket-spacing": "Stylistic rule.",
1332
+ "vue/html-comment-content-newline": "Stylistic rule.",
1333
+ "vue/html-comment-content-spacing": "Stylistic rule.",
1334
+ "vue/html-comment-indent": "Stylistic rule.",
1335
+ "vue/html-end-tags": "Not currently possible, as it requires Vue template parsing.",
1336
+ "vue/html-indent": "Stylistic rule.",
1337
+ "vue/html-quotes": "Stylistic rule.",
1338
+ "vue/html-self-closing": "Not currently possible, as it requires Vue template parsing.",
1339
+ "vue/key-spacing": "Stylistic rule.",
1340
+ "vue/keyword-spacing": "Stylistic rule.",
1341
+ "vue/max-attributes-per-line": "Stylistic rule.",
1342
+ "vue/max-len": "Not currently possible, as it requires Vue template parsing.",
1343
+ "vue/max-lines-per-block": "Not currently possible, as it requires Vue template parsing.",
1344
+ "vue/max-template-depth": "Not currently possible, as it requires Vue template parsing.",
1345
+ "vue/multiline-html-element-content-newline": "Not currently possible, as it requires Vue template parsing.",
1346
+ "vue/multiline-ternary": "Stylistic rule. Also not currently possible, as it requires Vue template parsing.",
1347
+ "vue/mustache-interpolation-spacing": "Stylistic rule.",
1348
+ "vue/new-line-between-multi-line-property": "Stylistic rule.",
1349
+ "vue/no-bare-strings-in-template": "Not currently possible, as it requires Vue template parsing.",
1350
+ "vue/no-child-content": "Not currently possible, as it requires Vue template parsing.",
1351
+ "vue/no-console": "Not currently possible, as it requires Vue template parsing.",
1352
+ "vue/no-constant-condition": "Not currently possible, as it requires Vue template parsing.",
1353
+ "vue/no-custom-modifiers-on-v-model": "Not currently possible, as it requires Vue template parsing.",
1354
+ "vue/no-deprecated-filter": "Not currently possible, as it requires Vue template parsing.",
1355
+ "vue/no-deprecated-functional-template": "Not currently possible, as it requires Vue template parsing.",
1356
+ "vue/no-deprecated-html-element-is": "Not currently possible, as it requires Vue template parsing.",
1357
+ "vue/no-deprecated-inline-template": "Not currently possible, as it requires Vue template parsing.",
1358
+ "vue/no-deprecated-router-link-tag-prop": "Not currently possible, as it requires Vue template parsing.",
1359
+ "vue/no-deprecated-scope-attribute": "Not currently possible, as it requires Vue template parsing.",
1360
+ "vue/no-deprecated-slot-attribute": "Not currently possible, as it requires Vue template parsing.",
1361
+ "vue/no-deprecated-slot-scope-attribute": "Not currently possible, as it requires Vue template parsing.",
1362
+ "vue/no-deprecated-v-bind-sync": "Not currently possible, as it requires Vue template parsing.",
1363
+ "vue/no-deprecated-v-is": "Not currently possible, as it requires Vue template parsing.",
1364
+ "vue/no-deprecated-v-on-native-modifier": "Not currently possible, as it requires Vue template parsing.",
1365
+ "vue/no-deprecated-v-on-number-modifiers": "Not currently possible, as it requires Vue template parsing.",
1366
+ "vue/no-dupe-v-else-if": "Not currently possible, as it requires Vue template parsing.",
1367
+ "vue/no-duplicate-attr-inheritance": "Not currently possible, as it requires Vue template parsing.",
1368
+ "vue/no-duplicate-attributes": "Not currently possible, as it requires Vue template parsing.",
1369
+ "vue/no-duplicate-class-names": "Not currently possible, as it requires Vue template parsing.",
1370
+ "vue/no-empty-component-block": "Not currently possible, as it requires Vue template and style parsing.",
1371
+ "vue/no-empty-pattern": "Not currently possible, as it requires Vue template parsing.",
1372
+ "vue/no-extra-parens": "Stylistic rule, and requires template parsing.",
1373
+ "vue/no-implicit-coercion": "Not currently possible, as it requires Vue template parsing.",
1374
+ "vue/no-literals-in-template": "Not currently possible, as it requires Vue template parsing.",
1375
+ "vue/no-loss-of-precision": "Not currently possible, as it requires Vue template parsing.",
1376
+ "vue/no-multi-spaces": "Stylistic rule.",
1377
+ "vue/no-multiple-objects-in-class": "Not currently possible, as it requires Vue template parsing.",
1378
+ "vue/no-multiple-template-root": "Not currently possible, as it requires Vue template parsing.",
1379
+ "vue/no-negated-condition": "Not currently possible, as it requires Vue template parsing.",
1380
+ "vue/no-negated-v-if-condition": "Not currently possible, as it requires Vue template parsing.",
1381
+ "vue/no-parsing-error": "Not currently possible, as it requires Vue template parsing.",
1382
+ "vue/no-restricted-block": "Not currently possible, as it requires Vue template parsing.",
1383
+ "vue/no-restricted-class": "Not currently possible, as it requires Vue template parsing.",
1384
+ "vue/no-restricted-html-elements": "Not currently possible, as it requires Vue template parsing.",
1385
+ "vue/no-restricted-static-attribute": "Not currently possible, as it requires Vue template parsing.",
1386
+ "vue/no-restricted-syntax": "Not currently possible, as it requires Vue template parsing.",
1387
+ "vue/no-restricted-v-bind": "Not currently possible, as it requires Vue template parsing.",
1388
+ "vue/no-restricted-v-on": "Not currently possible, as it requires Vue template parsing.",
1389
+ "vue/no-root-v-if": "Not currently possible, as it requires Vue template parsing.",
1390
+ "vue/no-spaces-around-equal-signs-in-attribute": "Stylistic rule.",
1391
+ "vue/no-sparse-arrays": "Not currently possible, as it requires Vue template parsing.",
1392
+ "vue/no-static-inline-styles": "Not currently possible, as it requires Vue template parsing.",
1393
+ "vue/no-template-key": "Not currently possible, as it requires Vue template parsing.",
1394
+ "vue/no-template-shadow": "Not currently possible, as it requires Vue template parsing.",
1395
+ "vue/no-template-target-blank": "Not currently possible, as it requires Vue template parsing.",
1396
+ "vue/no-textarea-mustache": "Not currently possible, as it requires Vue template parsing.",
1397
+ "vue/no-undef-components": "Not currently possible, as it requires Vue template parsing.",
1398
+ "vue/no-undef-directives": "Not currently possible, as it requires Vue template parsing.",
1399
+ "vue/no-undef-properties": "Not currently possible, as it requires Vue template parsing.",
1400
+ "vue/no-unsupported-features": "Cannot be kept up-to-date with Vue versions + requires template parsing.",
1401
+ "vue/no-unused-components": "Not currently possible, as it requires Vue template parsing.",
1402
+ "vue/no-unused-properties": "Not currently possible, as it requires Vue template parsing.",
1403
+ "vue/no-unused-refs": "Not currently possible, as it requires Vue template parsing.",
1404
+ "vue/no-unused-vars": "Not currently possible, as it requires Vue template parsing. May also prefer to cover this via the core no-unused-vars rule.",
1405
+ "vue/no-use-v-else-with-v-for": "Not currently possible, as it requires Vue template parsing.",
1406
+ "vue/no-use-v-if-with-v-for": "Not currently possible, as it requires Vue template parsing.",
1407
+ "vue/no-useless-concat": "Not currently possible, as it requires Vue template parsing.",
1408
+ "vue/no-useless-mustaches": "Not currently possible, as it requires Vue template parsing.",
1409
+ "vue/no-useless-template-attributes": "Not currently possible, as it requires Vue template parsing.",
1410
+ "vue/no-useless-v-bind": "Not currently possible, as it requires Vue template parsing.",
1411
+ "vue/no-v-text-v-html-on-component": "Not currently possible, as it requires Vue template parsing.",
1412
+ "vue/no-v-text": "Not currently possible, as it requires Vue template parsing.",
1413
+ "vue/no-v-for-template-key": "Not currently possible, as it requires Vue template parsing.",
1414
+ "vue/object-curly-newline": "Stylistic rule.",
1415
+ "vue/object-curly-spacing": "Stylistic rule.",
1416
+ "vue/object-property-newline": "Stylistic rule.",
1417
+ "vue/object-shorthand": "Not currently possible, as it requires Vue template parsing.",
1418
+ "vue/operator-linebreak": "Stylistic rule.",
1419
+ "vue/padding-line-between-blocks": "Stylistic rule.",
1420
+ "vue/padding-line-between-tags": "Stylistic rule.",
1421
+ "vue/padding-lines-in-component-definition": "Stylistic rule.",
1422
+ "vue/prefer-separate-static-class": "Not currently possible, as it requires Vue template parsing.",
1423
+ "vue/prefer-template": "Not currently possible, as it requires Vue template parsing.",
1424
+ "vue/prefer-true-attribute-shorthand": "Not currently possible, as it requires Vue template parsing.",
1425
+ "vue/quote-props": "Stylistic rule.",
1426
+ "vue/require-component-is": "Not currently possible, as it requires Vue template parsing.",
1427
+ "vue/require-explicit-emits": "Not currently possible, as it requires Vue template parsing.",
1428
+ "vue/require-explicit-slots": "Not currently possible, as it requires Vue template parsing.",
1429
+ "vue/require-toggle-inside-transition": "Not currently possible, as it requires Vue template parsing.",
1430
+ "vue/require-v-for-key": "Not currently possible, as it requires Vue template parsing.",
1431
+ "vue/restricted-component-names": "Not currently possible, as it requires Vue template parsing.",
1432
+ "vue/singleline-html-element-content-newline": "Not currently possible, as it requires Vue template parsing.",
1433
+ "vue/slot-name-casing": "Not currently possible, as it requires Vue template parsing.",
1434
+ "vue/space-in-parens": "Stylistic rule.",
1435
+ "vue/space-infix-ops": "Stylistic rule.",
1436
+ "vue/space-unary-ops": "Stylistic rule.",
1437
+ "vue/static-class-names-order": "Not currently possible, as it requires Vue template parsing.",
1438
+ "vue/template-curly-spacing": "Stylistic rule.",
1439
+ "vue/use-v-on-exact": "Not currently possible, as it requires Vue template parsing.",
1440
+ "vue/v-bind-style": "Not currently possible, as it requires Vue template parsing.",
1441
+ "vue/v-for-delimiter-style": "Not currently possible, as it requires Vue template parsing.",
1442
+ "vue/v-if-else-key": "Not currently possible, as it requires Vue template parsing.",
1443
+ "vue/v-on-event-hyphenation": "Not currently possible, as it requires Vue template parsing.",
1444
+ "vue/v-on-handler-style": "Not currently possible, as it requires Vue template parsing.",
1445
+ "vue/v-on-style": "Not currently possible, as it requires Vue template parsing.",
1446
+ "vue/v-slot-style": "Not currently possible, as it requires Vue template parsing.",
1447
+ "vue/valid-attribute-name": "Not currently possible, as it requires Vue template parsing.",
1448
+ "vue/valid-template-root": "Not currently possible, as it requires Vue template parsing.",
1449
+ "vue/valid-v-bind": "Not currently possible, as it requires Vue template parsing.",
1450
+ "vue/valid-v-cloak": "Not currently possible, as it requires Vue template parsing.",
1451
+ "vue/valid-v-else-if": "Not currently possible, as it requires Vue template parsing.",
1452
+ "vue/valid-v-else": "Not currently possible, as it requires Vue template parsing.",
1453
+ "vue/valid-v-for": "Not currently possible, as it requires Vue template parsing.",
1454
+ "vue/valid-v-html": "Not currently possible, as it requires Vue template parsing.",
1455
+ "vue/valid-v-if": "Not currently possible, as it requires Vue template parsing.",
1456
+ "vue/valid-v-is": "Not currently possible, as it requires Vue template parsing.",
1457
+ "vue/valid-v-memo": "Not currently possible, as it requires Vue template parsing.",
1458
+ "vue/valid-v-model": "Not currently possible, as it requires Vue template parsing.",
1459
+ "vue/valid-v-on": "Not currently possible, as it requires Vue template parsing.",
1460
+ "vue/valid-v-once": "Not currently possible, as it requires Vue template parsing.",
1461
+ "vue/valid-v-pre": "Not currently possible, as it requires Vue template parsing.",
1462
+ "vue/valid-v-show": "Not currently possible, as it requires Vue template parsing.",
1463
+ "vue/valid-v-slot": "Not currently possible, as it requires Vue template parsing.",
1464
+ "vue/valid-v-text": "Not currently possible, as it requires Vue template parsing.",
1465
+ "vue/no-v-for-template-key-on-child": "Deprecated.",
1466
+ "vue/no-v-model-argument": "Deprecated.",
1467
+ "vue/valid-v-bind-sync": "Deprecated.",
1468
+ "vue/valid-model-definition": "Deprecated."
1469
+ };
1470
+
1471
+ //#endregion
1472
+ //#region src/utilities.ts
1473
+ const isEqualDeep = (a, b) => {
1474
+ if (a === b) return true;
1475
+ const bothAreObjects = a && b && typeof a === "object" && typeof b === "object";
1476
+ return Boolean(bothAreObjects && Object.keys(a).length === Object.keys(b).length && Object.entries(a).every(([k, v]) => isEqualDeep(v, b[k])));
1477
+ };
1478
+ /**
1479
+ * Builds a lookup map of unsupported rule explanations.
1480
+ * Converts oxc-style rule keys (e.g. "eslint/no-dupe-args", "react/immutability")
1481
+ * to all matching ESLint-style keys, using rulesPrefixesForPlugins for aliases
1482
+ * (e.g. react → react-hooks/react-refresh, import → import-x, node → n).
1483
+ */
1484
+ function buildUnsupportedRuleExplanations() {
1485
+ const explanations = {};
1486
+ for (const [key, value] of Object.entries(unsupportedRules)) {
1487
+ const slashIdx = key.indexOf("/");
1488
+ const oxlintPlugin = key.slice(0, slashIdx);
1489
+ const ruleName = key.slice(slashIdx + 1);
1490
+ if (oxlintPlugin === "eslint") {
1491
+ explanations[ruleName] = value;
1492
+ continue;
1493
+ }
1494
+ for (const [eslintPrefix, plugin] of Object.entries(rulesPrefixesForPlugins)) if (plugin === oxlintPlugin) explanations[`${eslintPrefix}/${ruleName}`] = value;
1495
+ }
1496
+ return explanations;
1497
+ }
1498
+
1075
1499
  //#endregion
1076
1500
  //#region src/plugins_rules.ts
1077
1501
  const allRules = Object.values(rules_exports).flat();
1502
+ const unsupportedRuleExplanations = buildUnsupportedRuleExplanations();
1078
1503
  /**
1079
1504
  * checks if value is validSet, or if validSet is an array, check if value is first value of it
1080
1505
  */
@@ -1172,23 +1597,31 @@ const transformRuleEntry = (eslintConfig, targetConfig, baseConfig, options, ove
1172
1597
  else if (!isIgnoredPluginRule(rule)) targetConfig.rules[rule] = normalizedConfig;
1173
1598
  if (eslintConfig.files === void 0) {
1174
1599
  options?.reporter?.removeSkipped(rule, "js-plugins");
1600
+ options?.reporter?.removeSkipped(rule, "not-implemented");
1175
1601
  options?.reporter?.removeSkipped(rule, "unsupported");
1176
1602
  }
1177
1603
  continue;
1178
1604
  }
1179
- if (!enableJsPluginRule(targetConfig, rule, normalizedConfig)) options?.reporter?.markSkipped(rule, "unsupported");
1605
+ if (!enableJsPluginRule(targetConfig, rule, normalizedConfig)) {
1606
+ const category = unsupportedRuleExplanations[rule] ? "unsupported" : "not-implemented";
1607
+ options?.reporter?.markSkipped(rule, category);
1608
+ }
1180
1609
  continue;
1181
1610
  }
1182
1611
  if (!isActiveValue(normalizedConfig)) {
1183
1612
  if (isOffValue(normalizedConfig)) delete targetConfig.rules[rule];
1184
- if (eslintConfig.files === void 0) options?.reporter?.removeSkipped(rule, "unsupported");
1613
+ if (eslintConfig.files === void 0) {
1614
+ options?.reporter?.removeSkipped(rule, "not-implemented");
1615
+ options?.reporter?.removeSkipped(rule, "unsupported");
1616
+ }
1185
1617
  continue;
1186
1618
  }
1187
1619
  if (!options?.jsPlugins && !isIgnoredPluginRule(rule)) {
1188
1620
  options?.reporter?.markSkipped(rule, "js-plugins");
1189
1621
  continue;
1190
1622
  }
1191
- options?.reporter?.markSkipped(rule, "unsupported");
1623
+ const category = unsupportedRuleExplanations[rule] ? "unsupported" : "not-implemented";
1624
+ options?.reporter?.markSkipped(rule, category);
1192
1625
  }
1193
1626
  }
1194
1627
  };
@@ -1210,31 +1643,54 @@ const cleanUpUselessOverridesPlugins = (config) => {
1210
1643
  }
1211
1644
  };
1212
1645
  const cleanUpUselessOverridesRules = (config) => {
1213
- if (config.rules === void 0 || config.overrides === void 0) return;
1214
- const filesPatternMap = /* @__PURE__ */ new Map();
1215
- for (const [i, override] of config.overrides.entries()) {
1216
- if (override.files === void 0) continue;
1217
- const filesKey = JSON.stringify(override.files);
1218
- let entry = filesPatternMap.get(filesKey);
1219
- if (!entry) {
1220
- entry = {
1221
- firstIndex: i,
1222
- finalRules: {},
1223
- indicesToRemove: []
1224
- };
1225
- filesPatternMap.set(filesKey, entry);
1226
- } else entry.indicesToRemove.push(i);
1227
- if (override.rules) Object.assign(entry.finalRules, override.rules);
1228
- }
1229
- for (const entry of filesPatternMap.values()) {
1230
- const firstOverride = config.overrides[entry.firstIndex];
1231
- firstOverride.rules = entry.finalRules;
1232
- if (firstOverride.rules) {
1233
- for (const [rule, settings] of Object.entries(firstOverride.rules)) if (config.rules[rule] === settings) delete firstOverride.rules[rule];
1234
- if (Object.keys(firstOverride.rules).length === 0) delete firstOverride.rules;
1646
+ if (config.overrides === void 0) return;
1647
+ for (let i = 0; i < config.overrides.length; i++) {
1648
+ const current = config.overrides[i];
1649
+ if (i > 0) {
1650
+ const previous = config.overrides[i - 1];
1651
+ if (isEqualDeep(previous.files, current.files)) {
1652
+ mergeOverrideProperties(previous, current);
1653
+ config.overrides.splice(i, 1);
1654
+ i -= 2;
1655
+ continue;
1656
+ }
1235
1657
  }
1236
- for (const indexToRemove of entry.indicesToRemove) delete config.overrides[indexToRemove].rules;
1658
+ removeRootMatchingRules(config, i);
1659
+ }
1660
+ };
1661
+ /** Merge all properties from `source` into `target` (same-files overrides). */
1662
+ const mergeOverrideProperties = (target, source) => {
1663
+ if (source.rules) target.rules = {
1664
+ ...target.rules,
1665
+ ...source.rules
1666
+ };
1667
+ if (source.plugins) target.plugins = [...new Set([...target.plugins ?? [], ...source.plugins])];
1668
+ if (source.jsPlugins) target.jsPlugins = [...new Set([...target.jsPlugins ?? [], ...source.jsPlugins])];
1669
+ if (source.env) target.env = {
1670
+ ...target.env,
1671
+ ...source.env
1672
+ };
1673
+ if (source.globals) target.globals = {
1674
+ ...target.globals,
1675
+ ...source.globals
1676
+ };
1677
+ if (source.categories) target.categories = {
1678
+ ...target.categories,
1679
+ ...source.categories
1680
+ };
1681
+ };
1682
+ /**
1683
+ * Remove rules from `config.overrides[overrideIndex]` that match root config,
1684
+ * unless a previous override also has the rule (meaning it overrides root with
1685
+ * a different value — same-as-root rules are removed earlier in the loop).
1686
+ */
1687
+ const removeRootMatchingRules = (config, overrideIndex) => {
1688
+ const override = config.overrides[overrideIndex];
1689
+ if (!override.rules || !config.rules) return;
1690
+ for (const [rule, settings] of Object.entries(override.rules)) if (config.rules[rule] === settings) {
1691
+ if (!config.overrides.slice(0, overrideIndex).some((prev) => prev.rules?.[rule] !== void 0)) delete override.rules[rule];
1237
1692
  }
1693
+ if (Object.keys(override.rules).length === 0) delete override.rules;
1238
1694
  };
1239
1695
  const cleanUpRulesWhichAreCoveredByCategory = (config) => {
1240
1696
  if (config.rules === void 0 || config.categories === void 0) return;
@@ -1295,14 +1751,6 @@ const replaceReactRefreshPluginName = (config) => {
1295
1751
  }
1296
1752
  };
1297
1753
 
1298
- //#endregion
1299
- //#region src/utilities.ts
1300
- const isEqualDeep = (a, b) => {
1301
- if (a === b) return true;
1302
- const bothAreObjects = a && b && typeof a === "object" && typeof b === "object";
1303
- return Boolean(bothAreObjects && Object.keys(a).length === Object.keys(b).length && Object.entries(a).every(([k, v]) => isEqualDeep(v, b[k])));
1304
- };
1305
-
1306
1754
  //#endregion
1307
1755
  //#region src/cleanup.ts
1308
1756
  const TS_ESLINT_DEFAULT_OVERRIDE = {
@@ -1345,7 +1793,6 @@ const cleanUpUselessOverridesEntries = (config) => {
1345
1793
  if (config.overrides === void 0) return;
1346
1794
  for (const [overrideIndex, override] of config.overrides.entries()) if (Object.keys(override).length === 1) delete config.overrides[overrideIndex];
1347
1795
  config.overrides = config.overrides.filter((overrides) => Object.keys(overrides).length > 0);
1348
- mergeConsecutiveIdenticalOverrides(config);
1349
1796
  mergeConsecutiveOverridesWithDifferingFiles(config);
1350
1797
  if (config.overrides.length === 0) delete config.overrides;
1351
1798
  };
@@ -1371,51 +1818,6 @@ const cleanUpOxlintConfig = (config) => {
1371
1818
  }
1372
1819
  };
1373
1820
  /**
1374
- * Merges consecutive identical overrides in the config's overrides array
1375
- * Merges only if the overrides are directly next to each other
1376
- * (otherwise they could be overriden in between one another).
1377
- *
1378
- * Example:
1379
- *
1380
- * ```json
1381
- * overrides: [
1382
- * {
1383
- * "files": [
1384
- * "*.ts",
1385
- * "*.tsx",
1386
- * ],
1387
- * "plugins": [
1388
- * "typescript",
1389
- * ],
1390
- * },
1391
- * {
1392
- * "files": [
1393
- * "*.ts",
1394
- * "*.tsx",
1395
- * ],
1396
- * "plugins": [
1397
- * "typescript",
1398
- * ],
1399
- * },
1400
- * ]
1401
- * ```
1402
- */
1403
- function mergeConsecutiveIdenticalOverrides(config) {
1404
- if (config.overrides === void 0) return;
1405
- if (config.overrides.length <= 1) return;
1406
- const mergedOverrides = [];
1407
- let i = 0;
1408
- while (i < config.overrides.length) {
1409
- const current = config.overrides[i];
1410
- if (i + 1 < config.overrides.length && isEqualDeep(current, config.overrides[i + 1])) {
1411
- mergedOverrides.push(current);
1412
- while (i + 1 < config.overrides.length && isEqualDeep(current, config.overrides[i + 1])) i++;
1413
- } else mergedOverrides.push(current);
1414
- i++;
1415
- }
1416
- config.overrides = mergedOverrides;
1417
- }
1418
- /**
1419
1821
  * Merge consecutive overrides that have differing files but everything else is identical.
1420
1822
  *
1421
1823
  * ```json
@@ -1547,8 +1949,15 @@ const preFixForJsPlugins = () => {
1547
1949
  function processConfigFiles(files, reporter) {
1548
1950
  const filesArray = Array.isArray(files) ? files : [files];
1549
1951
  const simpleFiles = [];
1550
- for (const file of filesArray) if (Array.isArray(file)) reporter?.addWarning(`ESLint AND glob patterns (nested arrays in files) are not supported in oxlint: ${JSON.stringify(file)}`);
1551
- else simpleFiles.push(file);
1952
+ for (const file of filesArray) if (Array.isArray(file)) {
1953
+ const filesSet = new Set(file);
1954
+ if (filesSet.size === 0) continue;
1955
+ if (filesSet.size > 1) {
1956
+ reporter?.addWarning(`ESLint AND glob patterns (nested arrays in files) are not supported in oxlint: ${JSON.stringify(file)}`);
1957
+ continue;
1958
+ }
1959
+ simpleFiles.push(file[0]);
1960
+ } else simpleFiles.push(file);
1552
1961
  return simpleFiles;
1553
1962
  }
1554
1963
 
@@ -1654,4 +2063,4 @@ const warnSettingsInOverride = (eslintConfig, options) => {
1654
2063
  };
1655
2064
 
1656
2065
  //#endregion
1657
- export { preFixForJsPlugins as a, cleanUpOxlintConfig as c, transformRuleEntry as d, nurseryRules as f, transformEnvAndGlobals as h, fixForJsPlugins as i, detectNeededRulesPlugins as l, detectEnvironmentByGlobals as m, warnSettingsInOverride as n, detectSameOverride as o, rules_exports as p, processConfigFiles as r, transformIgnorePatterns as s, transformSettings as t, isOffValue as u };
2066
+ export { preFixForJsPlugins as a, cleanUpOxlintConfig as c, transformRuleEntry as d, buildUnsupportedRuleExplanations as f, transformEnvAndGlobals as g, detectEnvironmentByGlobals as h, fixForJsPlugins as i, detectNeededRulesPlugins as l, rules_exports as m, warnSettingsInOverride as n, detectSameOverride as o, nurseryRules as p, processConfigFiles as r, transformIgnorePatterns as s, transformSettings as t, isOffValue as u };
@@ -2694,7 +2694,7 @@ type OxlintConfig = {
2694
2694
  ignorePatterns?: OxlintConfigIgnorePatterns;
2695
2695
  settings?: OxlintSettings;
2696
2696
  };
2697
- type RuleSkippedCategory = 'nursery' | 'type-aware' | 'unsupported' | 'js-plugins';
2697
+ type RuleSkippedCategory = 'nursery' | 'type-aware' | 'not-implemented' | 'unsupported' | 'js-plugins';
2698
2698
  type SkippedCategoryGroup = Record<RuleSkippedCategory, string[]>;
2699
2699
  type Reporter = {
2700
2700
  addWarning(message: string): void;
@@ -1,4 +1,4 @@
1
- import { c as cleanUpOxlintConfig, d as transformRuleEntry, h as transformEnvAndGlobals, i as fixForJsPlugins, l as detectNeededRulesPlugins, m as detectEnvironmentByGlobals, n as warnSettingsInOverride, o as detectSameOverride, r as processConfigFiles, s as transformIgnorePatterns, t as transformSettings } from "../settings-DozKYNAk.mjs";
1
+ import { c as cleanUpOxlintConfig, d as transformRuleEntry, g as transformEnvAndGlobals, h as detectEnvironmentByGlobals, i as fixForJsPlugins, l as detectNeededRulesPlugins, n as warnSettingsInOverride, o as detectSameOverride, r as processConfigFiles, s as transformIgnorePatterns, t as transformSettings } from "../settings-Bb6227Gq.mjs";
2
2
 
3
3
  //#region src/index.ts
4
4
  const buildConfig = (configs, oxlintConfig, options) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxlint/migrate",
3
- "version": "1.48.0",
3
+ "version": "1.49.0",
4
4
  "description": "Generates a `.oxlintrc.json` from a existing eslint flat config",
5
5
  "keywords": [
6
6
  "eslint",
@@ -28,7 +28,10 @@
28
28
  },
29
29
  "scripts": {
30
30
  "prepare": "husky",
31
- "generate": "node --import @oxc-node/core/register ./scripts/generate-vitest-rules.ts && node --import @oxc-node/core/register ./scripts/generate.ts && pnpm format",
31
+ "generate": "node --import @oxc-node/core/register ./scripts/generate.ts",
32
+ "generate:vitest": "node --import @oxc-node/core/register ./scripts/generate-vitest-rules.ts",
33
+ "generate:unsupported": "node --import @oxc-node/core/register ./scripts/fetch-unsupported-rules.ts",
34
+ "generate:all": "pnpm generate:vitest && pnpm generate && pnpm generate:unsupported && pnpm format",
32
35
  "format": "oxfmt",
33
36
  "lint": "oxlint --type-aware --type-check",
34
37
  "test": "vitest",
@@ -38,7 +41,7 @@
38
41
  "dependencies": {
39
42
  "commander": "^14.0.0",
40
43
  "globals": "^17.0.0",
41
- "oxc-parser": "^0.112.0",
44
+ "oxc-parser": "^0.114.0",
42
45
  "tinyglobby": "^0.2.14"
43
46
  },
44
47
  "devDependencies": {
@@ -75,9 +78,9 @@
75
78
  "husky": "^9.1.7",
76
79
  "lint-staged": "^16.1.2",
77
80
  "next": "^16.0.0",
78
- "oxfmt": "^0.28.0",
79
- "oxlint": "^1.48.0",
80
- "oxlint-tsgolint": "^0.11.3",
81
+ "oxfmt": "^0.33.0",
82
+ "oxlint": "^1.49.0",
83
+ "oxlint-tsgolint": "^0.14.0",
81
84
  "tsdown": "^0.20.0",
82
85
  "typescript-eslint": "^8.35.0",
83
86
  "vitest": "^4.0.0"
@@ -85,5 +88,5 @@
85
88
  "lint-staged": {
86
89
  "*": "oxfmt --no-error-on-unmatched-pattern"
87
90
  },
88
- "packageManager": "pnpm@10.28.2"
91
+ "packageManager": "pnpm@10.29.3"
89
92
  }