From 0bf04bebe949f7886b4e3b3f0fd9dd3486626dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C5=A0v=C3=A1b?= Date: Thu, 7 Jul 2022 13:44:44 +0200 Subject: [PATCH] [Fix] order: Require with member expression could not be fixed if alphabetize.order was used --- src/rules/order.js | 29 ++++++++++++++++++++--------- tests/src/rules/order.js | 27 ++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/rules/order.js b/src/rules/order.js index df35db065c..3f033eb82b 100644 --- a/src/rules/order.js +++ b/src/rules/order.js @@ -129,7 +129,17 @@ function findStartOfLineWithComments(sourceCode, node) { return result; } -function isPlainRequireModule(node) { +function isRequireExpression(expr) { + return expr != null && + expr.type === 'CallExpression' && + expr.callee != null && + expr.callee.name === 'require' && + expr.arguments != null && + expr.arguments.length === 1 && + expr.arguments[0].type === 'Literal'; +} + +function isSupportedRequireModule(node) { if (node.type !== 'VariableDeclaration') { return false; } @@ -137,16 +147,17 @@ function isPlainRequireModule(node) { return false; } const decl = node.declarations[0]; - const result = decl.id && + const isPlainRequire = decl.id && + (decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') && + isRequireExpression(decl.init); + const isRequireWithMemberExpression = decl.id && (decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') && decl.init != null && decl.init.type === 'CallExpression' && decl.init.callee != null && - decl.init.callee.name === 'require' && - decl.init.arguments != null && - decl.init.arguments.length === 1 && - decl.init.arguments[0].type === 'Literal'; - return result; + decl.init.callee.type === 'MemberExpression' && + isRequireExpression(decl.init.callee.object); + return isPlainRequire || isRequireWithMemberExpression; } function isPlainImportModule(node) { @@ -158,7 +169,7 @@ function isPlainImportEquals(node) { } function canCrossNodeWhileReorder(node) { - return isPlainRequireModule(node) || isPlainImportModule(node) || isPlainImportEquals(node); + return isSupportedRequireModule(node) || isPlainImportModule(node) || isPlainImportEquals(node); } function canReorderItems(firstNode, secondNode) { @@ -276,7 +287,7 @@ function getSorter(ascending) { result = a < b ? -1 : 1; } } - + return result * multiplier; }; } diff --git a/tests/src/rules/order.js b/tests/src/rules/order.js index f5c3bb393e..e8a5143c52 100644 --- a/tests/src/rules/order.js +++ b/tests/src/rules/order.js @@ -896,13 +896,13 @@ ruleTester.run('order', rule, { import express from 'express'; import service from '@/api/service'; - + import fooParent from '../foo'; - + import fooSibling from './foo'; - + import index from './'; - + import internalDoesNotExistSoIsUnknown from '@/does-not-exist'; `, options: [ @@ -2289,7 +2289,7 @@ ruleTester.run('order', rule, { import b from "foo-bar"; `, errors: [{ - message: '`foo-bar` import should occur after import of `foo/barfoo`', + message: '`foo-bar` import should occur after import of `foo/barfoo`', }], }), // Option alphabetize {order: 'asc': caseInsensitive: true} @@ -2336,6 +2336,23 @@ ruleTester.run('order', rule, { message: '`foo` import should occur before import of `Bar`', }], }), + // Option alphabetize {order: 'asc'} and require with member expression + test({ + code: ` + const b = require('./b').get(); + const a = require('./a'); + `, + output: ` + const a = require('./a'); + const b = require('./b').get(); + `, + options: [{ + alphabetize: { order: 'asc' }, + }], + errors: [{ + message: '`./a` import should occur before import of `./b`', + }], + }), // Alphabetize with parent paths test({ code: `