From 7a60a4d14f98b51dadcc56ab7901024ebd6ad5c4 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 01:02:26 +0800 Subject: [PATCH 01/12] feat(typescript-estree): forbid computed `EnumMember` --- .../snapshots/1-TSESTree-AST.shot | 1 - .../snapshots/5-AST-Alignment-AST.shot | 1 - .../ast-spec/src/element/TSEnumMember/spec.ts | 44 +++---------------- .../snapshots/1-TSESTree-Error.shot | 8 +++- .../snapshots/3-Alignment-Error.shot | 2 +- .../snapshots/1-TSESTree-Error.shot | 8 +++- .../snapshots/3-Alignment-Error.shot | 2 +- .../snapshots/1-TSESTree-Error.shot | 8 +++- .../snapshots/3-Alignment-Error.shot | 2 +- .../const-enum/snapshots/1-TSESTree-AST.shot | 2 - .../snapshots/5-AST-Alignment-AST.shot | 16 +++---- .../snapshots/1-TSESTree-AST.shot | 2 - .../snapshots/5-AST-Alignment-AST.shot | 2 - .../snapshots/1-TSESTree-AST.shot | 2 - .../snapshots/5-AST-Alignment-AST.shot | 2 - .../snapshots/1-TSESTree-AST.shot | 2 - .../snapshots/5-AST-Alignment-AST.shot | 2 - .../enum/snapshots/1-TSESTree-AST.shot | 2 - .../enum/snapshots/5-AST-Alignment-AST.shot | 2 - .../fixtures-with-differences-errors.shot | 3 -- packages/typescript-estree/src/convert.ts | 42 +++++++++++++----- 21 files changed, 69 insertions(+), 86 deletions(-) diff --git a/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/1-TSESTree-AST.shot index ddd23006e5d0..9a5146151d36 100644 --- a/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/1-TSESTree-AST.shot @@ -8,7 +8,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/5-AST-Alignment-AST.shot index 90fb8dedf846..eeec47153937 100644 --- a/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/declaration/TSEnumDeclaration/fixtures/with-member-one/snapshots/5-AST-Alignment-AST.shot @@ -15,7 +15,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], diff --git a/packages/ast-spec/src/element/TSEnumMember/spec.ts b/packages/ast-spec/src/element/TSEnumMember/spec.ts index a80e963ad278..9e03c86193f5 100644 --- a/packages/ast-spec/src/element/TSEnumMember/spec.ts +++ b/packages/ast-spec/src/element/TSEnumMember/spec.ts @@ -1,44 +1,14 @@ import type { AST_NODE_TYPES } from '../../ast-node-types'; import type { BaseNode } from '../../base/BaseNode'; import type { Expression } from '../../unions/Expression'; -import type { - PropertyNameComputed, - PropertyNameNonComputed, -} from '../../unions/PropertyName'; +import type { PropertyNameNonComputed } from '../../unions/PropertyName'; -interface TSEnumMemberBase extends BaseNode { +export interface TSEnumMember extends BaseNode { type: AST_NODE_TYPES.TSEnumMember; - computed: boolean; - id: - | PropertyNameComputed // this should only happen in semantically invalid code (ts error 1164) - | PropertyNameNonComputed; - initializer: Expression | undefined; -} - -/** - * this should only really happen in semantically invalid code (errors 1164 and 2452) - * - * @example - * ```ts - * // VALID: - * enum Foo { ['a'] } - * - * // INVALID: - * const x = 'a'; - * enum Foo { [x] } - * enum Bar { ['a' + 'b'] } - * ``` - */ -export interface TSEnumMemberComputedName extends TSEnumMemberBase { - computed: true; - id: PropertyNameComputed; -} - -export interface TSEnumMemberNonComputedName extends TSEnumMemberBase { - computed: false; id: PropertyNameNonComputed; + initializer: Expression | undefined; + /** + * @deprecated the enum member is always non-computed. + */ + computed: boolean; } - -export type TSEnumMember = - | TSEnumMemberComputedName - | TSEnumMemberNonComputedName; diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/1-TSESTree-Error.shot index c64aaae4a4d8..dc8d857908c8 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/1-TSESTree-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/1-TSESTree-Error.shot @@ -1,4 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-number > TSESTree - Error`] -NO ERROR +TSError + 2 | + 3 | export enum Foo { +> 4 | [1], + | ^^^ Computed property names are not allowed in enums. + 5 | } + 6 | diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/3-Alignment-Error.shot index f5e14d5d4b27..f9ae118971e1 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/3-Alignment-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/snapshots/3-Alignment-Error.shot @@ -1,4 +1,4 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-number > Error Alignment`] -Babel errored but TSESTree didn't +Both errored diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/1-TSESTree-Error.shot index 866743a38587..90ef25fd26d8 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/1-TSESTree-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/1-TSESTree-Error.shot @@ -1,4 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-string > TSESTree - Error`] -NO ERROR +TSError + 2 | + 3 | export enum Foo { +> 4 | ['baz'], + | ^^^^^^^ Computed property names are not allowed in enums. + 5 | } + 6 | diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/3-Alignment-Error.shot index f58190aa21f3..2dc13fd3d5d2 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/3-Alignment-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/snapshots/3-Alignment-Error.shot @@ -1,4 +1,4 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-string > Error Alignment`] -Babel errored but TSESTree didn't +Both errored diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/1-TSESTree-Error.shot index 85b95f8e17d3..7e31fde5e0c7 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/1-TSESTree-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/1-TSESTree-Error.shot @@ -1,4 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-var-ref > TSESTree - Error`] -NO ERROR +TSError + 2 | + 3 | export enum Foo { +> 4 | [x], + | ^^^ Computed property names are not allowed in enums. + 5 | } + 6 | diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/3-Alignment-Error.shot index 006e3518ee1f..3909357acf22 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/3-Alignment-Error.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/snapshots/3-Alignment-Error.shot @@ -1,4 +1,4 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > legacy-fixtures > basics > _error_ > export-named-enum-computed-var-ref > Error Alignment`] -Babel errored but TSESTree didn't +Both errored diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/1-TSESTree-AST.shot index 9187f52aade3..238113e5cc58 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/1-TSESTree-AST.shot @@ -8,7 +8,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], @@ -41,7 +40,6 @@ Program { }, TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/5-AST-Alignment-AST.shot index 1c5c321a9cf2..20c84325ce31 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/const-enum/snapshots/5-AST-Alignment-AST.shot @@ -15,7 +15,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -81,7 +80,6 @@ Snapshot Diff: }, - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -121,12 +119,7 @@ Snapshot Diff: - loc: { - start: { column: 15, line: 3 }, - end: { column: 1, line: 6 }, -+ range: [103, 106], -+ loc: { -+ start: { column: 2, line: 5 }, -+ end: { column: 5, line: 5 }, -+ }, - }, +- }, - }, - const: true, - declare: false, @@ -140,7 +133,12 @@ Snapshot Diff: - loc: { - start: { column: 11, line: 3 }, - end: { column: 14, line: 3 }, -- }, ++ range: [103, 106], ++ loc: { ++ start: { column: 2, line: 5 }, ++ end: { column: 5, line: 5 }, ++ }, + }, - }, + ], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/1-TSESTree-AST.shot index 0a35e9756f00..01c4d100b383 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/1-TSESTree-AST.shot @@ -11,7 +11,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], @@ -44,7 +43,6 @@ Program { }, TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/5-AST-Alignment-AST.shot index bc225b94ed0d..603938fb4270 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-const-named-enum/snapshots/5-AST-Alignment-AST.shot @@ -19,7 +19,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -85,7 +84,6 @@ Snapshot Diff: }, - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/1-TSESTree-AST.shot index 15279e8049d7..f946f794f043 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/1-TSESTree-AST.shot @@ -11,7 +11,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], @@ -44,7 +43,6 @@ Program { }, TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/5-AST-Alignment-AST.shot index 695e866e0f98..eff7ba3226bd 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-declare-named-enum/snapshots/5-AST-Alignment-AST.shot @@ -19,7 +19,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -85,7 +84,6 @@ Snapshot Diff: }, - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/1-TSESTree-AST.shot index b1554a6d0194..8f42d8de69bf 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/1-TSESTree-AST.shot @@ -11,7 +11,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], @@ -44,7 +43,6 @@ Program { }, TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/5-AST-Alignment-AST.shot index b52051becdfb..10c5f8d572d1 100644 --- a/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/basics/fixtures/export-named-enum/snapshots/5-AST-Alignment-AST.shot @@ -19,7 +19,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -85,7 +84,6 @@ Snapshot Diff: }, - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], diff --git a/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/1-TSESTree-AST.shot b/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/1-TSESTree-AST.shot index 513eb9bcd84c..e483a20f2a29 100644 --- a/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/1-TSESTree-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/1-TSESTree-AST.shot @@ -8,7 +8,6 @@ Program { members: [ TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], @@ -30,7 +29,6 @@ Program { }, TSEnumMember { type: "TSEnumMember", - computed: false, id: Identifier { type: "Identifier", decorators: [], diff --git a/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/5-AST-Alignment-AST.shot b/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/5-AST-Alignment-AST.shot index 3c1cbd1bc2a0..544b72e407c8 100644 --- a/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/5-AST-Alignment-AST.shot +++ b/packages/ast-spec/src/legacy-fixtures/declare/fixtures/enum/snapshots/5-AST-Alignment-AST.shot @@ -15,7 +15,6 @@ Snapshot Diff: - members: Array [ - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], @@ -59,7 +58,6 @@ Snapshot Diff: }, - TSEnumMember { - type: 'TSEnumMember', -- computed: false, - id: Identifier { - type: 'Identifier', - decorators: Array [], diff --git a/packages/ast-spec/tests/fixtures-with-differences-errors.shot b/packages/ast-spec/tests/fixtures-with-differences-errors.shot index 7051aa777fbb..04b14e7a3730 100644 --- a/packages/ast-spec/tests/fixtures-with-differences-errors.shot +++ b/packages/ast-spec/tests/fixtures-with-differences-errors.shot @@ -27,9 +27,6 @@ exports[`AST Fixtures > List fixtures with Error differences`] "legacy-fixtures/basics/fixtures/_error_/class-with-constructor-and-type-parameters/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/class-with-two-methods-computed-constructor/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/const-assertions/fixture.ts", - "legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-number/fixture.ts", - "legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-string/fixture.ts", - "legacy-fixtures/basics/fixtures/_error_/export-named-enum-computed-var-ref/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/export-with-import-assertions/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/import-type-error/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/new-target-in-arrow-function-body/fixture.ts", diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 8f293db2af02..a717c3a619d0 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -476,7 +476,7 @@ export class Converter { >( node: Properties, deprecatedKey: Key, - preferredKey: string, + preferredKey: string | undefined, value: Value, ): Properties & Record { let warned = false; @@ -487,10 +487,13 @@ export class Converter { ? (): Value => value : (): Value => { if (!warned) { - process.emitWarning( - `The '${deprecatedKey}' property is deprecated on ${node.type} nodes. Use ${preferredKey} instead. See https://typescript-eslint.io/troubleshooting/faqs/general#the-key-property-is-deprecated-on-type-nodes-use-key-instead-warnings.`, - 'DeprecationWarning', - ); + let message = `The '${deprecatedKey}' property is deprecated on ${node.type} nodes.`; + if (preferredKey) { + message += ' Use ${preferredKey} instead.'; + } + message += + ' See https://typescript-eslint.io/troubleshooting/faqs/general#the-key-property-is-deprecated-on-type-nodes-use-key-instead-warnings.'; + process.emitWarning(message, 'DeprecationWarning'); warned = true; } @@ -3238,12 +3241,29 @@ export class Converter { } case SyntaxKind.EnumMember: { - return this.createNode(node, { - type: AST_NODE_TYPES.TSEnumMember, - computed: node.name.kind === ts.SyntaxKind.ComputedPropertyName, - id: this.convertChild(node.name), - initializer: node.initializer && this.convertChild(node.initializer), - }); + const computed = node.name.kind === ts.SyntaxKind.ComputedPropertyName; + if (computed) { + this.#throwUnlessAllowInvalidAST( + node.name, + 'Computed property names are not allowed in enums.', + ); + } + + return this.createNode( + node, + + this.#withDeprecatedGetter( + { + type: AST_NODE_TYPES.TSEnumMember, + id: this.convertChild(node.name), + initializer: + node.initializer && this.convertChild(node.initializer), + }, + 'computed', + undefined, + computed, + ), + ); } case SyntaxKind.ModuleDeclaration: { From fcec48fec025c5af424a139c89000d83cb05c692 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 01:02:26 +0800 Subject: [PATCH 02/12] feat(typescript-estree): forbid computed `EnumMember` --- packages/typescript-estree/src/convert.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index a717c3a619d0..4c9779388468 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -489,7 +489,7 @@ export class Converter { if (!warned) { let message = `The '${deprecatedKey}' property is deprecated on ${node.type} nodes.`; if (preferredKey) { - message += ' Use ${preferredKey} instead.'; + message += ` Use ${preferredKey} instead.`; } message += ' See https://typescript-eslint.io/troubleshooting/faqs/general#the-key-property-is-deprecated-on-type-nodes-use-key-instead-warnings.'; @@ -3251,7 +3251,6 @@ export class Converter { return this.createNode( node, - this.#withDeprecatedGetter( { type: AST_NODE_TYPES.TSEnumMember, From 3a55b5adade5fc3a6e7eece14f5bab1b67750952 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 01:56:20 +0800 Subject: [PATCH 03/12] Update `eslint-plugin` `scope-manager` --- packages/eslint-plugin/src/rules/naming-convention.ts | 7 ++----- packages/scope-manager/src/referencer/Referencer.ts | 5 +---- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index 03500d825163..839f3e0a1c98 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -631,11 +631,8 @@ export default createRule({ // #region interface - 'TSEnumMember[computed != true]': { - handler: ( - node: TSESTree.TSEnumMemberNonComputedName, - validator, - ): void => { + TSEnumMember: { + handler: (node: TSESTree.TSEnumMember, validator): void => { const id = node.id; const modifiers = new Set(); diff --git a/packages/scope-manager/src/referencer/Referencer.ts b/packages/scope-manager/src/referencer/Referencer.ts index 1f621d8f7823..562921170751 100644 --- a/packages/scope-manager/src/referencer/Referencer.ts +++ b/packages/scope-manager/src/referencer/Referencer.ts @@ -668,10 +668,7 @@ export class Referencer extends Visitor { name, new TSEnumMemberDefinition(name, member), ); - } else if ( - !member.computed && - member.id.type === AST_NODE_TYPES.Identifier - ) { + } else if (member.id.type === AST_NODE_TYPES.Identifier) { this.currentScope().defineIdentifier( member.id, new TSEnumMemberDefinition(member.id, member), From cf53299545c09a399ee5ee24da3a103cb18b92d2 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 02:23:24 +0800 Subject: [PATCH 04/12] Narrow types --- packages/ast-spec/src/element/TSEnumMember/spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/ast-spec/src/element/TSEnumMember/spec.ts b/packages/ast-spec/src/element/TSEnumMember/spec.ts index 9e03c86193f5..a4d1b836f951 100644 --- a/packages/ast-spec/src/element/TSEnumMember/spec.ts +++ b/packages/ast-spec/src/element/TSEnumMember/spec.ts @@ -1,11 +1,12 @@ import type { AST_NODE_TYPES } from '../../ast-node-types'; import type { BaseNode } from '../../base/BaseNode'; +import type { Identifier } from '../../expression/Identifier/spec'; +import type { StringLiteral } from '../../expression/literal/StringLiteral/spec'; import type { Expression } from '../../unions/Expression'; -import type { PropertyNameNonComputed } from '../../unions/PropertyName'; export interface TSEnumMember extends BaseNode { type: AST_NODE_TYPES.TSEnumMember; - id: PropertyNameNonComputed; + id: Identifier | StringLiteral; initializer: Expression | undefined; /** * @deprecated the enum member is always non-computed. From 81e9a30b55596ba528235f75202ded70295928aa Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 02:30:47 +0800 Subject: [PATCH 05/12] Workaround --- packages/eslint-plugin/src/rules/naming-convention.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index 839f3e0a1c98..02b95a5948fc 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -633,7 +633,8 @@ export default createRule({ TSEnumMember: { handler: (node: TSESTree.TSEnumMember, validator): void => { - const id = node.id; + // Unknown reason, can't get the correct type + const id = node.id as TSESTree.Identifier | TSESTree.StringLiteral; const modifiers = new Set(); if (requiresQuoting(id, compilerOptions.target)) { From d5772c3f2b80bfa3b14e222ae31801148b9aac30 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 21 May 2025 18:52:51 +0000 Subject: [PATCH 06/12] Remove invalid tests --- .../rules/no-unsafe-enum-comparison.test.ts | 81 ------------------- 1 file changed, 81 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts b/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts index b592b7fe513d..89e28f163314 100644 --- a/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unsafe-enum-comparison.test.ts @@ -1121,87 +1121,6 @@ ruleTester.run('no-unsafe-enum-comparison', rule, { }, ], }, - { - code: ` - enum ComputedKey { - ['test-key' /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === 1; - `, - errors: [ - { - messageId: 'mismatchedCondition', - suggestions: [ - { - messageId: 'replaceValueWithEnum', - output: ` - enum ComputedKey { - ['test-key' /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === ComputedKey['test-key']; - `, - }, - ], - }, - ], - }, - { - code: ` - enum ComputedKey { - [\`test-key\` /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === 1; - `, - errors: [ - { - messageId: 'mismatchedCondition', - suggestions: [ - { - messageId: 'replaceValueWithEnum', - output: ` - enum ComputedKey { - [\`test-key\` /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === ComputedKey[\`test-key\`]; - `, - }, - ], - }, - ], - }, - { - code: ` - enum ComputedKey { - [\`test- - key\` /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === 1; - `, - errors: [ - { - messageId: 'mismatchedCondition', - suggestions: [ - { - messageId: 'replaceValueWithEnum', - output: ` - enum ComputedKey { - [\`test- - key\` /* with comment */] = 1, - } - declare const computedKey: ComputedKey; - computedKey === ComputedKey[\`test- - key\`]; - `, - }, - ], - }, - ], - }, { code: ` enum Fruit { From 8faad117be4c7e34525c6021249dec788efc423f Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 21 May 2025 18:54:14 +0000 Subject: [PATCH 07/12] Two more --- .../tests/rules/prefer-literal-enum-member.test.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts b/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts index ea670139ccb3..f655c87e9ce2 100644 --- a/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts @@ -54,11 +54,6 @@ enum ValidQuotedKey { ` enum ValidQuotedKeyWithAssignment { 'a' = 1, -} - `, - ` -enum ValidKeyWithComputedSyntaxButNoComputedKey { - ['a'], } `, { @@ -107,15 +102,6 @@ enum Foo { }, { code: ` -enum Foo { - ['A-1'] = 1 << 0, - C = ~Foo['A-1'], -} - `, - options: [{ allowBitwiseExpressions: true }], - }, - { - code: ` enum Foo { A = 1 << 0, B = 1 << 1, From aabbb8880af77ce272fe531ea98ec455b1b6d132 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 21 May 2025 19:10:47 +0000 Subject: [PATCH 08/12] Another invalid case --- .../rules/switch-exhaustiveness-check.test.ts | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts b/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts index da5b65c8177f..b18e91e4872a 100644 --- a/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts +++ b/packages/eslint-plugin/tests/rules/switch-exhaustiveness-check.test.ts @@ -2281,46 +2281,6 @@ switch (value) { }, ], }, - { - code: ` - enum Enum { - 'a' = 1, - [\`key-with - - new-line\`] = 2, - } - - declare const a: Enum; - - switch (a) { - } - `, - errors: [ - { - messageId: 'switchIsNotExhaustive', - suggestions: [ - { - messageId: 'addMissingCases', - output: ` - enum Enum { - 'a' = 1, - [\`key-with - - new-line\`] = 2, - } - - declare const a: Enum; - - switch (a) { - case Enum.a: { throw new Error('Not implemented yet: Enum.a case') } - case Enum['key-with\\n\\n new-line']: { throw new Error('Not implemented yet: Enum[\\'key-with\\\\n\\\\n new-line\\'] case') } - } - `, - }, - ], - }, - ], - }, { code: noFormat` enum Enum { From 107d67c11874bc4475162afb720c9d4df1140025 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 22 May 2025 03:20:34 +0800 Subject: [PATCH 09/12] Forbid number --- .../fixtures/_error_/numeric-name/fixture.ts | 3 +++ .../_error_/numeric-name/snapshots/1-TSESTree-Error.shot | 9 +++++++++ .../_error_/numeric-name/snapshots/2-Babel-Error.shot | 4 ++++ .../numeric-name/snapshots/3-Alignment-Error.shot | 4 ++++ packages/typescript-estree/src/convert.ts | 7 +++++++ 5 files changed, 27 insertions(+) create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts new file mode 100644 index 000000000000..174773e65995 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts @@ -0,0 +1,3 @@ +enum Foo { + 1 = 2 +} diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot new file mode 100644 index 000000000000..b3e4c0eb03bc --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > TSESTree - Error`] +TSError + 1 | enum Foo { +> 2 | 1 = 2 + | ^ An enum member cannot have a numeric name. + 3 | } + 4 | diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot new file mode 100644 index 000000000000..60e8e9fa4761 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > Babel - Error`] +SyntaxError: Unexpected token (2:2) diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot new file mode 100644 index 000000000000..6999466f4909 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > Error Alignment`] +Both errored diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 4c9779388468..3462db4f8a20 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -3249,6 +3249,13 @@ export class Converter { ); } + if (node.name.kind === SyntaxKind.NumericLiteral) { + this.#throwUnlessAllowInvalidAST( + node.name, + 'An enum member cannot have a numeric name.', + ); + } + return this.createNode( node, this.#withDeprecatedGetter( From fcc7712a6556f886f522cb54548001b4310176ff Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 8 Jun 2025 17:08:54 +0800 Subject: [PATCH 10/12] Forbid bigint --- .../TSEnumMember/fixtures/_error_/bigint-name/fixture.ts | 3 +++ .../_error_/bigint-name/snapshots/1-TSESTree-Error.shot | 9 +++++++++ .../snapshots/2-Babel-Error.shot | 2 +- .../_error_/bigint-name/snapshots/3-Alignment-Error.shot | 4 ++++ .../_error_/{numeric-name => number-name}/fixture.ts | 0 .../snapshots/1-TSESTree-Error.shot | 2 +- .../_error_/number-name/snapshots/2-Babel-Error.shot | 4 ++++ .../_error_/number-name/snapshots/3-Alignment-Error.shot | 4 ++++ .../numeric-name/snapshots/3-Alignment-Error.shot | 4 ---- packages/typescript-estree/src/convert.ts | 5 ++++- 10 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/fixture.ts create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/1-TSESTree-Error.shot rename packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/{numeric-name => bigint-name}/snapshots/2-Babel-Error.shot (52%) create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/3-Alignment-Error.shot rename packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/{numeric-name => number-name}/fixture.ts (100%) rename packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/{numeric-name => number-name}/snapshots/1-TSESTree-Error.shot (64%) create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/3-Alignment-Error.shot delete mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/fixture.ts b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/fixture.ts new file mode 100644 index 000000000000..3fcd08d2bc99 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/fixture.ts @@ -0,0 +1,3 @@ +enum Foo { + 1n = 2 +} diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/1-TSESTree-Error.shot new file mode 100644 index 000000000000..87ba241f5d40 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/1-TSESTree-Error.shot @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > bigint-name > TSESTree - Error`] +TSError + 1 | enum Foo { +> 2 | 1n = 2 + | ^^ An enum member cannot have a numeric name. + 3 | } + 4 | diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot similarity index 52% rename from packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot rename to packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot index 60e8e9fa4761..ee23e42bd252 100644 --- a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/2-Babel-Error.shot +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot @@ -1,4 +1,4 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > Babel - Error`] +exports[`AST Fixtures > element > TSEnumMember > _error_ > bigint-name > Babel - Error`] SyntaxError: Unexpected token (2:2) diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/3-Alignment-Error.shot new file mode 100644 index 000000000000..083d80544d72 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/3-Alignment-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > bigint-name > Error Alignment`] +Both errored diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/fixture.ts similarity index 100% rename from packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/fixture.ts rename to packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/fixture.ts diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/1-TSESTree-Error.shot similarity index 64% rename from packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot rename to packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/1-TSESTree-Error.shot index b3e4c0eb03bc..8dfacb32e5b9 100644 --- a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/1-TSESTree-Error.shot +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/1-TSESTree-Error.shot @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > TSESTree - Error`] +exports[`AST Fixtures > element > TSEnumMember > _error_ > number-name > TSESTree - Error`] TSError 1 | enum Foo { > 2 | 1 = 2 diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot new file mode 100644 index 000000000000..1fd7e2f92db1 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > number-name > Babel - Error`] +SyntaxError: Unexpected token (2:2) diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/3-Alignment-Error.shot new file mode 100644 index 000000000000..34e6cebc91e1 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/3-Alignment-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > number-name > Error Alignment`] +Both errored diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot deleted file mode 100644 index 6999466f4909..000000000000 --- a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/numeric-name/snapshots/3-Alignment-Error.shot +++ /dev/null @@ -1,4 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`AST Fixtures > element > TSEnumMember > _error_ > numeric-name > Error Alignment`] -Both errored diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 3462db4f8a20..3a084584ec3c 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -3249,7 +3249,10 @@ export class Converter { ); } - if (node.name.kind === SyntaxKind.NumericLiteral) { + if ( + node.name.kind === SyntaxKind.NumericLiteral || + node.name.kind === SyntaxKind.BigIntLiteral + ) { this.#throwUnlessAllowInvalidAST( node.name, 'An enum member cannot have a numeric name.', From 471e815fcfb7e0ab2d5ec6ffe79c5481eac7cee5 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 11 Jun 2025 01:14:31 +0800 Subject: [PATCH 11/12] Update snapshot --- .../_error_/bigint-name/snapshots/2-Babel-Error.shot | 8 +++++++- .../_error_/number-name/snapshots/2-Babel-Error.shot | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot index ee23e42bd252..b3afe3afc96e 100644 --- a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/bigint-name/snapshots/2-Babel-Error.shot @@ -1,4 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > element > TSEnumMember > _error_ > bigint-name > Babel - Error`] -SyntaxError: Unexpected token (2:2) +BabelError + 1 | enum Foo { +> 2 | 1n = 2 + | ^ Unexpected token (2:2) + 3 | } + 4 | + diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot index 1fd7e2f92db1..76b2f2b9c62e 100644 --- a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/number-name/snapshots/2-Babel-Error.shot @@ -1,4 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`AST Fixtures > element > TSEnumMember > _error_ > number-name > Babel - Error`] -SyntaxError: Unexpected token (2:2) +BabelError + 1 | enum Foo { +> 2 | 1 = 2 + | ^ Unexpected token (2:2) + 3 | } + 4 | + From 8908efb2a2c10cc0d7cb11ac07fa0b2b43e48e34 Mon Sep 17 00:00:00 2001 From: fisker Date: Wed, 11 Jun 2025 01:15:38 +0800 Subject: [PATCH 12/12] Test computed string --- .../fixtures/_error_/computed-string-name/fixture.ts | 3 +++ .../snapshots/1-TSESTree-Error.shot | 9 +++++++++ .../computed-string-name/snapshots/2-Babel-Error.shot | 10 ++++++++++ .../snapshots/3-Alignment-Error.shot | 4 ++++ 4 files changed, 26 insertions(+) create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/fixture.ts create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/1-TSESTree-Error.shot create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/2-Babel-Error.shot create mode 100644 packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/3-Alignment-Error.shot diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/fixture.ts b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/fixture.ts new file mode 100644 index 000000000000..2e99a8d3766b --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/fixture.ts @@ -0,0 +1,3 @@ +enum Foo { + ["A"] = 2 +} diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/1-TSESTree-Error.shot new file mode 100644 index 000000000000..2079fad90f2e --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/1-TSESTree-Error.shot @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > computed-string-name > TSESTree - Error`] +TSError + 1 | enum Foo { +> 2 | ["A"] = 2 + | ^^^^^ Computed property names are not allowed in enums. + 3 | } + 4 | diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/2-Babel-Error.shot new file mode 100644 index 000000000000..c68571c79318 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/2-Babel-Error.shot @@ -0,0 +1,10 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > computed-string-name > Babel - Error`] +BabelError + 1 | enum Foo { +> 2 | ["A"] = 2 + | ^ Unexpected token (2:2) + 3 | } + 4 | + diff --git a/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/3-Alignment-Error.shot new file mode 100644 index 000000000000..1331cf0d18b9 --- /dev/null +++ b/packages/ast-spec/src/element/TSEnumMember/fixtures/_error_/computed-string-name/snapshots/3-Alignment-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > element > TSEnumMember > _error_ > computed-string-name > Error Alignment`] +Both errored