From 8bfcb6999b823b5074c98dcb4fe62d0f38e2300a Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Mon, 18 Jul 2022 13:02:01 +0300 Subject: [PATCH] support import/export name as string literal --- lib/javascript/JavascriptParser.js | 9 +++++++-- package.json | 2 +- test/cases/parsing/es2022/counter.js | 4 ++++ test/cases/parsing/es2022/es2022.js | 20 ++++++++++++++++++++ test/cases/parsing/es2022/index.js | 7 +++++++ test/cases/parsing/es2022/reexport.js | 1 + test/cases/parsing/es2022/test.filter.js | 11 +++++++++++ yarn.lock | 8 ++++---- 8 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 test/cases/parsing/es2022/counter.js create mode 100644 test/cases/parsing/es2022/es2022.js create mode 100644 test/cases/parsing/es2022/index.js create mode 100644 test/cases/parsing/es2022/reexport.js create mode 100644 test/cases/parsing/es2022/test.filter.js diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js index 0909f48ede1..c10c7b16eaf 100644 --- a/lib/javascript/JavascriptParser.js +++ b/lib/javascript/JavascriptParser.js @@ -1447,6 +1447,11 @@ class JavascriptParser extends Parser { this.walkExpression(classElement.value); this.scope.topLevelScope = wasTopLevel; } + } else if (classElement.type === "StaticBlock") { + const wasTopLevel = this.scope.topLevelScope; + this.scope.topLevelScope = false; + this.walkBlockStatement(classElement); + this.scope.topLevelScope = wasTopLevel; } } } @@ -1903,7 +1908,7 @@ class JavascriptParser extends Parser { !this.hooks.importSpecifier.call( statement, source, - specifier.imported.name, + specifier.imported.name || specifier.imported.value, name ) ) { @@ -1973,7 +1978,7 @@ class JavascriptParser extends Parser { const specifier = statement.specifiers[specifierIndex]; switch (specifier.type) { case "ExportSpecifier": { - const name = specifier.exported.name; + const name = specifier.exported.name || specifier.exported.value; if (source) { this.hooks.exportImportSpecifier.call( statement, diff --git a/package.json b/package.json index f68913fa01b..c39ea53fdb1 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", diff --git a/test/cases/parsing/es2022/counter.js b/test/cases/parsing/es2022/counter.js new file mode 100644 index 00000000000..befe6cdde9d --- /dev/null +++ b/test/cases/parsing/es2022/counter.js @@ -0,0 +1,4 @@ +let value = 0; +const add = () => value++; + +export { value, add } diff --git a/test/cases/parsing/es2022/es2022.js b/test/cases/parsing/es2022/es2022.js new file mode 100644 index 00000000000..de68a3d3cab --- /dev/null +++ b/test/cases/parsing/es2022/es2022.js @@ -0,0 +1,20 @@ +import { "\0 add" as add } from './reexport'; + +export default class Foo { + static { + new Foo(add); + } + + constructor(fn) { + this.#foo = fn; + this.#add(); + } + + #foo = undefined; + + #add() { + if (#foo in this && this.#foo) { + this.#foo(); + } + } +} diff --git a/test/cases/parsing/es2022/index.js b/test/cases/parsing/es2022/index.js new file mode 100644 index 00000000000..1050bdd8a2d --- /dev/null +++ b/test/cases/parsing/es2022/index.js @@ -0,0 +1,7 @@ +import { value, add } from "./counter"; +import Foo from "./es2022"; + +it("should compile and run", () => { + new Foo(add); + expect(value).toBe(2); +}); diff --git a/test/cases/parsing/es2022/reexport.js b/test/cases/parsing/es2022/reexport.js new file mode 100644 index 00000000000..f2e9cce1091 --- /dev/null +++ b/test/cases/parsing/es2022/reexport.js @@ -0,0 +1 @@ +export { add as "\0 add" } from "./counter"; diff --git a/test/cases/parsing/es2022/test.filter.js b/test/cases/parsing/es2022/test.filter.js new file mode 100644 index 00000000000..a26c3793c0b --- /dev/null +++ b/test/cases/parsing/es2022/test.filter.js @@ -0,0 +1,11 @@ +module.exports = function(config) { + // terser doesn't support static {} + if (config.mode === "production") return false; + + try { + eval("class A { static {} }"); + return true; + } catch { + return false; + } +}; diff --git a/yarn.lock b/yarn.lock index 91529d7d68e..5b033072206 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1230,10 +1230,10 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +acorn@^8.2.4, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== agent-base@6: version "6.0.2"