import Vue from 'vue' import { findPageForPath } from './util' export default function dataMixin (siteData) { prepare(siteData) const store = new Vue({ data: { siteData } }) if (module.hot) { module.hot.accept('./.temp/siteData', () => { prepare(siteData) store.siteData = siteData }) } return { computed: { $site () { return store.siteData }, $localeConfig () { const { locales = {}} = this.$site let targetLang let defaultLang for (const path in locales) { if (path === '/') { defaultLang = locales[path] } else if (this.$page.path.indexOf(path) === 0) { targetLang = locales[path] } } return targetLang || defaultLang || {} }, $siteTitle () { return this.$localeConfig.title || this.$site.title || '' }, $title () { const page = this.$page const siteTitle = this.$siteTitle const selfTitle = page.frontmatter.home ? null : ( page.frontmatter.title || // explicit title page.title // inferred title ) return siteTitle ? selfTitle ? (selfTitle + ' | ' + siteTitle) : siteTitle : selfTitle || 'VuePress' }, $description () { // #565 hoist description from meta if (this.$page.frontmatter.meta) { const descriptionMeta = this.$page.frontmatter.meta.filter(item => item.name === 'description')[0] if (descriptionMeta) return descriptionMeta.content } return this.$page.frontmatter.description || this.$localeConfig.description || this.$site.description || '' }, $lang () { return this.$page.frontmatter.lang || this.$localeConfig.lang || 'en-US' }, $localePath () { return this.$localeConfig.path || '/' }, $themeLocaleConfig () { return (this.$site.themeConfig.locales || {})[this.$localePath] || {} }, $page () { return findPageForPath( this.$site.pages, this.$route.path ) } } } } function prepare (siteData) { siteData.pages.forEach(page => { if (!page.frontmatter) { page.frontmatter = {} } }) if (siteData.locales) { Object.keys(siteData.locales).forEach(path => { siteData.locales[path].path = path }) } Object.freeze(siteData) }