Skip to content

Releases: quick-lint/quick-lint-js

3.2.0 (2024-03-03)

04 Mar 04:59
Compare
Choose a tag to compare

Downloads

Added

  • VS Code: You can now make quick-lint-js messages fun and insulting with the
    quick-lint-js.snarky setting (disabled by default). (Implemented by
    vegerot.)
  • Using Greek question mark (ΝΎ, U+037E) instead of a semicolon (;, U+003B)
    now reports [E0457][] ("this is a Greek Question Mark, not a semicolon
    (';')"). This diagnostic is also reported for similar-looking characters like
    Ηƒ (which should be !) and ο΄Ύ (which should be ().
  • TypeScript: Decorators on abstract classes are now parsed. (#1194)

Fixed

  • TypeScript: (): RT<T>=>null (with no spaces in >=>) now parses correctly.
    (Fixed by vegerot.)
  • Fixed [E0718][] falsely diagnosing valid code. (#1192, #1199)
  • quick-lint-js no longer crashes in the presence of symbolic links and
    directory junctions on Windows. (#1182)
  • Fixed a read buffer overflow (possibly leading to a crash) when checking
    whether short identifiers containing Unicode escape sequences are keywords.
    (x86 and x86_64 only.) (#1191)
Read more

3.1.0 (2024-01-10)

11 Jan 03:09
Compare
Choose a tag to compare

Downloads

Added

  • quick-lint-js's JSX diagnostics can now be configured via quick-lint-js's JSX
    mode
    mechanism. New JSX modes are "none", "react", and "auto"
    (default).
  • Writing a namespace alias with import type, such as in
    import type ns = otherns;, now reports [E0717][] ("namespace alias cannot
    use 'import type'"). (Implemented by koopiehoop.) (#1139)
  • x?.y.z now reports [E0718][] ("using a '.' after a '?.' might fail, since
    '?.' might return 'undefined'"). (Implemented by Joshua Pepple.)
    (#1128)
  • for await (...) now reports E0162 ("'await' is only allowed in async
    functions") when written in a non-async function. (Implemented by Daniel La
    Rocque
    .) (#1168)

Fixed

  • quick-lint-js's tracing no longer crashes with an assertion failure when
    setting its thread name on FreeBSD. (#1155)
  • React-specific JSX diagnostics, such as E0193 ("misspelled React
    attribute; write 'className' instead"), are now only reported when 'react' is
    imported and if 'preact' is not imported. This fixes false warnings in Preact
    code. (#1152)
  • Commas are now allowed after methods in interfaces in .d.ts files. (They
    were previously only allowed in .ts files.) (#1171)
  • quick-lint-js no longer reports warnings for web types such as HeadersInit
    in TypeScript code. (#1180)
Read more

3.0.0 (2024-01-01)

01 Jan 07:41
Compare
Choose a tag to compare

Downloads

Added

Fixed

  • TypeScript support:
    • Assigning to a variable with the same name as an imported type no longer
      falsely reports E0185 ("assignment to imported variable").
    • Interface index signature variables can now be named contextual keywords
      such as type.
    • Writing ++x inside ? : no longer falsely reports E0254 ("unexpected
      ':' in expression; did you mean 'as'?").
    • Hypthenated JSX attribute names following generic JSX component names, such
      as in <MyComponent<T> aria-label="..." />, now parse correctly and no
      longer report E0054 ("unexpected token").
Read more

2.19.0 (2023-12-30)

30 Dec 07:24
Compare
Choose a tag to compare

Downloads

Added

  • Unicode 15.1 is now supported, including new CJK code points in identifiers.
  • Missing break; (or return; or throw ...; or // fallthrough) after a
    clause in switch statement now reports [E0427][] ("missing 'break;' or '//
    fallthrough' comment between statement and 'case'"). (Implemented by [Yash
    Masani][].)
  • Detection of multiple export default statements ([E0715][]) now also applies
    to export {... as default}; statements.
  • JSX elements and fragments are now allowed in JSX attributes without
    surrounding them in { and } (e.g.
    <List header=<ListHeader />>{items}</List>).
  • TypeScript support (still experimental):
    • export as namespace statements are now parsed.
    • Const generic parameters (<const T>) are now parsed.
    • Assertion signatures (function f(param): asserts param) are now parsed.
    • If a type predicate appears outside a return type, quick-lint-js now reports
      [E0426][] ("type predicates are only allowed as function return types").
    • export default now supports separately-declared TypeScript interfaces and
      types.
    • cond ? (param): ReturnType => body : f is now correctly parsed as a
      conditional expression with a function in the truthy branch.
      (cond ? (t) : param => body continues to be parsed as a conditional
      expression with a function in the falsy branch.)
    • Using << in an interface's extends clause, in a class's implements
      clause, or in a typeof type now reports [E0429][] instead of misleading
      diagnostics. (Implemented by [strager][] and [Ariel Don][].)
    • Properties in object literal types can now be named with number and string
      literals.
    • Repeating in or out generic parameter modifiers now reports [E0432][]
      ("'in' or 'out' variance specifier cannot be listed twice").
    • Writing a newline after an in, out, or const generic parameter
      modifier now reports [E0440][] ("newline is not allowed after 'in' modifier
      in generic parameter"). (Implemented by [Ariel Don][].)
    • Negative number literals are now parsed in types.
    • Parameter decorators are now parsed.
    • Overload signatures are now allowed on exported functions.
    • Assigning to a class now reports [E0003][] ("cannot assign to class").
    • Definite assignment assertions (! after a variable name in let or var)
      is now supported.
    • override is now supported in classes.
    • Abstract constructor types (such as abstract new () => C) are now
      supported.
    • export class { m(); } in a .d.ts file no longer falsely reports [E0172][]
      ("missing body for function").
    • import() type assertions are now allowed in TypeScript types.
    • U+0085 (Next Line) is now interpreted as whitespace.

Fixed

  • Class decorators may now reference the class by name.
  • Decorators are now parsed correctly when using a semicolon-free coding style.
  • Properties named 'private', 'declare', or similar names are now parsed
    correctly when using a semicolon-free coding style.
  • A newline between an arrow function and a parenthesized expression (e.g.
    let f = () => {} /*newline*/ (console.log('x')); no longer falsely reports
    [E0211][] ("missing parentheses around self-invoked function").
  • for await (async of []); no longer falsely reports [E0082][] ("assigning to
    'async' in a for-of loop requires parentheses"). (for (async of []); still
    reports the diagnostic.)
  • A return statement inside a nested switch no longer falsely repots
    [E0427][] ("missing 'break;' or '// fallthrough' comment between " "statement
    and 'case'").
  • TypeScript support (still experimental):
    • Types named await, implements, interface, let, package, private,
      protected, public, static, and yield are now recognized in type
      signatures.
    • export default with a class and an interface (triggering declaration
      merging) no longer fasely reports [E0715][] ("cannot use multiple export default statements in one module").
    • class C<T extends U, U> {} no longer falsely reports [E0058][] ("variable
      used before declaration").
    • case await x: no longer treats : as if it was a type annotation colon in
      an arrow function parameter list.
    • Fixed a crash if certain diagnostics are reported after a TypeScript
      interface. (Implemented by [Rui Serra][].)
    • import("modulename").Class<<T>(params) => ReturnType> in a type is now
      parsed correctly.
    • import("modulename") in a type is now allowed and no longer falsely
      reports a diagnostic.
    • import type * from 'othermodule'; no longer crashes quick-lint-js with an
      assertion failure.
    • Generic call signatures are now parsed correctly when using a semicolon-free
      coding style.
    • Interface index signatures and computed property names in interfaces are now
      parsed correctly when using a semicolon-free coding style.
    • Properties named 'extends' or 'is' are now parsed correctly when using a
      semicolon-free coding style.
    • Types named 'asserts' are parsed correctly when using a semicolon-free
      coding style.
    • declare const x = 42; no longer falsely reports [E0351][] or [E0385][].
    • type T = T.thing; no longer falsely reports [E0384][] ("cannot use type
      directly in its own definition").
    • Interface methods and index signatures can now end in , (in addition to
      ;).
    • Parsing of ; and , between and after properties in object types is much
      less buggy.
    • quick-lint-js no longer incorrectly reports [E0384][] ("cannot use type
      directly in its own definition") when using extends ? :.
    • Making a type alias and a function with the same name no longer falsely
      reports [E0034][] ("redeclaration of variable").
    • Importing a type then declaring a function or variable with the same name no
      longer falsely reports [E0034][] ("redeclaration of variable").
    • Importing a function or variable then declaring a type with the same name no
      longer falsely reports [E0034][] ("redeclaration of variable").
    • T extends () => RT ? A : B no longer falsely reports [E0348][]
      ("unexpected '?' in type; use '| void' to make an optional type").
    • <T extends /> is now correctly parsed as a JSX element.
    • interface I { get: any; } (field named get with a type annotation) no
      longer reports [E0054][] ("unexpected token"). (Implemented by [Rui
      Serra][].)
    • In type assertions, certain types such as in <string[]>expr and
      < <T>() => RT>expr, are no longer incorrectly interpreted as JSX.
    • Assigning to an enum or namespace no longer crashes quick-lint-js with an
      assertion failure.
    • Subnamespaces can now be named contextual keywords such as string.
    • Import aliases can now be named contextual keywords such as implements.
    • Optional function parameters can now be named contextual keywords such as
      readonly.
    • Import aliases can now be declared with import type.
    • Namespace aliases can now reference variables named contextual keywords such as
      yield inside namespaces.
    • Type annotations can now reference types inside namespaces named contextual
      keywords such as string.
    • import A = ns; class A {} no longer crashes or falsely reports that A
      was redeclared.
    • import {type A from 'mod'}; let A; no longer crashes or falsely reports
      that A was redeclared.
    • extends checks with multiple infers no longer crash or falsely report
      that the inferred variable was redeclared.
    • class implements I {} is now parsed as a class with no name rather than a
      class with the name implements.
    • class C extends Base<T> implements I {} now correctly parses Base<T> as
      a type with generic arguments rather than logical comparisons.
    • Variables declared inside a declare global block are now correctly
      declared as global variables instead of module variables. This means that
      variables inside a declare global block can be shadowed by module
      variables without diagnostics.
    • Fixed false negatives for [E0196][] if a type has the same name as a
      variable.
    • Using a variable in a type or interface (e.g. with typeof) no longer
      falsely reports [E0058][] ("variable used before declaration").
    • Type predicates in function types no longer falsely report [E0315][]
      ("'param' is not the name of a parameter").
    • Arrow functions with return type annotations such as (42) or (string[])
      are now parsed correctly.
    • f<T>?.() (optional chaining function call with generic function arguments)
      is now parsed correctly.
    • In a .d.ts file, declare module without a body no longer falsely reports
      errors.
    • export default inside a declare module no longer falsely reports
      [E0715][] ("cannot use multiple export default statements in one module").
    • typeof in types now supports variables named boolean, string, and some
      other names.
    • An optional parameter with ? followed by an optional parameter with = no
      longer falsely reports [E0379][] ("optional parameter cannot be followed by
      a required parameter").
    • extends in some cases is no longer incorrectly interpreted as an infer
      constraint, such as in
      MyType extends (infer T extends U ? T1 : F1) ? T2 : F2;.
    • Nested extends, such as in A extends () => B extends C ? D : E ? F : G,
      no longer falsely reports [E0348][] ("unexpected '?' in type; use '| void'
      to make an optional type").
    • class T<T> {} no longer falsely reports [E0034][] ("redeclaration of
      variable").
    • await <T>() => {} no longer does confusing things.

[coc.nv...

Read more

2.18.0 (2023-11-03)

03 Nov 23:20
Compare
Choose a tag to compare

Downloads

Added

  • Mixing & and << such as in a & 0x1 << 3 now reports [E0716][]
    ("unintuitive operator precedence when using & and << or >>"). (Implemented by
    toastin0.)

Fixed

  • A missing operator in an if condition (such as in if (x y)) no longer
    causes E0065 ("'else' has no corresponding 'if'") to be reported.
    (Implemented by Ariel Don.)
  • cmake --install with --component build-tools now installs the build
    tools. (This is a regression introduced in quick-lint-js version 2.16.0.)
  • Windows: The installer and executables are now signed with a non-expired
    certificate chain.
Read more

2.17.0 (2023-10-25)

26 Oct 01:01
Compare
Choose a tag to compare

Downloads

Known issues

Added

  • quick-lint-js now understands decorators.
  • quick-lint-js now understands accessor fields.
  • class C { myField, } now reports better diagnostics.
  • quick-lint-js now compiles correctly on big-endian architectures such as
    S/390 (Linux s390x).
  • Missing commas in array literals now reports [E0712][]. (Implemented by
    koopiehoop.)
  • get *prop() and set *prop() in classes now report [E0713][] ("getters and
    setters cannot be generators"). (Implemented by koopiehoop.)
  • async get and async set in classes now report [E0714][] ("'async' keyword
    is not allowed on getters or setters"). (Implemented by koopiehoop.)
  • Multiple export default statements now report [E0715][] ("cannot use
    multiple export default statements in one module"). (Implemented by
    Ariel Don.)
  • Emacs: The Debian/Ubuntu package now installs the Emacs plugin. Manual
    installation of the .el files is no longer required.
  • CLI: The new --stdin-path CLI option allows users of the --stdin option
    (primarily text editors) to have quick-lint-js detect the language
    automatically via --language=default or --language=experimental-default.
  • TypeScript support (still experimental):
    • CLI: The new --language=experimental-default option auto-detects the
      language based on the file's extension (.ts, .tsx, .d.ts, or .js).
    • Emacs: Flymake plugin users can now opt into TypeScript support. See the
      Flymake configuration instructions.
    • Class method overload signatures are now parsed.
    • [E0398][] is now reported when using both abstract and static on a
      single class property.
    • , is now allowed after interface fields. (Previously only ; or a newline
      was allowed.)
    • if (cond); now reports E0064 ("missing body for 'if' statement").
      (Implemented by Samir Hamud.)
    • Type predicates are now supported in function types (e.g.
      (param) => param is Type).
    • declare fields are now parsed inside classes.
    • declare global blocks are now parsed.

Fixed

  • E0072 is no longer falsely reported if function has a newline after it.
  • [E0196][] is no longer falsely reported if the shadowing variable is declared
    in the head of a for loop. For example, quick-lint-js no longer warns about
    let x; for (let x = 0;;);.
  • Emacs: .el files are now installed in the correct place on Arch Linux, btw.
  • Emacs: The Flymake plugin now reliably clears out diagnostics after issues are
    fixed. Sticky diagnostics are no more.
  • TypeScript support (still experimental):
    • A newline after public, protected, private, or readonly inside a
      class is now interpreted correctly.
    • <T>(T: T) => {} (a generic arrow function with the same name for a
      run-time parameter and a generic parameter) no longer falsely reports
      E0034 ("redeclaration of variable").
    • A namespace with the same name as an interface or type alias no longer
      falsely reports E0034 ("redeclaration of variable").
    • declare class and function with the same name no longer falsely reports
      E0034 ("redeclaration of variable").
    • (a?, ...b) => ReturnType in a TypeScript type no longer falsely reports
      [E0379][] ("optional parameter cannot be followed by a required parameter").
    • LSP: A file named a.tsxbanana.ts is no longer recognized as a
      TypeScript JSX file. It is now recognized as a non-JSX TypeScript
      file.
    • Nested module declarations no longer falsely report [E0361][]. E0361's
      message has been changed:
      • Before: "module with string name is only allowed at the top level"
      • After: "TypeScript 'declare module' with string name is not allowed in
        namespaces"
Read more

2.16.0 (2023-09-06)

07 Sep 07:12
Compare
Choose a tag to compare

Downloads

Known issues

Added

  • 2 ^ 8 now reports [E0710][] ("'^' is the XOR operator; to exponentiate, use
    '**' instead"). (Implemented by pedrobl1718.)
  • A missing } in a function parameter list now reports E0161 ("unclosed
    object literal; expected '}'"). (Implemented by Yash Masani.)
  • quick-lint-js now builds on Alpine Linux and other musl-based distributions.
  • TypeScript support (still experimental):
    • Invalid recursive type definitions such as type T = T; now report
      [E0384][] ("cannot use type directly in its own definition").
    • quick-lint-js now recognizes import types.
    • quick-lint-js now recognizes .d.ts files:
      • CLI: --language=experimental-typescript-definition
      • LSP server: typescriptdefinition; typescript will detect from the URI,
        and typescriptsource prevents detection from the URI
      • Visual Studio Code extension: detected from the file name

Fixed

  • LSP: On macOS, quick-lint-js no longer hangs if a file has too many
    diagnostics.
  • #property in object expressions are now parsed correctly and do not report
    E0155.
  • ({k = defaultValue} = o); no longer incorrectly reports [E0253][] ("use ':'
    instead of '=' in object literals").
  • Class property initializers no longer incorrectly report E0058 ("variable
    used before declaration"). Example:
    class C { myProperty = f(); } const f = () => {};
  • TypeScript support (still experimental):
    • quick-lint-js no longer falsely reports E0058 ("variable used before
      declaration") for code such as function f<T extends T[]>() {}.
    • Declaring a type alias or an interface inside a declare namespace no
      longer reports [E0357][] ("'declare namespace' cannot contain statements,
      only declarations").
    • const enum E {} no longer causes E0150.
    • Using a declare-ed variable prior to its declaration is now allowed.
      Example: new C(); declare class C { }
    • Using a variable in a declare class's extends clause prior to the
      variable's declaration is now allowed.
      Example: declare class Derived extends Base { } class Base { }
    • VS Code: The extension now loads when only opening a TypeScript file.
      (Previously, the extension would only load when you opened a JavaScript or
      JSON file.) The quick-lint-js.experimental-typescript setting is still
      required.
    • Vim ALE: JSX syntax is now recognized inside .tsx files.

Changed

  • quick-lint-js no longer depends on the Boost third-party library. The
    QUICK_LINT_JS_USE_BUNDLED_BOOST CMake variable now has no effect.
Read more

2.15.0 (2023-07-18)

19 Jul 03:03
Compare
Choose a tag to compare

Downloads

Added

  • LSP server: quick-lint-js can now receive configuration options via the
    initialize request. See LSP configuration
    documentation
    for
    details.
  • x = x; now reports [E0383][]. (Implemented by Austin Garcia.)
  • ... without something following it now reports either [E0708][] ("unexpected
    '...'; expected expression") or [E0709][] ("expected variable name after
    '...'"). (Implemented by Isaac Nonato.)
  • TypeScript support (still experimental):
    • namespace A.B {} syntax (with .) is now supported.
    • static public myMethod() {} now reports [E0380][] ("'public' access
      specifier must precede 'static'"). (Implemented by Leszek Nowicki.)
    • class C { \u{63}onstructor() {} } now reports [E0381][] ("Typescript does
      not allow keywords to contain escape sequence"). (Implemented by Jait
      Jacob
      .)
    • export declare is now supported.

Fixed

  • Emacs (Flycheck): Using C-x C-; to comment a line now runs quick-lint-js
    (instead of leaving old diagnostics on the screen). This requires that you
    update your Emacs file: add new-line to the
    flycheck-check-syntax-automatically variable.
  • export default abstract; is now parsed correctly as the export of a variable
    named abstract.
  • export default async (newline) function f() {} is now parsed correctly as
    the export of a variable named async followed by the declaration of a
    non-async function named f.
  • TypeScript support (still experimental):
    • E0034 ("redeclaration of variable") is no longer incorrectly reported
      in various cases, including the following:
      • class A {} namespace A {}
      • function f<T>(T) {}
      • type X = null; var X;
      • namespace ns{} namespace ns{}
    • export = a b now reports E0027 ("missing semicolon after statement").
    • module 'name' { import ... } no longer falsely reports [E0362][] ("cannot
      import a module from inside a 'declare namespace'").
    • module 'name'; no longer falsely reports [E0356][] ("missing body for
      TypeScript namespace").

[E0253...

Read more

2.14.0 (2023-05-22)

23 May 03:51
Compare
Choose a tag to compare

Downloads

Added

  • Missing props in JSX tags now report [E0376][] ("JSX prop is missing an
    expression"). (Implemented by James Moles.)
  • ! == (with a space) now reports [E0373][] or [E0374][]. (Implemented by
    daethtech.)
  • x == y ?? true now reports [E0369][]. (Implemented by Kate Conkright.)
  • apt install quick-lint-js now works on ARM64 (AArch64) Debian and Ubuntu
    installations.
  • TypeScript support (still experimental):
    • Certain invalid parameter properties (such as in constructor(public {id, name})) now report diagnostics.
    • function f(a?, b) {} now reports [E0379][]. (Implemented by Alek
      Lefebvre
      .)

Fixed

  • Arrow functions with TypeScript parameter type annotations no longer report
    confusing diagnostics in JavaScript mode. (Implemented by Leszek Nowicki.)
  • TypeScript support (still experimental):
  • Windows: Fixed a build failure with MinGW GCC 13.1.0.
  • Shell completions are now up to date with the CLI. (Fixed by Jake
    Castelli
    .)
  • FreeBSD: quick-lint-js no longer fails to build.

Changed

  • Ubuntu 18.04 LTS Bionic is no longer supported. It might happen to work, but it
    is not extensively tested. Canonical is itself ending support for Bionic on
    May 31, 2023, so please upgrade to Ubuntu 20.04 LTS or newer.
Read more

2.13.0 (2023-04-13)

14 Apr 00:54
Compare
Choose a tag to compare

Downloads

Known issues

Added

  • quick-lint-js now recognizes Deno's global variables, including Deno.
    This suppresses undesired E0057 ("use of undeclared variable") warnings.
    This is controlled by the deno global group.
  • if () {} (without a condition) now reports [E0452][] ("empty parenthesis
    after control statement"). (Implemented by Yunus.)
  • return x, now reports E0026 ("missing operand for operator").
    (Implemented by Tom Binford.)
  • TypeScript support (still experimental):
    • The satisfies operator is now recognized.
    • The infer operator is now recognized.
    • The in and out keywords for generic parameter variance are now
      recognized.
    • Parameter properties (constructor(public readonly name: string, public age: number)) are now recognized.
    • C<T>=y; now reports [E0365][] ("TypeScript requires whitespace between
      '>' and '=' here").
    • extends in interface now allows generic arguments, such as in
      interface I extends T<U> {}.
    • extends in interface now allows nested namespaces, such as in
      interface I extends ns1.ns2.ns3.I {}.
  • FreeBSD: quick-lint-js --debug-apps now works. (Implemented by Nico
    Sonack
    .)

Fixed

  • Fixed several false errors:
    • do while (x); while (y); no longer falsely reports E0101 ("missing
      body for do-while loop").
    • { var async; async } no longer falsely reports E0054 ("unexpected
      token").
    • async[x] no longer falsely reports E0054 ("unexpected token").
    • await x ? y : z no longer falsely reports [E0311][] ("missing parentheses
      around parameter").
    • if (c) async () => {}; else {} no longer falsely reports E0065
      ("'else' has no corresponding 'if'").
    • class A extends await {} no longer falsely reports E0111 ("missing
      body for class").
    • class A extends await() {} no longer falsely reports E0176 ("missing
      arrow operator for arrow function").
    • do if (c) {} else (b); while (d); no longer falsely reports E0103
      ("missing 'while (condition)' for do-while statement").
  • if (c) {} else (b) d; now correctly reports E0027 ("missing semicolon
    after statement").
  • The CLI's --output-format=gnu-like output (default) no longer prints
    terminal escape sequences for "dumb" terminals (where TERM=dumb). (Fixed by
    wagner riffel.)
  • FreeBSD: The quick-lint-js-licenses.txt file is now populated correctly.
  • TypeScript support (still experimental):
    • let x: C<T>=y; no longer falsely reports an error.
    • class A extends B<C> {} no longer falsely reports an error.
    • T extends keyof O ? A : B no longer falsely reports an error.

Changed

  • Cross compiling now requires you to build with
    QUICK_LINT_JS_ENABLE_BUILD_TOOLS for the build machine then with
    QUICK_LINT_JS_USE_BUILD_TOOLS for the target machine. See the
    cross-compiling documentation for details.
  • Code signing certificate has been refreshed. The old certificate expires on
    April 18, 2023 (PDT) and the new certificate expires on April 17, 2024 (PDT).
    The public key is the same between the two certificates:
    7ea531a42cd3e7161b6951f93d83449546e90722 (SHA1).
Read more