-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgatsby-node.js
118 lines (105 loc) · 2.39 KB
/
gatsby-node.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
const path = require('path');
const sanitizeName = artistName => {
if (!artistName) {
console.error(`invalid url : no name provided`);
}
let path;
try {
path = artistName
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/([^a-zA-Z0-9])/g, ' ')
.split(' ')
.filter(Boolean)
.join('-')
.toLowerCase();
} catch (e) {
console.error(e);
}
return path;
};
const templates = {
artist: path.resolve(`src/templates/artists/index.js`),
agenda: path.resolve(`src/templates/agenda/index.js`),
show: path.resolve(`src/templates/shows/index.js`),
};
const convertToUrl = name => {
try {
return sanitizeName(name);
} catch (e) {
console.error(e);
}
};
const artistsQuery = `
query artistsForPath {
allContentfulArtists {
edges {
node {
id
name
}
}
}
}
`;
const showsQuery = `
query showsForPath {
allContentfulShow {
edges {
node {
id
name
url
artist {
id
name
}
}
}
}
}
`;
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions;
const createPageWithResults = (path, cpmnt, context) => {
createPage({
path: path,
component: cpmnt,
context: context,
});
};
return await Promise.all([
graphql(artistsQuery).then(result => {
if (result.errors) {
reject(result.errors);
}
// Create blog post pages.
result.data.allContentfulArtists.edges.map(edge => {
const artistPath = `/artists/${convertToUrl(edge.node.name)}`;
const agendaPath = `/agenda/${convertToUrl(edge.node.name)}`;
const context = {
artistId: edge.node.id,
};
createPageWithResults(artistPath, templates.artist, context);
createPageWithResults(agendaPath, templates.agenda, context);
});
return;
}),
graphql(showsQuery).then(result => {
if (result.errors) {
reject(result.errors);
}
// Create show pages.
result.data.allContentfulShow.edges.forEach(edge => {
const artistPath = `/artists/${convertToUrl(edge.node.artist.name)}/${
edge.node.url
}/`;
const context = {
showId: edge.node.id,
};
createPageWithResults(artistPath, templates.show, context);
});
return;
}),
]);
};