From 64fcc9b44e124c2c501a070a18fb09e9d0a0713d Mon Sep 17 00:00:00 2001 From: luo2430 Date: Tue, 14 Jul 2026 21:59:06 +0800 Subject: [PATCH] feat(keep-sorted): support class properties and member expressions - Add PropertyDefinition to node lookup so that class fields with array/object initializers can be sorted - Extend getString to handle MemberExpression (e.g. ItemTag.Apple) so enum-like members can be used as sortable array elements --- src/commands/keep-sorted.test.ts | 24 ++++++++++++++++++++++++ src/commands/keep-sorted.ts | 18 ++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/commands/keep-sorted.test.ts b/src/commands/keep-sorted.test.ts index 0a5f251..db11348 100644 --- a/src/commands/keep-sorted.test.ts +++ b/src/commands/keep-sorted.test.ts @@ -493,4 +493,28 @@ run( `, errors: ['command-fix'], }, + { + description: 'Class property with array', + code: $` + class Foo { + /// keep-sorted + protected _tags: ItemTag[] = [ + ItemTag.Foo, + ItemTag.Bar, + ItemTag.Apple, + ]; + } + `, + output: $` + class Foo { + /// keep-sorted + protected _tags: ItemTag[] = [ + ItemTag.Apple, + ItemTag.Bar, + ItemTag.Foo, + ]; + } + `, + errors: ['command-fix'], + }, ) diff --git a/src/commands/keep-sorted.ts b/src/commands/keep-sorted.ts index 85fad82..f3c2dc9 100644 --- a/src/commands/keep-sorted.ts +++ b/src/commands/keep-sorted.ts @@ -34,6 +34,7 @@ export const keepSorted: Command = { 'ExportNamedDeclaration', 'TSInterfaceDeclaration', 'VariableDeclaration', + 'PropertyDefinition', ) if (node?.type === 'TSInterfaceDeclaration') { @@ -55,6 +56,14 @@ export const keepSorted: Command = { } } + if (node?.type === 'PropertyDefinition') { + const value = node.value + if (value?.type === 'ObjectExpression' || value?.type === 'ArrayExpression' || value?.type === 'TSSatisfiesExpression' || value?.type === 'TSAsExpression') + node = value + else + node = undefined + } + // Unwrap TSSatisfiesExpression / TSAsExpression (e.g. `satisfies`, `as const`) if (node?.type === 'TSSatisfiesExpression' || node?.type === 'TSAsExpression') { if (node.expression.type !== 'ArrayExpression' && node.expression.type !== 'ObjectExpression') { @@ -307,5 +316,14 @@ function getString(node: Tree.Node): string | null { return node.name if (node.type === 'Literal') return String(node.raw) + if (node.type === 'MemberExpression') { + const object = getString(node.object) + const property = node.computed + ? (node.property.type === 'Literal' ? String(node.property.raw) : null) + : getString(node.property) + if (object == null || property == null) + return null + return `${object}.${property}` + } return null }