mirror of
https://github.com/joelwmale/webhook-action.git
synced 2024-12-01 20:05:21 +01:00
145 lines
19 KiB
JavaScript
145 lines
19 KiB
JavaScript
|
'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') },
|
||
|
|
||
|
|
||
|
fixable: 'code',
|
||
|
|
||
|
schema: [
|
||
|
{
|
||
|
type: 'object',
|
||
|
properties: {
|
||
|
commonjs: { type: 'boolean' },
|
||
|
noUselessIndex: { type: 'boolean' } },
|
||
|
|
||
|
additionalProperties: false }] },
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMuanMiXSwibmFtZXMiOlsidG9SZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJzdHJpcHBlZCIsInJlcGxhY2UiLCJ0ZXN0Iiwibm9ybWFsaXplIiwiZm4iLCJwYXRoIiwicG9zaXgiLCJjb3VudFJlbGF0aXZlUGFyZW50cyIsInBhdGhTZWdtZW50cyIsInJlZHVjZSIsInN1bSIsInBhdGhTZWdtZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiY29tbW9uanMiLCJub1VzZWxlc3NJbmRleCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwiY29udGV4dCIsImN1cnJlbnREaXIiLCJkaXJuYW1lIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZSIsImltcG9ydFBhdGgiLCJ2YWx1ZSIsInJlcG9ydFdpdGhQcm9wb3NlZFBhdGgiLCJwcm9wb3NlZFBhdGgiLCJyZXBvcnQiLCJub2RlIiwibWVzc2FnZSIsImZpeCIsImZpeGVyIiwicmVwbGFjZVRleHQiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRzV2l0aCIsInJlc29sdmVkUGF0aCIsIm5vcm1lZFBhdGgiLCJyZXNvbHZlZE5vcm1lZFBhdGgiLCJmaWxlRXh0ZW5zaW9ucyIsInNldHRpbmdzIiwicmVnZXhVbm5lY2Vzc2FyeUluZGV4IiwiUmVnRXhwIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsInBhcmVudERpcmVjdG9yeSIsImZpbGVFeHRlbnNpb24iLCJ1bmRlZmluZWQiLCJleHBlY3RlZCIsInJlbGF0aXZlIiwiZXhwZWN0ZWRTcGxpdCIsInNwbGl0Iiwic2VwIiwiaW1wb3J0UGF0aFNwbGl0IiwiY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzIiwiY291bnRFeHBl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
|