From a0e750c649f327f28e9c5057a02bc1683c27bd25 Mon Sep 17 00:00:00 2001 From: yeonjuan Date: Thu, 15 Feb 2024 03:05:09 +0900 Subject: [PATCH 1/3] fix(eslint-plugin): [no-use-before-define] fix false positive type reference in as, satisfies --- .../src/rules/no-use-before-define.ts | 11 +++--- .../tests/rules/no-use-before-define.test.ts | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index c08a21b4bac..83a533842b6 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -315,10 +315,13 @@ export default createRule({ variable: TSESLint.Scope.Variable, reference: TSESLint.Scope.Reference, ): boolean { - return ( - variable.identifiers[0].range[1] <= reference.identifier.range[1] && - !isInInitializer(variable, reference) - ); + if (variable.identifiers[0].range[1] <= reference.identifier.range[1]) { + if (reference.isValueReference) { + return !isInInitializer(variable, reference); + } + return true; + } + return false; } /** diff --git a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts index 44ce43101e7..d3d9c9279b6 100644 --- a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts +++ b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts @@ -529,6 +529,40 @@ class A { } } `, + { + code: ` +const obj = { + foo: 'foo-value', + bar: 'bar-value', +} satisfies { + [key in 'foo' | 'bar']: \`\${key}-value\`; +}; + `, + options: [{ ignoreTypeReferences: false }], + }, + { + code: ` +const obj = { + foo: 'foo-value', + bar: 'bar-value', +} as { + [key in 'foo' | 'bar']: \`\${key}-value\`; +}; + `, + options: [{ ignoreTypeReferences: false }], + }, + { + code: ` +const obj = { + foo: { + foo: 'foo', + } as { + [key in 'foo' | 'bar']: key; + }, +}; + `, + options: [{ ignoreTypeReferences: false }], + }, ], invalid: [ { From 5e109a1516214c13edd82b22d4b77f77c5cfd6b4 Mon Sep 17 00:00:00 2001 From: yeonjuan Date: Sun, 18 Feb 2024 12:14:59 +0900 Subject: [PATCH 2/3] chore: add testcase --- .../tests/rules/no-use-before-define.test.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts index d3d9c9279b6..38efe428dd1 100644 --- a/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts +++ b/packages/eslint-plugin/tests/rules/no-use-before-define.test.ts @@ -563,6 +563,18 @@ const obj = { `, options: [{ ignoreTypeReferences: false }], }, + { + code: ` +const foo = { + bar: 'bar', +} satisfies { + bar: typeof baz; +}; + +const baz = ''; + `, + options: [{ ignoreTypeReferences: true }], + }, ], invalid: [ { @@ -1138,6 +1150,25 @@ const Foo = { }, ], }, + { + code: ` +const foo = { + bar: 'bar', +} satisfies { + bar: typeof baz; +}; + +const baz = ''; + `, + options: [{ ignoreTypeReferences: false }], + errors: [ + { + messageId: 'noUseBeforeDefine', + data: { name: 'baz' }, + type: AST_NODE_TYPES.Identifier, + }, + ], + }, // "variables" option { From 35d0a18f7c62a0b29cf29f3f472d6373115282a4 Mon Sep 17 00:00:00 2001 From: yeonjuan Date: Sun, 18 Feb 2024 12:17:26 +0900 Subject: [PATCH 3/3] refactor: condition --- .../eslint-plugin/src/rules/no-use-before-define.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index 83a533842b6..d577773de9e 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -315,13 +315,10 @@ export default createRule({ variable: TSESLint.Scope.Variable, reference: TSESLint.Scope.Reference, ): boolean { - if (variable.identifiers[0].range[1] <= reference.identifier.range[1]) { - if (reference.isValueReference) { - return !isInInitializer(variable, reference); - } - return true; - } - return false; + return ( + variable.identifiers[0].range[1] <= reference.identifier.range[1] && + !(reference.isValueReference && isInInitializer(variable, reference)) + ); } /**