Skip to content

Commit

Permalink
Generate recommended preset based on meta.docs.recommended (#2337)
Browse files Browse the repository at this point in the history
  • Loading branch information
fisker committed May 8, 2024
1 parent e3ce193 commit 911d73e
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 184 deletions.
6 changes: 0 additions & 6 deletions configs/all.js

This file was deleted.

122 changes: 0 additions & 122 deletions configs/recommended.js

This file was deleted.

27 changes: 23 additions & 4 deletions index.js
Expand Up @@ -3,8 +3,6 @@ const createDeprecatedRules = require('./rules/utils/create-deprecated-rules.js'
const {loadRules} = require('./rules/utils/rule.js');
const legacyConfigBase = require('./configs/legacy-config-base.js');
const flatConfigBase = require('./configs/flat-config-base.js');
const recommendedRules = require('./configs/recommended.js');
const allRules = require('./configs/all.js');
const {name, version} = require('./package.json');

const deprecatedRules = createDeprecatedRules({
Expand All @@ -28,10 +26,31 @@ const deprecatedRules = createDeprecatedRules({
'regex-shorthand': 'unicorn/better-regex',
});

const externalRules = {
// Covered by `unicorn/no-negated-condition`
'no-negated-condition': 'off',
// Covered by `unicorn/no-nested-ternary`
'no-nested-ternary': 'off',
};

const rules = loadRules();
const recommendedRules = Object.fromEntries(
Object.entries(rules).map(([id, rule]) => [
`unicorn/${id}`,
rule.meta.docs.recommended ? 'error' : 'off',
]),
);
const allRules = Object.fromEntries(
Object.keys(rules).map(id => [
`unicorn/${id}`,
'error',
]),
);

const createConfig = (rules, isLegacyConfig = false) => ({
...(isLegacyConfig ? legacyConfigBase : flatConfigBase),
plugins: isLegacyConfig ? ['unicorn'] : {unicorn},
rules,
rules: {...externalRules, ...rules},
});

const unicorn = {
Expand All @@ -40,7 +59,7 @@ const unicorn = {
version,
},
rules: {
...loadRules(),
...rules,
...deprecatedRules,
},
};
Expand Down
2 changes: 2 additions & 0 deletions rules/require-post-message-target-origin.js
Expand Up @@ -64,6 +64,8 @@ module.exports = {
type: 'problem',
docs: {
description: 'Enforce using the `targetOrigin` argument with `window.postMessage()`.',
// Turned off because we can't distinguish `window.postMessage` and `{Worker,MessagePort,Client,BroadcastChannel}#postMessage()`
// See #1396
recommended: false,
},
hasSuggestions: true,
Expand Down
39 changes: 0 additions & 39 deletions scripts/create-rule.mjs
Expand Up @@ -35,44 +35,6 @@ function renderTemplate({source, target, data}) {
return fs.writeFileSync(targetFile, content);
}

function updateRecommended(id) {
const RULE_INDENT = '\t';
const file = path.join(ROOT, 'configs/recommended.js');
const content = fs.readFileSync(file, 'utf8');
const {before, rules, after} = content.match(/(?<before>.*?{\n)(?<rules>.*?)(?<after>\n};\s*)/s)?.groups ?? {};
if (!rules) {
throw new Error('Unexpected content in “configs/recommended.js”.');
}

const lines = rules.split('\n');

if (!lines.every(line => line.startsWith(RULE_INDENT))) {
throw new Error('Unexpected content in “configs/recommended.js”.');
}

let ruleContent = `${RULE_INDENT}'unicorn/${id}': 'error',`;

const unicornRuleLines = lines.filter(line => line.startsWith(`${RULE_INDENT}'unicorn/`));
let insertIndex;
if (ruleContent.localeCompare(unicornRuleLines[0]) === -1) {
insertIndex = 0;
} else if (ruleContent.localeCompare(unicornRuleLines.at(-1)) === 1) {
insertIndex = lines.length;
lines[lines.length - 1] += ',';
ruleContent = ruleContent.slice(0, -1);
} else {
const lineBefore = unicornRuleLines[
unicornRuleLines.findIndex(line => line.localeCompare(ruleContent) === 1) - 1
];
insertIndex = lines.indexOf(lineBefore) + 1;
}

lines.splice(insertIndex, 0, ruleContent);

const updated = `${before}${lines.join('\n')}${after}`;
fs.writeFileSync(file, updated);
}

async function getData() {
const questions = [
{
Expand Down Expand Up @@ -153,7 +115,6 @@ renderTemplate({
target: `test/${id}.mjs`,
data,
});
updateRecommended(id);

try {
await execa('code', [
Expand Down
13 changes: 0 additions & 13 deletions test/package.mjs
Expand Up @@ -24,17 +24,6 @@ const deprecatedRules = Object.entries(eslintPluginUnicorn.rules)
.filter(([, {meta: {deprecated}}]) => deprecated)
.map(([ruleId]) => ruleId);

const testSorted = (t, actualOrder, sourceName) => {
actualOrder = actualOrder.filter(x => !ignoredRules.includes(x));
const sortedOrder = [...actualOrder].sort();

for (const [wantedIndex, name] of sortedOrder.entries()) {
const actualIndex = actualOrder.indexOf(name);
const whereMessage = (wantedIndex === 0) ? '' : `, after '${sortedOrder[wantedIndex - 1]}'`;
t.is(actualIndex, wantedIndex, `${sourceName} should be alphabetically sorted, '${name}' should be placed at index ${wantedIndex}${whereMessage}`);
}
};

const RULES_WITHOUT_PASS_FAIL_SECTIONS = new Set([
// Doesn't show code samples since it's just focused on filenames.
'filename-case',
Expand Down Expand Up @@ -72,8 +61,6 @@ test('Every rule is defined in index file in alphabetical order', t => {
ruleFiles.length - deprecatedRules.length,
'There are more rules than those exported in the all config.',
);

testSorted(t, Object.keys(eslintPluginUnicorn.configs.recommended.rules), 'configs.recommended.rules');
});

test('validate configuration', async t => {
Expand Down

0 comments on commit 911d73e

Please sign in to comment.