'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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const t = require('@babel/types')
const uniI18n = require('@dcloudio/uni-cli-i18n')
 
const hyphenateRE = /\B([A-Z])/g
 
function cached (fn) {
  const cache = Object.create(null)
  return function cachedFn (str) {
    const hit = cache[str]
    return hit || (cache[str] = fn(str))
  }
}
 
const hyphenate = cached((str) => {
  return str.replace(hyphenateRE, '-$1').toLowerCase()
})
 
function findImportDeclaration (identifierName, path) {
  const binding = path.scope.getBinding(identifierName)
  if (!binding) {
    return
  }
 
  if (t.isImportDeclaration(binding.path.parent)) {
    return binding.path.parentPath
  }
}
 
function parseComponents (names, path) {
  const components = []
  const dynamicImportMap = new Map()
  names.forEach(({
    name,
    value
  }) => {
    const importDeclaration = findImportDeclaration(value, path)
    if (!importDeclaration) {
      throw new Error(uniI18n.__('mpLoader.componentReferenceErrorOnlySupportImport', {
        0: name
      }))
    }
    let source = importDeclaration.node.source.value
    if (process.UNI_LIBRARIES && process.UNI_LIBRARIES.includes(source)) {
      const componentName = hyphenate(name)
      source = source + '/lib/' + componentName + '/' + componentName
    }
    const dynamicImportArray = dynamicImportMap.get(importDeclaration) || []
    dynamicImportArray.push({
      name,
      value,
      source
    })
    dynamicImportMap.set(importDeclaration, dynamicImportArray)
  })
 
  const importDeclarations = dynamicImportMap.keys()
  for (const importDeclaration of importDeclarations) {
    const dynamicImportArray = dynamicImportMap.get(importDeclaration)
    dynamicImportArray.forEach((dynamicImport) => {
      components.push(dynamicImport)
    })
    importDeclaration.remove()
  }
  return components
}
 
function findBabelLoader (loaders) {
  return loaders.find(loader => loader.path.indexOf('babel-loader') !== -1)
}
 
const babelPluginDynamicImport = require.resolve('./plugin-dynamic-import')
 
function addDynamicImport (babelLoader, resourcePath, dynamicImports) {
  babelLoader.options = babelLoader.options || {}
  if (!babelLoader.options.plugins) {
    babelLoader.options.plugins = []
  }
  babelLoader.options.plugins.push([babelPluginDynamicImport, {
    resourcePath,
    dynamicImports
  }])
}
 
module.exports = {
  addDynamicImport,
  findBabelLoader,
  parseComponents
}