diff --git a/rules/sort-objects.ts b/rules/sort-objects.ts index 84065eab1..7544603d4 100644 --- a/rules/sort-objects.ts +++ b/rules/sort-objects.ts @@ -125,8 +125,10 @@ export default createEslintRule({ return } - let objectParent = getObjectParent({ node: nodeObject }) - + let objectParent = getObjectParent({ + onlyFirstParent: true, + node: nodeObject, + }) let matchedContextOptions = getMatchingContextOptions({ nodeNames: nodeObject.properties .map(property => getNodeName({ sourceCode, property })) @@ -178,10 +180,14 @@ export default createEslintRule({ return } + let objectParentForIgnorePattern = getObjectParent({ + onlyFirstParent: false, + node: nodeObject, + }) if ( - objectParent?.name && + objectParentForIgnorePattern?.name && options.ignorePattern.some(pattern => - matches(objectParent.name, pattern), + matches(objectParentForIgnorePattern.name, pattern), ) ) { return @@ -629,21 +635,26 @@ let getNodeName = ({ } let getObjectParent = ({ + onlyFirstParent, node, }: { node: TSESTree.ObjectExpression | TSESTree.ObjectPattern + onlyFirstParent: boolean }): { type: 'VariableDeclarator' | 'CallExpression' name: string } | null => { - let variableParentName = getVariableParentName({ node }) + let variableParentName = getVariableParentName({ onlyFirstParent, node }) if (variableParentName) { return { type: 'VariableDeclarator', name: variableParentName, } } - let callParentName = getCallExpressionParentName({ node }) + let callParentName = getCallExpressionParentName({ + onlyFirstParent, + node, + }) if (callParentName) { return { type: 'CallExpression', @@ -654,15 +665,18 @@ let getObjectParent = ({ } let getVariableParentName = ({ + onlyFirstParent, node, }: { node: TSESTree.ObjectExpression | TSESTree.ObjectPattern + onlyFirstParent: boolean }): string | null => { let variableParent = getFirstNodeParentWithType({ allowedTypes: [ TSESTree.AST_NODE_TYPES.VariableDeclarator, TSESTree.AST_NODE_TYPES.Property, ], + onlyFirstParent, node, }) if (!variableParent) { @@ -682,12 +696,15 @@ let getVariableParentName = ({ } let getCallExpressionParentName = ({ + onlyFirstParent, node, }: { node: TSESTree.ObjectExpression | TSESTree.ObjectPattern + onlyFirstParent: boolean }): string | null => { let callParent = getFirstNodeParentWithType({ allowedTypes: [TSESTree.AST_NODE_TYPES.CallExpression], + onlyFirstParent, node, }) if (!callParent) { diff --git a/rules/sort-objects/get-first-node-parent-with-type.ts b/rules/sort-objects/get-first-node-parent-with-type.ts index ea057b9d0..f5eb6aac0 100644 --- a/rules/sort-objects/get-first-node-parent-with-type.ts +++ b/rules/sort-objects/get-first-node-parent-with-type.ts @@ -5,13 +5,20 @@ type NodeOfType = { type: Type } & TSESTree.Node export let getFirstNodeParentWithType = < NodeType extends TSESTree.AST_NODE_TYPES, >({ + onlyFirstParent, allowedTypes, node, }: { allowedTypes: NodeType[] + onlyFirstParent: boolean node: TSESTree.Node }): NodeOfType | null => { let { parent } = node + if (onlyFirstParent) { + return parent && (allowedTypes as string[]).includes(parent.type) + ? (parent as NodeOfType) + : null + } while (parent) { if ((allowedTypes as string[]).includes(parent.type)) { return parent as NodeOfType diff --git a/test/rules/sort-objects.test.ts b/test/rules/sort-objects.test.ts index e0e270edc..3f5510d82 100644 --- a/test/rules/sort-objects.test.ts +++ b/test/rules/sort-objects.test.ts @@ -2278,6 +2278,24 @@ describe(ruleName, () => { }, messageId: 'unexpectedObjectsGroupOrder', }, + { + data: { + rightGroup: 'g', + leftGroup: 'b', + right: 'g', + left: 'b', + }, + messageId: 'unexpectedObjectsGroupOrder', + }, + { + data: { + rightGroup: 'r', + leftGroup: 'g', + right: 'r', + left: 'g', + }, + messageId: 'unexpectedObjectsGroupOrder', + }, ], options: [ { @@ -2311,6 +2329,12 @@ describe(ruleName, () => { g: string, b: string }) + + let a = someFunction(true, { + r: string, + g: string, + b: string + }) `, code: dedent` let obj = { @@ -2324,6 +2348,12 @@ describe(ruleName, () => { g: string, r: string }) + + let a = someFunction(true, { + b: string, + g: string, + r: string + }) `, }, ],