import { createBootstrap } from 'bootstrap-vue-next' import { App, Component, DefineComponent, WritableComputedRef } from 'vue' import { i18n } from './i18n' import * as components from './components' import * as datavisualisations from './datavisualisations' import * as maps from './maps' import config from './config' type ComponentMap = Record interface PluginOptions { useI18n?: boolean useBootstrap?: boolean useConfig?: boolean registerComponents?: boolean } const Murmur = { get i18n() { return i18n }, get config() { return config }, get components(): ComponentMap { return components }, get datavisualisations(): ComponentMap { return datavisualisations }, get maps(): ComponentMap { return maps }, setLocaleMessage(lang: string, message: any) { return Murmur.i18n.global.setLocaleMessage(lang, message) }, mergeLocaleMessage(lang: string, message: any) { return Murmur.i18n.global.mergeLocaleMessage(lang, message) }, setLocale(lang: string) { // i18n.ts pins createI18n()'s Locales generic to 'en' | 'fr' (the initial // messages' keys), but setLocaleMessage/mergeLocaleMessage let consumers // register arbitrary locales at runtime (see main.spec.ts) — so this // accepts any string and casts past the narrower type. return ((Murmur.i18n.global.locale as WritableComputedRef).value = lang) }, getLocale() { return Murmur.i18n.global.locale.value }, install(app: App, { useI18n = true, useBootstrap = true, useConfig = true, registerComponents = true }: PluginOptions = {}) { if (useBootstrap) { app.use(createBootstrap()) } if (useI18n) { app.use(Murmur.i18n) } if (useConfig) { app.config.globalProperties.$config = Murmur.config } if (registerComponents) { const registerAll = (map: ComponentMap) => Object.keys(map).forEach(key => app.component(key, map[key])) registerAll(this.components) registerAll(this.datavisualisations) registerAll(this.maps) } } } export default Murmur