123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- 'use strict';
- var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
- var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
- var _debug = require('debug');var _debug2 = _interopRequireDefault(_debug);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
- var log = (0, _debug2['default'])('eslint-plugin-import:rules:newline-after-import');
- function containsNodeOrEqual(outerNode, innerNode) {return outerNode.range[0] <= innerNode.range[0] && outerNode.range[1] >= innerNode.range[1];}
- function getScopeBody(scope) {
- if (scope.block.type === 'SwitchStatement') {
- log('SwitchStatement scopes not supported');
- return null;
- }var
- body = scope.block.body;
- if (body && body.type === 'BlockStatement') {
- return body.body;
- }
- return body;
- }
- function findNodeIndexInScopeBody(body, nodeToFind) {
- return body.findIndex(function (node) {return containsNodeOrEqual(node, nodeToFind);});
- }
- function getLineDifference(node, nextNode) {
- return nextNode.loc.start.line - node.loc.end.line;
- }
- function isClassWithDecorator(node) {
- return node.type === 'ClassDeclaration' && node.decorators && node.decorators.length;
- }
- function isExportDefaultClass(node) {
- return node.type === 'ExportDefaultDeclaration' && node.declaration.type === 'ClassDeclaration';
- }
- function isExportNameClass(node) {
- return node.type === 'ExportNamedDeclaration' && node.declaration && node.declaration.type === 'ClassDeclaration';
- }
- module.exports = {
- meta: {
- type: 'layout',
- docs: {
- category: 'Style guide',
- description: 'Enforce a newline after import statements.',
- url: (0, _docsUrl2['default'])('newline-after-import') },
- fixable: 'whitespace',
- schema: [
- {
- type: 'object',
- properties: {
- count: {
- type: 'integer',
- minimum: 1 },
- exactCount: { type: 'boolean' },
- considerComments: { type: 'boolean' } },
- additionalProperties: false }] },
- create: function () {function create(context) {
- var level = 0;
- var requireCalls = [];
- var options = Object.assign({
- count: 1,
- exactCount: false,
- considerComments: false },
- context.options[0]);
- function checkForNewLine(node, nextNode, type) {
- if (isExportDefaultClass(nextNode) || isExportNameClass(nextNode)) {
- var classNode = nextNode.declaration;
- if (isClassWithDecorator(classNode)) {
- nextNode = classNode.decorators[0];
- }
- } else if (isClassWithDecorator(nextNode)) {
- nextNode = nextNode.decorators[0];
- }
- var lineDifference = getLineDifference(node, nextNode);
- var EXPECTED_LINE_DIFFERENCE = options.count + 1;
- if (
- lineDifference < EXPECTED_LINE_DIFFERENCE ||
- options.exactCount && lineDifference !== EXPECTED_LINE_DIFFERENCE)
- {
- var column = node.loc.start.column;
- if (node.loc.start.line !== node.loc.end.line) {
- column = 0;
- }
- context.report({
- loc: {
- line: node.loc.end.line,
- column: column },
- message: 'Expected ' + String(options.count) + ' empty line' + (options.count > 1 ? 's' : '') + ' after ' + String(type) + ' statement not followed by another ' + String(type) + '.',
- fix: options.exactCount && EXPECTED_LINE_DIFFERENCE < lineDifference ? undefined : function (fixer) {return fixer.insertTextAfter(
- node,
- '\n'.repeat(EXPECTED_LINE_DIFFERENCE - lineDifference));} });
- }
- }
- function commentAfterImport(node, nextComment) {
- var lineDifference = getLineDifference(node, nextComment);
- var EXPECTED_LINE_DIFFERENCE = options.count + 1;
- if (lineDifference < EXPECTED_LINE_DIFFERENCE) {
- var column = node.loc.start.column;
- if (node.loc.start.line !== node.loc.end.line) {
- column = 0;
- }
- context.report({
- loc: {
- line: node.loc.end.line,
- column: column },
- message: 'Expected ' + String(options.count) + ' empty line' + (options.count > 1 ? 's' : '') + ' after import statement not followed by another import.',
- fix: options.exactCount && EXPECTED_LINE_DIFFERENCE < lineDifference ? undefined : function (fixer) {return fixer.insertTextAfter(
- node,
- '\n'.repeat(EXPECTED_LINE_DIFFERENCE - lineDifference));} });
- }
- }
- function incrementLevel() {
- level++;
- }
- function decrementLevel() {
- level--;
- }
- function checkImport(node) {var
- parent = node.parent;
- if (!parent || !parent.body) {
- return;
- }
- var nodePosition = parent.body.indexOf(node);
- var nextNode = parent.body[nodePosition + 1];
- var endLine = node.loc.end.line;
- var nextComment = void 0;
- if (typeof parent.comments !== 'undefined' && options.considerComments) {
- nextComment = parent.comments.find(function (o) {return o.loc.start.line >= endLine && o.loc.start.line <= endLine + options.count + 1;});
- }
-
- if (node.type === 'TSImportEqualsDeclaration' && node.isExport) {
- return;
- }
- if (nextComment && typeof nextComment !== 'undefined') {
- commentAfterImport(node, nextComment);
- } else if (nextNode && nextNode.type !== 'ImportDeclaration' && (nextNode.type !== 'TSImportEqualsDeclaration' || nextNode.isExport)) {
- checkForNewLine(node, nextNode, 'import');
- }
- }
- return {
- ImportDeclaration: checkImport,
- TSImportEqualsDeclaration: checkImport,
- CallExpression: function () {function CallExpression(node) {
- if ((0, _staticRequire2['default'])(node) && level === 0) {
- requireCalls.push(node);
- }
- }return CallExpression;}(),
- 'Program:exit': function () {function ProgramExit() {
- log('exit processing for', context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename());
- var scopeBody = getScopeBody(context.getScope());
- log('got scope:', scopeBody);
- requireCalls.forEach(function (node, index) {
- var nodePosition = findNodeIndexInScopeBody(scopeBody, node);
- log('node position in scope:', nodePosition);
- var statementWithRequireCall = scopeBody[nodePosition];
- var nextStatement = scopeBody[nodePosition + 1];
- var nextRequireCall = requireCalls[index + 1];
- if (nextRequireCall && containsNodeOrEqual(statementWithRequireCall, nextRequireCall)) {
- return;
- }
- if (
- nextStatement && (
- !nextRequireCall ||
- !containsNodeOrEqual(nextStatement, nextRequireCall)))
- {
- checkForNewLine(statementWithRequireCall, nextStatement, 'require');
- }
- });
- }return ProgramExit;}(),
- FunctionDeclaration: incrementLevel,
- FunctionExpression: incrementLevel,
- ArrowFunctionExpression: incrementLevel,
- BlockStatement: incrementLevel,
- ObjectExpression: incrementLevel,
- Decorator: incrementLevel,
- 'FunctionDeclaration:exit': decrementLevel,
- 'FunctionExpression:exit': decrementLevel,
- 'ArrowFunctionExpression:exit': decrementLevel,
- 'BlockStatement:exit': decrementLevel,
- 'ObjectExpression:exit': decrementLevel,
- 'Decorator:exit': decrementLevel };
- }return create;}() };
|