Spaces:
Sleeping
Sleeping
File size: 1,403 Bytes
56fda74 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
import { transformExpressionWithStyles, createTransformerMacro } from './utils'
const isAlreadyTranspiled = path => {
if (!path.isCallExpression()) {
return false
}
const firstArgPath = path.get('arguments.0')
if (!firstArgPath) {
return false
}
if (!firstArgPath.isConditionalExpression()) {
return false
}
const alternatePath = firstArgPath.get('alternate')
if (!alternatePath.isObjectExpression()) {
return false
}
const properties = new Set(
alternatePath.get('properties').map(p => p.node.key.name)
)
return ['name', 'styles'].every(p => properties.has(p))
}
let createEmotionTransformer =
(isPure /*: boolean */) =>
(
{ state, babel, importSource, reference, importSpecifierName } /*: Object */
) => {
const path = reference.parentPath
if (isAlreadyTranspiled(path)) {
return
}
if (isPure) {
path.addComment('leading', '#__PURE__')
}
let node = transformExpressionWithStyles({
babel,
state,
path,
shouldLabel: true
})
if (node) {
path.node.arguments[0] = node
}
}
export let transformers = {
css: createEmotionTransformer(true),
injectGlobal: createEmotionTransformer(false),
keyframes: createEmotionTransformer(true)
}
export let createEmotionMacro = (importSource /*: string */) =>
createTransformerMacro(transformers, { importSource })
|