static-cms/website/gatsby-node.js

105 lines
2.3 KiB
JavaScript

const path = require('path');
const { createFilePath } = require('gatsby-source-filesystem');
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions;
const docPage = path.resolve('./src/templates/doc-page.js');
const blogPost = path.resolve('./src/templates/blog-post.js');
// get all markdown with a frontmatter path field and title
const allMarkdown = await graphql(`
{
allMarkdownRemark(filter: { frontmatter: { title: { ne: null } } }) {
edges {
node {
fields {
slug
}
frontmatter {
title
}
}
}
}
}
`);
if (allMarkdown.errors) {
console.error(allMarkdown.errors); // eslint-disable-line no-console
throw Error(allMarkdown.errors);
}
allMarkdown.data.allMarkdownRemark.edges.forEach(({ node }) => {
const { slug } = node.fields;
let template = docPage;
if (slug.includes('blog/')) {
template = blogPost;
}
createPage({
path: slug,
component: template,
context: {
slug,
},
});
});
};
function pad(n) {
return n >= 10 ? n : `0${n}`;
}
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions;
if (node.internal.type === 'MarkdownRemark') {
const value = createFilePath({ node, getNode });
const { relativePath } = getNode(node.parent);
let slug = value;
if (relativePath.includes('blog/')) {
const date = new Date(node.frontmatter.date);
const year = date.getFullYear();
const month = date.getMonth() + 1;
const filename = path.basename(relativePath, '.md');
slug = `/blog/${year}/${pad(month)}/${filename}`;
createNodeField({
node,
name: 'date',
value: date.toJSON(),
});
}
// used for doc posts
createNodeField({
node,
name: 'slug',
value: slug,
});
// used to create GitHub edit link
createNodeField({
node,
name: 'path',
value: relativePath,
});
}
};
exports.onCreateWebpackConfig = ({ actions }) => {
actions.setWebpackConfig({
resolve: {
extensions: ['.ts', '.tsx', '.js', '.json'],
alias: {
moment$: 'moment/moment.js',
},
},
});
};