You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
16 KiB
107 lines
16 KiB
5 months ago
|
'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 _contextCompat = require('eslint-module-utils/contextCompat');
|
||
|
|
||
|
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 = (0, _contextCompat.getSourceCode)(context);
|
||
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1lbXB0eS1uYW1lZC1ibG9ja3MuanMiXSwibmFtZXMiOlsiZ2V0RW1wdHlCbG9ja1JhbmdlIiwidG9rZW5zIiwiaW5kZXgiLCJ0b2tlbiIsIm5leHRUb2tlbiIsInByZXZUb2tlbiIsInN0YXJ0IiwicmFuZ2UiLCJlbmQiLCJ2YWx1ZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsImhhc1N1Z2dlc3Rpb25zIiwiY3JlYXRlIiwiY29udGV4dCIsImltcG9ydHNXaXRob3V0TmFtZWRzIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJub2RlIiwic3BlY2lmaWVycyIsInNvbWUiLCJ4IiwicHVzaCIsInByb2dyYW0iLCJpbXBvcnRzVG9rZW5zIiwibWFwIiwiZmlsdGVyIiwiZm9yRWFjaCIsImlkeCIsImluZGV4T2YiLCJoYXNPdGhlcklkZW50aWZpZXJzIiwicmVwb3J0IiwibWVzc2FnZSIsInN1Z2dlc3QiLCJkZXNjIiwiZml4IiwiZml4ZXIiLCJyZW1vdmUiLCJzb3VyY2VDb2RlIiwiZnJvbVRva2VuIiwiZmluZCIsInQiLCJpbXBvcnRUb2tlbiIsImhhc1NwYWNlQWZ0ZXJGcm9tIiwiaXNTcGFjZUJldHdlZW4iLCJnZXRUb2tlbkFmdGVyIiwiaGFzU3BhY2VBZnRlckltcG9ydCIsInJlcGxhY2VUZXh0UmFuZ2UiLCJyZW1vdmVSYW5nZSJdLCJtYXBwaW5ncyI6InFvQkFBQTs7QUFFQSxxQzs7QUFFQSxTQUFTQSxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLFFBQVFGLE9BQU9DLEtBQVAsQ0FBZDtBQUNBLE1BQU1FLFlBQVlILE9BQU9DLFFBQVEsQ0FBZixDQUFsQjtBQUNBLE1BQU1HLFlBQVlKLE9BQU9DLFFBQVEsQ0FBZixDQUFsQjtBQUNBLE1BQUlJLFFBQVFILE1B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
|