51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
// @flow
|
|
import { transformExpressionWithStyles } from './utils'
|
|
import { addNamed } from '@babel/helper-module-imports'
|
|
import { createMacro } from 'babel-plugin-macros'
|
|
|
|
export let createEmotionMacro = (instancePath: string) =>
|
|
createMacro(function macro({ references, state, babel, isEmotionCall }) {
|
|
if (!isEmotionCall) {
|
|
state.emotionSourceMap = true
|
|
}
|
|
|
|
let t = babel.types
|
|
Object.keys(references).forEach(referenceKey => {
|
|
let isPure = true
|
|
let runtimeNode = addNamed(state.file.path, referenceKey, instancePath)
|
|
|
|
switch (referenceKey) {
|
|
case 'injectGlobal': {
|
|
isPure = false
|
|
}
|
|
// eslint-disable-next-line no-fallthrough
|
|
case 'css':
|
|
case 'keyframes': {
|
|
references[referenceKey].reverse().forEach(reference => {
|
|
const path = reference.parentPath
|
|
|
|
reference.replaceWith(t.cloneDeep(runtimeNode))
|
|
if (isPure) {
|
|
path.addComment('leading', '#__PURE__')
|
|
}
|
|
let node = transformExpressionWithStyles({
|
|
babel,
|
|
state,
|
|
path,
|
|
shouldLabel: true
|
|
})
|
|
if (node) {
|
|
path.node.arguments[0] = node
|
|
}
|
|
})
|
|
break
|
|
}
|
|
default: {
|
|
references[referenceKey].reverse().forEach(reference => {
|
|
reference.replaceWith(t.cloneDeep(runtimeNode))
|
|
})
|
|
}
|
|
}
|
|
})
|
|
})
|