/**
* 微信小程序:编译 DIY bridge 时注入生成的静态 v-if 版本
*/
const fs = require('fs')
const path = require('path')
const { ROOT } = require('./addon-utils.cjs')
const MP_ROUTER = path.join(ROOT, 'src', 'components', 'diy-dynamic-bridge', 'diy-dynamic-bridge.router.mp.vue')
const MP_APP = path.join(ROOT, 'src', 'components', 'diy-dynamic-bridge-app', 'diy-dynamic-bridge-app.mp.vue')
const MP_LEGACY = path.join(ROOT, 'src', 'components', 'diy-dynamic-bridge', 'diy-dynamic-bridge.mp.vue')
function isMpWeixin() {
return process.env.UNI_PLATFORM === 'mp-weixin'
}
function normId(id) {
return (id || '').replace(/\\/g, '/')
}
function readIfExists(filePath) {
if (!fs.existsSync(filePath)) return null
return fs.readFileSync(filePath, 'utf-8')
}
function resolveInjectContent(id) {
const norm = normId(id)
if (norm.endsWith('/components/diy-dynamic-bridge/diy-dynamic-bridge.vue')) {
return readIfExists(MP_ROUTER) || readIfExists(MP_LEGACY)
}
if (norm.endsWith('/components/diy-dynamic-bridge-app/diy-dynamic-bridge-app.vue')) {
return readIfExists(MP_APP)
}
const addonMatch = norm.match(/\/components\/diy-dynamic-bridge-([a-zA-Z0-9_]+)\/diy-dynamic-bridge-\1\.vue$/)
if (addonMatch) {
const key = addonMatch[1]
const envKey = process.env.MP_ADDON_BRIDGE_KEY
if (envKey && envKey !== key) return null
const mpFile = path.join(ROOT, 'src', 'components', `diy-dynamic-bridge-${key}`, `diy-dynamic-bridge-${key}.mp.vue`)
if (fs.existsSync(mpFile)) return fs.readFileSync(mpFile, 'utf-8')
// 插件 bridge 目录不存在(如未构建的 cms 等),返回空壳防止 Rollup 解析失败
return `\n\n`
}
return null
}
function isBridgeVueId(id) {
if (!id || id.includes('?')) return false
return resolveInjectContent(id) !== null
}
function createDiyDynamicBridgeMpPlugin() {
return {
name: 'diy-dynamic-bridge-mp',
enforce: 'pre',
transform(code, id) {
if (!isMpWeixin()) return null
const content = resolveInjectContent(id)
if (!content) return null
return content
}
}
}
module.exports = {
createDiyDynamicBridgeMpPlugin,
MP_ROUTER,
MP_APP,
MP_LEGACY
}