144 lines
20 KiB
JavaScript
144 lines
20 KiB
JavaScript
|
'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
|
||
|
|
||
|
function getImportValue(node) {
|
||
|
return node.type === 'ImportDeclaration' ?
|
||
|
node.source.value :
|
||
|
node.moduleReference.expression.value;
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
category: 'Style guide',
|
||
|
description: 'Ensure all imports appear before other statements.',
|
||
|
url: (0, _docsUrl2['default'])('first') },
|
||
|
|
||
|
fixable: 'code',
|
||
|
schema: [
|
||
|
{
|
||
|
type: 'string',
|
||
|
'enum': ['absolute-first', 'disable-absolute-first'] }] },
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
create: function () {function create(context) {
|
||
|
function isPossibleDirective(node) {
|
||
|
return node.type === 'ExpressionStatement' &&
|
||
|
node.expression.type === 'Literal' &&
|
||
|
typeof node.expression.value === 'string';
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
Program: function () {function Program(n) {
|
||
|
var body = n.body;
|
||
|
if (!body) {
|
||
|
return;
|
||
|
}
|
||
|
var absoluteFirst = context.options[0] === 'absolute-first';
|
||
|
var message = 'Import in body of module; reorder to top.';
|
||
|
var sourceCode = context.getSourceCode();
|
||
|
var originSourceCode = sourceCode.getText();
|
||
|
var nonImportCount = 0;
|
||
|
var anyExpressions = false;
|
||
|
var anyRelative = false;
|
||
|
var lastLegalImp = null;
|
||
|
var errorInfos = [];
|
||
|
var shouldSort = true;
|
||
|
var lastSortNodesIndex = 0;
|
||
|
body.forEach(function (node, index) {
|
||
|
if (!anyExpressions && isPossibleDirective(node)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
anyExpressions = true;
|
||
|
|
||
|
if (node.type === 'ImportDeclaration' || node.type === 'TSImportEqualsDeclaration') {
|
||
|
if (absoluteFirst) {
|
||
|
if (/^\./.test(getImportValue(node))) {
|
||
|
anyRelative = true;
|
||
|
} else if (anyRelative) {
|
||
|
context.report({
|
||
|
node: node.type === 'ImportDeclaration' ? node.source : node.moduleReference,
|
||
|
message: 'Absolute imports should come before relative imports.' });
|
||
|
|
||
|
}
|
||
|
}
|
||
|
if (nonImportCount > 0) {var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try {
|
||
|
for (var _iterator = context.getDeclaredVariables(node)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var variable = _step.value;
|
||
|
if (!shouldSort) {break;}
|
||
|
var references = variable.references;
|
||
|
if (references.length) {var _iteratorNormalCompletion2 = true;var _didIteratorError2 = false;var _iteratorError2 = undefined;try {
|
||
|
for (var _iterator2 = references[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {var reference = _step2.value;
|
||
|
if (reference.identifier.range[0] < node.range[1]) {
|
||
|
shouldSort = false;
|
||
|
break;
|
||
|
}
|
||
|
}} catch (err) {_didIteratorError2 = true;_iteratorError2 = err;} finally {try {if (!_iteratorNormalCompletion2 && _iterator2['return']) {_iterator2['return']();}} finally {if (_didIteratorError2) {throw _iteratorError2;}}}
|
||
|
}
|
||
|
}} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator['return']) {_iterator['return']();}} finally {if (_didIteratorError) {throw _iteratorError;}}}
|
||
|
shouldSort && (lastSortNodesIndex = errorInfos.length);
|
||
|
errorInfos.push({
|
||
|
node: node,
|
||
|
range: [body[index - 1].range[1], node.range[1]] });
|
||
|
|
||
|
} else {
|
||
|
lastLegalImp = node;
|
||
|
}
|
||
|
} else {
|
||
|
nonImportCount++;
|
||
|
}
|
||
|
});
|
||
|
if (!errorInfos.length) {return;}
|
||
|
errorInfos.forEach(function (errorInfo, index) {
|
||
|
var node = errorInfo.node;
|
||
|
var infos = {
|
||
|
node: node,
|
||
|
message: message };
|
||
|
|
||
|
if (index < lastSortNodesIndex) {
|
||
|
infos.fix = function (fixer) {
|
||
|
return fixer.insertTextAfter(node, '');
|
||
|
};
|
||
|
} else if (index === lastSortNodesIndex) {
|
||
|
var sortNodes = errorInfos.slice(0, lastSortNodesIndex + 1);
|
||
|
infos.fix = function (fixer) {
|
||
|
var removeFixers = sortNodes.map(function (_errorInfo) {
|
||
|
return fixer.removeRange(_errorInfo.range);
|
||
|
});
|
||
|
var range = [0, removeFixers[removeFixers.length - 1].range[1]];
|
||
|
var insertSourceCode = sortNodes.map(function (_errorInfo) {
|
||
|
var nodeSourceCode = String.prototype.slice.apply(
|
||
|
originSourceCode, _errorInfo.range);
|
||
|
|
||
|
if (/\S/.test(nodeSourceCode[0])) {
|
||
|
return '\n' + String(nodeSourceCode);
|
||
|
}
|
||
|
return nodeSourceCode;
|
||
|
}).join('');
|
||
|
var insertFixer = null;
|
||
|
var replaceSourceCode = '';
|
||
|
if (!lastLegalImp) {
|
||
|
insertSourceCode = insertSourceCode.trim() + insertSourceCode.match(/^(\s+)/)[0];
|
||
|
}
|
||
|
insertFixer = lastLegalImp ?
|
||
|
fixer.insertTextAfter(lastLegalImp, insertSourceCode) :
|
||
|
fixer.insertTextBefore(body[0], insertSourceCode);
|
||
|
|
||
|
var fixers = [insertFixer].concat(removeFixers);
|
||
|
fixers.forEach(function (computedFixer, i) {
|
||
|
replaceSourceCode += originSourceCode.slice(
|
||
|
fixers[i - 1] ? fixers[i - 1].range[1] : 0, computedFixer.range[0]) +
|
||
|
computedFixer.text;
|
||
|
});
|
||
|
|
||
|
return fixer.replaceTextRange(range, replaceSourceCode);
|
||
|
};
|
||
|
}
|
||
|
context.report(infos);
|
||
|
});
|
||
|
}return Program;}() };
|
||
|
|
||
|
}return create;}() };
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9maXJzdC5qcyJdLCJuYW1lcyI6WyJnZXRJbXBvcnRWYWx1ZSIsIm5vZGUiLCJ0eXBlIiwic291cmNlIiwidmFsdWUiLCJtb2R1bGVSZWZlcmVuY2UiLCJleHByZXNzaW9uIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwiY2F0ZWdvcnkiLCJkZXNjcmlwdGlvbiIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwiaXNQb3NzaWJsZURpcmVjdGl2ZSIsIlByb2dyYW0iLCJuIiwiYm9keSIsImFic29sdXRlRmlyc3QiLCJvcHRpb25zIiwibWVzc2FnZSIsInNvdXJjZUNvZGUiLCJnZXRTb3VyY2VDb2RlIiwib3JpZ2luU291cmNlQ29kZSIsImdldFRleHQiLCJub25JbXBvcnRDb3VudCIsImFueUV4cHJlc3Npb25zIiwiYW55UmVsYXRpdmUiLCJsYXN0TGVnYWxJbXAiLCJlcnJvckluZm9zIiwic2hvdWxkU29ydCIsImxhc3RTb3J0Tm9kZXNJbmRleCIsImZvckVhY2giLCJpbmRleCIsInRlc3QiLCJyZXBvcnQiLCJnZXREZWNsYXJlZFZhcmlhYmxlcyIsInZhcmlhYmxlIiwicmVmZXJlbmNlcyIsImxlbmd0aCIsInJlZmVyZW5jZSIsImlkZW50aWZpZXIiLCJyYW5nZSIsInB1c2giLCJlcnJvckluZm8iLCJpbmZvcyIsImZpeCIsImZpeGVyIiwiaW5zZXJ0VGV4dEFmdGVyIiwic29ydE5vZGVzIiwic2xpY2UiLCJyZW1vdmVGaXhlcnMiLCJtYXAiLCJfZXJyb3JJbmZvIiwicmVtb3ZlUmFuZ2UiLCJpbnNlcnRTb3VyY2VDb2RlIiwibm9kZVNvdXJjZUNvZGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJhcHBseSIsImpvaW4iLCJpbnNlcnRGaXhlciIsInJlcGxhY2VTb3VyY2VDb2RlIiwidHJpbSIsIm1hdGNoIiwiaW5zZXJ0VGV4dEJlZm9yZSIsImZpeGVycyIsImNvbmNhdCIsImNv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
|