mirror of
https://github.com/twbs/bootstrap.git
synced 2025-03-14 14:29:30 +01:00
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
/**
|
|
* --------------------------------------------------------------------------
|
|
* Bootstrap (v5.2.3): util/config.js
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
* --------------------------------------------------------------------------
|
|
*/
|
|
|
|
import { isElement, toType } from './index'
|
|
import Manipulator from '../dom/manipulator'
|
|
|
|
/**
|
|
* Class definition
|
|
*/
|
|
|
|
class Config {
|
|
// Getters
|
|
static get Default() {
|
|
return {}
|
|
}
|
|
|
|
static get DefaultType() {
|
|
return {}
|
|
}
|
|
|
|
static get NAME() {
|
|
throw new Error('You have to implement the static method "NAME", for each component!')
|
|
}
|
|
|
|
_getConfig(config) {
|
|
config = this._mergeConfigObj(config)
|
|
config = this._configAfterMerge(config)
|
|
this._typeCheckConfig(config)
|
|
return config
|
|
}
|
|
|
|
_configAfterMerge(config) {
|
|
return config
|
|
}
|
|
|
|
_mergeConfigObj(config, element) {
|
|
const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse
|
|
|
|
return {
|
|
...this.constructor.Default,
|
|
...(typeof jsonConfig === 'object' ? jsonConfig : {}),
|
|
...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),
|
|
...(typeof config === 'object' ? config : {})
|
|
}
|
|
}
|
|
|
|
_typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
|
|
for (const property of Object.keys(configTypes)) {
|
|
const expectedTypes = configTypes[property]
|
|
const value = config[property]
|
|
const valueType = isElement(value) ? 'element' : toType(value)
|
|
|
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
throw new TypeError(
|
|
`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export default Config
|