From c46f46492bcf8ffcf14ef90225ad75b2199348d0 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Sun, 20 Sep 2020 12:44:32 -0400 Subject: [PATCH] [[FEAT]] Add support for "export * as ns from" --- src/jshint.js | 11 +++++++++++ src/options.js | 3 ++- tests/test262/expectations.txt | 10 ---------- tests/unit/core.js | 27 +++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/jshint.js b/src/jshint.js index edf820f330..33c8817341 100644 --- a/src/jshint.js +++ b/src/jshint.js @@ -5631,7 +5631,18 @@ var JSHINT = (function() { if (state.tokens.next.value === "*") { // ExportDeclaration :: export * FromClause + // ExportDeclaration :: export * as IdentifierName FromClause advance("*"); + + if (state.tokens.next.value === "as") { + if (!state.inES11()) { + warning("W119", state.tokens.curr, "export * as ns from", "11"); + } + advance("as"); + identifier(context, true); + state.funct["(scope)"].setExported(null, state.tokens.curr); + } + advance("from"); advance("(string)"); return this; diff --git a/src/options.js b/src/options.js index d8bc66b176..533934a208 100644 --- a/src/options.js +++ b/src/options.js @@ -1051,7 +1051,8 @@ exports.val = { * - `10` - To enable language features introduced by [ECMAScript * 10](https://www.ecma-international.org/ecma-262/10.0/index.html). * Notable additions: optional catch bindings. - * - `11` - To enable language features introduced by ECMAScript 11. + * - `11` - To enable language features introduced by ECMAScript 11. Notable + * additions: "export * as ns from 'module'". */ esversion: 5 }; diff --git a/tests/test262/expectations.txt b/tests/test262/expectations.txt index db4b5936f8..66b7cb2f8e 100644 --- a/tests/test262/expectations.txt +++ b/tests/test262/expectations.txt @@ -1382,14 +1382,6 @@ test/language/comments/multi-line-asi-line-separator.js(default) test/language/comments/multi-line-asi-line-separator.js(strict mode) test/language/comments/multi-line-asi-paragraph-separator.js(default) test/language/comments/multi-line-asi-paragraph-separator.js(strict mode) -test/language/module-code/eval-rqstd-once.js(default) -test/language/module-code/eval-rqstd-once.js(strict mode) -test/language/module-code/eval-rqstd-order.js(default) -test/language/module-code/eval-rqstd-order.js(strict mode) -test/language/module-code/eval-self-once.js(default) -test/language/module-code/eval-self-once.js(strict mode) -test/language/module-code/instn-once.js(default) -test/language/module-code/instn-once.js(strict mode) test/language/module-code/privatename-valid-no-earlyerr.js(default) test/language/module-code/privatename-valid-no-earlyerr.js(strict mode) test/annexB/language/comments/single-line-html-close-unicode-separators.js(default) @@ -8998,8 +8990,6 @@ test/language/identifiers/start-unicode-9.0.0-escaped.js(default) test/language/identifiers/start-unicode-9.0.0-escaped.js(strict mode) test/language/identifiers/start-unicode-9.0.0.js(default) test/language/identifiers/start-unicode-9.0.0.js(strict mode) -test/language/module-code/export-star-as-dflt.js(default) -test/language/module-code/export-star-as-dflt.js(strict mode) test/language/statementList/block-array-literal-with-item.js(default) test/language/statementList/block-array-literal.js(default) test/language/statementList/block-arrow-function-assignment-expr.js(default) diff --git a/tests/unit/core.js b/tests/unit/core.js index 60b82d77ac..0d989788f1 100644 --- a/tests/unit/core.js +++ b/tests/unit/core.js @@ -1107,6 +1107,33 @@ exports.testES6ModuleDuplicateExport = function (test) { test.done(); }; +exports.testExportStar = function (test) { + TestRun(test, "rejects earlier language editions") + .addError(1, 8, "'export * as ns from' is only available in ES11 (use 'esversion: 11').") + .test([ + "export * as x from '.';" + ], { esversion: 10, module: true }); + + TestRun(test, "minimal esversion") + .test([ + "export * as x from '.';" + ], { esversion: 11, module: true }); + + TestRun(test, "tolerates any IdentifierName") + .test([ + "export * as if from '.';" + ], { esversion: 11, module: true }); + + TestRun(test, "detects duplicate bindings") + .addError(2, 13, "Duplicate exported binding: 'x'.") + .test([ + "export * as x from '.';", + "export * as x from '.';" + ], { esversion: 11, module: true }); + + test.done(); +}; + exports.testES6ModulesNamedExportsAffectUnused = function (test) { // Named Exports should count as used var src1 = [