- Support for async generators in method notation (#598).
- Support for static initialization blocks (#594).
- Fix for node position of
js2-new-node
(#591). - Support the d (hasIndices) and s (dotAll) regexp flags (#590).
- Support for
_
separator in numbers (i.e., numeric separator) (#584).
- Imenu support for mocha-like (includes Jasmine and Cypress) test
files: i.e.,
M-x imenu
will now list test blocks defined withdescribe()
andit()
(#576). - Minor improvements in
js2-jump-to-definition
(#423). - Support for private class members (#537).
- Support for dynamic imports and
import.meta
(#547). - Support for trailing comma in arrow function parameters (#480).
- Support for
for await of
syntax (#543).
- Support for logical assignment operators (#564).
- Support for the nullish coalescing operator (#561).
- Emacs 27 now provides improved JSX indentation support, along with
new JSX highlighting and detection support. Install Emacs 27 and use
js-mode
withjs2-minor-mode
(see README), rather thanjs2-jsx-mode
. - Using
js2-jsx-mode
will now trigger a warning in Emacs 27. - Support for optional-chaining operator
?.
- Changed the default of
js2-strict-trailing-comma-warning
to nil.
- Support single-line JSDocs.
- New face
js2-object-property-access
. - Support for trailing comma in function arguments
- JSDoc highlighting for
@yield
,@yields
,@abstract
,@virtual
and@typedef
. - Support for anonymous class exports.
- Support for async arrow function without parentheses.
- Support for
/*jslint
declarations. - User option
js2-getprop-has-side-effects
. - Support for trailing commas in function parameter lists.
- Support for ES7 public class fields.
- New user option
js2-ignored-warnings
.
js2-include-*-externs
are now evaluated on demand. As a result, they can now be effectively used as file- or directory-local variables.- Support for ES7 exponentiation operator.
- New variable
js2-mode-assume-strict
, for use with ES6 modules. - Support for JSDoc @callback, @func and @method tags.
- Object properties are highlighted using a different face:
js2-object-property
, which has no color by default. - Experimental support for object rest/spread ECMAScript proposal.
js2-getter-setter-node
is renamed tojs2-method-node
, together with its related functions. It already handles generator methods, and we added support for async methods (see below), so the old name would get more confusing.- Support for default parameters in destructuring. It should work for both objects and arrays, in both literals and function arguments.
- New mode:
js2-jsx-mode
, deriving fromjs2-mode
. Supports indentation of JSXElement expressions wrapped within parentheses or as function arguments. Indentation is customizable viasgml-attribute-offset
. - Experimental support for async/await ECMAScript proposal.
-
js2-mode
now derives fromjs-mode
. That means the former function will runjs-mode-hook
, as well asjs2-mode-hook
. The key bindings will default tojs-mode-map
where they're not set injs2-mode-map
. And in Emacs 25 or later (including the snapshot builds),js2-mode
uses the indentation code fromjs-mode
. Where feasible, the user options (and functions) now have aliases, but if you're using Emacs 25 and you see an indentation-related setting that stopped working, try looking for a corresponding one in thejs
group:M-x customize-group RET js RET
. -
New command:
js2-jump-to-definition
. It's bound toM-.
by default, via remappingjs-find-symbol
. To get back to the defaultM-.
binding (e.g.find-tag
), put this in your init file:(eval-after-load 'js (define-key js-mode-map (kbd "M-.") nil))
- More comprehensive strict mode warnings and syntax errors.
- New minor mode:
js2-highlight-unused-variables-mode
. js2-pretty-multiline-declarations
can take the valuedynamic
now.
Support for:
- ES6 modules.
- Short-hand object literals.
- Method definitions.
- 'u' and 'y' RegExp flags.
- Computed property names.
- Class statements and expressions.
- Template strings, including tagged ones.
The variable js2-allow-keywords-as-property-names
has been
removed. Instead we check if js2-language-version
is 180 or highter.
Support for:
- Unicode characters in identifiers (improved).
- Delegating yield.
- ES6 numeric literals (octal, binary).
- Harmony array and generator comprehensions.
Support for:
See the docstring for js2-include-jslint-globals
.
Because well-behaving major modes aren't supposed to do that.
So pressing it won't continue a block comment, or turn a string into a concatenation.
Pressing M-j
, however, will.
The options js2-indent-on-enter-key
and js2-enter-indents-newline
were also removed.
To bring back the previous behavior, put this in your init file:
(eval-after-load 'js2-mode
'(define-key js2-mode-map (kbd "RET") 'js2-line-break))
Support for for..of loops
[foo, bar, baz].forEach(function (v) {
if (validate(v))
process(v);
});
[a, b, c].some(function (v) {
return validate(v);
});
In the original mode,
var foo = 10,
bar = 20,
baz = 30;
In this mode when the value of js2-pretty-multiline-declarations
is non-nil,
var foo = 10,
bar = 20,
baz = 30;
let {a, b} = {a: 10, b: 20}; // Abbreviated (Not supported in the original mode)
let {a: a, b: b} = {a: 10, b: 20}; // Same as above (Supported in the original mode)
(function ({responseText}) { /* */ })(xhr); // As the argument of function
for (let [k, { name, age }] in Iterator(obj)) // nested
print(k, name, age);
let worker = {
get age() 20,
get sex() "male",
fire: function () _fire()
};
In the original mode,
if (foo)
return foo;
else if (bar)
return bar; // here
In this mode,
if (foo)
return foo;
else if (bar)
return bar; // fixed
Supports function nesting and anonymous wrappers:
(function() {
var foo = function() {
function bar() { // shown as foo.bar.<definition-1>
function baz() {} // foo.bar.baz
var qux = function() {}; // foo.bar.quux
}
};
});
Examples of output:
For library-specific extension methods like $.extend
and dojo.declare
, see js2-imenu-extras.
Original mode highlights them only on the left side of assignments:
var house;
hose = new House(); // highlights "hose"
Here they are highlighted in all expressions:
function feed(fishes, food) {
for each (var fish in fshes) { // highlights "fshes"
food.feed(fsh); // highlights "fsh"
}
hood.discard(); // highlights "hood"
}
Destructuring assignments and array comprehensions (JS 1.7) are supported:
let three, [one, two] = [1, 2];
thee = one + two; // highlights "thee"
function revenue(goods) {
// highlights "coast"
return [price - coast for each ({price, cost} in goods)].reduce(add);
}