mirror of
https://github.com/tenrok/vue-meta.git
synced 2026-06-24 03:30:33 +03:00
feat: child can indicate its content should be ignored (resolves: #204)
This commit is contained in:
committed by
Alexander Lichter
parent
4dafffea4e
commit
22e456cbe2
+23
-2
@@ -1,5 +1,6 @@
|
|||||||
import deepmerge from 'deepmerge'
|
import deepmerge from 'deepmerge'
|
||||||
import applyTemplate from './applyTemplate'
|
import applyTemplate from './applyTemplate'
|
||||||
|
import { metaInfoAttributeKeys } from './constants'
|
||||||
|
|
||||||
export function arrayMerge({ component, tagIDKeyName, metaTemplateKeyName, contentKeyName }, target, source) {
|
export function arrayMerge({ component, tagIDKeyName, metaTemplateKeyName, contentKeyName }, target, source) {
|
||||||
// we concat the arrays without merging objects contained in,
|
// we concat the arrays without merging objects contained in,
|
||||||
@@ -15,9 +16,11 @@ export function arrayMerge({ component, tagIDKeyName, metaTemplateKeyName, conte
|
|||||||
}
|
}
|
||||||
|
|
||||||
const sourceIndex = source.findIndex(item => item[tagIDKeyName] === targetItem[tagIDKeyName])
|
const sourceIndex = source.findIndex(item => item[tagIDKeyName] === targetItem[tagIDKeyName])
|
||||||
|
const sourceItem = source[sourceIndex]
|
||||||
|
|
||||||
// source doesnt contain any duplicate id's
|
// source doesnt contain any duplicate id's
|
||||||
if (sourceIndex === -1) {
|
// or the source item should be ignored
|
||||||
|
if (sourceIndex === -1 || sourceItem[contentKeyName] === false || sourceItem.innerHTML === false) {
|
||||||
destination.push(targetItem)
|
destination.push(targetItem)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -29,7 +32,6 @@ export function arrayMerge({ component, tagIDKeyName, metaTemplateKeyName, conte
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const sourceItem = source[sourceIndex]
|
|
||||||
const sourceTemplate = sourceItem[metaTemplateKeyName]
|
const sourceTemplate = sourceItem[metaTemplateKeyName]
|
||||||
|
|
||||||
if (!sourceTemplate) {
|
if (!sourceTemplate) {
|
||||||
@@ -45,6 +47,25 @@ export function arrayMerge({ component, tagIDKeyName, metaTemplateKeyName, conte
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function merge(target, source, options = {}) {
|
export function merge(target, source, options = {}) {
|
||||||
|
// remove properties explicitly set to false so child components can
|
||||||
|
// optionally _not_ overwrite the parents content
|
||||||
|
// (for array properties this is checked in arrayMerge)
|
||||||
|
if (source.title === false) {
|
||||||
|
delete source.title
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const attrKey in metaInfoAttributeKeys) {
|
||||||
|
if (!source[attrKey]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key in source[attrKey]) {
|
||||||
|
if (source[attrKey][key] === false) {
|
||||||
|
delete source[attrKey][key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return deepmerge(target, source, {
|
return deepmerge(target, source, {
|
||||||
arrayMerge: (t, s) => arrayMerge(options, t, s)
|
arrayMerge: (t, s) => arrayMerge(options, t, s)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -617,4 +617,58 @@ describe('getMetaInfo', () => {
|
|||||||
__dangerouslyDisableSanitizersByTagID: {}
|
__dangerouslyDisableSanitizersByTagID: {}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('child can indicate its content should be ignored', () => {
|
||||||
|
Vue.component('merge-child', {
|
||||||
|
render: h => h('div'),
|
||||||
|
metaInfo: {
|
||||||
|
title: false,
|
||||||
|
meta: [
|
||||||
|
{
|
||||||
|
vmid: 'og:title',
|
||||||
|
content: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const component = new Vue({
|
||||||
|
metaInfo: {
|
||||||
|
title: 'Hello',
|
||||||
|
meta: [
|
||||||
|
{
|
||||||
|
vmid: 'og:title',
|
||||||
|
property: 'og:title',
|
||||||
|
content: 'Test title',
|
||||||
|
template: chunk => `${chunk} - My page`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
el: document.createElement('div'),
|
||||||
|
render: h => h('div', null, [h('merge-child')])
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(getMetaInfo(component)).toEqual({
|
||||||
|
title: 'Hello',
|
||||||
|
titleChunk: 'Hello',
|
||||||
|
titleTemplate: '%s',
|
||||||
|
htmlAttrs: {},
|
||||||
|
headAttrs: {},
|
||||||
|
bodyAttrs: {},
|
||||||
|
meta: [
|
||||||
|
{
|
||||||
|
vmid: 'og:title',
|
||||||
|
property: 'og:title',
|
||||||
|
content: 'Test title - My page'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
base: [],
|
||||||
|
link: [],
|
||||||
|
style: [],
|
||||||
|
script: [],
|
||||||
|
noscript: [],
|
||||||
|
__dangerouslyDisableSanitizers: [],
|
||||||
|
__dangerouslyDisableSanitizersByTagID: {}
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user