2
0
mirror of https://github.com/tenrok/vue-meta.git synced 2026-06-20 12:30:34 +03:00

logically group modules into folders

This commit is contained in:
Declan de Wet
2016-11-02 23:11:28 +02:00
parent a3c17f1c14
commit 701bedc170
13 changed files with 46 additions and 43 deletions
+11
View File
@@ -0,0 +1,11 @@
import inject from './inject'
/**
* Returns an injector for server-side rendering.
* @this {Object} - the Vue instance (a root component)
* @return {Object} - injector
*/
export default function $meta () {
// bind inject method to this component
return { inject: inject.bind(this) }
}
+19
View File
@@ -0,0 +1,19 @@
import titleGenerator from './generators/titleGenerator'
import attrsGenerator from './generators/attrsGenerator'
/**
* Converts a meta info property to one that can be stringified on the server
*
* @param {String} type - the type of data to convert
* @param {(String|Object|Array<Object>)} data - the data value
* @return {Object} - the new injector
*/
export default function generateServerInjector (type, data) {
switch (type) {
case 'title':
return titleGenerator(type, data)
case 'htmlAttrs':
case 'bodyAttrs':
return attrsGenerator(type, data)
}
}
+29
View File
@@ -0,0 +1,29 @@
import { VUE_META_ATTRIBUTE } from '../../shared/constants'
/**
* Generates tag attributes for use on the server.
*
* @param {('bodyAttrs'|'htmlAttrs')} type - the type of attributes to generate
* @param {Object} data - the attributes to generate
* @return {Object} - the attribute generator
*/
export default function attrsGenerator (type, data) {
return {
text () {
let attributeStr = ''
let watchedAttrs = []
for (let attr in data) {
if (data.hasOwnProperty(attr)) {
watchedAttrs.push(attr)
attributeStr += `${
typeof data[attr] !== 'undefined'
? `${attr}="${data[attr]}"`
: attr
} `
}
}
attributeStr += `${VUE_META_ATTRIBUTE}="${watchedAttrs.join(',')}"`
return attributeStr.trim()
}
}
}
+16
View File
@@ -0,0 +1,16 @@
import { VUE_META_ATTRIBUTE } from '../../shared/constants'
/**
* Generates title output for the server
*
* @param {'title'} type - the string "title"
* @param {String} data - the title text
* @return {Object} - the title generator
*/
export default function titleGenerator (type, data) {
return {
text () {
return `<${type} ${VUE_META_ATTRIBUTE}="true">${data}</${type}>`
}
}
}
+29
View File
@@ -0,0 +1,29 @@
import getMetaInfo from '../shared/getMetaInfo'
import generateServerInjector from './generateServerInjector'
/**
* Converts the state of the meta info object such that each item
* can be compiled to a tag string on the server
*
* @this {Object} - Vue instance - ideally the root component
* @return {Object} - server meta info with `toString` methods
*/
export default function inject () {
const Vue = this.constructor
// get meta info with sensible defaults
const info = Vue.util.extend({
title: '',
htmlAttrs: {},
bodyAttrs: {}
}, getMetaInfo(this.$root))
// generate server injectors
for (let key in info) {
if (info.hasOwnProperty(key) && key !== 'titleTemplate') {
info[key] = generateServerInjector(key, info[key])
}
}
return info
}