const { jsPreprocessOptions } = require('@dcloudio/uni-cli-shared') const preprocessor = require('@dcloudio/vue-cli-plugin-uni/packages/webpack-preprocess-loader/preprocess') const traverse = require('@dcloudio/webpack-uni-mp-loader/lib/babel/scoped-component-traverse') const { parseComponents } = require('./util') function genComponentCode (components) { const importCode = [] const componentsCode = [] components.forEach(({ name, value, source }) => { importCode.push(`import ${value} from '${source}'`) componentsCode.push(`'${name}': ${value}`) }) return [importCode.join('\n'), componentsCode.join(',\n')] } function genCode ({ components, options }, css = []) { const optionsCode = [] Object.keys(options).forEach(name => { options[name] !== null && optionsCode.push(`${name}:${options[name]}`) }) const [importComponentCode, componentsCode] = genComponentCode(components) // TODO js 内引用 css return ` ${importComponentCode} export default { ${optionsCode.length ? (optionsCode.join(',') + ',') : ''} data(){ return { wxsProps:{} } }, components:{ ${componentsCode} } } ` } module.exports = function (content, map) { this.cacheable && this.cacheable() content = preprocessor.preprocess(content, jsPreprocessOptions.context, { type: jsPreprocessOptions.type }) this.callback(null, genCode(parseComponents(content, traverse)), map) }