rickvanlieshout.com/internal/gatsby/on-create-node.ts

57 lines
1.5 KiB
TypeScript

import { GatsbyNode } from "gatsby";
import { createFilePath } from "gatsby-source-filesystem";
import readingTime from "reading-time";
import * as constants from "./constants";
import * as types from "./types";
import * as utils from "./utils";
const onCreateNode: GatsbyNode["onCreateNode"] = ({ node, actions, getNode }) => {
const { createNodeField } = actions;
if (node.internal.type === "MarkdownRemark") {
const { frontmatter, parent }: types.Edge["node"] = node;
const { tags, category, slug } = frontmatter || {};
if (slug) {
const dirname = parent && getNode(parent)?.relativeDirectory;
const value =
typeof dirname === "string"
? utils.concat("/", dirname, "/", slug)
: utils.concat("/", slug);
createNodeField({ node, name: "slug", value });
} else {
const value = createFilePath({ node, getNode });
createNodeField({ node, name: "slug", value });
}
if (tags) {
const value = tags.map((tag) =>
utils.concat(constants.routes.tagRoute, "/", utils.toKebabCase(tag), "/")
);
createNodeField({ node, name: "tagSlugs", value });
}
if (category) {
const value = utils.concat(
constants.routes.categoryRoute,
"/",
utils.toKebabCase(category),
"/"
);
createNodeField({ node, name: "categorySlug", value });
}
createNodeField({
node,
name: "readingTime",
value: readingTime(node.rawMarkdownBody as string),
});
}
};
export { onCreateNode };