@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
116 lines (115 loc) • 4.37 kB
JavaScript
import { dedupMessages } from "./content-helpers.js";
import { generateFieldSetContent, generateMultipleFieldSetContents, } from "./generate-fake-content.js";
export async function updateRoutingDocument(ctx, report, siteOptions, nodeOptions) {
ctx.logger.debug(`[TASK] Updating routing document "${nodeOptions.nodeType.typeName}"…`);
const { clusterNode, nodeType } = nodeOptions;
const { fqdn, siteSchema, schemaI18n } = siteOptions;
const content = await generateFieldSetContent(ctx, {
nodeType,
documentType: nodeType,
siteSchema,
schemaI18n,
withTitle: false,
llmTaskName: nodeType.kebabName,
}, report);
await ctx.service.connector.updateNodeContent(fqdn, {
nodeId: clusterNode.nodeId,
content: toRiDocumentContent(content, nodeType),
});
for (const language of siteSchema.languages) {
report.addId({
typeName: nodeType.typeName,
id: {
nodeId: clusterNode.nodeId,
language,
},
parentNodeId: undefined,
});
}
}
export async function addRegularDocuments(ctx, report, siteOptions, nodeOptions) {
ctx.logger.debug(`[TASK] Adding regular documents "${nodeOptions.nodeType.typeName}"…`);
const { parentNodeId, nodeType, documentType } = nodeOptions;
const { fqdn, siteSchema, schemaI18n } = siteOptions;
const tolerateErrors = {
errorMessages: [],
};
const list = await generateMultipleFieldSetContents(ctx, {
siteSchema,
nodeType,
documentType,
schemaI18n,
count: getDefaultNodeContentCount(nodeType),
withTitle: true,
tolerateErrors,
llmTaskName: nodeType.kebabName,
}, report);
const errorMessages = dedupMessages(tolerateErrors.errorMessages);
if (errorMessages.length > 0) {
ctx.logger.warn(`Error generating content for ${nodeType.typeName}:\n - ${errorMessages.join("\n - ")}`);
}
const insertedIds = await ctx.service.connector.addMultipleDocumentContents(fqdn, {
parentNodeId,
contents: list.map((content) => toRiDocumentContent(content, nodeType)),
});
report.addId({ typeName: nodeType.typeName, id: insertedIds, parentNodeId });
}
export async function addParts(ctx, report, siteOptions, nodeOptions) {
ctx.logger.debug(`[TASK] Adding parts "${nodeOptions.nodeType.typeName}"…`);
const { parentNodeId, nodeType, documentType } = nodeOptions;
const { fqdn, siteSchema, schemaI18n } = siteOptions;
const tolerateErrors = {
errorMessages: [],
};
const list = await generateMultipleFieldSetContents(ctx, {
siteSchema,
nodeType,
documentType,
schemaI18n,
count: getDefaultNodeContentCount(nodeType),
withTitle: true,
tolerateErrors,
llmTaskName: nodeType.kebabName,
}, report);
const errorMessages = dedupMessages(tolerateErrors.errorMessages);
if (errorMessages.length > 0) {
ctx.logger.warn(`Error generating content for ${nodeType.typeName}:\n - ${errorMessages.join("\n - ")}`);
}
const insertedIds = await ctx.service.connector.addMultiplePartContents(fqdn, {
parentNodeId,
contents: list.map((content) => toRiPartContent(content, nodeType)),
});
report.addId({ typeName: nodeType.typeName, id: insertedIds, parentNodeId });
}
function toRiDocumentContent(content, nodeType) {
const { title, fields, featuredImage } = content;
return {
kind: "document",
typeName: nodeType.typeName,
title,
featuredImage,
fields,
};
}
function toRiPartContent(content, nodeType) {
const { fields } = content;
return {
kind: "part",
typeName: nodeType.typeName,
fields,
};
}
function getDefaultNodeContentCount(nodeType) {
if (nodeType.kind === "site")
throw new Error("Cannot generate content for site node type");
if (nodeType.kind === "document") {
if (nodeType.documentKind === "routing")
return 1;
if (nodeType.route === ":yyyy/:mm/:dd/:relativeId-:slug")
return 14; // 4
return 8; // 2
}
if (nodeType.kind === "part")
return 8; // 2
throw new Error(`Unknown node type kind: ${nodeType.kind}`);
}