bigint-crypto-utils/node_modules/eslint-plugin-import/lib/rules/no-useless-path-segments.js

151 lines
16 KiB
JavaScript
Raw Normal View History

'use strict';
var _ignore = require('eslint-module-utils/ignore');
var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
var _resolve = require('eslint-module-utils/resolve');
var _resolve2 = _interopRequireDefault(_resolve);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _docsUrl = require('../docsUrl');
var _docsUrl2 = _interopRequireDefault(_docsUrl);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* convert a potentially relative path from node utils into a true
* relative path.
*
* ../ -> ..
* ./ -> .
* .foo/bar -> ./.foo/bar
* ..foo/bar -> ./..foo/bar
* foo/bar -> ./foo/bar
*
* @param relativePath {string} relative posix path potentially missing leading './'
* @returns {string} relative posix path that always starts with a ./
**/
function toRelativePath(relativePath) {
const stripped = relativePath.replace(/\/$/g, ''); // Remove trailing /
return (/^((\.\.)|(\.))($|\/)/.test(stripped) ? stripped : `./${stripped}`
);
} /**
* @fileOverview Ensures that there are no useless path segments
* @author Thomas Grainger
*/
function normalize(fn) {
return toRelativePath(_path2.default.posix.normalize(fn));
}
function countRelativeParents(pathSegments) {
return pathSegments.reduce((sum, pathSegment) => pathSegment === '..' ? sum + 1 : sum, 0);
}
module.exports = {
meta: {
type: 'suggestion',
docs: {
url: (0, _docsUrl2.default)('no-useless-path-segments')
},
schema: [{
type: 'object',
properties: {
commonjs: { type: 'boolean' },
noUselessIndex: { type: 'boolean' }
},
additionalProperties: false
}],
fixable: 'code'
},
create(context) {
const currentDir = _path2.default.dirname(context.getFilename());
const options = context.options[0];
function checkSourceValue(source) {
const importPath = source.value;
function reportWithProposedPath(proposedPath) {
context.report({
node: source,
// Note: Using messageIds is not possible due to the support for ESLint 2 and 3
message: `Useless path segments for "${importPath}", should be "${proposedPath}"`,
fix: fixer => proposedPath && fixer.replaceText(source, JSON.stringify(proposedPath))
});
}
// Only relative imports are relevant for this rule --> Skip checking
if (!importPath.startsWith('.')) {
return;
}
// Report rule violation if path is not the shortest possible
const resolvedPath = (0, _resolve2.default)(importPath, context);
const normedPath = normalize(importPath);
const resolvedNormedPath = (0, _resolve2.default)(normedPath, context);
if (normedPath !== importPath && resolvedPath === resolvedNormedPath) {
return reportWithProposedPath(normedPath);
}
const fileExtensions = (0, _ignore.getFileExtensions)(context.settings);
const regexUnnecessaryIndex = new RegExp(`.*\\/index(\\${Array.from(fileExtensions).join('|\\')})?$`);
// Check if path contains unnecessary index (including a configured extension)
if (options && options.noUselessIndex && regexUnnecessaryIndex.test(importPath)) {
const parentDirectory = _path2.default.dirname(importPath);
// Try to find ambiguous imports
if (parentDirectory !== '.' && parentDirectory !== '..') {
for (let fileExtension of fileExtensions) {
if ((0, _resolve2.default)(`${parentDirectory}${fileExtension}`, context)) {
return reportWithProposedPath(`${parentDirectory}/`);
}
}
}
return reportWithProposedPath(parentDirectory);
}
// Path is shortest possible + starts from the current directory --> Return directly
if (importPath.startsWith('./')) {
return;
}
// Path is not existing --> Return directly (following code requires path to be defined)
if (resolvedPath === undefined) {
return;
}
const expected = _path2.default.relative(currentDir, resolvedPath); // Expected import path
const expectedSplit = expected.split(_path2.default.sep); // Split by / or \ (depending on OS)
const importPathSplit = importPath.replace(/^\.\//, '').split('/');
const countImportPathRelativeParents = countRelativeParents(importPathSplit);
const countExpectedRelativeParents = countRelativeParents(expectedSplit);
const diff = countImportPathRelativeParents - countExpectedRelativeParents;
// Same number of relative parents --> Paths are the same --> Return directly
if (diff <= 0) {
return;
}
// Report and propose minimal number of required relative parents
return reportWithProposedPath(toRelativePath(importPathSplit.slice(0, countExpectedRelativeParents).concat(importPathSplit.slice(countImportPathRelativeParents + diff)).join('/')));
}
return (0, _moduleVisitor2.default)(checkSourceValue, options);
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMuanMiXSwibmFtZXMiOlsidG9SZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJzdHJpcHBlZCIsInJlcGxhY2UiLCJ0ZXN0Iiwibm9ybWFsaXplIiwiZm4iLCJwYXRoIiwicG9zaXgiLCJjb3VudFJlbGF0aXZlUGFyZW50cyIsInBhdGhTZWdtZW50cyIsInJlZHVjZSIsInN1bSIsInBhdGhTZWdtZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJjb21tb25qcyIsIm5vVXNlbGVzc0luZGV4IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJmaXhhYmxlIiwiY3JlYXRlIiwiY29udGV4dCIsImN1cnJlbnREaXIiLCJkaXJuYW1lIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZSIsImltcG9ydFBhdGgiLCJ2YWx1ZSIsInJlcG9ydFdpdGhQcm9wb3NlZFBhdGgiLCJwcm9wb3NlZFBhdGgiLCJyZXBvcnQiLCJub2RlIiwibWVzc2FnZSIsImZpeCIsImZpeGVyIiwicmVwbGFjZVRleHQiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRzV2l0aCIsInJlc29sdmVkUGF0aCIsIm5vcm1lZFBhdGgiLCJyZXNvbHZlZE5vcm1lZFBhdGgiLCJmaWxlRXh0ZW5zaW9ucyIsInNldHRpbmdzIiwicmVnZXhVbm5lY2Vzc2FyeUluZGV4IiwiUmVnRXhwIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsInBhcmVudERpcmVjdG9yeSIsImZpbGVFeHRlbnNpb24iLCJ1bmRlZmluZWQiLCJleHBlY3RlZCIsInJlbGF0aXZlIiwiZXhwZWN0ZWRTcGxpdCIsInNwbGl0Iiwic2VwIiwiaW1wb3J0UGF0aFNwbGl0IiwiY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzIiwiY291bnRFeHBl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