Blame view

天文台pc/tianwentai-ui/node_modules/@emotion/babel-plugin/src/emotion-macro.js 1.37 KB
bc518174   王天杨   提交两个项目文件
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
  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 })