diff --git a/src/shared/getComponentOption.js b/src/shared/getComponentOption.js index 5cdfe1ff..1df2c0eb 100644 --- a/src/shared/getComponentOption.js +++ b/src/shared/getComponentOption.js @@ -1,5 +1,4 @@ import deepmerge from 'deepmerge' -import isArray from './isArray' /** * Returns the `opts.option` $option value of the given `opts.component`. @@ -25,10 +24,16 @@ export default function getComponentOption (opts, result = {}) { if (typeof $options[option] !== 'undefined' && $options[option] !== null) { let data = $options[option] - if (isArray(data)) { - result = data.reduce((result, dataItem) => mergeDataInResult(dataItem, result, component, arrayMerge), result) + // if option is a function, replace it with it's result + if (typeof data === 'function') { + data = data.call(component) + } + + if (typeof data === 'object') { + // merge with existing options + result = deepmerge(result, data, { arrayMerge }) } else { - result = mergeDataInResult(data, result, component, arrayMerge) + result = data } } @@ -62,16 +67,3 @@ export default function getComponentOption (opts, result = {}) { } return result } - -function mergeDataInResult (data, result, component, arrayMerge) { - // if option is a function, replace it with it's result - if (typeof data === 'function') { - data = data.call(component) - } - - if (typeof data === 'object') { - // merge with existing options - return deepmerge(result, data, { arrayMerge }) - } - return data -} diff --git a/src/shared/plugin.js b/src/shared/plugin.js index 18920a8a..1c34e9a3 100644 --- a/src/shared/plugin.js +++ b/src/shared/plugin.js @@ -35,9 +35,6 @@ export default function VueMeta (Vue, options = {}) { // bind the $meta method to this component instance Vue.prototype.$meta = $meta(options) - // define optionMergeStrategies for the keyName - Vue.config.optionMergeStrategies[options.keyName] = Vue.config.optionMergeStrategies.created - // store an id to keep track of DOM updates let batchID = null diff --git a/test/getComponentOption.spec.js b/test/getComponentOption.spec.js index 103e86c8..af2e2a91 100644 --- a/test/getComponentOption.spec.js +++ b/test/getComponentOption.spec.js @@ -43,77 +43,20 @@ describe('getComponentOption', () => { expect(mergedOption).to.eql({ bar: 'baz', fizz: 'buzz' }) }) - it('allows for a custom array merge strategy in object literal', () => { + it('allows for a custom array merge strategy', () => { Vue.component('array-child', { template: '
', - foo: { - flowers: [ - { name: 'flower', content: 'rose' } - ] - } - }) - - component = new Vue({ - render: (h) => h('div', null, [h('array-child')]), - foo: { - flowers: [ - { name: 'flower', content: 'tulip' } - ] - }, - el: container - }) - - const mergedOption = getComponentOption({ - component, - option: 'foo', - deep: true, - arrayMerge (target, source) { - return target.concat(source) - } - }) - - expect(mergedOption).to.eql({ - flowers: [ - { name: 'flower', content: 'tulip' }, + foo: [ { name: 'flower', content: 'rose' } ] }) - }) - - it('merges arrays of objects literal options', () => { - component = new Vue({ someOption: [{ foo: 'hello' }, { bar: 'there' }] }) - - const mergedOption = getComponentOption({ component, option: 'someOption' }) - expect(mergedOption).to.eql({ foo: 'hello', bar: 'there' }) - }) - it('merges arrays of mixed object literals and functions', () => { component = new Vue({ - cake: 'good', - desserts: [ - { yogurt: 'meh' }, - function someFunction () { - return { cake: this.$options.cake } - }, - function someOtherFunction () { - return { pineapple: 'not bad' } - } - ] - }) - - const mergedOption = getComponentOption({ component, option: 'desserts' }) - expect(mergedOption).to.eql({ yogurt: 'meh', cake: 'good', pineapple: 'not bad' }) - }) - - it('uses custom array merge strategy when merging arrays in arrays of options', () => { - component = new Vue({ - template: '
', + render: (h) => h('div', null, [h('array-child')]), foo: [ - { cars: [{ brand: 'renault', color: 'red' }] }, - function someFunction () { - return { cars: [{ brand: 'peugeot', color: 'blue' }] } - } - ] + { name: 'flower', content: 'tulip' } + ], + el: container }) const mergedOption = getComponentOption({ @@ -125,11 +68,9 @@ describe('getComponentOption', () => { } }) - expect(mergedOption).to.eql({ - cars: [ - { brand: 'renault', color: 'red' }, - { brand: 'peugeot', color: 'blue' } - ] - }) + expect(mergedOption).to.eql([ + { name: 'flower', content: 'tulip' }, + { name: 'flower', content: 'rose' } + ]) }) }) diff --git a/test/getMetaInfo.spec.js b/test/getMetaInfo.spec.js index e24ea07a..e72ab33c 100644 --- a/test/getMetaInfo.spec.js +++ b/test/getMetaInfo.spec.js @@ -21,9 +21,6 @@ const defaultOptions = { const getMetaInfo = _getMetaInfo(defaultOptions) -// define optionMergeStrategies for the keyName -Vue.config.optionMergeStrategies[VUE_META_KEY_NAME] = Vue.config.optionMergeStrategies.created - describe('getMetaInfo', () => { // const container = document.createElement('div') let component @@ -533,92 +530,4 @@ describe('getMetaInfo', () => { __dangerouslyDisableSanitizersByTagID: {} }) }) - - it('properly merges mixins options', () => { - const mixin1 = { - metaInfo: function () { - return { - title: 'This title will be overridden', - meta: [ - { - vmid: 'og:title', - property: 'og:title', - content: 'This title will be overridden' - }, - { - vmid: 'og:fromMixin1', - property: 'og:fromMixin1', - content: 'This is from mixin1' - } - ] - } - } - } - const mixin2 = { - metaInfo: { - meta: [ - { - vmid: 'og:fromMixin2', - property: 'og:fromMixin2', - content: 'This is from mixin2' - } - ] - } - } - const component = new Vue({ - mixins: [mixin1, mixin2], - metaInfo: { - title: 'New Title', - meta: [ - { - vmid: 'og:title', - property: 'og:title', - content: 'New Title! - My page' - }, - { - vmid: 'og:description', - property: 'og:description', - content: 'Some Description' - } - ] - } - }) - expect(getMetaInfo(component)).to.eql({ - title: 'New Title', - titleChunk: 'New Title', - titleTemplate: '%s', - htmlAttrs: {}, - headAttrs: {}, - bodyAttrs: {}, - meta: [ - { - vmid: 'og:fromMixin1', - property: 'og:fromMixin1', - content: 'This is from mixin1' - }, - { - vmid: 'og:fromMixin2', - property: 'og:fromMixin2', - content: 'This is from mixin2' - }, - { - vmid: 'og:title', - property: 'og:title', - content: 'New Title! - My page' - }, - { - vmid: 'og:description', - property: 'og:description', - content: 'Some Description' - } - ], - base: [], - link: [], - style: [], - script: [], - noscript: [], - __dangerouslyDisableSanitizers: [], - __dangerouslyDisableSanitizersByTagID: {} - }) - }) }) diff --git a/test/plugin.spec.js b/test/plugin.spec.js index cac00400..aa8d080c 100644 --- a/test/plugin.spec.js +++ b/test/plugin.spec.js @@ -30,9 +30,4 @@ describe('plugin', () => { const vm = new Vue(Component).$mount() expect(vm._hasMetaInfo).to.equal(true) }) - - it('setup optionMergeStrategies for the keyName', () => { - const strats = Vue.config.optionMergeStrategies - expect(strats[VUE_META_KEY_NAME]).to.equal(strats.created) - }) })