Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

馃拝 noInvalidUseBeforeDeclaration does not raise an error in some complex contexts #2643

Open
1 task done
th1nkful opened this issue Apr 29, 2024 · 3 comments
Open
1 task done
Labels
A-Linter Area: linter L-JavaScript Language: JavaScript and super languages S-Enhancement Status: Improve an existing feature

Comments

@th1nkful
Copy link

Environment information

CLI:
  Version:                      1.6.1
  Color support:                true

Platform:
  CPU Architecture:             aarch64
  OS:                           macos

Environment:
  BIOME_LOG_DIR:                unset
  NO_COLOR:                     unset
  TERM:                         "xterm-256color"
  JS_RUNTIME_VERSION:           "v20.11.1"
  JS_RUNTIME_NAME:              "node"
  NODE_PACKAGE_MANAGER:         "pnpm/9.0.6"

Biome Configuration:
  Status:                       Loaded successfully
  Formatter disabled:           false
  Linter disabled:              false
  Organize imports disabled:    false
  VCS disabled:                 true

Linter:
  Recommended:                  true
  All:                          false
  Rules:                        a11y/all = false
                                complexity/noBannedTypes = "off"
                                complexity/noForEach = "off"
                                complexity/noStaticOnlyClass = "off"
                                complexity/noUselessThisAlias = "off"
                                complexity/useFlatMap = "off"
                                complexity/useOptionalChain = "off"
                                correctness/noUndeclaredVariables = "error"
                                correctness/noUnusedImports = "error"
                                correctness/useExhaustiveDependencies = "off"
                                performance/noAccumulatingSpread = "off"
                                performance/noDelete = "off"
                                security/noDangerouslySetInnerHtml = "off"
                                style/noInferrableTypes = "off"
                                style/noNonNullAssertion = "off"
                                style/noParameterAssign = "off"
                                style/useEnumInitializers = "off"
                                style/useNodejsImportProtocol = "off"
                                style/useNumberNamespace = "off"
                                suspicious/noConfusingVoidType = "off"
                                suspicious/noConsoleLog = "error"
                                suspicious/noEmptyInterface = "off"
                                suspicious/noExplicitAny = "off"
                                suspicious/noShadowRestrictedNames = "off"
                                suspicious/noThenProperty = "off"

Workspace:
  Open Documents:               0

Rule name

noUndeclaredVariables

Playground link

