Skip to content

Commit

Permalink
feat: use FlatESLint instead of loadEslint
Browse files Browse the repository at this point in the history
  • Loading branch information
lotmek committed Oct 6, 2024
1 parent dfd671e commit b690889
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 104 deletions.
18 changes: 10 additions & 8 deletions src/lib/rule-finder.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
const path = require('path');

const { ESLint, Linter, loadESLint } = require('eslint');
const { ESLint, Linter } = require('eslint');
const glob = require('glob');
const difference = require('./array-diff');
const getSortedRules = require('./sort-rules');
const normalizePluginName = require('./normalize-plugin-name');

let builtinRules;
let builtinRules, FlatESLint;
try {
builtinRules = require('eslint/use-at-your-own-risk').builtinRules;
const eslintInternal = require('eslint/use-at-your-own-risk');
builtinRules = eslintInternal.builtinRules;
FlatESLint = eslintInternal.FlatESLint;
} catch (e) {}

async function _loadEslint(options, useFlatConfig) {
function _loadEslint(options, useFlatConfig) {
if (!useFlatConfig) {
// Ignore any config applicable depending on the location on the filesystem
options.useEslintrc = false;
} else if (!loadESLint) {
} else if (!FlatESLint) {
throw 'This version of ESLint does not support flat config.';
}

return loadESLint
? new (await loadESLint({ useFlatConfig }))(options)
return useFlatConfig
? new FlatESLint(options)
: new ESLint(options);
}

Expand All @@ -36,7 +38,7 @@ function _getConfigFile(specifiedFile) {
}

async function _getConfigs(overrideConfigFile, files, useFlatConfig) {
const esLint = await _loadEslint({
const esLint = _loadEslint({
// Point to the particular config
overrideConfigFile
}, useFlatConfig);
Expand Down
215 changes: 119 additions & 96 deletions test/lib/rule-finder.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,19 @@ const getRuleFinderForDedupeTests = proxyquire('../../src/lib/rule-finder', {
}
});

const getRuleFinderNoFlatSupport = proxyquire('../../src/lib/rule-finder', {
eslint: {
Linter: class {
getRules() {
return mockedBuiltinRules
}
},
},
'eslint/use-at-your-own-risk': {
FlatESLint: undefined
}
});

const noSpecifiedFile = path.resolve(process.cwd(), `./test/fixtures/${eslintVersion}/no-path`);
const specifiedFileRelative = `./test/fixtures/${eslintVersion}/eslint.json`;
const specifiedFileAbsolute = path.join(process.cwd(), specifiedFileRelative);
Expand Down Expand Up @@ -652,111 +665,121 @@ describe('rule-finder', function() {
]);
});

it('flat config - should throw an exception if FlatESLint is not defined', async () => {
try {
await getRuleFinderNoFlatSupport(specifiedFlatConfigFileRelative, {useFlatConfig: true})
assert.fail('Expected an error to be thrown');
} catch (error) {
assert.strictEqual(error, 'This version of ESLint does not support flat config.')
}
});

describe('flat config', () => {
it('specifiedFile (relative path) - unused rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {useFlatConfig: true});
assert.deepEqual(ruleFinder.getUnusedRules(), [
'bar-rule',
'baz-rule',
'plugin/bar-rule'
]);
});

it('specifiedFile (relative path) - unused rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(ruleFinder.getUnusedRules(), [
'bar-rule',
'baz-rule',
'old-rule',
'plugin/bar-rule',
'plugin/old-plugin-rule'
]);
});

it('specifiedFile (relative path) - current rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'foo-rule',
'plugin/foo-rule'
]);
});

it('specifiedFile (relative path) - current rules with ext', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['.json'], useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'jsonPlugin/foo-rule'
]);
});

it('specifiedFile (relative path) - current rules with ext without dot', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['json'], useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'jsonPlugin/foo-rule'
]);
});

it('specifiedFile (relative path) - current rules with ext not found', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['.ts'], useFlatConfig: true });
assert.deepEqual(ruleFinder.getCurrentRules(), []);
});

it('specifiedFile (relative path) - plugin rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { useFlatConfig: true});
assert.deepEqual(ruleFinder.getPluginRules(), [
'plugin/bar-rule',
'plugin/foo-rule'
]);
});

it('specifiedFile (relative path) - plugin rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(ruleFinder.getPluginRules(), [
'plugin/bar-rule',
'plugin/foo-rule',
'plugin/old-plugin-rule'
]);
});

it('specifiedFile (relative path) - all available rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { useFlatConfig: true });
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
if (semver.satisfies(eslintPkg.version, '>= 8')) {
describe('flat config - supported', () => {
it('specifiedFile (relative path) - unused rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {useFlatConfig: true});
assert.deepEqual(ruleFinder.getUnusedRules(), [
'bar-rule',
'baz-rule',
'foo-rule',
'plugin/bar-rule'
]);
});

it('specifiedFile (relative path) - unused rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(ruleFinder.getUnusedRules(), [
'bar-rule',
'baz-rule',
'old-rule',
'plugin/bar-rule',
'plugin/old-plugin-rule'
]);
});

it('specifiedFile (relative path) - current rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'foo-rule',
'plugin/foo-rule'
]
);
});

it('specifiedFile (relative path) - all available rules without core', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {omitCore: true, useFlatConfig: true});
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
]);
});

it('specifiedFile (relative path) - current rules with ext', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['.json'], useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'jsonPlugin/foo-rule'
]);
});

it('specifiedFile (relative path) - current rules with ext without dot', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['json'], useFlatConfig: true});
assert.deepEqual(ruleFinder.getCurrentRules(), [
'jsonPlugin/foo-rule'
]);
});

it('specifiedFile (relative path) - current rules with ext not found', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { ext: ['.ts'], useFlatConfig: true });
assert.deepEqual(ruleFinder.getCurrentRules(), []);
});

it('specifiedFile (relative path) - plugin rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { useFlatConfig: true});
assert.deepEqual(ruleFinder.getPluginRules(), [
'plugin/bar-rule',
'plugin/foo-rule'
]
);
});

it('specifiedFile (relative path) - all available rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
'bar-rule',
'baz-rule',
'foo-rule',
'old-rule',
]);
});

it('specifiedFile (relative path) - plugin rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(ruleFinder.getPluginRules(), [
'plugin/bar-rule',
'plugin/foo-rule',
'plugin/old-plugin-rule'
]
);
]);
});

it('specifiedFile (relative path) - all available rules', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, { useFlatConfig: true });
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
'bar-rule',
'baz-rule',
'foo-rule',
'plugin/bar-rule',
'plugin/foo-rule'
]
);
});

it('specifiedFile (relative path) - all available rules without core', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {omitCore: true, useFlatConfig: true});
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
'plugin/bar-rule',
'plugin/foo-rule'
]
);
});

it('specifiedFile (relative path) - all available rules including deprecated', async () => {
const ruleFinder = await getRuleFinder(specifiedFlatConfigFileRelative, {includeDeprecated: true, useFlatConfig: true});
assert.deepEqual(
ruleFinder.getAllAvailableRules(),
[
'bar-rule',
'baz-rule',
'foo-rule',
'old-rule',
'plugin/bar-rule',
'plugin/foo-rule',
'plugin/old-plugin-rule'
]
);
});
});
})
}
});

0 comments on commit b690889

Please sign in to comment.