@dcloudio/uni-cli-shared
Version:
uni-cli-shared
123 lines (108 loc) • 3.67 kB
JavaScript
const path = require('path')
const initPreprocessContext = require('./preprocess')
const uniI18n = require('@dcloudio/uni-cli-i18n')
const Plugin = {
options: {},
// 初步校验相关配置是否正确
validate: [], // (platformOptions, manifestJson) {},
configureEnv: [], // (){},
// 以 H5 为基准的平台特殊配置
configureH5: [], // (h5Options) {},
configurePages: [], // (pagesJson,manifestJson,loader) {},
// 链式修改 webpack config
chainWebpack: [], // (config, vueOptions, api) {},
// 修改 webpack config
configureWebpack: [], // (config, vueOptions, api) {},
// 配置额外的资源拷贝
copyWebpackOptions: [] // (platformOptions, vueOptions) {}
}
const PLUGIN_KEYS = Object.keys(Plugin)
function initPlugin (plugin) {
let pluginApi
try {
pluginApi = require(path.join(plugin.id, (plugin.config.main || '/lib/uni.config.js')))
} catch (e) {
console.warn(uniI18n.__('cliShared.missingUniConfig', { 0: plugin.id }))
}
pluginApi && PLUGIN_KEYS.forEach(name => {
if (pluginApi[name]) {
if (Array.isArray(Plugin[name])) { // hooks
Plugin[name].push(pluginApi[name])
} else { // options
Object.assign(Plugin[name], pluginApi[name])
}
}
})
}
const pluginRE = /^(uni-|@[\w-]+(\.)?[\w-]+\/uni-)/
function resolvePlugins () {
const pkg = require(path.resolve(process.env.UNI_CLI_CONTEXT, 'package.json'))
return Object.keys(pkg.devDependencies || {})
.concat(Object.keys(pkg.dependencies || {}))
.map(id => {
if (!pluginRE.test(id)) {
return
}
try {
const pluginPkg = require(id + '/package.json')
const config = pluginPkg['uni-app']
if (!config) {
return
}
if (!config.name) {
return console.warn(uniI18n.__('cliShared.missingNameAttribute', { 0: `${id}/package.json->uni-app` }))
}
return {
id,
name: config.name,
config
}
} catch (e) {}
}).filter(Boolean)
}
function initExtends (name, plugin, plugins) {
const extendsPlatform = plugin.config.extends
if (extendsPlatform) {
if (extendsPlatform !== 'h5') {
console.error(uniI18n.__('cliShared.extendOnlySupportH5'))
process.exit(0)
}
if (!plugin) {
console.error(uniI18n.__('cliShared.noFoundPlatformPlugin', { 0: extendsPlatform }))
process.exit(0)
}
const extendsPlugin = plugins.find(plugin => plugin.name === extendsPlatform)
process.env.UNI_SUB_PLATFORM = name
process.env.UNI_PLATFORM = extendsPlatform
initPlugin(extendsPlugin)
}
}
module.exports = {
init () {
// compatible with vue-cli-service lint
process.env.UNI_PLATFORM = process.env.UNI_PLATFORM || 'h5'
// hack
if (
process.env.UNI_PLATFORM === 'quickapp-webview-huawei' ||
process.env.UNI_PLATFORM === 'quickapp-webview-union'
) {
process.env.UNI_SUB_PLATFORM = process.env.UNI_PLATFORM
process.env.UNI_PLATFORM = 'quickapp-webview'
}
const plugins = resolvePlugins()
const plugin = plugins.find(plugin => plugin.name === process.env.UNI_PLATFORM)
if (!plugin) {
console.error(uniI18n.__('cliShared.noFoundPlatformPlugin', { 0: process.env.UNI_PLATFORM }))
process.exit(0)
}
const name = plugin.name
initExtends(name, plugin, plugins)
initPlugin(plugin)
Plugin.name = name
Plugin.id = plugin.id
Plugin.config = plugin.config
Plugin.platforms = plugins.map(plugin => plugin.name)
Plugin.preprocess = initPreprocessContext(name, Plugin.platforms, process.UNI_SCRIPT_DEFINE)
return Plugin
}
}