const path = require('path') const babel = require('@babel/core') const { hashify, removeExt, hasModule } = require('@dcloudio/uni-cli-shared') const { resolve, cacheCompilerOptions } = require('./shared') const babelPluginScopedComponent = require('./babel-plugin-scoped-component') module.exports = function (content, map) { if (process.env.UNI_USING_COMPONENTS) { if (process.env.UNI_PLATFORM === 'app-plus') { return require('./script-new').call(this, content, map) } return require('./script-new').call(this, content) } this.cacheable && this.cacheable() // 单页面 解析 component 依赖 const plugins = [] if (hasModule('@babel/plugin-syntax-typescript')) { plugins.push('@babel/plugin-syntax-typescript') plugins.push([ '@babel/plugin-proposal-decorators', { legacy: true } ]) } plugins.push(babelPluginScopedComponent) const ast = babel.transform(content, { configFile: false, plugins }) const components = ast.metadata.components || {} const imports = {} const callback = this.async() Promise.all(Object.keys(components).map(name => { return resolve.call(this, components[name]).then(resolved => { resolved = path.relative(process.env.UNI_INPUT_DIR, resolved) const hashed = hashify(resolved) imports[name] = { name: hashed, src: removeExt(resolved) } }) })).then(() => { const realResourcePath = path.relative(process.env.UNI_INPUT_DIR, this.resourcePath) const compilerOptions = { name: hashify(realResourcePath), imports } cacheCompilerOptions(realResourcePath, compilerOptions) callback(null, content, map) }, err => { callback(err, content, map) }) }