diff --git a/tasks/lint_rules/src/main.cjs b/tasks/lint_rules/src/main.cjs index 3d16c740e..ac220b81b 100644 --- a/tasks/lint_rules/src/main.cjs +++ b/tasks/lint_rules/src/main.cjs @@ -9,6 +9,7 @@ const { updateNotSupportedStatus, updateImplementedStatus, overrideTypeScriptPluginStatusWithEslintPluginStatus: syncTypeScriptPluginStatusWithEslintPluginStatus, + syncVitestPluginStatusWithJestPluginStatus, } = require('./oxlint-rules.cjs'); const { renderMarkdown } = require('./markdown-renderer.cjs'); const { updateGitHubIssue } = require('./result-reporter.cjs'); @@ -61,6 +62,7 @@ Plugins: ${Array.from(ALL_TARGET_PLUGINS.keys()).join(', ')} await updateImplementedStatus(ruleEntries); updateNotSupportedStatus(ruleEntries); syncTypeScriptPluginStatusWithEslintPluginStatus(ruleEntries); + await syncVitestPluginStatusWithJestPluginStatus(ruleEntries); // // Render list and update if necessary diff --git a/tasks/lint_rules/src/oxlint-rules.cjs b/tasks/lint_rules/src/oxlint-rules.cjs index e60917127..04728969c 100644 --- a/tasks/lint_rules/src/oxlint-rules.cjs +++ b/tasks/lint_rules/src/oxlint-rules.cjs @@ -127,3 +127,55 @@ exports.overrideTypeScriptPluginStatusWithEslintPluginStatus = ( rule.isNotSupported = eslintRule.isNotSupported; } }; + +/** + * Some Jest rules are written to be compatible with Vitest, so we should + * override the status of the Vitest rules to match the Jest rules. + * @param {RuleEntries} ruleEntries + */ +exports.syncVitestPluginStatusWithJestPluginStatus = async (ruleEntries) => { + const vitestCompatibleRulesFile = await readFile( + 'crates/oxc_linter/src/utils/mod.rs', + 'utf8', + ); + + // Find the start of the list of vitest-compatible rules + // ``` + // const VITEST_COMPATIBLE_JEST_RULES: phf::Set<&'static str> = phf::phf_set! { + // "consistent-test-it", + // "expect-expect", + // ... + // }; + // ``` + const vitestCompatibleRules = vitestCompatibleRulesFile.match( + /const VITEST_COMPATIBLE_JEST_RULES.+phf_set! {([^}]+)/s, + )?.[1]; + if (!vitestCompatibleRules) { + throw new Error('Failed to find the list of vitest-compatible rules'); + } + + const rules = new Set( + vitestCompatibleRules + .split('\n') + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith('//')) + .map((line) => + line + .replace(/"/g, '') + .split(',') + .filter((s) => s !== '') + ) + .flat(), + ); + + for (const rule of rules) { + const vitestRuleEntry = ruleEntries.get(`vitest/${rule}`); + const jestRuleEntry = ruleEntries.get(`jest/${rule}`); + if (vitestRuleEntry && jestRuleEntry) { + ruleEntries.set(`vitest/${rule}`, { + ...vitestRuleEntry, + isImplemented: jestRuleEntry.isImplemented, + }); + } + } +};