-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgatsby-node.ts
78 lines (68 loc) · 1.77 KB
/
gatsby-node.ts
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
/* eslint-disable import/no-nodejs-modules */
import * as path from 'path';
/* eslint-enable import/no-nodejs-modules */
import dotenv from 'dotenv';
import type {
CreateNodeArgs,
CreatePagesArgs,
CreateSchemaCustomizationArgs,
} from 'gatsby';
import createMarkdownPost from './gatsby/createMarkdownPost';
import { assert } from './src/utils/typeHelpers';
dotenv.config({
path: `.env.${process.env.NODE_ENV as string}`,
});
export const createPages = async ({ actions, graphql, reporter }: CreatePagesArgs): Promise<void> => {
const postResult = await graphql<PostData>(postQuery);
if (postResult.errors) {
reporter.panicOnBuild(`Error while running GraphQL query for each post`);
return;
}
assert(postResult.data);
postResult.data.allMarkdownPost.nodes.forEach(({ id, postPath }) => {
actions.createPage({
path: postPath,
component: path.resolve('src/components/templates/PostTemplate.tsx'),
context: { id },
});
});
};
export const createSchemaCustomization = ({ actions }: CreateSchemaCustomizationArgs) => {
actions.createTypes(`
type Site implements Node {
siteMetadata: SiteSiteMetadata!
}
type SiteSiteMetadata {
author: String!
description: String!
locales: [String!]!
name: String!
shortName: String!
siteUrl: String!
themeColor: String!
title: String!
titleTemplate: String!
}
`);
}
export const onCreateNode = (createNodeArgs: CreateNodeArgs): void => {
createMarkdownPost(createNodeArgs);
};
interface PostData {
readonly allMarkdownPost: {
readonly nodes: {
readonly postPath: string;
readonly id: string;
}[];
};
}
const postQuery = `
query {
allMarkdownPost {
nodes {
postPath
id
}
}
}
`;