google / google/closure-compiler

ES6 or CommonJS modules cause "Missing semicolon" errors

Open
#2,605 5 comments 0 reactions 0 assignees View on GitHub
lint
Dominant language
JavaScript
Stars
7.7k
Forks
1.2k
Avg merge
2d 12h
Merged PRs (30d)
6

Description

I'm seeing erroneous `WARNING - Missing semicolon` errors when using **ES6** or **CommonJS** modules (with `jscomp_warning` turned on for all checks). The warnings do not appear for Closure Library (goog) modules.

It sounds like Closure Compiler transpiles ES6 and CommonJS to Closure Library modules, so I wonder if a missing semicolon error is introduced during that process?

Here are 3 simple test examples, one for each module system. They each have an entry point test.js file that imports a module. I've included the module and test code for each, as well as the output of the command.

All commands were run with the v20170626 version of the compiler:
```
$ java -jar ./compiler.jar --version
Closure Compiler (http://github.com/google/closure-compiler)
Version: v20170626
Built on: 2017-06-30 12:25
```

## CommonJS

#### ./module.js
```
module.exports = 1;
```

#### ./test.js
```
const value = require('./module.js');

console.log(value);
```

```
$ java -jar ./compiler.jar \
--jscomp_warning=* \
--js=./test.js \
--js=./module.js \
--entry_point=./test.js
--process_common_js_modules

./module.js:1: WARNING - Missing semicolon
module.exports = 1;
^^^^^^^^^^^^^^^^^^^

./test.js:1: WARNING - Missing semicolon
const value = require('./module.js');
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 error(s), 2 warning(s), 100.0% typed
var module$module=1;var value=module$module;console.log(module$module);
```

Result: 2 Warnings for Missing semicolon on lines that clearly have a semicolon.

## ES6 modules

#### ./module.js
```
export const value = 1;
```

#### ./test.js
```
import { value } from './module.js';

console.log(value);
```

```
$ java -jar ./compiler.jar \
--jscomp_warning=* \
--js=./test.js \
--js=./module.js \
--entry_point=./test.js

./module.js:1: WARNING - Missing semicolon
export const value = 1;
^^^^^^^^^^^^^^^^^^^^^^^

./module.js:1: WARNING - Missing semicolon
export const value = 1;
^^^^^^^^^^^^^^^

./module.js:1: WARNING - Missing semicolon
export const value = 1;
^^^^^^^^^

./test.js:1: WARNING - Missing semicolon
import { value } from './module.js';
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 error(s), 4 warning(s), 100.0% typed
var module$module={},value$$module$module=1;module$module.value=value$$module$module;var module$test={};console.log(module$module.value);
```

Result: 4 Warnings for Missing semicolon on lines that clearly have a semicolon.

## goog modules

#### ./module.js
```
goog.module('test.module');

const value = 1;

exports = {value};
```

#### ./test.js
```
goog.module('test');

const {value} = goog.require('test.module');

console.log(value);
```

```
$ java -jar ./compiler.jar \
--jscomp_warning=* \
--js=./test.js \
--js=./module.js \
--entry_point=goog:test

var module$exports$test$module={value:1};var module$exports$test={};console.log(module$exports$test$module.value);
```

Result: No warnings with Closure Library (goog.module).

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.