UNPKG

@paroicms/server

Version:
90 lines 2.96 kB
import { encodeLNodeId } from "@paroicms/public-anywhere-lib"; import { type } from "arktype"; const LNodeDataRowAT = type({ nodeId: "number|string", relativeId: "string", publishDate: "string|null", language: "string", title: "string|null", slug: "string|null", ready: "number", "+": "reject", }).pipe((r) => ({ nodeId: String(r.nodeId), relativeId: r.relativeId, publishDate: r.publishDate ?? undefined, language: r.language, title: r.title ?? undefined, slug: r.slug ?? undefined, ready: Boolean(r.ready), })); export async function buildClusterNodeInfo(siteContext, homeRoutingCluster) { const lNodeIds = collectLNodeIds(homeRoutingCluster); const lNodeDataMap = await loadLNodeData(siteContext, lNodeIds); return transformClusterNode(homeRoutingCluster, lNodeDataMap); } function collectLNodeIds(node) { const ids = []; for (const lNodeId of Object.values(node.lNodeIds)) { ids.push(lNodeId); } if (node.children) { for (const child of Object.values(node.children)) { ids.push(...collectLNodeIds(child)); } } return ids; } async function loadLNodeData(siteContext, lNodeIds) { const { cn } = siteContext; const nodeIds = lNodeIds.map((id) => id.split(":")[0]); const rows = await cn("PaLNode as l") .innerJoin("PaNode as n", "n.id", "l.nodeId") .leftJoin("PaDocument as d", { "d.nodeId": "l.nodeId", "d.language": "l.language", }) .select("n.id as nodeId", "n.relativeId", "n.publishDate", "l.language", "l.ready", "d.title", "d.slug") .whereIn("n.id", nodeIds); const lNodeDataMap = new Map(); for (const row of rows) { const data = LNodeDataRowAT.assert(row); const lNodeId = encodeLNodeId({ nodeId: data.nodeId, language: data.language }); lNodeDataMap.set(lNodeId, data); } return lNodeDataMap; } function transformClusterNode(node, lNodeDataMap) { const availableIn = {}; let relativeId; let publishDate; for (const [language, documentId] of Object.entries(node.lNodeIds)) { const data = lNodeDataMap.get(documentId); if (data) { availableIn[language] = { documentId, language, ready: data.ready, title: data.title, slug: data.slug, }; relativeId ??= data.relativeId; publishDate ??= data.publishDate; } } const result = { nodeId: node.nodeId, typeName: node.typeName, relativeId, publishDate, availableIn, }; if (node.children) { result.children = {}; for (const [typeName, child] of Object.entries(node.children)) { result.children[typeName] = transformClusterNode(child, lNodeDataMap); } } return result; } //# sourceMappingURL=site-info-api.js.map