UNPKG

@oberoncms/core

Version:

OberonCMS is a cloud deployable CMS written in typescript based on the Puck visual editor

77 lines (76 loc) 2.13 kB
import { transformProps } from "@puckeditor/core"; import { mapConcurrent } from "@tohuhono/utils/map-concurrent"; async function applyTransform(key, transforms, getPageData, updatePageData) { try { const data = await getPageData(key); if (!data) { return { type: "transform", key, status: "success" }; } await updatePageData({ key, data: transformProps(data, transforms), updatedAt: /* @__PURE__ */ new Date(), updatedBy: "migration" }); return { type: "transform", key, status: "success" }; } catch (error) { console.error(error); return { type: "transform", key, status: "error" }; } } const MAX_CONCURRENCY = 10; async function* applyTransforms({ transforms, pages, getPageData, updatePageData }) { yield* mapConcurrent( pages, ({ key }) => applyTransform(key, transforms, getPageData, updatePageData), MAX_CONCURRENCY ); } function getComponentTransformVersions({ components }) { const versions = {}; for (const key in components) { const transforms = components[key]?.transforms || []; versions[key] = transforms.length; } return versions; } function getTransforms(currentTransformVersions = {}, { components }) { const componentTransforms = {}; const transformVersions = {}; for (const componentKey in components) { const transforms = components[componentKey]?.transforms || []; const latestTransform = transforms.length; const previousTransform = currentTransformVersions[componentKey] ?? latestTransform; if (previousTransform < latestTransform) { componentTransforms[componentKey] = (props) => transforms.slice(previousTransform).reduce((accumulater, transform) => transform(accumulater), props); } transformVersions[componentKey] = latestTransform; } const hasTransforms = !!Object.keys(componentTransforms).length; return { components: transformVersions, transforms: hasTransforms && componentTransforms }; } export { applyTransforms, getComponentTransformVersions, getTransforms };