@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
JavaScript
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
};