Blame view

node_modules/bootstrap-vue/src/utils/config-set.js 2.44 KB
4cd4fd28   郭伟龙   feat: 初始化项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { Vue as OurVue } from '../vue'
import { NAME, PROP_NAME } from '../constants/config'
import { cloneDeep } from './clone-deep'
import { getRaw } from './get'
import { isArray, isPlainObject, isString, isUndefined } from './inspect'
import { getOwnPropertyNames } from './object'
import { warn } from './warn'

// Config manager class
class BvConfig {
  constructor() {
    this.$_config = {}
  }

  // Method to merge in user config parameters
  setConfig(config = {}) {
    /* istanbul ignore next */
    if (!isPlainObject(config)) {
      return
    }
    const configKeys = getOwnPropertyNames(config)
    configKeys.forEach(key => {
      /* istanbul ignore next */
      const subConfig = config[key]
      if (key === 'breakpoints') {
        /* istanbul ignore if */
        if (
          !isArray(subConfig) ||
          subConfig.length < 2 ||
          subConfig.some(b => !isString(b) || b.length === 0)
        ) {
          warn('"breakpoints" must be an array of at least 2 breakpoint names', NAME)
        } else {
          this.$_config[key] = cloneDeep(subConfig)
        }
      } else if (isPlainObject(subConfig)) {
        // Component prop defaults
        this.$_config[key] = getOwnPropertyNames(subConfig).reduce((config, prop) => {
          if (!isUndefined(subConfig[prop])) {
            config[prop] = cloneDeep(subConfig[prop])
          }
          return config
        }, this.$_config[key] || {})
      }
    })
  }

  // Clear the config
  resetConfig() {
    this.$_config = {}
  }

  // Returns a deep copy of the user config
  getConfig() {
    return cloneDeep(this.$_config)
  }

  // Returns a deep copy of the config value
  getConfigValue(key, defaultValue = undefined) {
    return cloneDeep(getRaw(this.$_config, key, defaultValue))
  }
}

// Method for applying a global config
export const setConfig = (config = {}, Vue = OurVue) => {
  // Ensure we have a `$bvConfig` Object on the Vue prototype
  // We set on Vue and OurVue just in case consumer has not set an alias of `vue`
  Vue.prototype[PROP_NAME] = OurVue.prototype[PROP_NAME] =
    Vue.prototype[PROP_NAME] || OurVue.prototype[PROP_NAME] || new BvConfig()
  // Apply the config values
  Vue.prototype[PROP_NAME].setConfig(config)
}

// Method for resetting the user config
// Exported for testing purposes only
export const resetConfig = () => {
  if (OurVue.prototype[PROP_NAME] && OurVue.prototype[PROP_NAME].resetConfig) {
    OurVue.prototype[PROP_NAME].resetConfig()
  }
}