https://biomejs.dev/playground/?lintRules=all&code=aQBtAHAAbwByAHQAIABQAHIAbwBtAGkAcwBlAHMAIABmAHIAbwBtACAAJwBiAGwAdQBlAGIAaQByAGQAJwA7AAoACgBjAG8AbgBzAHQAIABnAGUAdABQAGEAZwBlAGQAQwBvAG4AdABlAG4AdABzACAAPQAgAGEAcwB5AG4AYwAgACgAYwB1AHMAdABvAG0AZQByAEkAZAAsACAAbwBwAHQAaQBvAG4AcwApACAAPQA%2BACAAewAKACAAIAAvAC8AIABoAGkAdAAgAEQAQgAKACAAIABhAHcAYQBpAHQAIABuAGUAdwAgAFAAcgBvAG0AaQBzAGUAKAAoAHIAZQBzAG8AbAB2AGUAKQAgAD0APgAgAHMAZQB0AFQAaQBtAGUAbwB1AHQAKAByAGUAcwBvAGwAdgBlACwAIAAyADUAMAApACkAOwAKAAoAIAAgAHIAZQB0AHUAcgBuACAAWwB7AAoAIAAgACAAIABjAHUAcwB0AG8AbQBlAHIASQBkACwACgAgACAAIAAgAC4ALgAuAG8AcAB0AGkAbwBuAHMALAAKACAAIAB9AF0AOwAKAH0AOwAKAAoAYwBvAG4AcwB0ACAAZgBvAHIAbQBhAHQAUwB1AG0AbQBhAHIAeQBJAHQAZQBtACAAPQAgACgAYQBjAHQAaQBvAG4ALAAgAGMAbwBuAHQAZQBuAHQALAAgAG8AcAB0AGkAbwBuAHMAKQAgAD0APgAgAHsACgAgACAAcgBlAHQAdQByAG4AIAB7AAoAIAAgACAAIAAuAC4ALgBhAGMAdABpAG8AbgAsAAoAIAAgACAAIAAuAC4ALgBjAG8AbgB0AGUAbgB0ACwACgAgACAAIAAgAC4ALgAuAG8AcAB0AGkAbwBuAHMALAAKACAAIAB9ADsACgB9AAoACgBjAG8AbgBzAHQAIABlAHgAYQBtAHAAbABlACAAPQAgAGEAcwB5AG4AYwAgACgAYwB1AHMAdABvAG0AZQByACwAIABhAGMAdABpAG8AbgAsACAAYQBjAHQAaQBvAG4ASQB0AGUAbQBzAEcAcgBvAHUAcABlAGQAKQAgAD0APgAgAHsACgAgACAAYwBvAG4AcwB0ACAAYwBvAG4AdABlAG4AdABzADoAIABSAGUAYwBvAHIAZAA8AHMAdAByAGkAbgBnACwAIABzAHQAcgBpAG4AZwA%2BAFsAXQAgAD0AIABbAF0AOwAKAAoAIAAgAGEAdwBhAGkAdAAgAFAAcgBvAG0AaQBzAGUAcwAuAHAAYQByAGEAbABsAGUAbAAoAGEAYwB0AGkAbwBuAEkAdABlAG0AcwBHAHIAbwB1AHAAZQBkACwAIABhAHMAeQBuAGMAIAAoAGkAdABlAG0AcwApACAAPQA%2BACAAewAKACAAIAAgACAAYwBvAG4AcwB0ACAAYwBvAG4AdABlAG4AdABJAHQAZQBtAHMAIAA9ACAAYQB3AGEAaQB0ACAAZwBlAHQAUABhAGcAZQBkAEMAbwBuAHQAZQBuAHQAcwAoAGMAdQBzAHQAbwBtAGUAcgAuAGkAZAAsACAAewAKACAAIAAgACAAIAAgAGkAZABzADoAIAAgAGkAdABlAG0AcwAuAG0AYQBwACgAKABpAHQAZQBtACkAIAA9AD4AIABpAHQAZQBtAC4AaQBkACkALAAKACAAIAAgACAAIAAgAHQAaQBtAGUAegBvAG4AZQAsACAALwAvACAALQA%2BACAAZQB4AHAAZQBjAHQAaQBuAGcAIABhAG4AIABlAHIAcgBvAHIAIABoAGUAcgBlACAAZgBvAHIACgAgACAAIAAgAH0AKQA7AAoACgAgACAAIAAgAGMAbwBuAHQAZQBuAHQAcwAuAHAAdQBzAGgAKAAuAC4ALgBjAG8AbgB0AGUAbgB0AEkAdABlAG0AcwApADsACgAgACAAfQApADsACgAKACAAIABjAG8AbgBzAHQAIAB0AGkAbQBlAHoAbwBuAGUAIAA9ACAAYQBjAHQAaQBvAG4ALgB0AGkAbQBlAHoAbwBuAGUAOwAKACAAIAAKACAAIABjAG8AbgBzAHQAIABpAHQAZQBtAHMAIAA9ACAAYwBvAG4AdABlAG4AdABzAC4AbQBhAHAAKAAoAGMAbwBuAHQAZQBuAHQAKQAgAD0APgAKACAAIAAgACAAZgBvAHIAbQBhAHQAUwB1AG0AbQBhAHIAeQBJAHQAZQBtACgAYQBjAHQAaQBvAG4ALAAgAGMAbwBuAHQAZQBuAHQALAAgAHsAIAB0AGkAbQBlAHoAbwBuAGUAIAB9ACkALAAKACAAIAApADsACgAKACAAIAByAGUAdAB1AHIAbgAgAGkAdABlAG0AcwA7AAoAfQAKAAoAZQB4AGEAbQBwAGwAZQAoACkAOwA%3D

Expected result

Expected biome to error for variable

Im the repro, I am using a variable (timezone) before initialisation (error I saw at runtime was "ReferenceError: Cannot access 'timezone' before initialization"). Maybe I am misunderstanding how the rule works, but I do remember that eslint would mark these kinds of mistakes

Code of Conduct

  • I agree to follow Biome's Code of Conduct
@Conaclos
Copy link
Member

This is a particularly hard case to catch. TSC and ESLint doesn't report any issue either.

The issue comes from the execution of the promise before the declaration of a variable used in the callback.

@th1nkful
Copy link
Author

A dev on my team pointed out that it's a different eslint rule that detects this - "no-use-before-define"

Is their similar in biome yet?

@Conaclos Conaclos added A-Linter Area: linter L-JavaScript Language: JavaScript and super languages S-Enhancement Status: Improve an existing feature labels Apr 29, 2024
@Conaclos
Copy link
Member

Is their similar in biome yet?

Yes it is noInvalidUseBeforeDeclaration.

Note that the ESLint rule reports false positives.
For instance, the following code should be valid:

const f = () => x;
const x = 0;
f();

Conversely, the Biome rule misses some cases.
We could try to improve it.

@th1nkful th1nkful changed the title 馃拝 noUndeclaredVariables does not raise an error for variables used before initialisation 馃拝 noInvalidUseBeforeDeclaration does not raise an error in some complex contexts Apr 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-Linter Area: linter L-JavaScript Language: JavaScript and super languages S-Enhancement Status: Improve an existing feature
Projects
None yet
Development

No branches or pull requests

2 participants