benjamn / benjamn/reify

Declare variables with `let` for module code, but `var` in the Node REPL

Open
#17 1 comment 0 reactions 1 assignee Claimed by @benjamn View on GitHub
enhancement
Dominant language
JavaScript
Stars
740
Forks
29
PR merge metrics
No merged PRs in 30d

Description

Using `let` to declare imported variables in compiled code allows the variables to be scoped to the enclosing block, and enables warnings about redeclarations of identically-named variables:

``` js
if (process.env.NODE_ENV === "production") {
import { S3 } from "aws-sdk";
let s3 = new S3();
s3.abortMultipartUpload(params, function (err, data) { ... });
}
// S3 and s3 should not be visible here!
```

Currently the `import` statement is compiled to

``` js
var S3;module.import("aws-sdk",{S3:function(v){S3=v}});
```

The use of `var` means the `S3` variable will be visible anywhere in the enclosing _function_ scope, which is dangerous if `process.env.NODE_ENV !== "production"`.

Ideally (when possible) we would like to use `let` instead:

``` js
let S3;module.import("aws-sdk",{S3:function(v){S3=v}});
```

Note that `const` is not an option because `import`ed symbols must be able to change their values whenever the source module gets around to `export`ing them.

However, using `let` in the Node REPL means you can't `import` the same symbol more than once, which can be really annoying. For that reason, when you `require("reify/repl")`, the compiler should generate `var` declarations instead (as it currently does).

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.