eslint-plugin-ferramentas
Version:
A bundle of useful ESLint rules
86 lines (85 loc) • 3.36 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.rule = exports.ruleName = void 0;
const path_1 = require("path");
const Utils_1 = require("../Utils");
exports.ruleName = 'siloed-import';
const extractOptions = ([firstOption]) => {
const { directories, isRelative = Utils_1.RELATIVE_IMPORT_PATTERN, debug = false } = firstOption;
return {
directories,
isRelative: new RegExp(isRelative),
debug,
};
};
exports.rule = {
meta: {
type: 'problem',
docs: { description: 'disallows the importing of the forbidden files from the filtered files' },
schema: {
type: 'array',
items: {
type: 'object',
properties: {
isRelative: { type: 'string' },
debug: { type: 'boolean' },
directories: {
type: 'array',
items: {
type: 'object',
properties: {
filter: { type: 'string' },
forbid: { type: 'array', items: { type: 'string' } },
},
required: ['filter', 'forbid'],
additionalProperties: false,
},
},
},
required: ['directories'],
additionalProperties: false,
},
minItems: 1,
maxItems: 1,
},
},
create: (context) => {
/**
* Get context input
*/
const options = extractOptions(context.options);
const directory = context.getCwd();
const fileName = context.getFilename();
const debug = (0, Utils_1.createDebugger)(options.debug);
debug('options', options);
debug('directory', directory);
debug('fileName', fileName);
const relativeFileName = (0, path_1.relative)(directory, fileName);
const fileFolder = (0, path_1.dirname)(fileName);
debug('relativeFileName', relativeFileName);
debug('fileFolder', fileFolder);
const forbidden = options.directories.reduce((r, { filter, forbid }) => (new RegExp(filter).test(relativeFileName) ? [...r, ...forbid.map((f) => new RegExp(f))] : r), []);
debug('forbidden', forbidden);
if (!forbidden.length) {
/**
* There is nothing to forbid
* So don't return any declaration
*/
return {};
}
return {
ImportDeclaration: (node) => {
const importPath = (0, Utils_1.extractImportPath)(node);
const relativeImportedFilename = (0, path_1.relative)(directory, (0, path_1.resolve)(fileFolder, importPath));
debug('importPath', importPath);
debug('relativeImportedFilename', relativeImportedFilename);
if (forbidden.some((forbid) => forbid.test(relativeImportedFilename))) {
context.report({
node,
message: `Importing of '${relativeImportedFilename}' is forbidden on '${relativeFileName}'`,
});
}
},
};
},
};
;