Skip to content

Commit

Permalink
Map provider protocols to 'levels'
Browse files Browse the repository at this point in the history
Rather than perform typeof checks to see if the provider has a
particular feature, check the 'support level' instead. This should make
code using a provider easier to maintain.
  • Loading branch information
novemberborn committed Feb 2, 2020
1 parent 56338dc commit f4008d5
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
12 changes: 8 additions & 4 deletions eslint-plugin-helper.js
Expand Up @@ -22,16 +22,20 @@ function load(projectDir, overrides) {

providers = [];
if (Reflect.has(conf, 'babel')) {
const {level, main} = providerManager.babel(projectDir);
providers.push({
type: 'babel',
main: providerManager.babel(projectDir).main({config: conf.babel})
level,
main: main({config: conf.babel}),
type: 'babel'
});
}

if (Reflect.has(conf, 'typescript')) {
const {level, main} = providerManager.typescript(projectDir);
providers.push({
type: 'typescript',
main: providerManager.typescript(projectDir).main({config: conf.typescript})
level,
main: main({config: conf.typescript}),
type: 'typescript'
});
}

Expand Down
12 changes: 8 additions & 4 deletions lib/cli.js
Expand Up @@ -282,9 +282,11 @@ exports.run = async () => { // eslint-disable-line complexity
const providers = [];
if (Reflect.has(conf, 'babel')) {
try {
const {level, main} = providerManager.babel(projectDir);
providers.push({
type: 'babel',
main: providerManager.babel(projectDir).main({config: conf.babel})
level,
main: main({config: conf.babel}),
type: 'babel'
});
} catch (error) {
exit(error.message);
Expand All @@ -293,9 +295,11 @@ exports.run = async () => { // eslint-disable-line complexity

if (Reflect.has(conf, 'typescript')) {
try {
const {level, main} = providerManager.typescript(projectDir);
providers.push({
type: 'typescript',
main: providerManager.typescript(projectDir).main({config: conf.typescript})
level,
main: main({config: conf.typescript}),
type: 'typescript'
});
} catch (error) {
exit(error.message);
Expand Down
21 changes: 18 additions & 3 deletions lib/provider-manager.js
@@ -1,24 +1,39 @@
const pkg = require('../package.json');
const globs = require('./globs');

const levels = {
ava3: 1
};

exports.levels = levels;

const levelsByProtocol = {
'ava-3': levels.ava3
};

function load(providerModule, projectDir) {
const ava = {version: pkg.version};
const makeProvider = require(providerModule);

let fatal;
let level;
const provider = makeProvider({
negotiateProtocol(identifiers, {version}) {
if (!identifiers.includes('ava-3')) {
const [identifier] = identifiers.filter(identifier => Reflect.has(levelsByProtocol, identifier));

if (identifier === undefined) {
fatal = new Error(`This version of AVA (${ava.version}) is not compatible with ${providerModule}@${version}`);
return null;
}

level = levelsByProtocol[identifier];

return {
ava,
async findFiles({extensions, patterns}) {
return globs.findFiles({cwd: projectDir, extensions, filePatterns: patterns});
},
identifier: 'ava-3',
identifier,
normalizeGlobPatterns: globs.normalizePatterns,
projectDir
};
Expand All @@ -29,7 +44,7 @@ function load(providerModule, projectDir) {
throw fatal;
}

return provider;
return {...provider, level};
}

exports.babel = projectDir => load('@ava/babel', projectDir);
Expand Down

0 comments on commit f4008d5

Please sign in to comment.