const path = require('path') const t = require('@babel/types') const babelTraverse = require('@babel/traverse').default const { parseComponents } = require('./util') const uniI18n = require('@dcloudio/uni-cli-i18n') module.exports = function (ast, state = {}) { const imports = [] let nodePath = false try { babelTraverse(ast, { CallExpression (path) { const callee = path.node.callee if (!callee.object || !callee.property) { return } const objectName = callee.object.name const propertyName = callee.property.name if ( propertyName === 'component' && (objectName === 'Vue' || objectName === 'app') ) { const args = path.node.arguments const nameNode = args[0] const valueNode = args[1] nodePath = path if (!t.isStringLiteral(nameNode)) { throw new Error( uniI18n.__('mpLoader.firstParameterNeedStaticString', { 0: objectName + '.component()' }) ) } if (!t.isIdentifier(valueNode)) { throw new Error( uniI18n.__('mpLoader.requireTwoParameter', { 0: objectName + '.component()' }) ) } imports.push({ name: nameNode.value, value: valueNode.name }) } } }) if (imports.length) { state.components = parseComponents(imports, nodePath) } else { state.components = [] } } catch (e) { if (state.filename) { console.error('at ' + require('@dcloudio/uni-cli-shared').normalizePath(path.relative(process.env.UNI_INPUT_DIR, state.filename)) + ':1') } throw e } return { ast, state } }