Blame view

天文台pc/tianwentai-ui/node_modules/@emotion/babel-plugin/src/utils/get-styled-options.js 2.79 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  import { getLabelFromPath } from './label'
  import { getTargetClassName } from './get-target-class-name'
  import createNodeEnvConditional from './create-node-env-conditional'
  
  const getKnownProperties = (t, node) =>
    new Set(
      node.properties
        .filter(n => t.isObjectProperty(n) && !n.computed)
        .map(n => (t.isIdentifier(n.key) ? n.key.name : n.key.value))
    )
  
  const createObjectSpreadLike = (t, file, ...objs) =>
    t.callExpression(file.addHelper('extends'), [t.objectExpression([]), ...objs])
  
  export let getStyledOptions = (t, path, state) => {
    const autoLabel = state.opts.autoLabel || 'dev-only'
  
    let args = path.node.arguments
    let optionsArgument = args.length >= 2 ? args[1] : null
  
    let prodProperties = []
    let devProperties = null
    let knownProperties =
      optionsArgument && t.isObjectExpression(optionsArgument)
        ? getKnownProperties(t, optionsArgument)
        : new Set()
  
    if (!knownProperties.has('target')) {
      prodProperties.push(
        t.objectProperty(
          t.identifier('target'),
          t.stringLiteral(getTargetClassName(state, t))
        )
      )
    }
  
    let label =
      autoLabel !== 'never' && !knownProperties.has('label')
        ? getLabelFromPath(path, state, t)
        : null
  
    if (label) {
      const labelNode = t.objectProperty(
        t.identifier('label'),
        t.stringLiteral(label)
      )
      switch (autoLabel) {
        case 'always':
          prodProperties.push(labelNode)
          break
        case 'dev-only':
          devProperties = [labelNode]
          break
      }
    }
  
    if (optionsArgument) {
      // for some reason `.withComponent` transformer gets requeued
      // so check if this has been already transpiled to avoid double wrapping
      if (
        t.isConditionalExpression(optionsArgument) &&
        t.isBinaryExpression(optionsArgument.test) &&
        t.buildMatchMemberExpression('process.env.NODE_ENV')(
          optionsArgument.test.left
        )
      ) {
        return optionsArgument
      }
      if (!t.isObjectExpression(optionsArgument)) {
        const prodNode = createObjectSpreadLike(
          t,
          state.file,
          t.objectExpression(prodProperties),
          optionsArgument
        )
        return devProperties
          ? createNodeEnvConditional(
              t,
              prodNode,
              t.cloneNode(
                createObjectSpreadLike(
                  t,
                  state.file,
                  t.objectExpression(prodProperties.concat(devProperties)),
                  optionsArgument
                )
              )
            )
          : prodNode
      }
  
      prodProperties.unshift(...optionsArgument.properties)
    }
  
    return devProperties
      ? createNodeEnvConditional(
          t,
          t.objectExpression(prodProperties),
          t.cloneNode(t.objectExpression(prodProperties.concat(devProperties)))
        )
      : t.objectExpression(prodProperties)
  }