You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.2 KiB
56 lines
1.2 KiB
'use strict';
|
|
const getDocumentationUrl = require('./utils/get-documentation-url');
|
|
|
|
const regexp = /^(?<package>@.*?\/.*?|[./]+?.*?)\/(?:\.|(?:index(?:\.js)?))?$/;
|
|
const isImportingIndex = value => regexp.test(value);
|
|
const normalize = value => value.replace(regexp, '$<package>');
|
|
|
|
const importIndex = (context, node, argument) => {
|
|
if (argument && isImportingIndex(argument.value)) {
|
|
context.report({
|
|
node,
|
|
message: 'Do not reference the index file directly.',
|
|
fix: fixer => fixer.replaceText(argument, `'${normalize(argument.value)}'`)
|
|
});
|
|
}
|
|
};
|
|
|
|
const create = context => {
|
|
const options = context.options[0] || {};
|
|
|
|
const rules = {
|
|
'CallExpression[callee.name="require"]': node => importIndex(context, node, node.arguments[0])
|
|
};
|
|
|
|
if (!options.ignoreImports) {
|
|
rules.ImportDeclaration = node => importIndex(context, node, node.source);
|
|
}
|
|
|
|
return rules;
|
|
};
|
|
|
|
const schema = [
|
|
{
|
|
type: 'object',
|
|
properties: {
|
|
ignoreImports: {
|
|
type: 'boolean',
|
|
default: false
|
|
}
|
|
},
|
|
additionalProperties: false
|
|
}
|
|
];
|
|
|
|
module.exports = {
|
|
create,
|
|
meta: {
|
|
type: 'suggestion',
|
|
docs: {
|
|
url: getDocumentationUrl(__filename)
|
|
},
|
|
schema,
|
|
fixable: 'code'
|
|
}
|
|
};
|