From 25280bec3b6527e23808c3d237599e87da5ffccd Mon Sep 17 00:00:00 2001 From: Jon de la Motte Date: Tue, 29 Aug 2023 15:39:20 -0700 Subject: [PATCH 1/3] Add test --- .../core/integration-tests/test/javascript.js | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index 5b750f93f6e..40150cb8091 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -18,6 +18,7 @@ import { distDir, outputFS, inputFS, + fsFixture, } from '@parcel/test-utils'; import {makeDeferredWithPromise, normalizePath} from '@parcel/utils'; import vm from 'vm'; @@ -6326,6 +6327,44 @@ describe('javascript', function () { assert.equal(await res.default, 'target'); }); + it.only('should detect shorthand identifier imports', async function () { + const dir = path.join(__dirname, 'js-import-shorthand-identifier'); + overlayFS.mkdirp(dir); + + await fsFixture(overlayFS, dir)` + package.json: + { + "name": "app", + "private": true, + "sideEffects": false + } + + index.js: + import { tokens, mode } from "./tokens.js"; + + export default tokens; + + tokens.js: + import { color } from "./color.js"; + + export const tokens = { + color, + }; + + export { mode } from "./color.js"; + + color.js: + export const color = "blue"; + export const mode = "dark";`; + + let b = await bundle(path.join(dir, '/index.js'), { + inputFS: overlayFS, + }); + + let output = await run(b); + assert.deepEqual(output.default, {color: 'blue'}); + }); + for (let shouldScopeHoist of [false, true]) { let options = { defaultTargetOptions: { From 37132adb2c54248e31931b3a83ae88c76181d4d8 Mon Sep 17 00:00:00 2001 From: Jon de la Motte Date: Tue, 29 Aug 2023 15:39:33 -0700 Subject: [PATCH 2/3] Fix js transformer bug --- packages/transformers/js/core/src/collect.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/transformers/js/core/src/collect.rs b/packages/transformers/js/core/src/collect.rs index a35ec64626a..966db948b27 100644 --- a/packages/transformers/js/core/src/collect.rs +++ b/packages/transformers/js/core/src/collect.rs @@ -757,6 +757,16 @@ impl Visit for Collect { } } + fn visit_ident(&mut self, node: &Ident) { + // This visitor helps us identify used imports in cases like: + // + // import { foo } from "bar"; + // const baz = { foo }; + if self.imports.contains_key(&id!(node)) { + self.used_imports.insert(id!(node)); + } + } + fn visit_this_expr(&mut self, node: &ThisExpr) { if self.in_module_this { self.has_cjs_exports = true; From 9a6f2fb1d37731734f1544ce0750dbdfee665d42 Mon Sep 17 00:00:00 2001 From: Jon de la Motte Date: Fri, 1 Sep 2023 09:13:07 -0700 Subject: [PATCH 3/3] Remove accidental `.only` in test --- packages/core/integration-tests/test/javascript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index 40150cb8091..35e597a6e1b 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -6327,7 +6327,7 @@ describe('javascript', function () { assert.equal(await res.default, 'target'); }); - it.only('should detect shorthand identifier imports', async function () { + it('should detect shorthand identifier imports', async function () { const dir = path.join(__dirname, 'js-import-shorthand-identifier'); overlayFS.mkdirp(dir);