Releases: quick-lint/quick-lint-js
Releases Β· quick-lint/quick-lint-js
3.2.0 (2024-03-03)
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)
3.1.0 (2024-01-10)
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)
3.0.0 (2024-01-01)
Added
- TypeScript is now supported by default in the CLI and in all editor plugins.
- Exception: Emacs with Eglot
- Exception: Emacs with Flycheck
- Exception: Emacs with LSP Mode
- Exception: Kate
Fixed
- TypeScript support:
- Assigning to a variable with the same name as an
import
ed type no longer
falsely reports E0185 ("assignment to imported variable"). - Interface index signature variables can now be named contextual keywords
such astype
. - 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").
- Assigning to a variable with the same name as an
2.19.0 (2023-12-30)
Added
- Unicode 15.1 is now supported, including new CJK code points in identifiers.
- Missing
break;
(orreturn;
orthrow ...;
or// fallthrough
) after a
clause inswitch
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
toexport {... 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'sextends
clause, in a class'simplements
clause, or in atypeof
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
orout
generic parameter modifiers now reports [E0432][]
("'in' or 'out' variance specifier cannot be listed twice"). - Writing a newline after an
in
,out
, orconst
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 inlet
orvar
)
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 nestedswitch
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
, andyield
are now recognized in type
signatures. export default
with a class and an interface (triggering declaration
merging) no longer fasely reports [E0715][] ("cannot use multipleexport 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 usingextends ? :
. - 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 namedget
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 asstring
. import A = ns; class A {}
no longer crashes or falsely reports thatA
was redeclared.import {type A from 'mod'}; let A;
no longer crashes or falsely reports
thatA
was redeclared.extends
checks with multipleinfer
s 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 nameimplements
.class C extends Base<T> implements I {}
now correctly parsesBase<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 adeclare 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 adeclare module
no longer falsely reports
[E0715][] ("cannot use multipleexport default
statements in one module").typeof
in types now supports variables namedboolean
,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 aninfer
constraint, such as in
MyType extends (infer T extends U ? T1 : F1) ? T2 : F2;
.- Nested
extends
, such as inA 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.
- Types named
[coc.nv...
2.18.0 (2023-11-03)
Added
- Mixing
&
and<<
such as ina & 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 inif (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.
2.17.0 (2023-10-25)
Known issues
cmake --install
with--component build-tools
does not install the build
tools. (This is a regression introduced in quick-lint-js version 2.16.0.)
Fix: Git commit
3923f0df76d24b73d57f15eec61ab190ea048093- Windows: Code signing does not validate on some machines. Workaround: follow
SSL.com's instructions for removing the expired "Certum Trusted Network CA"
certificate.
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()
andset *prop()
in classes now report [E0713][] ("getters and
setters cannot be generators"). (Implemented by koopiehoop.)async get
andasync 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
multipleexport 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
andstatic
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.
- CLI: The new
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 afor
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
, orreadonly
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
andfunction
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"
- A newline after
2.16.0 (2023-09-06)
Known issues
cmake --install
with--component build-tools
does not install the build
tools. Fix: Git commit
3923f0df76d24b73d57f15eec61ab190ea048093
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,
andtypescriptsource
prevents detection from the URI - Visual Studio Code extension: detected from the file name
- CLI:
- Invalid recursive type definitions such as
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 asfunction 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
'sextends
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.) Thequick-lint-js.experimental-typescript
setting is still
required. - Vim ALE: JSX syntax is now recognized inside
.tsx
files.
- quick-lint-js no longer falsely reports E0058 ("variable used before
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.
2.15.0 (2023-07-18)
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: addnew-line
to the
flycheck-check-syntax-automatically
variable. export default abstract;
is now parsed correctly as the export of a variable
namedabstract
.export default async (newline) function f() {}
is now parsed correctly as
the export of a variable namedasync
followed by the declaration of a
non-async function namedf
.- 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").
- E0034 ("redeclaration of variable") is no longer incorrectly reported
[E0253...
2.14.0 (2023-05-22)
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.)
- Certain invalid parameter properties (such as in
Fixed
- Arrow functions with TypeScript parameter type annotations no longer report
confusing diagnostics in JavaScript mode. (Implemented by Leszek Nowicki.) - TypeScript support (still experimental):
- '`hello${world}` as const' no longer falsely reports E0291.
(Fixed by Leszek Nowicki.)
- '`hello${world}` as const' no longer falsely reports E0291.
- 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.
2.13.0 (2023-04-13)
Known issues
- Building quick-lint-js on FreeBSD is
broken.
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 thedeno
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
andout
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
ininterface
now allows generic arguments, such as in
interface I extends T<U> {}
.extends
ininterface
now allows nested namespaces, such as in
interface I extends ns1.ns2.ns3.I {}
.
- The
- 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 (whereTERM=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).