-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgridsome.server.js
122 lines (111 loc) · 3.01 KB
/
gridsome.server.js
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Server API makes it possible to hook into various parts of Gridsome
// on server-side and add custom data to the GraphQL data layer.
// Learn more: https://gridsome.org/docs/server-api/
// Changes here require a server restart.
// To restart press CTRL + C in terminal and run `gridsome develop`
let { marked } = require('marked')
var renderer = new marked.Renderer()
renderer.link = function(href, title, text) {
var link = marked.Renderer.prototype.link.apply(this, arguments)
if (link.includes('href="http')) return link.replace("<a","<a target='_blank'")
return link
};
marked.setOptions({
renderer: renderer
})
module.exports = function (api) {
// Pre-define NewsData schema to avoid missing data schema errors
api.loadSource(({ addSchemaTypes }) => {
addSchemaTypes(`
type NewsData implements Node {
headline: TextLang
text: TextLang
date: Date
key: String
reference: String
thumb: Image
yyyymm: Date
}
type TextLang {
en: String
es: String
}
`)
})
// Load markdown so the client doesn't have to do it
api.loadSource(({ addSchemaResolvers }) => {
addSchemaResolvers({
MetaData: {
description(obj) {
if (obj.description) {
obj.description.en = marked(obj.description.en)
obj.description.es = marked(obj.description.es)
return obj.description
}
}
},
CollectionsData: {
collections(obj) {
return obj.collections.map(c => {
c.description.en = marked(c.description.en)
c.description.es = marked(c.description.es)
return c
})
}
},
FaqData: {
questions(obj) {
return obj.questions.map(q => {
q.answer.es = marked(q.answer.es)
q.answer.en = marked(q.answer.en)
return q
})
}
},
NewsData: {
text(obj) {
obj.text.en = marked(obj.text.en)
obj.text.es = marked(obj.text.es)
return obj.text
}
},
AboutData: {
text(obj) {
obj.text.en = marked(obj.text.en)
obj.text.es = marked(obj.text.es)
return obj.text
},
disclaimer(obj) {
obj.disclaimer.en = marked(obj.disclaimer.en)
obj.disclaimer.es = marked(obj.disclaimer.es)
return obj.disclaimer
}
}
})
})
// Create YearMonth News pages
api.createPages(async ({ createPage, graphql }) => {
const { data } = await graphql(`{
allNewsData {
edges {
node {
yyyymm
}
}
}
}`)
let yyyymm = {}
data.allNewsData.edges.forEach(({ node }) => {
if (!yyyymm[node.yyyymm]) yyyymm[node.yyyymm] = true
})
for (const k in yyyymm) {
createPage({
path: `/news/${k}`,
component: './src/templates/News.vue',
context: {
yyyymm: k
}
})
}
})
}