bootstrap-vue-loader
Version:
A Webpack plugin for automatic BootstrapVue components and directives importing, mainly for treeshaking
45 lines (39 loc) • 1.74 kB
JavaScript
const loaderUtils = require('loader-utils')
const runtimePaths = {
installComponents: require.resolve('./runtime/installComponents'),
installDirectives: require.resolve('./runtime/installDirectives')
}
function inject(runtimeInstallationFunction, content, imports, importTransformer) {
const importsFragment =
`
import ${runtimeInstallationFunction} from ${loaderUtils.stringifyRequest(this, '!' + runtimePaths[runtimeInstallationFunction])}
import {${imports.join(', ')}} from 'bootstrap-vue'
${runtimeInstallationFunction}(component, {${importTransformer()}})
`
const hotReload = content.indexOf('/* hot reload */')
const afterComponent = content.indexOf('component.options.__file')
const componentExport = content.indexOf('export default component.exports')
if (hotReload > -1) {
content = content.slice(0, hotReload) + importsFragment + '\n\n' + content.slice(hotReload)
} else if (afterComponent > -1) {
content = content.slice(0, afterComponent) + importsFragment + '\n\n' + content.slice(afterComponent)
} else if (componentExport > -1) {
content = content.slice(0, componentExport) + importsFragment + '\n\n' + content.slice(componentExport)
} else {
content = importsFragment + '\n\n' + content
}
return content
}
const injectComponents = (content, components) => inject(
'installComponents',
content,
components,
() => components.join(', ')
)
const injectDirectives = (content, directives) => inject(
'installDirectives',
content,
directives.map(d => d['import']),
() => directives.map(d => `'${d.name}': ${d['import']}`).join(', ')
)
module.exports = {injectComponents, injectDirectives}