60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
import { createMacro } from 'babel-plugin-macros'
|
|
|
|
/*
|
|
type Transformer = Function
|
|
*/
|
|
|
|
export function createTransformerMacro(
|
|
transformers /*: { [key: string]: Transformer | [Transformer, Object] } */,
|
|
{ importSource } /*: { importSource: string } */
|
|
) {
|
|
let macro = createMacro(
|
|
({ path, source, references, state, babel, isEmotionCall }) => {
|
|
if (!path) {
|
|
path = state.file.scope.path
|
|
.get('body')
|
|
.find(p => p.isImportDeclaration() && p.node.source.value === source)
|
|
}
|
|
|
|
if (/\/macro$/.test(source)) {
|
|
path
|
|
.get('source')
|
|
.replaceWith(
|
|
babel.types.stringLiteral(source.replace(/\/macro$/, ''))
|
|
)
|
|
}
|
|
|
|
if (!isEmotionCall) {
|
|
state.emotionSourceMap = true
|
|
}
|
|
Object.keys(references).forEach(importSpecifierName => {
|
|
if (transformers[importSpecifierName]) {
|
|
references[importSpecifierName].reverse().forEach(reference => {
|
|
let options
|
|
let transformer
|
|
if (Array.isArray(transformers[importSpecifierName])) {
|
|
transformer = transformers[importSpecifierName][0]
|
|
options = transformers[importSpecifierName][1]
|
|
} else {
|
|
transformer = transformers[importSpecifierName]
|
|
options = {}
|
|
}
|
|
transformer({
|
|
state,
|
|
babel,
|
|
path,
|
|
importSource,
|
|
importSpecifierName,
|
|
options,
|
|
reference
|
|
})
|
|
})
|
|
}
|
|
})
|
|
return { keepImports: true }
|
|
}
|
|
)
|
|
macro.transformers = transformers
|
|
return macro
|
|
}
|