@paroicms/site-generator-plugin
Version:
ParoiCMS Site Generator Plugin
49 lines (48 loc) • 2.21 kB
JavaScript
import { encodeLNodeId, } from "@paroicms/public-anywhere-lib";
export async function updateLNodesWithTaxonomies(ctx, options) {
const { siteSchema, siteConnector } = ctx;
const { idPicker } = options;
const { nodeTypes } = siteSchema;
for (const nodeType of Object.values(nodeTypes)) {
const labelingFields = nodeType.fields?.filter((f) => f.dataType === "labeling");
if (!labelingFields || labelingFields.length === 0)
continue;
await updateLabelingFields(ctx, {
idPicker,
nodeType,
labelingFields,
}, siteConnector);
}
}
async function updateLabelingFields(ctx, options, siteConnector) {
const { nodeType, labelingFields, idPicker } = options;
if (nodeType.kind !== "document" && nodeType.kind !== "part")
return;
const nodeIds = idPicker.pickNodeIds({ typeName: nodeType.typeName });
// Labeling fields are not localized, so use default language
const defaultLanguage = ctx.siteSchema.languages[0];
for (const nodeId of nodeIds) {
const fieldValues = {};
for (const field of labelingFields) {
const taxonomyIds = idPicker.pickNodeIds({ typeName: field.taxonomy });
if (taxonomyIds.length !== 1) {
if (taxonomyIds.length > 1) {
ctx.logger.warn(`Expected one taxonomy ID for "${field.taxonomy}", got ${taxonomyIds.length}`);
}
continue;
}
const taxonomyNodeId = taxonomyIds[0];
const max = field.multiple ? Math.floor(Math.random() * 2) + 1 : 1;
const termNodeIds = idPicker.pickNodeIds({ parentNodeId: taxonomyNodeId }, max);
if (termNodeIds.length === 0)
continue;
const labelingValue = { t: termNodeIds };
fieldValues[field.name] = labelingValue;
}
if (Object.keys(fieldValues).length === 0)
continue;
// Use updateFields with the default language since labeling is not localized
const lNodeId = encodeLNodeId({ nodeId, language: defaultLanguage });
await siteConnector.updateFields(lNodeId, fieldValues);
}
}