const path = require('path') const loaderUtils = require('loader-utils') const { removeExt, normalizePath, getPlatformExts, getShadowTemplate } = require('@dcloudio/uni-cli-shared') const { getJsonFile, getWXComponents, updateSpecialMethods, getGlobalUsingComponents, updateGenericComponents, // resolve updateComponentGenerics, // define updateUsingGlobalComponents } = require('@dcloudio/uni-cli-shared/lib/cache') const { isBuiltInComponentPath } = require('@dcloudio/uni-cli-shared/lib/pages') const { getPlatformFilterTag } = require('@dcloudio/uni-cli-shared/lib/platform') const { normalizeNodeModules } = require('./shared') const templateExt = getPlatformExts().template const filterTagName = getPlatformFilterTag() || '' function parseFilterModules (filterModules) { if (filterModules) { return JSON.parse(Buffer.from(filterModules, 'base64').toString('utf8')) } return {} } module.exports = function (content, map) { this.cacheable && this.cacheable() const vueLoaderOptions = this.loaders.find(loader => loader.ident === 'vue-loader-options') if (vueLoaderOptions) { const globalUsingComponents = getGlobalUsingComponents() const realResourcePath = path.relative(process.env.UNI_INPUT_DIR, this.resourcePath) let resourcePath = normalizeNodeModules(removeExt(realResourcePath) + templateExt) if ( // windows 上 page-meta, navigation-bar 可能在不同盘上 /^win/.test(process.platform) && path.isAbsolute(resourcePath) && isBuiltInComponentPath(resourcePath) ) { resourcePath = normalizePath(path.relative(process.env.UNI_CLI_CONTEXT, resourcePath)) } const wxComponents = getWXComponents(resourcePath.replace(path.extname(resourcePath), '')) const params = loaderUtils.parseQuery(this.resourceQuery) /* eslint-disable no-mixed-operators */ const filterModules = parseFilterModules(params && params['filter-modules']) Object.assign(vueLoaderOptions.options.compilerOptions, { mp: { platform: process.env.UNI_PLATFORM, scopedSlotsCompiler: process.env.SCOPED_SLOTS_COMPILER, slotMultipleInstance: process.env.SLOT_MULTIPLE_INSTANCE === 'true', mergeVirtualHostAttributes: process.env.MERGE_VIRTUAL_HOST_ATTRIBUTES === 'true' }, filterModules, filterTagName, resourcePath, emitFile: this.emitFile, wxComponents, getJsonFile, getShadowTemplate, updateSpecialMethods, globalUsingComponents, updateGenericComponents, updateComponentGenerics, updateUsingGlobalComponents }) } else { throw new Error('vue-loader-options parse error') } this.callback(null, content, map) }