const webpack = require('webpack')
|
const path = require('path')
|
const debug = require('debug')('vue-cli-plugin-i18n:service')
|
|
module.exports = (api, options) => {
|
const {
|
enableInSFC,
|
localeDir,
|
runtimeOnly,
|
enableLegacy,
|
enableBridge,
|
includeLocales,
|
compositionOnly,
|
fullInstall
|
} = options.pluginOptions.i18n
|
debug('options', options)
|
|
const { semver, loadModule } = require(require.resolve(
|
'@vue/cli-shared-utils'
|
))
|
const vue = loadModule('vue', api.service.context)
|
debug('vue version', vue.version)
|
const isVue3 = vue && semver.major(vue.version) === 3
|
|
if (isVue3) {
|
api.chainWebpack(webpackConfig => {
|
debug('chainWebpack called')
|
|
// prettier-ignore
|
webpackConfig.module
|
.rule('i18n-resource')
|
.test(/\.(json5?|ya?ml)$/)
|
.include.add(path.resolve(__dirname, '../../', `./src/${localeDir}`))
|
.end()
|
.type('javascript/auto')
|
.use('i18n-resource')
|
.loader('@intlify/vue-i18n-loader')
|
// prettier-ignore
|
webpackConfig.module
|
.rule('i18n')
|
.resourceQuery(/blockType=i18n/)
|
.type('javascript/auto')
|
.use('i18n')
|
.loader('@intlify/vue-i18n-loader')
|
|
if (runtimeOnly) {
|
webpackConfig.resolve.alias.set(
|
'vue-i18n',
|
'vue-i18n/dist/vue-i18n.runtime.esm-bundler.js'
|
)
|
debug('set vue-i18n runtime only')
|
}
|
|
// prettier-ignore
|
const legacyApiFlag = enableLegacy
|
? 'true'
|
: compositionOnly
|
? 'false' : 'true'
|
const installFlag = fullInstall ? 'true' : 'false'
|
webpackConfig.plugin('vue-i18n-feature-flags').use(webpack.DefinePlugin, [
|
{
|
__VUE_I18N_LEGACY_API__: legacyApiFlag,
|
__VUE_I18N_FULL_INSTALL__: installFlag,
|
__VUE_I18N_PROD_DEVTOOLS__: 'false'
|
}
|
])
|
debug(
|
'set __VUE_I18N_LEGACY_API__ and __VUE_I18N_FULL_INSTALL',
|
legacyApiFlag,
|
installFlag
|
)
|
})
|
} else {
|
api.chainWebpack(webpackConfig => {
|
debug('chainWebpack called')
|
|
if (enableInSFC) {
|
if (!enableBridge) {
|
// prettier-ignore
|
webpackConfig.module
|
.rule('i18n')
|
.resourceQuery(/blockType=i18n/)
|
.type('javascript/auto')
|
.use('i18n')
|
.loader('@intlify/vue-i18n-loader')
|
.end()
|
.end()
|
} else {
|
// prettier-ignore
|
if (includeLocales) {
|
webpackConfig.module
|
.rule('i18n-resource')
|
.test(/\.(json5?|ya?ml)$/)
|
.include.add(path.resolve(__dirname, '../../', `./src/${localeDir}`))
|
.end()
|
.type('javascript/auto')
|
.use('i18n-resource')
|
.loader('@intlify/vue-i18n-loader')
|
.options({ bridge: true })
|
}
|
// prettier-ignore
|
webpackConfig.module
|
.rule('i18n')
|
.resourceQuery(/blockType=i18n/)
|
.type('javascript/auto')
|
.use('i18n')
|
.loader('@intlify/vue-i18n-loader')
|
.options({ bridge: true })
|
|
if (runtimeOnly) {
|
webpackConfig.resolve.alias.set(
|
'vue-i18n-bridge',
|
'vue-i18n-bridge/dist/vue-i18n-bridge.runtime.esm-bundler.js'
|
)
|
debug('set vue-i18n-bridge runtime only')
|
}
|
}
|
}
|
})
|
}
|
|
const report = require('./report')
|
api.registerCommand('i18n:report', report.options, args =>
|
report.service(args, api)
|
)
|
}
|
|
module.exports.defaultModes = {
|
build: 'production'
|
}
|