We have been stalled on ESLint 3.8.0 for some time. Current ESLint is 3.13.0. We have been unable to upgrade because of more aggressive reporting on some rules, including indentation. ESLint configuration options and bugfixes are now such that we can reasonably upgrade. PR-URL: https://github.com/nodejs/node/pull/10561 Reviewed-By: Teddy Katz <teddy.katz@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
85 lines
2.6 KiB
JavaScript
85 lines
2.6 KiB
JavaScript
/**
|
|
* @fileoverview Restrict usage of specified node imports.
|
|
* @author Guy Ellis
|
|
*/
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Rule Definition
|
|
//------------------------------------------------------------------------------
|
|
|
|
const ignore = require("ignore");
|
|
|
|
const arrayOfStrings = {
|
|
type: "array",
|
|
items: {
|
|
type: "string"
|
|
},
|
|
uniqueItems: true
|
|
};
|
|
|
|
module.exports = {
|
|
meta: {
|
|
docs: {
|
|
description: "disallow specified modules when loaded by `import`",
|
|
category: "ECMAScript 6",
|
|
recommended: false
|
|
},
|
|
|
|
schema: {
|
|
anyOf: [
|
|
arrayOfStrings,
|
|
{
|
|
type: "array",
|
|
items: [{
|
|
type: "object",
|
|
properties: {
|
|
paths: arrayOfStrings,
|
|
patterns: arrayOfStrings
|
|
},
|
|
additionalProperties: false
|
|
}],
|
|
additionalItems: false
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
create(context) {
|
|
const options = Array.isArray(context.options) ? context.options : [];
|
|
const isStringArray = typeof options[0] !== "object";
|
|
const restrictedPaths = new Set(isStringArray ? context.options : options[0].paths || []);
|
|
const restrictedPatterns = isStringArray ? [] : options[0].patterns || [];
|
|
|
|
// if no imports are restricted we don"t need to check
|
|
if (restrictedPaths.size === 0 && restrictedPatterns.length === 0) {
|
|
return {};
|
|
}
|
|
|
|
const ig = ignore().add(restrictedPatterns);
|
|
|
|
return {
|
|
ImportDeclaration(node) {
|
|
if (node && node.source && node.source.value) {
|
|
|
|
const importName = node.source.value.trim();
|
|
|
|
if (restrictedPaths.has(importName)) {
|
|
context.report({
|
|
node,
|
|
message: "'{{importName}}' import is restricted from being used.",
|
|
data: { importName }
|
|
});
|
|
}
|
|
if (restrictedPatterns.length > 0 && ig.ignores(importName)) {
|
|
context.report({
|
|
node,
|
|
message: "'{{importName}}' import is restricted from being used by a pattern.",
|
|
data: { importName }
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|