105 lines
15 KiB
JavaScript
105 lines
15 KiB
JavaScript
|
'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
|
||
|
|
||
|
function getEmptyBlockRange(tokens, index) {
|
||
|
var token = tokens[index];
|
||
|
var nextToken = tokens[index + 1];
|
||
|
var prevToken = tokens[index - 1];
|
||
|
var start = token.range[0];
|
||
|
var end = nextToken.range[1];
|
||
|
|
||
|
// Remove block tokens and the previous comma
|
||
|
if (prevToken.value === ',' || prevToken.value === 'type' || prevToken.value === 'typeof') {
|
||
|
start = prevToken.range[0];
|
||
|
}
|
||
|
|
||
|
return [start, end];
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
category: 'Helpful warnings',
|
||
|
description: 'Forbid empty named import blocks.',
|
||
|
url: (0, _docsUrl2['default'])('no-empty-named-blocks') },
|
||
|
|
||
|
fixable: 'code',
|
||
|
schema: [],
|
||
|
hasSuggestions: true },
|
||
|
|
||
|
|
||
|
create: function () {function create(context) {
|
||
|
var importsWithoutNameds = [];
|
||
|
|
||
|
return {
|
||
|
ImportDeclaration: function () {function ImportDeclaration(node) {
|
||
|
if (!node.specifiers.some(function (x) {return x.type === 'ImportSpecifier';})) {
|
||
|
importsWithoutNameds.push(node);
|
||
|
}
|
||
|
}return ImportDeclaration;}(),
|
||
|
|
||
|
'Program:exit': function () {function ProgramExit(program) {
|
||
|
var importsTokens = importsWithoutNameds.map(function (node) {return [node, program.tokens.filter(function (x) {return x.range[0] >= node.range[0] && x.range[1] <= node.range[1];})];});
|
||
|
|
||
|
importsTokens.forEach(function (_ref) {var _ref2 = _slicedToArray(_ref, 2),node = _ref2[0],tokens = _ref2[1];
|
||
|
tokens.forEach(function (token) {
|
||
|
var idx = program.tokens.indexOf(token);
|
||
|
var nextToken = program.tokens[idx + 1];
|
||
|
|
||
|
if (nextToken && token.value === '{' && nextToken.value === '}') {
|
||
|
var hasOtherIdentifiers = tokens.some(function (token) {return token.type === 'Identifier' &&
|
||
|
token.value !== 'from' &&
|
||
|
token.value !== 'type' &&
|
||
|
token.value !== 'typeof';});
|
||
|
|
||
|
|
||
|
// If it has no other identifiers it's the only thing in the import, so we can either remove the import
|
||
|
// completely or transform it in a side-effects only import
|
||
|
if (!hasOtherIdentifiers) {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: 'Unexpected empty named import block',
|
||
|
suggest: [
|
||
|
{
|
||
|
desc: 'Remove unused import',
|
||
|
fix: function () {function fix(fixer) {
|
||
|
// Remove the whole import
|
||
|
return fixer.remove(node);
|
||
|
}return fix;}() },
|
||
|
|
||
|
{
|
||
|
desc: 'Remove empty import block',
|
||
|
fix: function () {function fix(fixer) {
|
||
|
// Remove the empty block and the 'from' token, leaving the import only for its side
|
||
|
// effects, e.g. `import 'mod'`
|
||
|
var sourceCode = context.getSourceCode();
|
||
|
var fromToken = program.tokens.find(function (t) {return t.value === 'from';});
|
||
|
var importToken = program.tokens.find(function (t) {return t.value === 'import';});
|
||
|
var hasSpaceAfterFrom = sourceCode.isSpaceBetween(fromToken, sourceCode.getTokenAfter(fromToken));
|
||
|
var hasSpaceAfterImport = sourceCode.isSpaceBetween(importToken, sourceCode.getTokenAfter(fromToken));var _getEmptyBlockRange =
|
||
|
|
||
|
getEmptyBlockRange(program.tokens, idx),_getEmptyBlockRange2 = _slicedToArray(_getEmptyBlockRange, 1),start = _getEmptyBlockRange2[0];var _fromToken$range = _slicedToArray(
|
||
|
fromToken.range, 2),end = _fromToken$range[1];
|
||
|
var range = [start, hasSpaceAfterFrom ? end + 1 : end];
|
||
|
|
||
|
return fixer.replaceTextRange(range, hasSpaceAfterImport ? '' : ' ');
|
||
|
}return fix;}() }] });
|
||
|
|
||
|
|
||
|
|
||
|
} else {
|
||
|
context.report({
|
||
|
node: node,
|
||
|
message: 'Unexpected empty named import block',
|
||
|
fix: function () {function fix(fixer) {
|
||
|
return fixer.removeRange(getEmptyBlockRange(program.tokens, idx));
|
||
|
}return fix;}() });
|
||
|
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}return ProgramExit;}() };
|
||
|
|
||
|
}return create;}() };
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1lbXB0eS1uYW1lZC1ibG9ja3MuanMiXSwibmFtZXMiOlsiZ2V0RW1wdHlCbG9ja1JhbmdlIiwidG9rZW5zIiwiaW5kZXgiLCJ0b2tlbiIsIm5leHRUb2tlbiIsInByZXZUb2tlbiIsInN0YXJ0IiwicmFuZ2UiLCJlbmQiLCJ2YWx1ZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsImhhc1N1Z2dlc3Rpb25zIiwiY3JlYXRlIiwiY29udGV4dCIsImltcG9ydHNXaXRob3V0TmFtZWRzIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJub2RlIiwic3BlY2lmaWVycyIsInNvbWUiLCJ4IiwicHVzaCIsInByb2dyYW0iLCJpbXBvcnRzVG9rZW5zIiwibWFwIiwiZmlsdGVyIiwiZm9yRWFjaCIsImlkeCIsImluZGV4T2YiLCJoYXNPdGhlcklkZW50aWZpZXJzIiwicmVwb3J0IiwibWVzc2FnZSIsInN1Z2dlc3QiLCJkZXNjIiwiZml4IiwiZml4ZXIiLCJyZW1vdmUiLCJzb3VyY2VDb2RlIiwiZ2V0U291cmNlQ29kZSIsImZyb21Ub2tlbiIsImZpbmQiLCJ0IiwiaW1wb3J0VG9rZW4iLCJoYXNTcGFjZUFmdGVyRnJvbSIsImlzU3BhY2VCZXR3ZWVuIiwiZ2V0VG9rZW5BZnRlciIsImhhc1NwYWNlQWZ0ZXJJbXBvcnQiLCJyZXBsYWNlVGV4dFJhbmdlIiwicmVtb3ZlUmFuZ2UiXSwibWFwcGluZ3MiOiJxb0JBQUEscUM7O0FBRUEsU0FBU0Esa0JBQVQsQ0FBNEJDLE1BQTVCLEVBQW9DQyxLQUFwQyxFQUEyQztBQUN6QyxNQUFNQyxRQUFRRixPQUFPQyxLQUFQLENBQWQ7QUFDQSxNQUFNRSxZQUFZSCxPQUFPQyxRQUFRLENBQWYsQ0FBbEI7QUFDQSxNQUFNRyxZQUFZSixPQUFPQyxRQUFRLENBQWYsQ0FBbEI7QUFDQSxNQUFJ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
|