'f'
mh-two-thousand-and-two
2024-04-12 26f2711ef9461961fb953e2b497bd314ef95e345
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
const uniI18n = require('@dcloudio/uni-cli-i18n')
 
function addImportsMap (metadata, name, source) {
  if (!metadata.modules) {
    metadata.modules = {}
  }
  metadata.modules[name] = source
}
 
module.exports = function babelPluginGlobalComponent ({
  types: t
}) {
  return {
    visitor: {
      Program: {
        exit (path) {
          path.traverse({
            CallExpression (path) {
              if (path.hub) {
                const {
                  callee,
                  arguments: args
                } = path.node
 
                const {
                  metadata
                } = path.hub.file
 
                if (!callee.object || !callee.property) {
                  return
                }
                if (callee.object.name === 'Vue' && callee.property.name === 'component') {
                  if (!args[0] || args[0].type !== 'StringLiteral') {
                    throw new Error(uniI18n.__('mpLoader.firstParameterNeedStaticString', { 0: 'Vue.component()' }))
                  }
                  if (!args[1]) {
                    throw new Error(uniI18n.__('mpLoader.requireTwoParameter', { 0: 'Vue.component()' }))
                  }
                  if (!metadata.globalComponents) {
                    metadata.globalComponents = {}
                  }
                  metadata.globalComponents[args[0].value] = metadata.modules[args[1].name]
                }
              }
            }
          })
        }
      },
      ImportDeclaration (path) {
        if (path.hub) {
          const {
            specifiers,
            source: {
              value
            }
          } = path.node
 
          const {
            metadata
          } = path.hub.file
 
          specifiers.forEach(specifier => {
            addImportsMap(metadata, specifier.local.name, value)
          })
        }
      }
    }
  }
}