Skip to content

Instantly share code, notes, and snippets.

@connorshea
Last active December 17, 2025 05:59
Show Gist options
  • Select an option

  • Save connorshea/6cd1d3ba9ed5e37dee6c122c60a78dab to your computer and use it in GitHub Desktop.

Select an option

Save connorshea/6cd1d3ba9ed5e37dee6c122c60a78dab to your computer and use it in GitHub Desktop.
Script for oxlint to check for config option differences (to run, place in `tools/check_rule_config.mjs`)
#!/usr/bin/env node
import fs from 'fs';
import path from 'path';
import { createESLintLinter, loadTargetPluginRules, getTypeScriptDisabledRules } from '../tasks/lint_rules/src/eslint-rules.mjs';
function findFiles(dir, pattern = /.rs$/) {
const out = [];
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const full = path.join(dir, entry.name);
if (entry.isDirectory()) out.push(...findFiles(full, pattern));
else if (pattern.test(entry.name)) out.push(full);
}
return out;
}
function extractDeclareMacro(content) {
const start = content.indexOf('declare_oxc_lint!(');
if (start === -1) return null;
let i = start + 'declare_oxc_lint!('.length;
let depth = 1;
while (i < content.length && depth > 0) {
const ch = content[i];
if (ch === '(') depth++;
else if (ch === ')') depth--;
i++;
}
if (depth !== 0) return null;
const inner = content.slice(start + 'declare_oxc_lint!('.length, i - 1);
// Remove lines starting with optional spaces and three slashes (doc comments) so they don't interfere
// Also strip inline `//` comments so trailing TODOs don't merge with subsequent args
let innerClean = inner.replace(/^\s*\/\/\/.*$/gm, '');
innerClean = innerClean.replace(/\/\/.*$/gm, '');
// Split by top-level commas only.
const args = [];
let cur = '';
let nested = 0;
for (let j = 0; j < innerClean.length; j++) {
const ch = innerClean[j];
if (ch === '(' || ch === '{' || ch === '[') { nested++; cur += ch; }
else if (ch === ')' || ch === '}' || ch === ']') { nested--; cur += ch; }
else if (ch === ',' && nested === 0) { args.push(cur.trim()); cur = ''; }
else cur += ch;
}
if (cur.trim()) args.push(cur.trim());
const identifierLike = args.map(a => a.trim()).filter(a => /^[A-Za-z0-9_]+$/.test(a));
// Heuristics to find the plugin name:
// Prefer locating the PascalCase struct name and taking the following
// argument as the plugin (this avoids accidentally picking words from
// the doc comment block). Fall back to the old identifier-based heuristic
// if the PascalCase struct is not found.
let plugin;
// Prefer to find the struct name that is actually declared in the file
// (look for `pub struct Name {`) and use the following argument as the plugin.
const identifierCandidates = args.map(a => a.trim()).filter(a => /^[A-Z][A-Za-z0-9_]*$/.test(a.trim()));
const structName = identifierCandidates.find(n => new RegExp(`(?:pub(?:\\([^)]*\\))?\\s+)?struct\\s+${n}\\s*\\{`).test(content));
if (structName) {
const idx = args.findIndex(a => a.trim() === structName);
if (idx !== -1 && args.length > idx + 1) plugin = args[idx + 1].trim();
}
if (!plugin) {
plugin = identifierLike.length >= 2 ? identifierLike[1] : undefined;
}
const configArg = args.find(a => a.trim().startsWith('config'));
const configType = configArg ? (configArg.split('=')[1] || '').trim().replace(/,$/, '') : null;
return { plugin, configType };
}
function extractStructFields(content, structName) {
const re = new RegExp(`(?:pub(?:\\([^)]*\\))?\\s+)?struct\\s+${structName}\\s*\\{`);
const start = content.search(re);
if (start === -1) return null;
const braceIndex = content.indexOf('{', start);
let i = braceIndex + 1;
let depth = 1;
while (i < content.length && depth > 0) {
const ch = content[i];
if (ch === '{') depth++;
else if (ch === '}') depth--;
i++;
}
let body = content.slice(braceIndex + 1, i - 1);
// Remove fenced code blocks ```...```, block comments /* ... */ and single-line comments
body = body.replace(/```[\s\S]*?```/g, "");
body = body.replace(/\/\*[\s\S]*?\*\//g, "");
body = body.replace(/^\s*\/\/.*$/gm, "");
// Look for field declarations at the start of a line: optional `pub`, then identifier starting with letter or underscore
const fields = [];
const fieldRe = /^\s*(?:pub\s+)?([a-zA-Z_][a-zA-Z0-9_]*)\s*:/gm;
let fm;
while ((fm = fieldRe.exec(body)) !== null) {
fields.push(fm[1]);
}
return fields;
}
function snakeToCamel(s) {
return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
}
function extractSchemaPropKeys(schema) {
if (!schema) return null;
if (Array.isArray(schema)) {
// If it's empty, that's fine. Return it.
if (schema.length === 0) { return []; }
const first = schema[0];
if (!first) return null;
if (first.properties) return Object.keys(first.properties);
if (first.items && first.items.properties) return Object.keys(first.items.properties);
return null;
}
if (schema.properties) return Object.keys(schema.properties);
return null;
}
async function main() {
const linter = createESLintLinter();
// Request loading type-checked TypeScript rules so the checker evaluates them too
loadTargetPluginRules(linter, { includeTypeChecked: true });
const typeCheckedDisabledRules = getTypeScriptDisabledRules();
const rulesDir = path.join(process.cwd(), 'crates', 'oxc_linter', 'src', 'rules');
const files = findFiles(rulesDir, /.rs$/);
// Previously we only checked files that implemented `fn from_configuration`.
// Include all rule files so we can verify rules that have no Rust config struct
// (treat them as having an empty set of fields).
const filesToCheck = files;
let hasError = false;
// Counters for summary
let totalChecked = 0;
let matchedCount = 0;
let mismatchedCount = 0;
for (const file of filesToCheck) {
const content = fs.readFileSync(file, 'utf8');
const declare = extractDeclareMacro(content);
if (!declare) continue;
const pluginName = path.relative(rulesDir, file).split(path.sep)[0];
if (!pluginName || pluginName === 'oxc') continue;
// If there's no `config` type declared, treat the rule as having no
// Rust-side configuration and use an empty list of fields.
const configType = declare.configType && declare.configType.replace(/,$/, '').trim();
let fields = [];
if (configType) {
fields = extractStructFields(content, configType) || [];
}
let fileName = path.basename(file, '.rs');
// Some rules are a module (`mod.rs`) or split across multiple files; prefer
// the parent directory name (which is the rule folder) in those cases.
if (fileName === 'mod' || fileName === 'lib') {
fileName = path.basename(path.dirname(file));
}
const ruleId = fileName.replace(/_/g, '-');
const linterKey = pluginName === 'eslint' ? ruleId : `${pluginName}/${ruleId}`;
let ruleObj = linter.getRules().get(linterKey);
// If the rule is missing and it's a TypeScript rule, check whether it's
// intentionally skipped because it's type-checked. If so, silently skip.
const altKey = `@typescript-eslint/${ruleId}`;
if ((!ruleObj || !ruleObj.meta) && pluginName === 'typescript') {
if (typeCheckedDisabledRules.has(altKey) || typeCheckedDisabledRules.has(ruleId)) {
console.log(`Skipping ${pluginName}/${ruleId}: type-checked and excluded`);
continue;
}
// Try fallback lookup under the npm-scoped plugin name
const alt = linter.getRules().get(altKey);
if (alt && alt.meta) {
ruleObj = alt;
}
}
// If metadata wasn't found for the expected key, attempt a broader
// search across all loaded rules. Some ESLint rules are provided by
// other plugins and may be registered under a different plugin name
// (e.g. `regexp/no-misleading-character-class`). Attempt to find any
// loaded rule that matches the `ruleId` and use its metadata.
if (!ruleObj || !ruleObj.meta) {
for (const [key, r] of linter.getRules()) {
if (key === ruleId || key.endsWith('/' + ruleId)) {
ruleObj = r;
break;
}
}
}
if (!ruleObj || !ruleObj.meta) {
console.warn(`No metadata found for ${linterKey}; skipping`);
continue;
}
const propKeys = extractSchemaPropKeys(ruleObj.meta.schema);
if (propKeys === null) {
console.warn(`Could not derive option properties for ${linterKey}; meta.schema is not an object with named properties`);
continue;
}
const rustCamel = fields.map(snakeToCamel);
// Known per-rule aliases to reduce false-positives where ESLint uses a
// different option name for the same configuration.
const PER_RULE_ALIASES = {
// Jest expect-expect: Rust exposes separate fields per test runner
// while ESLint uses a single `assertFunctionNames` option.
'jest/expect-expect': {
assertFunctionNamesJest: ['assertFunctionNames'],
assertFunctionNamesVitest: ['assertFunctionNames'],
},
};
const aliases = PER_RULE_ALIASES[linterKey] || {};
const augmentedRustCamel = [...rustCamel];
for (const [_orig, als] of Object.entries(aliases)) {
for (const a of als) {
if (!augmentedRustCamel.includes(a)) augmentedRustCamel.push(a);
}
}
const normalize = (k) => String(k).replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
const rustMap = new Map(augmentedRustCamel.map(k => [normalize(k), k]));
const eslintMap = new Map(propKeys.map(k => [normalize(k), k]));
const rustNormSet = new Set(rustMap.keys());
const eslintNormSet = new Set(eslintMap.keys());
const onlyInRustNorm = [...rustNormSet].filter(x => !eslintNormSet.has(x));
const onlyInEslintNorm = [...eslintNormSet].filter(x => !rustNormSet.has(x));
// Suppress false positives when a Rust key has known aliases in ESLint.
const ruleAliases = PER_RULE_ALIASES[linterKey] || {};
const normalizedAliasMap = Object.fromEntries(
Object.entries(ruleAliases).map(([k, arr]) => [normalize(k), arr.map(a => normalize(a))]),
);
const filteredOnlyInRustNorm = onlyInRustNorm.filter((normKey) => {
const aliasesForKey = normalizedAliasMap[normKey];
if (!aliasesForKey) return true;
// If any alias is present in ESLint keys, treat the Rust key as matched.
return !aliasesForKey.some((a) => eslintNormSet.has(a));
});
const onlyInRustNormFinal = filteredOnlyInRustNorm;
const rustOnlyEntries = onlyInRustNormFinal;
// This rule is being compared, update counters
totalChecked++;
if (rustOnlyEntries.length || onlyInEslintNorm.length) {
hasError = true;
mismatchedCount++;
console.log(`Mismatch for ${linterKey}:`);
if (rustOnlyEntries.length) console.log(` In Rust only: ${rustOnlyEntries.map(k => rustMap.get(k)).join(', ')}`);
if (onlyInEslintNorm.length) console.log(` In ESLint only: ${onlyInEslintNorm.map(k => eslintMap.get(k)).join(', ')}`);
// console.log(' debug:', { file, configType, rustCamel, propKeys });
} else {
matchedCount++;
console.log(`Config options match for ${linterKey}`);
}
}
// Print summary of the checks
console.log('\nSummary:');
console.log(` Total rules checked: ${totalChecked}`);
console.log(` Matched: ${matchedCount}`);
console.log(` Mismatched: ${mismatchedCount}`);
if (hasError) process.exitCode = 2;
}
// Do not run main for --test mode
if (process.argv[1] === new URL(import.meta.url).pathname && !process.argv.includes('--test')) {
await main();
}
//
// TESTS BELOW
//
// Test: verify extractDeclareMacro handles doc comments and returns plugin/config
function test_extractDeclareMacro() {
const src = `declare_oxc_lint!(
/// ### What it does
/// Foobar
NoMisleadingCharacterClass,
eslint,
nursery, // TODO: change category to \`correctness\`, after oxc-project/oxc#13660 and oxc-project/oxc#13436
config = NoMisleadingCharacterClass,
);`;
const res = extractDeclareMacro(src);
console.log('TEST extractDeclareMacro result:', res);
if (!res) {
console.error('extractDeclareMacro returned null');
process.exitCode = 2;
return;
}
const expectedPlugin = 'eslint';
const expectedConfig = 'NoMisleadingCharacterClass';
if (res.plugin !== expectedPlugin || res.configType !== expectedConfig) {
console.error('extractDeclareMacro test failed: unexpected result', res);
process.exitCode = 2;
return;
}
console.log('extractDeclareMacro test passed');
}
// Run tests if --test flag provided
if (process.argv.includes('--test')) {
test_extractDeclareMacro();
}
// Add the code below to `tasks/lint_rules/src/eslint-rules.mjs` in oxc/oxc for the above script to work.
/**
* Return the set of rules listed in `disable-type-checked` config of the
* `@typescript-eslint` plugin. These are rules that require type information
* and are intentionally skipped by our loader.
*/
export const getTypeScriptDisabledRules = () => {
const cfg = pluginTypeScriptConfigs && pluginTypeScriptConfigs['disable-type-checked'];
if (!cfg || !cfg.rules) return new Set();
return new Set(Object.keys(cfg.rules));
};
Config options match for accessor-pairs
Mismatch for array-callback-return:
In ESLint only: allowVoid
Could not derive option properties for arrow-body-style; meta.schema is not an object with named properties
Config options match for block-scoped-var
Could not derive option properties for capitalized-comments; meta.schema is not an object with named properties
Config options match for class-methods-use-this
Config options match for constructor-super
Could not derive option properties for curly; meta.schema is not an object with named properties
Config options match for default-case
Config options match for default-case-last
Config options match for default-param-last
Could not derive option properties for eqeqeq; meta.schema is not an object with named properties
Config options match for for-direction
Could not derive option properties for func-names; meta.schema is not an object with named properties
Could not derive option properties for func-style; meta.schema is not an object with named properties
Config options match for getter-return
Could not derive option properties for grouped-accessor-pairs; meta.schema is not an object with named properties
Config options match for guard-for-in
Config options match for id-length
Could not derive option properties for init-declarations; meta.schema is not an object with named properties
Could not derive option properties for max-classes-per-file; meta.schema is not an object with named properties
Could not derive option properties for max-depth; meta.schema is not an object with named properties
Could not derive option properties for max-lines; meta.schema is not an object with named properties
Could not derive option properties for max-lines-per-function; meta.schema is not an object with named properties
Could not derive option properties for max-nested-callbacks; meta.schema is not an object with named properties
Could not derive option properties for max-params; meta.schema is not an object with named properties
Config options match for new-cap
Config options match for no-alert
Config options match for no-array-constructor
Config options match for no-async-promise-executor
Config options match for no-await-in-loop
Config options match for no-bitwise
Config options match for no-caller
Config options match for no-case-declarations
Config options match for no-class-assign
Config options match for no-compare-neg-zero
Could not derive option properties for no-cond-assign; meta.schema is not an object with named properties
Config options match for no-console
Config options match for no-const-assign
Config options match for no-constant-binary-expression
Config options match for no-constant-condition
Config options match for no-constructor-return
Config options match for no-continue
Config options match for no-control-regex
Config options match for no-debugger
Config options match for no-delete-var
Config options match for no-div-regex
Config options match for no-dupe-class-members
Config options match for no-dupe-else-if
Config options match for no-dupe-keys
Config options match for no-duplicate-case
Config options match for no-duplicate-imports
Config options match for no-else-return
Config options match for no-empty
Config options match for no-empty-character-class
Mismatch for no-empty-function:
In ESLint only: allow
Mismatch for no-empty-pattern:
In ESLint only: allowObjectPatternsAsParameters
Config options match for no-empty-static-block
Config options match for no-eq-null
Config options match for no-eval
Config options match for no-ex-assign
Config options match for no-extend-native
Config options match for no-extra-bind
Could not derive option properties for no-extra-boolean-cast; meta.schema is not an object with named properties
Config options match for no-extra-label
Config options match for no-fallthrough
Config options match for no-func-assign
Config options match for no-global-assign
Config options match for no-implicit-coercion
Config options match for no-import-assign
Config options match for no-inline-comments
Could not derive option properties for no-inner-declarations; meta.schema is not an object with named properties
Config options match for no-invalid-regexp
Mismatch for no-irregular-whitespace:
In ESLint only: skipComments, skipStrings, skipTemplates, skipRegExps, skipJSXText
Config options match for no-iterator
Config options match for no-label-var
Config options match for no-labels
Config options match for no-lone-blocks
Config options match for no-lonely-if
Config options match for no-loop-func
Config options match for no-loss-of-precision
Config options match for no-magic-numbers
Config options match for no-misleading-character-class
Config options match for no-multi-assign
Config options match for no-multi-str
Config options match for no-negated-condition
Config options match for no-nested-ternary
Config options match for no-new
Config options match for no-new-func
Config options match for no-new-native-nonconstructor
Config options match for no-new-wrappers
Config options match for no-nonoctal-decimal-escape
Config options match for no-obj-calls
Config options match for no-object-constructor
Could not derive option properties for no-param-reassign; meta.schema is not an object with named properties
Config options match for no-plusplus
Config options match for no-promise-executor-return
Config options match for no-proto
Config options match for no-prototype-builtins
Config options match for no-redeclare
Config options match for no-regex-spaces
Could not derive option properties for no-restricted-globals; meta.schema is not an object with named properties
Could not derive option properties for no-restricted-imports; meta.schema is not an object with named properties
Could not derive option properties for no-return-assign; meta.schema is not an object with named properties
Config options match for no-script-url
Config options match for no-self-assign
Config options match for no-self-compare
Config options match for no-sequences
Config options match for no-setter-return
Config options match for no-shadow-restricted-names
Config options match for no-sparse-arrays
Config options match for no-template-curly-in-string
Config options match for no-ternary
Config options match for no-this-before-super
Config options match for no-throw-literal
Config options match for no-unassigned-vars
Config options match for no-undef
Config options match for no-undefined
Config options match for no-unexpected-multiline
Config options match for no-unneeded-ternary
Config options match for no-unreachable
Config options match for no-unsafe-finally
Config options match for no-unsafe-negation
Config options match for no-unsafe-optional-chaining
Mismatch for no-unused-expressions:
In ESLint only: ignoreDirectives
Config options match for no-unused-labels
Config options match for no-unused-private-class-members
Could not derive option properties for no-unused-vars; meta.schema is not an object with named properties
Config options match for no-useless-backreference
Config options match for no-useless-call
Config options match for no-useless-catch
Config options match for no-useless-computed-key
Config options match for no-useless-concat
Config options match for no-useless-constructor
Config options match for no-useless-escape
Config options match for no-useless-rename
Config options match for no-useless-return
Config options match for no-var
Config options match for no-void
Mismatch for no-warning-comments:
In ESLint only: terms, location, decoration
Config options match for no-with
Could not derive option properties for operator-assignment; meta.schema is not an object with named properties
Could not derive option properties for prefer-destructuring; meta.schema is not an object with named properties
Config options match for prefer-exponentiation-operator
Config options match for prefer-numeric-literals
Config options match for prefer-object-has-own
Config options match for prefer-object-spread
Config options match for prefer-promise-reject-errors
Config options match for prefer-rest-params
Config options match for prefer-spread
Config options match for prefer-template
Config options match for preserve-caught-error
Could not derive option properties for radix; meta.schema is not an object with named properties
Config options match for require-await
Config options match for require-yield
Config options match for sort-imports
Could not derive option properties for sort-keys; meta.schema is not an object with named properties
Config options match for sort-vars
Config options match for symbol-description
Could not derive option properties for unicode-bom; meta.schema is not an object with named properties
Config options match for use-isnan
Config options match for valid-typeof
Config options match for vars-on-top
Could not derive option properties for yoda; meta.schema is not an object with named properties
Could not derive option properties for import/consistent-type-specifier-style; meta.schema is not an object with named properties
Config options match for import/default
Config options match for import/export
Config options match for import/exports-last
Could not derive option properties for import/extensions; meta.schema is not an object with named properties
Could not derive option properties for import/first; meta.schema is not an object with named properties
Could not derive option properties for import/group-exports; meta.schema is not an object with named properties
Config options match for import/max-dependencies
Mismatch for import/named:
In ESLint only: commonjs
Config options match for import/namespace
Mismatch for import/no-absolute-path:
In ESLint only: ignore
Config options match for import/no-amd
Config options match for import/no-anonymous-default-export
Could not derive option properties for import/no-commonjs; meta.schema is not an object with named properties
Mismatch for import/no-cycle:
In Rust only: ignoreTypes
In ESLint only: commonjs, amd, esmodule, ignore, disableScc
Config options match for import/no-default-export
Mismatch for import/no-duplicates:
In ESLint only: considerQueryString
Config options match for import/no-dynamic-require
Config options match for import/no-empty-named-blocks
Config options match for import/no-mutable-exports
Config options match for import/no-named-as-default
Config options match for import/no-named-as-default-member
Config options match for import/no-named-default
Config options match for import/no-named-export
Config options match for import/no-namespace
Config options match for import/no-self-import
Mismatch for import/no-unassigned-import:
In Rust only: globs
In ESLint only: devDependencies, optionalDependencies, peerDependencies, allow
Config options match for import/no-webpack-loader-syntax
Config options match for import/prefer-default-export
Config options match for import/unambiguous
Mismatch for jest/consistent-test-it:
In ESLint only: fn
Config options match for jest/expect-expect
Config options match for jest/max-expects
Config options match for jest/max-nested-describe
Config options match for jest/no-alias-methods
Config options match for jest/no-commented-out-tests
Config options match for jest/no-conditional-expect
Config options match for jest/no-conditional-in-test
Config options match for jest/no-confusing-set-timeout
Mismatch for jest/no-deprecated-functions:
In Rust only: jest
Config options match for jest/no-disabled-tests
Config options match for jest/no-done-callback
Config options match for jest/no-duplicate-hooks
Config options match for jest/no-export
Config options match for jest/no-focused-tests
Config options match for jest/no-hooks
Config options match for jest/no-identical-title
Config options match for jest/no-interpolation-in-snapshots
Config options match for jest/no-jasmine-globals
Config options match for jest/no-large-snapshots
Config options match for jest/no-mocks-import
Could not derive option properties for jest/no-restricted-jest-methods; meta.schema is not an object with named properties
Could not derive option properties for jest/no-restricted-matchers; meta.schema is not an object with named properties
Config options match for jest/no-standalone-expect
Config options match for jest/no-test-prefixes
Config options match for jest/no-test-return-statement
Config options match for jest/no-untyped-mock-factory
Config options match for jest/padding-around-test-blocks
Config options match for jest/prefer-called-with
Config options match for jest/prefer-comparison-matcher
Config options match for jest/prefer-each
Config options match for jest/prefer-equality-matcher
Config options match for jest/prefer-expect-resolves
Config options match for jest/prefer-hooks-in-order
Config options match for jest/prefer-hooks-on-top
Config options match for jest/prefer-jest-mocked
Mismatch for jest/prefer-lowercase-title:
In Rust only: lowercaseFirstCharacterOnly
Config options match for jest/prefer-mock-promise-shorthand
Config options match for jest/prefer-spy-on
Config options match for jest/prefer-strict-equal
Config options match for jest/prefer-to-be
Config options match for jest/prefer-to-contain
No metadata found for jest/prefer-to-have-been-called; skipping
No metadata found for jest/prefer-to-have-been-called-times; skipping
Config options match for jest/prefer-to-have-length
Config options match for jest/prefer-todo
Config options match for jest/require-hook
Config options match for jest/require-to-throw-message
Config options match for jest/require-top-level-describe
Config options match for jest/valid-describe-callback
Config options match for jest/valid-expect
Mismatch for jest/valid-title:
In ESLint only: ignoreSpaces, ignoreTypeOfDescribeName, ignoreTypeOfTestName, disallowedWords
Could not derive option properties for jsdoc/check-access; meta.schema is not an object with named properties
Mismatch for jsdoc/check-property-names:
In ESLint only: enableFixer
Mismatch for jsdoc/check-tag-names:
In ESLint only: enableFixer, inlineTags
Config options match for jsdoc/empty-tags
Mismatch for jsdoc/implements-on-classes:
In ESLint only: contexts
Mismatch for jsdoc/no-defaults:
In ESLint only: contexts
Mismatch for jsdoc/require-param:
In ESLint only: autoIncrementBase, contexts, enableFixer, enableRestElementFixer, enableRootFixer, ignoreWhenAllParamsMissing, interfaceExemptsParamsCheck, unnamedRootBase, useDefaultObjectProperties
Mismatch for jsdoc/require-param-description:
In ESLint only: contexts, defaultDestructuredRootDescription, setDefaultDestructuredRootDescription
Mismatch for jsdoc/require-param-name:
In ESLint only: contexts
Mismatch for jsdoc/require-param-type:
In ESLint only: contexts, defaultDestructuredRootType, setDefaultDestructuredRootType
Could not derive option properties for jsdoc/require-property; meta.schema is not an object with named properties
Could not derive option properties for jsdoc/require-property-description; meta.schema is not an object with named properties
Could not derive option properties for jsdoc/require-property-name; meta.schema is not an object with named properties
Could not derive option properties for jsdoc/require-property-type; meta.schema is not an object with named properties
Mismatch for jsdoc/require-returns:
In ESLint only: contexts, enableFixer, publicOnly
Mismatch for jsdoc/require-returns-description:
In ESLint only: contexts
Mismatch for jsdoc/require-returns-type:
In ESLint only: contexts
Mismatch for jsdoc/require-yields:
In ESLint only: contexts, forceRequireNext, next, nextWithGeneratorTag
Mismatch for jsx_a11y/alt-text:
In ESLint only: elements
Config options match for jsx_a11y/anchor-ambiguous-text
Mismatch for jsx_a11y/anchor-has-content:
In ESLint only: components
Mismatch for jsx_a11y/anchor-is-valid:
In Rust only: validHrefs
In ESLint only: components, specialLink, aspects
Config options match for jsx_a11y/aria-activedescendant-has-tabindex
Config options match for jsx_a11y/aria-props
Config options match for jsx_a11y/aria-role
Config options match for jsx_a11y/aria-unsupported-elements
Config options match for jsx_a11y/autocomplete-valid
Config options match for jsx_a11y/click-events-have-key-events
Config options match for jsx_a11y/heading-has-content
Config options match for jsx_a11y/html-has-lang
Config options match for jsx_a11y/iframe-has-title
Config options match for jsx_a11y/img-redundant-alt
Config options match for jsx_a11y/label-has-associated-control
Config options match for jsx_a11y/lang
Config options match for jsx_a11y/media-has-caption
Config options match for jsx_a11y/mouse-events-have-key-events
Config options match for jsx_a11y/no-access-key
Config options match for jsx_a11y/no-aria-hidden-on-focusable
Config options match for jsx_a11y/no-autofocus
Mismatch for jsx_a11y/no-distracting-elements:
In ESLint only: elements
Mismatch for jsx_a11y/no-noninteractive-tabindex:
In Rust only: allowExpressionValues
Could not derive option properties for jsx_a11y/no-redundant-roles; meta.schema is not an object with named properties
Config options match for jsx_a11y/prefer-tag-over-role
Config options match for jsx_a11y/role-has-required-aria-props
Config options match for jsx_a11y/role-supports-aria-props
Config options match for jsx_a11y/scope
Config options match for jsx_a11y/tabindex-no-positive
Config options match for nextjs/google-font-display
Config options match for nextjs/google-font-preconnect
Config options match for nextjs/inline-script-id
Config options match for nextjs/next-script-for-ga
Config options match for nextjs/no-assign-module-variable
Config options match for nextjs/no-async-client-component
Config options match for nextjs/no-before-interactive-script-outside-document
Config options match for nextjs/no-css-tags
Config options match for nextjs/no-document-import-in-page
Config options match for nextjs/no-duplicate-head
Config options match for nextjs/no-head-element
Config options match for nextjs/no-head-import-in-document
Could not derive option properties for nextjs/no-html-link-for-pages; meta.schema is not an object with named properties
Config options match for nextjs/no-img-element
Config options match for nextjs/no-page-custom-font
Config options match for nextjs/no-script-component-in-head
Config options match for nextjs/no-styled-jsx-in-document
Config options match for nextjs/no-sync-scripts
Config options match for nextjs/no-title-in-document-head
Config options match for nextjs/no-typos
Config options match for nextjs/no-unwanted-polyfillio
Config options match for node/no-exports-assign
Config options match for node/no-new-require
Mismatch for node/no-process-env:
In Rust only: allowedVariables
Config options match for promise/always-return
Config options match for promise/avoid-new
Mismatch for promise/catch-or-return:
In ESLint only: allowThenStrict
Mismatch for promise/no-callback-in-promise:
In Rust only: callbacks
Config options match for promise/no-multiple-resolved
Config options match for promise/no-nesting
Config options match for promise/no-new-statics
Config options match for promise/no-promise-in-callback
Config options match for promise/no-return-in-finally
Config options match for promise/no-return-wrap
Config options match for promise/param-names
Config options match for promise/prefer-await-to-callbacks
Config options match for promise/prefer-await-to-then
Config options match for promise/prefer-catch
Config options match for promise/spec-only
Mismatch for promise/valid-params:
In ESLint only: exclude
Config options match for react/button-has-type
Config options match for react/checked-requires-onchange-or-readonly
Mismatch for react/exhaustive-deps:
In ESLint only: enableDangerousAutofixThisMayCauseInfiniteLoops, experimental_autoDependenciesHooks, requireExplicitEffectDeps
Mismatch for react/forbid-dom-props:
In ESLint only: forbid
Mismatch for react/forbid-elements:
In ESLint only: forbid
Config options match for react/forward-ref-uses-ref
Config options match for react/iframe-missing-sandbox
Could not derive option properties for react/jsx-boolean-value; meta.schema is not an object with named properties
Could not derive option properties for react/jsx-curly-brace-presence; meta.schema is not an object with named properties
Config options match for react/jsx-filename-extension
Could not derive option properties for react/jsx-fragments; meta.schema is not an object with named properties
Could not derive option properties for react/jsx-handler-names; meta.schema is not an object with named properties
Mismatch for react/jsx-key:
In ESLint only: checkFragmentShorthand, checkKeyMustBeforeSpread, warnOnDuplicates
Config options match for react/jsx-no-comment-textnodes
Mismatch for react/jsx-no-duplicate-props:
In ESLint only: ignoreCase
Could not derive option properties for react/jsx-no-script-url; meta.schema is not an object with named properties
Config options match for react/jsx-no-target-blank
Mismatch for react/jsx-no-undef:
In ESLint only: allowGlobals
Config options match for react/jsx-no-useless-fragment
Config options match for react/jsx-pascal-case
Could not derive option properties for react/jsx-props-no-spread-multi; meta.schema is not an object with named properties
Could not derive option properties for react/jsx-props-no-spreading; meta.schema is not an object with named properties
Config options match for react/no-array-index-key
Mismatch for react/no-children-prop:
In ESLint only: allowFunctions
Mismatch for react/no-danger:
In ESLint only: customComponentNames
Config options match for react/no-danger-with-children
Could not derive option properties for react/no-direct-mutation-state; meta.schema is not an object with named properties
Config options match for react/no-find-dom-node
Config options match for react/no-is-mounted
Config options match for react/no-namespace
Config options match for react/no-redundant-should-component-update
Config options match for react/no-render-return-value
Config options match for react/no-set-state
Config options match for react/no-string-refs
Mismatch for react/no-unescaped-entities:
In ESLint only: forbid
Config options match for react/no-unknown-property
No metadata found for react/only-export-components; skipping
Could not derive option properties for react/prefer-es6-class; meta.schema is not an object with named properties
Config options match for react/react-in-jsx-scope
Config options match for react/require-render-return
Mismatch for react/rules-of-hooks:
In ESLint only: additionalHooks
Config options match for react/self-closing-comp
Could not derive option properties for react/state-in-constructor; meta.schema is not an object with named properties
Config options match for react/style-prop-object
Config options match for react/void-dom-elements-no-children
Mismatch for react_perf/jsx-no-jsx-as-prop:
In ESLint only: nativeAllowList
Mismatch for react_perf/jsx-no-new-array-as-prop:
In ESLint only: nativeAllowList
Mismatch for react_perf/jsx-no-new-function-as-prop:
In ESLint only: nativeAllowList
Mismatch for react_perf/jsx-no-new-object-as-prop:
In ESLint only: nativeAllowList
Config options match for typescript/adjacent-overload-signatures
Config options match for typescript/array-type
Config options match for typescript/await-thenable
Config options match for typescript/ban-ts-comment
Config options match for typescript/ban-tslint-comment
No metadata found for typescript/ban-types; skipping
Could not derive option properties for typescript/consistent-generic-constructors; meta.schema is not an object with named properties
Could not derive option properties for typescript/consistent-indexed-object-style; meta.schema is not an object with named properties
Could not derive option properties for typescript/consistent-type-definitions; meta.schema is not an object with named properties
Config options match for typescript/consistent-type-imports
Config options match for typescript/explicit-function-return-type
Config options match for typescript/explicit-module-boundary-types
Config options match for typescript/no-array-delete
Mismatch for typescript/no-base-to-string:
In ESLint only: checkUnknown
Config options match for typescript/no-confusing-non-null-assertion
Config options match for typescript/no-confusing-void-expression
Mismatch for typescript/no-deprecated:
In ESLint only: allow
Config options match for typescript/no-duplicate-enum-values
Config options match for typescript/no-duplicate-type-constituents
Config options match for typescript/no-dynamic-delete
Config options match for typescript/no-empty-interface
Config options match for typescript/no-empty-object-type
Config options match for typescript/no-explicit-any
Config options match for typescript/no-extra-non-null-assertion
Config options match for typescript/no-extraneous-class
Config options match for typescript/no-floating-promises
Config options match for typescript/no-for-in-array
Config options match for typescript/no-implied-eval
Config options match for typescript/no-import-type-side-effects
Config options match for typescript/no-inferrable-types
Mismatch for typescript/no-meaningless-void-operator:
In ESLint only: checkNever
Config options match for typescript/no-misused-new
Config options match for typescript/no-misused-promises
Mismatch for typescript/no-misused-spread:
In ESLint only: allow
Config options match for typescript/no-mixed-enums
Config options match for typescript/no-namespace
Config options match for typescript/no-non-null-asserted-nullish-coalescing
Config options match for typescript/no-non-null-asserted-optional-chain
Config options match for typescript/no-non-null-assertion
Config options match for typescript/no-redundant-type-constituents
Config options match for typescript/no-require-imports
Config options match for typescript/no-restricted-types
Config options match for typescript/no-this-alias
Config options match for typescript/no-unnecessary-boolean-literal-compare
Config options match for typescript/no-unnecessary-parameter-property-assignment
Config options match for typescript/no-unnecessary-template-expression
Config options match for typescript/no-unnecessary-type-arguments
Mismatch for typescript/no-unnecessary-type-assertion:
In ESLint only: checkLiteralConstAssertions
Config options match for typescript/no-unnecessary-type-constraint
Config options match for typescript/no-unsafe-argument
Config options match for typescript/no-unsafe-assignment
Config options match for typescript/no-unsafe-call
Config options match for typescript/no-unsafe-declaration-merging
Config options match for typescript/no-unsafe-enum-comparison
Config options match for typescript/no-unsafe-function-type
Mismatch for typescript/no-unsafe-member-access:
In ESLint only: allowOptionalChaining
Config options match for typescript/no-unsafe-return
Config options match for typescript/no-unsafe-type-assertion
Config options match for typescript/no-unsafe-unary-minus
Config options match for typescript/no-useless-empty-export
Mismatch for typescript/no-var-requires:
In ESLint only: allow
Config options match for typescript/no-wrapper-object-types
Config options match for typescript/non-nullable-type-assertion-style
Mismatch for typescript/only-throw-error:
In ESLint only: allowRethrowing
Config options match for typescript/prefer-as-const
Config options match for typescript/prefer-enum-initializers
Config options match for typescript/prefer-for-of
Config options match for typescript/prefer-function-type
Config options match for typescript/prefer-includes
Config options match for typescript/prefer-literal-enum-member
Config options match for typescript/prefer-namespace-keyword
Config options match for typescript/prefer-nullish-coalescing
Config options match for typescript/prefer-promise-reject-errors
Config options match for typescript/prefer-reduce-type-parameter
Config options match for typescript/prefer-return-this-type
Config options match for typescript/prefer-ts-expect-error
Config options match for typescript/promise-function-async
Config options match for typescript/related-getter-setter-pairs
Mismatch for typescript/require-array-sort-compare:
In ESLint only: ignoreStringArrays
Config options match for typescript/require-await
Config options match for typescript/restrict-plus-operands
Config options match for typescript/restrict-template-expressions
Could not derive option properties for typescript/return-await; meta.schema is not an object with named properties
Config options match for typescript/strict-boolean-expressions
Config options match for typescript/switch-exhaustiveness-check
Config options match for typescript/triple-slash-reference
Config options match for typescript/unbound-method
Config options match for typescript/use-unknown-in-catch-callback-variable
Config options match for unicorn/catch-error-name
Config options match for unicorn/consistent-assert
Config options match for unicorn/consistent-date-clone
Config options match for unicorn/consistent-empty-array-spread
Config options match for unicorn/consistent-existence-index-check
Config options match for unicorn/consistent-function-scoping
Config options match for unicorn/empty-brace-spaces
Config options match for unicorn/error-message
Could not derive option properties for unicorn/escape-case; meta.schema is not an object with named properties
Config options match for unicorn/explicit-length-check
Could not derive option properties for unicorn/filename-case; meta.schema is not an object with named properties
Config options match for unicorn/new-for-builtins
Config options match for unicorn/no-abusive-eslint-disable
Config options match for unicorn/no-accessor-recursion
Config options match for unicorn/no-anonymous-default-export
Config options match for unicorn/no-array-callback-reference
Config options match for unicorn/no-array-for-each
Config options match for unicorn/no-array-method-this-argument
Config options match for unicorn/no-array-reduce
Config options match for unicorn/no-array-reverse
Config options match for unicorn/no-array-sort
Config options match for unicorn/no-await-expression-member
Config options match for unicorn/no-await-in-promise-methods
Config options match for unicorn/no-console-spaces
Config options match for unicorn/no-document-cookie
Config options match for unicorn/no-empty-file
Config options match for unicorn/no-hex-escape
Could not derive option properties for unicorn/no-instanceof-array; meta.schema is not an object with named properties
Config options match for unicorn/no-instanceof-builtins
Config options match for unicorn/no-invalid-fetch-options
Config options match for unicorn/no-invalid-remove-event-listener
Could not derive option properties for unicorn/no-length-as-slice-end; meta.schema is not an object with named properties
Config options match for unicorn/no-lonely-if
Config options match for unicorn/no-magic-array-flat-depth
Config options match for unicorn/no-negation-in-equality-check
Config options match for unicorn/no-nested-ternary
Config options match for unicorn/no-new-array
Config options match for unicorn/no-new-buffer
Config options match for unicorn/no-null
Config options match for unicorn/no-object-as-default-parameter
Config options match for unicorn/no-process-exit
Config options match for unicorn/no-single-promise-in-promise-methods
Config options match for unicorn/no-static-only-class
Config options match for unicorn/no-thenable
Config options match for unicorn/no-this-assignment
Config options match for unicorn/no-typeof-undefined
Config options match for unicorn/no-unnecessary-array-flat-depth
Config options match for unicorn/no-unnecessary-array-splice-count
Config options match for unicorn/no-unnecessary-await
Config options match for unicorn/no-unnecessary-slice-end
Config options match for unicorn/no-unreadable-array-destructuring
Config options match for unicorn/no-unreadable-iife
No metadata found for unicorn/no-useless-collection-argument; skipping
Config options match for unicorn/no-useless-error-capture-stack-trace
Config options match for unicorn/no-useless-fallback-in-spread
Config options match for unicorn/no-useless-length-check
Mismatch for unicorn/no-useless-promise-resolve-reject:
In Rust only: allowReject
Config options match for unicorn/no-useless-spread
Config options match for unicorn/no-useless-switch-case
Config options match for unicorn/no-useless-undefined
Config options match for unicorn/no-zero-fractions
Mismatch for unicorn/number-literal-case:
In ESLint only: hexadecimalValue
Config options match for unicorn/numeric-separators-style
Mismatch for unicorn/prefer-add-event-listener:
In ESLint only: excludedPackages
Mismatch for unicorn/prefer-array-find:
In ESLint only: checkFromLast
Mismatch for unicorn/prefer-array-flat:
In ESLint only: functions
Config options match for unicorn/prefer-array-flat-map
Config options match for unicorn/prefer-array-index-of
Config options match for unicorn/prefer-array-some
Config options match for unicorn/prefer-at
Config options match for unicorn/prefer-bigint-literals
Config options match for unicorn/prefer-blob-reading-methods
Config options match for unicorn/prefer-class-fields
Config options match for unicorn/prefer-classlist-toggle
Config options match for unicorn/prefer-code-point
Config options match for unicorn/prefer-date-now
Config options match for unicorn/prefer-default-parameters
Config options match for unicorn/prefer-dom-node-append
Config options match for unicorn/prefer-dom-node-dataset
Config options match for unicorn/prefer-dom-node-remove
Config options match for unicorn/prefer-dom-node-text-content
Config options match for unicorn/prefer-event-target
Config options match for unicorn/prefer-global-this
Config options match for unicorn/prefer-includes
Config options match for unicorn/prefer-keyboard-event-key
Config options match for unicorn/prefer-logical-operator-over-ternary
Config options match for unicorn/prefer-math-min-max
Config options match for unicorn/prefer-math-trunc
Config options match for unicorn/prefer-modern-dom-apis
Config options match for unicorn/prefer-modern-math-apis
Config options match for unicorn/prefer-native-coercion-functions
Config options match for unicorn/prefer-negative-index
Config options match for unicorn/prefer-node-protocol
Config options match for unicorn/prefer-number-properties
Config options match for unicorn/prefer-object-from-entries
Config options match for unicorn/prefer-optional-catch-binding
Config options match for unicorn/prefer-prototype-methods
Config options match for unicorn/prefer-query-selector
Config options match for unicorn/prefer-reflect-apply
Config options match for unicorn/prefer-regexp-test
No metadata found for unicorn/prefer-response-static-json; skipping
Config options match for unicorn/prefer-set-has
Config options match for unicorn/prefer-set-size
Config options match for unicorn/prefer-spread
Config options match for unicorn/prefer-string-raw
Config options match for unicorn/prefer-string-replace-all
Config options match for unicorn/prefer-string-slice
Config options match for unicorn/prefer-string-starts-ends-with
Config options match for unicorn/prefer-string-trim-start-end
Config options match for unicorn/prefer-structured-clone
Config options match for unicorn/prefer-top-level-await
Config options match for unicorn/prefer-type-error
Config options match for unicorn/require-array-join-separator
Config options match for unicorn/require-module-specifiers
Config options match for unicorn/require-number-to-fixed-digits-argument
Config options match for unicorn/require-post-message-target-origin
Could not derive option properties for unicorn/switch-case-braces; meta.schema is not an object with named properties
Config options match for unicorn/text-encoding-identifier-case
Config options match for unicorn/throw-new-error
Config options match for vitest/no-conditional-tests
Config options match for vitest/no-import-node-test
Config options match for vitest/prefer-to-be-falsy
Config options match for vitest/prefer-to-be-object
Config options match for vitest/prefer-to-be-truthy
Config options match for vitest/require-local-test-context-for-concurrent-snapshots
Could not derive option properties for vue/define-emits-declaration; meta.schema is not an object with named properties
Could not derive option properties for vue/define-props-declaration; meta.schema is not an object with named properties
Config options match for vue/define-props-destructuring
Config options match for vue/max-props
Config options match for vue/no-export-in-script-setup
Config options match for vue/no-import-compiler-macros
Config options match for vue/no-multiple-slot-args
Mismatch for vue/no-required-prop-with-default:
In ESLint only: autofix
Config options match for vue/prefer-import-from-vue
Config options match for vue/require-default-export
Config options match for vue/require-typed-ref
Config options match for vue/valid-define-emits
Config options match for vue/valid-define-props
Summary:
Total rules checked: 539
Matched: 474
Mismatched: 65
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment