import { join } from 'path'; import type { TransformOptions } from '../test-utils'; import { transform as transformCode } from '../test-utils'; import Mock = jest.Mock; jest.mock('../utils/cache'); describe('module traversal', () => { const transform = (code: string, opts: TransformOptions = {}) => transformCode(code, { filename: join(__dirname, 'module-traversal.js'), ...opts }); it('should replace an identifier referencing a default import specifier object', () => { const actual = transform(` import '@compiled/react'; import colors from '../__fixtures__/mixins/objects';
`); expect(actual).toInclude('{color:blue}'); }); it('should replace an identifier referencing a default import specifier string literal', () => { const actual = transform(` import '@compiled/react'; import color from '../__fixtures__/mixins/simple'; `); expect(actual).toInclude('{color:red}'); }); it('should replace an identifier referencing a default import specifier string literal', () => { const actual = transform(` import '@compiled/react'; import { primary } from '../__fixtures__/mixins/simple'; `); expect(actual).toInclude('{color:red}'); }); it('should replace an identifier referencing a named import specifier object from a variable declaration export', () => { const actual = transform(` import '@compiled/react'; import { colors } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{color:red}'); }); it('should replace an identifier referencing a named import specifier object from an export specifier', () => { const actual = transform(` import '@compiled/react'; import { danger } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{color:blue}'); }); it('should replace an identifier referencing a node modules named import specifier object', () => { const actual = transform(` import '@compiled/react'; import { colors } from '@compiled-private/module-a'; `); expect(actual).toInclude('{color:purple}'); }); it('should use css from an identifier referencing a named import object', () => { const actual = transform(` import '@compiled/react'; import { style } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{font-size:12px}'); }); it('should inline css from an object spread referencing a named import object', () => { const actual = transform(` import '@compiled/react'; import { style } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{color:blue}'); expect(actual).toInclude('{font-size:12px}'); }); it('should inline css from an object with multiple identifiers referenced from a named import', () => { const actual = transform(` import '@compiled/react'; import { styleInlining } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{font-size:14px}'); expect(actual).toInclude('{color:blue}'); expect(actual).toInclude('{background-color:red}'); }); it('should inline css from a object with multiple identifiers referenced from a named import', () => { const actual = transform(` import '@compiled/react'; import { styleInlining } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{font-size:14px}'); expect(actual).toInclude('{color:blue}'); expect(actual).toInclude('{background-color:red}'); }); it('should inline css from a spread referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { styleModuleInlining } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{color:pink}'); }); it('should inline css from an identifier referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { styleModuleInlining } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{color:pink}'); }); it('should inline css from an export rexporting an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { reexport } from '../__fixtures__/mixins/reexport'; `); expect(actual).toInclude('{color:purple}'); }); it('should inline css from a member expression export rexporting an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { objectReexport } from '../__fixtures__/mixins/reexport'; `); expect(actual).toInclude('{color:orange}'); }); it('should inline css from a member expression that comprises of an import being exposed by a local variable', () => { const actual = transform(` import '@compiled/react'; import { danger } from '../__fixtures__/mixins/objects'; const theme = { danger }; `); expect(actual).toInclude('{color:blue}'); }); it('should inline a static string', () => { const actual = transform(` import '@compiled/react'; import { bold } from '../__fixtures__/mixins/strings'; `); expect(actual).toInclude('{font-size:12px}'); expect(actual).toInclude('{font-weight:bold}'); }); it('should inline a string with module interpolations', () => { const actual = transform(` import '@compiled/react'; import { italics } from '../__fixtures__/mixins/strings'; `); expect(actual).toInclude('{font-size:16px}'); expect(actual).toInclude('{font-weight:italic}'); }); it('should inline a string with import interpolations', () => { const actual = transform(` import '@compiled/react'; import { danger } from '../__fixtures__/mixins/strings'; `); expect(actual).toInclude('{color:red}'); expect(actual).toInclude('{font-size:10px}'); }); it('should inline css from a spread referencing an identifier with an IIFE property from another module', () => { const actual = transform(` import '@compiled/react'; import { fontMixin } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{font-size:12px}'); }); it('should inline css from an array referencing an identifier with an IIFE property from another module', () => { const actual = transform(` import '@compiled/react'; import { fontMixin } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude('{font-size:12px}'); }); it('should inline css from a function mixin referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { colorMixin } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude(':hover{color:red}'); expect(actual).toInclude(':hover{background-color:pink}'); }); it('should inline css for object literal from a directly called & assigned function mixin referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { colorMixin } from '../__fixtures__/mixins/objects'; const colors = colorMixin(); `); expect(actual).toInclude(':hover{color:red}'); }); it('should inline css for string literal from a directly called & assigned function mixin referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { colorMixin } from '../__fixtures__/mixins/objects'; const colors = colorMixin(); `); expect(actual).toInclude(':hover{color:red}'); }); it('should inline css from a directly called function mixin referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { colorMixin } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude(':hover{color:red}'); }); it('should inline css from a directly called function mixin referencing an identifier with an IIFE property from another module', () => { const actual = transform(` import '@compiled/react'; import { spacingMixin } from '../__fixtures__/mixins/objects'; `); expect(actual).toInclude(':hover{padding-top:10px}'); }); it('should inline css when destructuring an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { spacingMixin } from '../__fixtures__/mixins/objects'; const { padding: { top } } = spacingMixin; `); expect(actual).toInclude(':hover{padding-top:10px}'); }); it('should inline css from a function mixin with parameters referencing an identifier from another module', () => { const actual = transform(` import '@compiled/react'; import { colorMixin2 } from '../__fixtures__/mixins/objects'; const color = { blue: 'blue' }; const Component = (props) => { return }; `); expect(actual).toIncludeMultiple(['{color:red}', '{background-color:blue}']); }); it('handles template literal with imported selectors from external modules', () => { const actual = transform(` import { styled } from '@compiled/react'; import { ID_SELECTOR } from '../__fixtures__/mixins/strings'; const BackgroundWithSelector = styled.div({ [\`\${ID_SELECTOR}\`]: { backgroundColor: 'green', }, });