diff --git a/.changeset/eight-steaks-rhyme.md b/.changeset/eight-steaks-rhyme.md new file mode 100644 index 000000000..0f86c8e7f --- /dev/null +++ b/.changeset/eight-steaks-rhyme.md @@ -0,0 +1,6 @@ +--- +'@linaria/shaker': patch +'@linaria/testkit': patch +--- + +Fix @linaria/shaker from removing exported renamed imports. Fixes #1114. diff --git a/packages/shaker/src/plugins/shaker-plugin.ts b/packages/shaker/src/plugins/shaker-plugin.ts index e971449cf..6a1eca3f5 100644 --- a/packages/shaker/src/plugins/shaker-plugin.ts +++ b/packages/shaker/src/plugins/shaker-plugin.ts @@ -38,6 +38,10 @@ export interface IMetadata { __linariaShaker: IShakerMetadata; } +interface NodeWithName { + name: string; +} + export const hasShakerMetadata = ( metadata: object | undefined ): metadata is IMetadata => @@ -196,9 +200,15 @@ export default function shakerPlugin( if (!onlyExports.includes('*')) { const aliveExports = new Set(); + const importNames = collected.imports.map(({ imported }) => imported); + exports.forEach((exp) => { if (onlyExports.includes(exp.exported)) { aliveExports.add(exp); + } else if ( + importNames.includes((exp.local.node as NodeWithName).name || '') + ) { + aliveExports.add(exp); } }); diff --git a/packages/testkit/src/__fixtures__/foo.js b/packages/testkit/src/__fixtures__/foo.js index d558031cd..3cd3ce259 100644 --- a/packages/testkit/src/__fixtures__/foo.js +++ b/packages/testkit/src/__fixtures__/foo.js @@ -1,2 +1,3 @@ export const foo1 = "foo1"; export const foo2 = "foo2"; +export const foo3 = () => 'foo3'; diff --git a/packages/testkit/src/__snapshots__/babel.test.ts.snap b/packages/testkit/src/__snapshots__/babel.test.ts.snap index 5c324d552..c33c47fc7 100644 --- a/packages/testkit/src/__snapshots__/babel.test.ts.snap +++ b/packages/testkit/src/__snapshots__/babel.test.ts.snap @@ -1819,6 +1819,24 @@ Dependencies: ./__fixtures__/complex-component `; +exports[`strategy shaker should not drop exported vars of renamed imports 1`] = ` +"import { foo3 } from \\"./__fixtures__/reexports\\"; +export const bar3 = foo3; +export const square = \\"square_s13jq05\\";" +`; + +exports[`strategy shaker should not drop exported vars of renamed imports 2`] = ` + +CSS: + +.square_s13jq05 { + color: foo3; +} + +Dependencies: ./__fixtures__/reexports + +`; + exports[`strategy shaker should process \`css\` calls inside components 1`] = ` "import React from 'react'; export function Component() { diff --git a/packages/testkit/src/babel.test.ts b/packages/testkit/src/babel.test.ts index bf536491a..24ddab7ef 100644 --- a/packages/testkit/src/babel.test.ts +++ b/packages/testkit/src/babel.test.ts @@ -2448,6 +2448,25 @@ describe('strategy shaker', () => { expect(metadata).toMatchSnapshot(); }); + it('should not drop exported vars of renamed imports', async () => { + const { code, metadata } = await transform( + dedent` + import { css } from "@linaria/core"; + import { foo3 } from "./__fixtures__/reexports"; + + export const bar3 = foo3; + + export const square = css\` + color: ${'${bar3("thing")}'}; + \`; + `, + [evaluator] + ); + + expect(code).toMatchSnapshot(); + expect(metadata).toMatchSnapshot(); + }); + it('should interpolate imported components', async () => { const { code, metadata } = await transform( dedent`