babel/packages/babel-plugin-transform-block-scoping
Mauro Bringolf 0a9f136d5f Minor improvements to block-scoping/tdz (#6782)
* Add test case for simple reference in tdz

* Add more examples from old issues as test cases

* Fix two testcases by excluding function declarations from being tdz checked

* Document the  option for block-scoping

* Add test cases with destructuring assignments

* Remove failing test cases

* [skip ci] Include type and default value for options
2018-01-08 21:49:05 -08:00
..
2018-01-08 11:02:14 -05:00

@babel/plugin-transform-block-scoping

Compile ES2015 block scoping (const and let) to ES5

Examples

In

{
  let a = 3
}

let a = 3

Out

{
  var _a = 3;
}

var a = 3;

Installation

npm install --save-dev @babel/plugin-transform-block-scoping

Usage

.babelrc

Without options:

{
  "plugins": ["@babel/plugin-transform-block-scoping"]
}

With options:

{
  "plugins": [
    ["@babel/plugin-transform-block-scoping", {
      "throwIfClosureRequired": true
    }]
  ]
}

Via CLI

babel --plugins @babel/plugin-transform-block-scoping script.js

Via Node API

require("@babel/core").transform("code", {
  plugins: ["@babel/plugin-transform-block-scoping"]
});

Options

throwIfClosureRequired

boolean, defaults to false.

In cases such as the following it's impossible to rewrite let/const without adding an additional function and closure while transforming:

for (let i = 0; i < 5; i++) {
  setTimeout(() => console.log(i), 1);
}

In extremely performance-sensitive code, this can be undesirable. If "throwIfClosureRequired": true is set, Babel throws when transforming these patterns instead of automatically adding an additional function.

tdz

boolean, defaults to false.

By default this plugin will ignore the temporal dead zone (TDZ) for block-scoped variables. The following code will not throw an error when transpiled with Babel, which is not spec compliant:

i
let i;

If you need these errors you can tell Babel to try and find them by setting "tdz": true for this plugin. However, the current implementation might not get all edge cases right and its best to just avoid code like this in the first place.