140 lines
16 KiB
JavaScript
140 lines
16 KiB
JavaScript
|
'use strict';var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
|
||
|
|
||
|
var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
|
||
|
var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
|
||
|
var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
|
||
|
var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
|
||
|
|
||
|
module.exports = {
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
url: (0, _docsUrl2['default'])('no-internal-modules') },
|
||
|
|
||
|
|
||
|
schema: [
|
||
|
{
|
||
|
oneOf: [
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
allow: {
|
||
|
type: 'array',
|
||
|
items: {
|
||
|
type: 'string' } } },
|
||
|
|
||
|
|
||
|
|
||
|
additionalProperties: false },
|
||
|
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
forbid: {
|
||
|
type: 'array',
|
||
|
items: {
|
||
|
type: 'string' } } },
|
||
|
|
||
|
|
||
|
|
||
|
additionalProperties: false }] }] },
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
create: function () {function noReachingInside(context) {
|
||
|
var options = context.options[0] || {};
|
||
|
var allowRegexps = (options.allow || []).map(function (p) {return _minimatch2['default'].makeRe(p);});
|
||
|
var forbidRegexps = (options.forbid || []).map(function (p) {return _minimatch2['default'].makeRe(p);});
|
||
|
|
||
|
// minimatch patterns are expected to use / path separators, like import
|
||
|
// statements, so normalize paths to use the same
|
||
|
function normalizeSep(somePath) {
|
||
|
return somePath.split('\\').join('/');
|
||
|
}
|
||
|
|
||
|
function toSteps(somePath) {
|
||
|
return normalizeSep(somePath).
|
||
|
split('/').
|
||
|
reduce(function (acc, step) {
|
||
|
if (!step || step === '.') {
|
||
|
return acc;
|
||
|
} else if (step === '..') {
|
||
|
return acc.slice(0, -1);
|
||
|
} else {
|
||
|
return acc.concat(step);
|
||
|
}
|
||
|
}, []);
|
||
|
}
|
||
|
|
||
|
// test if reaching to this destination is allowed
|
||
|
function reachingAllowed(importPath) {
|
||
|
return allowRegexps.some(function (re) {return re.test(importPath);});
|
||
|
}
|
||
|
|
||
|
// test if reaching to this destination is forbidden
|
||
|
function reachingForbidden(importPath) {
|
||
|
return forbidRegexps.some(function (re) {return re.test(importPath);});
|
||
|
}
|
||
|
|
||
|
function isAllowViolation(importPath) {
|
||
|
var steps = toSteps(importPath);
|
||
|
|
||
|
var nonScopeSteps = steps.filter(function (step) {return step.indexOf('@') !== 0;});
|
||
|
if (nonScopeSteps.length <= 1) return false;
|
||
|
|
||
|
// before trying to resolve, see if the raw import (with relative
|
||
|
// segments resolved) matches an allowed pattern
|
||
|
var justSteps = steps.join('/');
|
||
|
if (reachingAllowed(justSteps) || reachingAllowed('/' + String(justSteps))) return false;
|
||
|
|
||
|
// if the import statement doesn't match directly, try to match the
|
||
|
// resolved path if the import is resolvable
|
||
|
var resolved = (0, _resolve2['default'])(importPath, context);
|
||
|
if (!resolved || reachingAllowed(normalizeSep(resolved))) return false;
|
||
|
|
||
|
// this import was not allowed by the allowed paths, and reaches
|
||
|
// so it is a violation
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function isForbidViolation(importPath) {
|
||
|
var steps = toSteps(importPath);
|
||
|
|
||
|
// before trying to resolve, see if the raw import (with relative
|
||
|
// segments resolved) matches a forbidden pattern
|
||
|
var justSteps = steps.join('/');
|
||
|
|
||
|
if (reachingForbidden(justSteps) || reachingForbidden('/' + String(justSteps))) return true;
|
||
|
|
||
|
// if the import statement doesn't match directly, try to match the
|
||
|
// resolved path if the import is resolvable
|
||
|
var resolved = (0, _resolve2['default'])(importPath, context);
|
||
|
if (resolved && reachingForbidden(normalizeSep(resolved))) return true;
|
||
|
|
||
|
// this import was not forbidden by the forbidden paths so it is not a violation
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// find a directory that is being reached into, but which shouldn't be
|
||
|
var isReachViolation = options.forbid ? isForbidViolation : isAllowViolation;
|
||
|
|
||
|
function checkImportForReaching(importPath, node) {
|
||
|
var potentialViolationTypes = ['parent', 'index', 'sibling', 'external', 'internal'];
|
||
|
if (potentialViolationTypes.indexOf((0, _importType2['default'])(importPath, context)) !== -1 &&
|
||
|
isReachViolation(importPath))
|
||
|
{
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: 'Reaching to "' + String(importPath) + '" is not allowed.' });
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return (0, _moduleVisitor2['default'])(function (source) {
|
||
|
checkImportForReaching(source.value, source);
|
||
|
}, { commonjs: true });
|
||
|
}return noReachingInside;}() };
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1pbnRlcm5hbC1tb2R1bGVzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJvbmVPZiIsInByb3BlcnRpZXMiLCJhbGxvdyIsIml0ZW1zIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJmb3JiaWQiLCJjcmVhdGUiLCJub1JlYWNoaW5nSW5zaWRlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJhbGxvd1JlZ2V4cHMiLCJtYXAiLCJtaW5pbWF0Y2giLCJtYWtlUmUiLCJwIiwiZm9yYmlkUmVnZXhwcyIsIm5vcm1hbGl6ZVNlcCIsInNvbWVQYXRoIiwic3BsaXQiLCJqb2luIiwidG9TdGVwcyIsInJlZHVjZSIsImFjYyIsInN0ZXAiLCJzbGljZSIsImNvbmNhdCIsInJlYWNoaW5nQWxsb3dlZCIsImltcG9ydFBhdGgiLCJzb21lIiwicmUiLCJ0ZXN0IiwicmVhY2hpbmdGb3JiaWRkZW4iLCJpc0FsbG93VmlvbGF0aW9uIiwic3RlcHMiLCJub25TY29wZVN0ZXBzIiwiZmlsdGVyIiwiaW5kZXhPZiIsImxlbmd0aCIsImp1c3RTdGVwcyIsInJlc29sdmVkIiwiaXNGb3JiaWRWaW9sYXRpb24iLCJpc1JlYWNoVmlvbGF0aW9uIiwiY2hlY2tJbXBvcnRGb3JSZWFjaGluZyIsIm5vZGUiLCJwb3RlbnRpYWxWaW9sYXRpb25UeXBlcyIsInJlcG9ydCIsIm1lc3NhZ2UiLCJzb3VyY2UiLCJ2YWx1ZSIsImNvbW1vbmpzIl0sIm1hcHBpbmdzIjoiYUFBQSxzQzs7QUFFQSxzRDtBQUNBLGdEO0FBQ0Esa0U7QUFDQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssMEJBQVEscUJBQVIsQ0FERCxFQUZGOzs7QUFNSkMsWUFBUTtBQUNOO0FBQ0VDLGFBQU87QUFDTDtBQUNFSixjQUFN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
|