bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
170 lines (152 loc) • 4.3 kB
JavaScript
import { Vue as OurVue } from '../vue'
import { HAS_WINDOW_SUPPORT, IS_JSDOM } from '../constants/env'
import { setConfig } from './config-set'
import { warn } from './warn'
/**
* Checks if there are multiple instances of Vue, and warns (once) about possible issues.
* @param {object} Vue
*/
export const checkMultipleVue = (() => {
let checkMultipleVueWarned = false
const MULTIPLE_VUE_WARNING = [
'Multiple instances of Vue detected!',
'You may need to set up an alias for Vue in your bundler config.',
'See: https://bootstrap-vue.org/docs#using-module-bundlers'
].join('\n')
return Vue => {
/* istanbul ignore next */
if (!checkMultipleVueWarned && OurVue !== Vue && !IS_JSDOM) {
warn(MULTIPLE_VUE_WARNING)
}
checkMultipleVueWarned = true
}
})()
/**
* Plugin install factory function.
* @param {object} { components, directives }
* @returns {function} plugin install function
*/
export const installFactory = ({ components, directives, plugins } = {}) => {
const install = (Vue, config = {}) => {
if (install.installed) {
/* istanbul ignore next */
return
}
install.installed = true
checkMultipleVue(Vue)
setConfig(config, Vue)
registerComponents(Vue, components)
registerDirectives(Vue, directives)
registerPlugins(Vue, plugins)
}
install.installed = false
return install
}
/**
* Plugin install factory function (no plugin config option).
* @param {object} { components, directives }
* @returns {function} plugin install function
*/
export const installFactoryNoConfig = ({ components, directives, plugins } = {}) => {
const install = Vue => {
if (install.installed) {
/* istanbul ignore next */
return
}
install.installed = true
checkMultipleVue(Vue)
registerComponents(Vue, components)
registerDirectives(Vue, directives)
registerPlugins(Vue, plugins)
}
install.installed = false
return install
}
/**
* Plugin object factory function.
* @param {object} { components, directives, plugins }
* @returns {object} plugin install object
*/
export const pluginFactory = (options = {}, extend = {}) => ({
...extend,
install: installFactory(options)
})
/**
* Plugin object factory function (no config option).
* @param {object} { components, directives, plugins }
* @returns {object} plugin install object
*/
export const pluginFactoryNoConfig = (options = {}, extend = {}) => ({
...extend,
install: installFactoryNoConfig(options)
})
/**
* Load a group of plugins.
* @param {object} Vue
* @param {object} Plugin definitions
*/
export const registerPlugins = (Vue, plugins = {}) => {
for (const plugin in plugins) {
if (plugin && plugins[plugin]) {
Vue.use(plugins[plugin])
}
}
}
/**
* Load a component.
* @param {object} Vue
* @param {string} Component name
* @param {object} Component definition
*/
export const registerComponent = (Vue, name, def) => {
if (Vue && name && def) {
Vue.component(name, def)
}
}
/**
* Load a group of components.
* @param {object} Vue
* @param {object} Object of component definitions
*/
export const registerComponents = (Vue, components = {}) => {
for (const component in components) {
registerComponent(Vue, component, components[component])
}
}
/**
* Load a directive.
* @param {object} Vue
* @param {string} Directive name
* @param {object} Directive definition
*/
export const registerDirective = (Vue, name, def) => {
if (Vue && name && def) {
// Ensure that any leading V is removed from the
// name, as Vue adds it automatically
Vue.directive(name.replace(/^VB/, 'B'), def)
}
}
/**
* Load a group of directives.
* @param {object} Vue
* @param {object} Object of directive definitions
*/
export const registerDirectives = (Vue, directives = {}) => {
for (const directive in directives) {
registerDirective(Vue, directive, directives[directive])
}
}
/**
* Install plugin if window.Vue available
* @param {object} Plugin definition
*/
export const vueUse = VuePlugin => {
/* istanbul ignore next */
if (HAS_WINDOW_SUPPORT && window.Vue) {
window.Vue.use(VuePlugin)
}
/* istanbul ignore next */
if (HAS_WINDOW_SUPPORT && VuePlugin.NAME) {
window[VuePlugin.NAME] = VuePlugin
}
}