@oxlint/migrate 1.46.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
|
|
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.
|
|
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
|
-
|
|
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",
|
|
@@ -425,6 +426,7 @@ const styleRules = [
|
|
|
425
426
|
"@typescript-eslint/adjacent-overload-signatures",
|
|
426
427
|
"@typescript-eslint/array-type",
|
|
427
428
|
"@typescript-eslint/ban-tslint-comment",
|
|
429
|
+
"@typescript-eslint/class-literal-property-style",
|
|
428
430
|
"@typescript-eslint/consistent-generic-constructors",
|
|
429
431
|
"@typescript-eslint/consistent-indexed-object-style",
|
|
430
432
|
"@typescript-eslint/consistent-type-assertions",
|
|
@@ -432,10 +434,12 @@ const styleRules = [
|
|
|
432
434
|
"@typescript-eslint/consistent-type-imports",
|
|
433
435
|
"@typescript-eslint/no-empty-interface",
|
|
434
436
|
"@typescript-eslint/no-inferrable-types",
|
|
437
|
+
"@typescript-eslint/parameter-properties",
|
|
435
438
|
"@typescript-eslint/prefer-for-of",
|
|
436
439
|
"@typescript-eslint/prefer-function-type",
|
|
437
440
|
"@typescript-eslint/prefer-reduce-type-parameter",
|
|
438
441
|
"@typescript-eslint/prefer-return-this-type",
|
|
442
|
+
"@typescript-eslint/unified-signatures",
|
|
439
443
|
"unicorn/catch-error-name",
|
|
440
444
|
"unicorn/consistent-date-clone",
|
|
441
445
|
"unicorn/consistent-existence-index-check",
|
|
@@ -481,10 +485,12 @@ const styleRules = [
|
|
|
481
485
|
"vitest/consistent-test-filename",
|
|
482
486
|
"vitest/consistent-vitest-vi",
|
|
483
487
|
"vitest/no-import-node-test",
|
|
488
|
+
"vitest/no-importing-vitest-globals",
|
|
484
489
|
"vitest/prefer-called-once",
|
|
485
490
|
"vitest/prefer-called-times",
|
|
486
491
|
"vitest/prefer-describe-function-title",
|
|
487
492
|
"vitest/prefer-expect-type-of",
|
|
493
|
+
"vitest/prefer-import-in-mock",
|
|
488
494
|
"vitest/prefer-to-be-falsy",
|
|
489
495
|
"vitest/prefer-to-be-object",
|
|
490
496
|
"vitest/prefer-to-be-truthy",
|
|
@@ -532,6 +538,7 @@ const styleRules = [
|
|
|
532
538
|
"vitest/prefer-hooks-on-top",
|
|
533
539
|
"vitest/prefer-lowercase-title",
|
|
534
540
|
"vitest/prefer-mock-promise-shorthand",
|
|
541
|
+
"vitest/prefer-mock-return-shorthand",
|
|
535
542
|
"vitest/prefer-spy-on",
|
|
536
543
|
"vitest/prefer-strict-equal",
|
|
537
544
|
"vitest/prefer-to-be",
|
|
@@ -548,7 +555,9 @@ const suspiciousRules = [
|
|
|
548
555
|
"no-extend-native",
|
|
549
556
|
"no-extra-bind",
|
|
550
557
|
"no-new",
|
|
558
|
+
"no-shadow",
|
|
551
559
|
"no-unexpected-multiline",
|
|
560
|
+
"no-unmodified-loop-condition",
|
|
552
561
|
"no-unneeded-ternary",
|
|
553
562
|
"no-useless-concat",
|
|
554
563
|
"no-useless-constructor",
|
|
@@ -588,6 +597,7 @@ const suspiciousRules = [
|
|
|
588
597
|
"unicorn/require-post-message-target-origin",
|
|
589
598
|
"vue/no-required-prop-with-default",
|
|
590
599
|
"vue/require-default-export",
|
|
600
|
+
"@typescript-eslint/no-shadow",
|
|
591
601
|
"@typescript-eslint/no-useless-constructor",
|
|
592
602
|
"import-x/no-absolute-path",
|
|
593
603
|
"import-x/no-empty-named-blocks",
|
|
@@ -616,6 +626,7 @@ const restrictionRules = [
|
|
|
616
626
|
"no-restricted-imports",
|
|
617
627
|
"no-sequences",
|
|
618
628
|
"no-undefined",
|
|
629
|
+
"no-use-before-define",
|
|
619
630
|
"no-var",
|
|
620
631
|
"no-void",
|
|
621
632
|
"unicode-bom",
|
|
@@ -632,6 +643,7 @@ const restrictionRules = [
|
|
|
632
643
|
"jsdoc/empty-tags",
|
|
633
644
|
"jsx-a11y/anchor-ambiguous-text",
|
|
634
645
|
"node/no-new-require",
|
|
646
|
+
"node/no-path-concat",
|
|
635
647
|
"node/no-process-env",
|
|
636
648
|
"promise/catch-or-return",
|
|
637
649
|
"promise/spec-only",
|
|
@@ -649,6 +661,7 @@ const restrictionRules = [
|
|
|
649
661
|
"@typescript-eslint/no-empty-object-type",
|
|
650
662
|
"@typescript-eslint/no-explicit-any",
|
|
651
663
|
"@typescript-eslint/no-import-type-side-effects",
|
|
664
|
+
"@typescript-eslint/no-invalid-void-type",
|
|
652
665
|
"@typescript-eslint/no-namespace",
|
|
653
666
|
"@typescript-eslint/no-non-null-asserted-nullish-coalescing",
|
|
654
667
|
"@typescript-eslint/no-non-null-assertion",
|
|
@@ -677,6 +690,7 @@ const restrictionRules = [
|
|
|
677
690
|
"@typescript-eslint/class-methods-use-this",
|
|
678
691
|
"@typescript-eslint/no-empty-function",
|
|
679
692
|
"@typescript-eslint/no-restricted-imports",
|
|
693
|
+
"@typescript-eslint/no-use-before-define",
|
|
680
694
|
"import-x/extensions",
|
|
681
695
|
"import-x/no-amd",
|
|
682
696
|
"import-x/no-commonjs",
|
|
@@ -687,6 +701,7 @@ const restrictionRules = [
|
|
|
687
701
|
"import-x/no-webpack-loader-syntax",
|
|
688
702
|
"import-x/unambiguous",
|
|
689
703
|
"n/no-new-require",
|
|
704
|
+
"n/no-path-concat",
|
|
690
705
|
"n/no-process-env",
|
|
691
706
|
"react-refresh/only-export-components"
|
|
692
707
|
];
|
|
@@ -791,6 +806,7 @@ const correctnessRules = [
|
|
|
791
806
|
"jsx-a11y/no-distracting-elements",
|
|
792
807
|
"jsx-a11y/no-noninteractive-tabindex",
|
|
793
808
|
"jsx-a11y/no-redundant-roles",
|
|
809
|
+
"jsx-a11y/no-static-element-interactions",
|
|
794
810
|
"jsx-a11y/prefer-tag-over-role",
|
|
795
811
|
"jsx-a11y/role-has-required-aria-props",
|
|
796
812
|
"jsx-a11y/role-supports-aria-props",
|
|
@@ -911,16 +927,29 @@ const nurseryRules = [
|
|
|
911
927
|
"no-unreachable",
|
|
912
928
|
"import/export",
|
|
913
929
|
"import/named",
|
|
914
|
-
"jsx-a11y/no-static-element-interactions",
|
|
915
930
|
"promise/no-return-in-finally",
|
|
916
931
|
"react/require-render-return",
|
|
932
|
+
"@typescript-eslint/consistent-return",
|
|
933
|
+
"@typescript-eslint/consistent-type-exports",
|
|
934
|
+
"@typescript-eslint/dot-notation",
|
|
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",
|
|
917
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",
|
|
918
946
|
"import-x/export",
|
|
919
947
|
"import-x/named"
|
|
920
948
|
];
|
|
921
949
|
const perfRules = [
|
|
922
950
|
"no-await-in-loop",
|
|
923
951
|
"no-useless-call",
|
|
952
|
+
"react/jsx-no-constructed-context-values",
|
|
924
953
|
"react/no-array-index-key",
|
|
925
954
|
"react-perf/jsx-no-jsx-as-prop",
|
|
926
955
|
"react-perf/jsx-no-new-array-as-prop",
|
|
@@ -932,6 +961,9 @@ const perfRules = [
|
|
|
932
961
|
];
|
|
933
962
|
const typeAwareRules = [
|
|
934
963
|
"@typescript-eslint/await-thenable",
|
|
964
|
+
"@typescript-eslint/consistent-return",
|
|
965
|
+
"@typescript-eslint/consistent-type-exports",
|
|
966
|
+
"@typescript-eslint/dot-notation",
|
|
935
967
|
"@typescript-eslint/no-array-delete",
|
|
936
968
|
"@typescript-eslint/no-base-to-string",
|
|
937
969
|
"@typescript-eslint/no-confusing-void-expression",
|
|
@@ -946,9 +978,12 @@ const typeAwareRules = [
|
|
|
946
978
|
"@typescript-eslint/no-mixed-enums",
|
|
947
979
|
"@typescript-eslint/no-redundant-type-constituents",
|
|
948
980
|
"@typescript-eslint/no-unnecessary-boolean-literal-compare",
|
|
981
|
+
"@typescript-eslint/no-unnecessary-condition",
|
|
982
|
+
"@typescript-eslint/no-unnecessary-qualifier",
|
|
949
983
|
"@typescript-eslint/no-unnecessary-template-expression",
|
|
950
984
|
"@typescript-eslint/no-unnecessary-type-arguments",
|
|
951
985
|
"@typescript-eslint/no-unnecessary-type-assertion",
|
|
986
|
+
"@typescript-eslint/no-unnecessary-type-parameters",
|
|
952
987
|
"@typescript-eslint/no-unsafe-argument",
|
|
953
988
|
"@typescript-eslint/no-unsafe-assignment",
|
|
954
989
|
"@typescript-eslint/no-unsafe-call",
|
|
@@ -957,14 +992,20 @@ const typeAwareRules = [
|
|
|
957
992
|
"@typescript-eslint/no-unsafe-return",
|
|
958
993
|
"@typescript-eslint/no-unsafe-type-assertion",
|
|
959
994
|
"@typescript-eslint/no-unsafe-unary-minus",
|
|
995
|
+
"@typescript-eslint/no-useless-default-assignment",
|
|
960
996
|
"@typescript-eslint/non-nullable-type-assertion-style",
|
|
961
997
|
"@typescript-eslint/only-throw-error",
|
|
998
|
+
"@typescript-eslint/prefer-find",
|
|
962
999
|
"@typescript-eslint/prefer-includes",
|
|
963
1000
|
"@typescript-eslint/prefer-nullish-coalescing",
|
|
964
1001
|
"@typescript-eslint/prefer-optional-chain",
|
|
965
1002
|
"@typescript-eslint/prefer-promise-reject-errors",
|
|
1003
|
+
"@typescript-eslint/prefer-readonly",
|
|
1004
|
+
"@typescript-eslint/prefer-readonly-parameter-types",
|
|
966
1005
|
"@typescript-eslint/prefer-reduce-type-parameter",
|
|
1006
|
+
"@typescript-eslint/prefer-regexp-exec",
|
|
967
1007
|
"@typescript-eslint/prefer-return-this-type",
|
|
1008
|
+
"@typescript-eslint/prefer-string-starts-ends-with",
|
|
968
1009
|
"@typescript-eslint/promise-function-async",
|
|
969
1010
|
"@typescript-eslint/related-getter-setter-pairs",
|
|
970
1011
|
"@typescript-eslint/require-array-sort-compare",
|
|
@@ -973,6 +1014,7 @@ const typeAwareRules = [
|
|
|
973
1014
|
"@typescript-eslint/restrict-template-expressions",
|
|
974
1015
|
"@typescript-eslint/return-await",
|
|
975
1016
|
"@typescript-eslint/strict-boolean-expressions",
|
|
1017
|
+
"@typescript-eslint/strict-void-return",
|
|
976
1018
|
"@typescript-eslint/switch-exhaustiveness-check",
|
|
977
1019
|
"@typescript-eslint/unbound-method",
|
|
978
1020
|
"@typescript-eslint/use-unknown-in-catch-callback-variable"
|
|
@@ -1061,9 +1103,403 @@ const enableJsPluginRule = (targetConfig, rule, ruleEntry) => {
|
|
|
1061
1103
|
return true;
|
|
1062
1104
|
};
|
|
1063
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
|
+
|
|
1064
1499
|
//#endregion
|
|
1065
1500
|
//#region src/plugins_rules.ts
|
|
1066
1501
|
const allRules = Object.values(rules_exports).flat();
|
|
1502
|
+
const unsupportedRuleExplanations = buildUnsupportedRuleExplanations();
|
|
1067
1503
|
/**
|
|
1068
1504
|
* checks if value is validSet, or if validSet is an array, check if value is first value of it
|
|
1069
1505
|
*/
|
|
@@ -1103,6 +1539,11 @@ const normalizeSeverityValue = (value) => {
|
|
|
1103
1539
|
return "off";
|
|
1104
1540
|
}
|
|
1105
1541
|
};
|
|
1542
|
+
const removePreviousOverrideRule = (rule, eslintConfig, overrides) => {
|
|
1543
|
+
if (eslintConfig.files === void 0 && overrides) {
|
|
1544
|
+
for (const override of overrides) if (override.rules?.[rule]) delete override.rules[rule];
|
|
1545
|
+
}
|
|
1546
|
+
};
|
|
1106
1547
|
/**
|
|
1107
1548
|
* Merges a new rule configuration with an existing one, preserving options when
|
|
1108
1549
|
* the new config only specifies a severity level.
|
|
@@ -1128,11 +1569,12 @@ const mergeRuleConfig = (existingConfig, newConfig) => {
|
|
|
1128
1569
|
if (Array.isArray(newConfig) && newConfig.length === 1 && existingIsArray && existingConfig.length > 1) return [newConfig[0], ...existingConfig.slice(1)];
|
|
1129
1570
|
return newConfig;
|
|
1130
1571
|
};
|
|
1131
|
-
const transformRuleEntry = (eslintConfig, targetConfig, baseConfig, options) => {
|
|
1572
|
+
const transformRuleEntry = (eslintConfig, targetConfig, baseConfig, options, overrides) => {
|
|
1132
1573
|
if (eslintConfig.rules === void 0) return;
|
|
1133
1574
|
if (targetConfig.rules === void 0) targetConfig.rules = {};
|
|
1134
1575
|
for (const [rule, config] of Object.entries(eslintConfig.rules)) {
|
|
1135
1576
|
const normalizedConfig = normalizeSeverityValue(config);
|
|
1577
|
+
if (!options?.merge) removePreviousOverrideRule(rule, eslintConfig, overrides);
|
|
1136
1578
|
if (allRules.includes(rule)) {
|
|
1137
1579
|
if (!options?.withNursery && nurseryRules.includes(rule)) {
|
|
1138
1580
|
options?.reporter?.markSkipped(rule, "nursery");
|
|
@@ -1155,23 +1597,31 @@ const transformRuleEntry = (eslintConfig, targetConfig, baseConfig, options) =>
|
|
|
1155
1597
|
else if (!isIgnoredPluginRule(rule)) targetConfig.rules[rule] = normalizedConfig;
|
|
1156
1598
|
if (eslintConfig.files === void 0) {
|
|
1157
1599
|
options?.reporter?.removeSkipped(rule, "js-plugins");
|
|
1600
|
+
options?.reporter?.removeSkipped(rule, "not-implemented");
|
|
1158
1601
|
options?.reporter?.removeSkipped(rule, "unsupported");
|
|
1159
1602
|
}
|
|
1160
1603
|
continue;
|
|
1161
1604
|
}
|
|
1162
|
-
if (!enableJsPluginRule(targetConfig, rule, normalizedConfig))
|
|
1605
|
+
if (!enableJsPluginRule(targetConfig, rule, normalizedConfig)) {
|
|
1606
|
+
const category = unsupportedRuleExplanations[rule] ? "unsupported" : "not-implemented";
|
|
1607
|
+
options?.reporter?.markSkipped(rule, category);
|
|
1608
|
+
}
|
|
1163
1609
|
continue;
|
|
1164
1610
|
}
|
|
1165
1611
|
if (!isActiveValue(normalizedConfig)) {
|
|
1166
1612
|
if (isOffValue(normalizedConfig)) delete targetConfig.rules[rule];
|
|
1167
|
-
if (eslintConfig.files === void 0)
|
|
1613
|
+
if (eslintConfig.files === void 0) {
|
|
1614
|
+
options?.reporter?.removeSkipped(rule, "not-implemented");
|
|
1615
|
+
options?.reporter?.removeSkipped(rule, "unsupported");
|
|
1616
|
+
}
|
|
1168
1617
|
continue;
|
|
1169
1618
|
}
|
|
1170
1619
|
if (!options?.jsPlugins && !isIgnoredPluginRule(rule)) {
|
|
1171
1620
|
options?.reporter?.markSkipped(rule, "js-plugins");
|
|
1172
1621
|
continue;
|
|
1173
1622
|
}
|
|
1174
|
-
|
|
1623
|
+
const category = unsupportedRuleExplanations[rule] ? "unsupported" : "not-implemented";
|
|
1624
|
+
options?.reporter?.markSkipped(rule, category);
|
|
1175
1625
|
}
|
|
1176
1626
|
}
|
|
1177
1627
|
};
|
|
@@ -1193,32 +1643,55 @@ const cleanUpUselessOverridesPlugins = (config) => {
|
|
|
1193
1643
|
}
|
|
1194
1644
|
};
|
|
1195
1645
|
const cleanUpUselessOverridesRules = (config) => {
|
|
1196
|
-
if (config.
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
if (
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
};
|
|
1208
|
-
filesPatternMap.set(filesKey, entry);
|
|
1209
|
-
} else entry.indicesToRemove.push(i);
|
|
1210
|
-
if (override.rules) Object.assign(entry.finalRules, override.rules);
|
|
1211
|
-
}
|
|
1212
|
-
for (const entry of filesPatternMap.values()) {
|
|
1213
|
-
const firstOverride = config.overrides[entry.firstIndex];
|
|
1214
|
-
firstOverride.rules = entry.finalRules;
|
|
1215
|
-
if (firstOverride.rules) {
|
|
1216
|
-
for (const [rule, settings] of Object.entries(firstOverride.rules)) if (config.rules[rule] === settings) delete firstOverride.rules[rule];
|
|
1217
|
-
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
|
+
}
|
|
1218
1657
|
}
|
|
1219
|
-
|
|
1658
|
+
removeRootMatchingRules(config, i);
|
|
1220
1659
|
}
|
|
1221
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];
|
|
1692
|
+
}
|
|
1693
|
+
if (Object.keys(override.rules).length === 0) delete override.rules;
|
|
1694
|
+
};
|
|
1222
1695
|
const cleanUpRulesWhichAreCoveredByCategory = (config) => {
|
|
1223
1696
|
if (config.rules === void 0 || config.categories === void 0) return;
|
|
1224
1697
|
const enabledCategories = Object.entries(config.categories).filter(([, severity]) => severity === "warn" || severity === "error").map(([category]) => category);
|
|
@@ -1278,14 +1751,6 @@ const replaceReactRefreshPluginName = (config) => {
|
|
|
1278
1751
|
}
|
|
1279
1752
|
};
|
|
1280
1753
|
|
|
1281
|
-
//#endregion
|
|
1282
|
-
//#region src/utilities.ts
|
|
1283
|
-
const isEqualDeep = (a, b) => {
|
|
1284
|
-
if (a === b) return true;
|
|
1285
|
-
const bothAreObjects = a && b && typeof a === "object" && typeof b === "object";
|
|
1286
|
-
return Boolean(bothAreObjects && Object.keys(a).length === Object.keys(b).length && Object.entries(a).every(([k, v]) => isEqualDeep(v, b[k])));
|
|
1287
|
-
};
|
|
1288
|
-
|
|
1289
1754
|
//#endregion
|
|
1290
1755
|
//#region src/cleanup.ts
|
|
1291
1756
|
const TS_ESLINT_DEFAULT_OVERRIDE = {
|
|
@@ -1328,7 +1793,6 @@ const cleanUpUselessOverridesEntries = (config) => {
|
|
|
1328
1793
|
if (config.overrides === void 0) return;
|
|
1329
1794
|
for (const [overrideIndex, override] of config.overrides.entries()) if (Object.keys(override).length === 1) delete config.overrides[overrideIndex];
|
|
1330
1795
|
config.overrides = config.overrides.filter((overrides) => Object.keys(overrides).length > 0);
|
|
1331
|
-
mergeConsecutiveIdenticalOverrides(config);
|
|
1332
1796
|
mergeConsecutiveOverridesWithDifferingFiles(config);
|
|
1333
1797
|
if (config.overrides.length === 0) delete config.overrides;
|
|
1334
1798
|
};
|
|
@@ -1354,51 +1818,6 @@ const cleanUpOxlintConfig = (config) => {
|
|
|
1354
1818
|
}
|
|
1355
1819
|
};
|
|
1356
1820
|
/**
|
|
1357
|
-
* Merges consecutive identical overrides in the config's overrides array
|
|
1358
|
-
* Merges only if the overrides are directly next to each other
|
|
1359
|
-
* (otherwise they could be overriden in between one another).
|
|
1360
|
-
*
|
|
1361
|
-
* Example:
|
|
1362
|
-
*
|
|
1363
|
-
* ```json
|
|
1364
|
-
* overrides: [
|
|
1365
|
-
* {
|
|
1366
|
-
* "files": [
|
|
1367
|
-
* "*.ts",
|
|
1368
|
-
* "*.tsx",
|
|
1369
|
-
* ],
|
|
1370
|
-
* "plugins": [
|
|
1371
|
-
* "typescript",
|
|
1372
|
-
* ],
|
|
1373
|
-
* },
|
|
1374
|
-
* {
|
|
1375
|
-
* "files": [
|
|
1376
|
-
* "*.ts",
|
|
1377
|
-
* "*.tsx",
|
|
1378
|
-
* ],
|
|
1379
|
-
* "plugins": [
|
|
1380
|
-
* "typescript",
|
|
1381
|
-
* ],
|
|
1382
|
-
* },
|
|
1383
|
-
* ]
|
|
1384
|
-
* ```
|
|
1385
|
-
*/
|
|
1386
|
-
function mergeConsecutiveIdenticalOverrides(config) {
|
|
1387
|
-
if (config.overrides === void 0) return;
|
|
1388
|
-
if (config.overrides.length <= 1) return;
|
|
1389
|
-
const mergedOverrides = [];
|
|
1390
|
-
let i = 0;
|
|
1391
|
-
while (i < config.overrides.length) {
|
|
1392
|
-
const current = config.overrides[i];
|
|
1393
|
-
if (i + 1 < config.overrides.length && isEqualDeep(current, config.overrides[i + 1])) {
|
|
1394
|
-
mergedOverrides.push(current);
|
|
1395
|
-
while (i + 1 < config.overrides.length && isEqualDeep(current, config.overrides[i + 1])) i++;
|
|
1396
|
-
} else mergedOverrides.push(current);
|
|
1397
|
-
i++;
|
|
1398
|
-
}
|
|
1399
|
-
config.overrides = mergedOverrides;
|
|
1400
|
-
}
|
|
1401
|
-
/**
|
|
1402
1821
|
* Merge consecutive overrides that have differing files but everything else is identical.
|
|
1403
1822
|
*
|
|
1404
1823
|
* ```json
|
|
@@ -1530,8 +1949,15 @@ const preFixForJsPlugins = () => {
|
|
|
1530
1949
|
function processConfigFiles(files, reporter) {
|
|
1531
1950
|
const filesArray = Array.isArray(files) ? files : [files];
|
|
1532
1951
|
const simpleFiles = [];
|
|
1533
|
-
for (const file of filesArray) if (Array.isArray(file))
|
|
1534
|
-
|
|
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);
|
|
1535
1961
|
return simpleFiles;
|
|
1536
1962
|
}
|
|
1537
1963
|
|
|
@@ -1637,4 +2063,4 @@ const warnSettingsInOverride = (eslintConfig, options) => {
|
|
|
1637
2063
|
};
|
|
1638
2064
|
|
|
1639
2065
|
//#endregion
|
|
1640
|
-
export { preFixForJsPlugins as a, cleanUpOxlintConfig as c, transformRuleEntry as d,
|
|
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 };
|
package/dist/src/index.d.mts
CHANGED
|
@@ -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;
|
package/dist/src/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as cleanUpOxlintConfig, d as transformRuleEntry,
|
|
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) => {
|
|
@@ -34,7 +34,7 @@ const buildConfig = (configs, oxlintConfig, options) => {
|
|
|
34
34
|
if (push) overrides.push(result);
|
|
35
35
|
}
|
|
36
36
|
transformIgnorePatterns(config, targetConfig, options);
|
|
37
|
-
transformRuleEntry(config, targetConfig, config.files !== void 0 ? oxlintConfig : void 0, options);
|
|
37
|
+
transformRuleEntry(config, targetConfig, config.files !== void 0 ? oxlintConfig : void 0, options, config.files === void 0 ? overrides : void 0);
|
|
38
38
|
transformEnvAndGlobals(config, targetConfig, options);
|
|
39
39
|
if (config.files === void 0) transformSettings(config, oxlintConfig, options);
|
|
40
40
|
else warnSettingsInOverride(config, options);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxlint/migrate",
|
|
3
|
-
"version": "1.
|
|
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
|
|
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.
|
|
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.
|
|
79
|
-
"oxlint": "^1.
|
|
80
|
-
"oxlint-tsgolint": "^0.
|
|
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.
|
|
91
|
+
"packageManager": "pnpm@10.29.3"
|
|
89
92
|
}
|