gatsby-mdx-remote
Version:
A plugin to transform nodes with mdx content and frontmatter into mdx File nodes for consumption by the gatsby-plugin-mdx plugin
81 lines • 4.41 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMdxFileNode = void 0;
const gatsby_source_filesystem_1 = require("gatsby-source-filesystem");
const yaml_1 = __importDefault(require("yaml"));
const extractUrlAndReplaceWithGatsbyImage_js_1 = require("./extractUrlAndReplaceWithGatsbyImage.js");
const recurseFieldContent = (nodeData, objectFieldSequence) => {
if (objectFieldSequence.length === 0 || !nodeData) {
return nodeData;
}
else {
const fieldName = objectFieldSequence[0];
if (Array.isArray(nodeData)) {
return recurseFieldContent(nodeData[0], objectFieldSequence);
}
else if (!Array.isArray(nodeData) && typeof nodeData === "object") {
const fields = objectFieldSequence.slice(1);
const childNodeData = nodeData[fieldName];
return recurseFieldContent(childNodeData, fields);
}
else {
return undefined;
}
}
};
const cacheMdxImages = async ({ pushImageUrlList, className }, content) => {
const remark = (await import("remark")).remark;
const urlList = [];
const pushImageUrlToList = (value) => urlList.push(value);
const getUrlListLength = () => urlList.length;
const file = await remark().use(extractUrlAndReplaceWithGatsbyImage_js_1.extractUrlAndReplaceWithGatsbyImage, { pushImageUrlToList, getUrlListLength, className }).process(content);
const mdx = "\n\n\n" + String(file);
urlList.forEach((url) => pushImageUrlList(url));
return mdx;
};
const createMdxFileNode = async (nodeData, typeConfig, args) => {
const { actions, createNodeId, getCache } = args;
const { createNode } = actions;
const urlList = [];
const isPreprocessImagesEnabled = typeConfig.preprocessImages === undefined || typeConfig.preprocessImages;
const mdxProcessedFieldData = await getMdx(typeConfig, nodeData, isPreprocessImagesEnabled, (value) => urlList.push(value));
const frontmatter = getMdxFrontmatter(typeConfig, nodeData, urlList);
const gatsbyImageImport = isPreprocessImagesEnabled &&
mdxProcessedFieldData &&
mdxProcessedFieldData.indexOf("import { GatsbyImage, getImage") === -1 &&
mdxProcessedFieldData.indexOf("import { getImage, GatsbyImage") === -1
? 'import { GatsbyImage, getImage } from "gatsby-plugin-image"'
: "";
const mdxContentWithFrontmatter = `${(typeConfig.mdxFrontmatterField && frontmatter) || ""}\n\n${gatsbyImageImport}\n\n${mdxProcessedFieldData}`;
if (mdxContentWithFrontmatter) {
return (0, gatsby_source_filesystem_1.createFileNodeFromBuffer)({
buffer: Buffer.from(mdxContentWithFrontmatter),
ext: ".mdx",
parentNodeId: nodeData.id,
getCache: getCache,
createNode: createNode,
createNodeId: createNodeId,
});
}
};
exports.createMdxFileNode = createMdxFileNode;
async function getMdx(typeConfig, nodeData, isPreprocessImagesEnabled, pushImageUrlList) {
const mdxField = typeConfig.mdxField;
const className = typeConfig.gatsbyImageClassName ?? "";
const mdxFields = mdxField ? mdxField.split(".") : undefined;
const mdxFieldData = mdxFields && `\n${recurseFieldContent(nodeData, mdxFields) ?? ""}`;
const mdxProcessedFieldData = isPreprocessImagesEnabled && mdxFieldData ? await cacheMdxImages({ pushImageUrlList, className }, mdxFieldData) : mdxFieldData;
return mdxProcessedFieldData;
}
function getMdxFrontmatter(typeConfig, nodeData, urlList) {
const frontmatterField = typeConfig.mdxFrontmatterField;
const frontmatterFields = (frontmatterField && (frontmatterField.indexOf(".") !== -1 ? frontmatterField.split(".") : [frontmatterField])) || undefined;
const recursedFrontmatterFieldData = frontmatterFields && recurseFieldContent(nodeData, frontmatterFields);
const frontmatterFieldData = (recursedFrontmatterFieldData && typeof recursedFrontmatterFieldData !== "string" && recursedFrontmatterFieldData) || undefined;
const frontmatter = frontmatterFieldData && `---\n${yaml_1.default.stringify({ ...frontmatterFieldData, markdownImageList: urlList })}---\n`;
return frontmatter;
}
//# sourceMappingURL=createMdxNode.js.map