From 5d66f954f254fdb5d8e67051d1f79d951c604858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Tue, 17 Sep 2024 21:03:50 +0100 Subject: [PATCH 1/2] feat: import/export of literal string names --- package-lock.json | 8 ++++---- package.json | 2 +- src/astring.js | 24 +++++++++++++++--------- src/tests/fixtures/syntax/export.js | 5 ++++- src/tests/fixtures/syntax/import.js | 1 + 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 803dfa3c..2429583f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@babel/generator": "^7.14.3", "@babel/parser": "^7.16.4", "@babel/preset-env": "^7.14.4", - "acorn": "^8.6.0", + "acorn": "^8.12.1", "acorn-import-attributes": "^1.9.5", "astravel": "^0.5.0", "ava": "^3.15.0", @@ -2804,9 +2804,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" diff --git a/package.json b/package.json index d8d78634..05b633f2 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@babel/generator": "^7.14.3", "@babel/parser": "^7.16.4", "@babel/preset-env": "^7.14.4", - "acorn": "^8.6.0", + "acorn": "^8.12.1", "acorn-import-attributes": "^1.9.5", "astravel": "^0.5.0", "ava": "^3.15.0", diff --git a/src/astring.js b/src/astring.js index 974b2ab9..2b6b90b2 100644 --- a/src/astring.js +++ b/src/astring.js @@ -567,10 +567,11 @@ export const GENERATOR = { state.write('{') for (;;) { const specifier = specifiers[i] - const { name } = specifier.imported - state.write(name, specifier) - if (name !== specifier.local.name) { - state.write(' as ' + specifier.local.name) + const { imported, local } = specifier + this[imported.type](imported, state) + if (local.type === 'Literal' || imported.name !== local.name) { + state.write(' as ') + this[local.type](local, state) } if (++i < length) { state.write(', ') @@ -626,11 +627,16 @@ export const GENERATOR = { { length } = specifiers if (length > 0) { for (let i = 0; ; ) { - const specifier = specifiers[i] - const { name } = specifier.local - state.write(name, specifier) - if (name !== specifier.exported.name) { - state.write(' as ' + specifier.exported.name) + const { local, exported } = specifiers[i] + this[local.type](local, state) + if ( + local.type !== exported.type + || (local.type === 'Literal' + ? local.value !== exported.value + : local.name !== exported.name) + ) { + state.write(' as ') + this[exported.type](exported, state) } if (++i < length) { state.write(', ') diff --git a/src/tests/fixtures/syntax/export.js b/src/tests/fixtures/syntax/export.js index 8d7957e1..5fabf268 100644 --- a/src/tests/fixtures/syntax/export.js +++ b/src/tests/fixtures/syntax/export.js @@ -1,5 +1,5 @@ export * from "module"; -export * as m from "module"; +export * as module from "module"; export {name} from "module"; export {a as b, c as d} from "module"; let e, g; @@ -10,3 +10,6 @@ export var j = 42; export let k = 42; export function l() {} export {val} from '../other/a.json' with { type: "json" }; +let m, n, o, p; +export {m as "m"}; +export {n as "n", "o" as o, "p"} from "module"; diff --git a/src/tests/fixtures/syntax/import.js b/src/tests/fixtures/syntax/import.js index 2e9825ce..426aeca9 100644 --- a/src/tests/fixtures/syntax/import.js +++ b/src/tests/fixtures/syntax/import.js @@ -8,3 +8,4 @@ import * as q from "../other/a.json" with { type: "json" }; import r from "../other/a.json" with { type: "json" }; import("module"); const x = import("module"); +import {"s" as t} from "module"; From 5b024f70659edbf3b28c338975923cf405d39ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Wed, 18 Sep 2024 10:47:32 +0100 Subject: [PATCH 2/2] implement quoted export name in ExportAllDeclaration --- src/astring.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/astring.js b/src/astring.js index 2b6b90b2..c22bfdf6 100644 --- a/src/astring.js +++ b/src/astring.js @@ -666,7 +666,9 @@ export const GENERATOR = { }, ExportAllDeclaration(node, state) { if (node.exported != null) { - state.write('export * as ' + node.exported.name + ' from ') + state.write('export * as ') + this[node.exported.type](node.exported, state) + state.write(' from ') } else { state.write('export * from ') }