alinea
Version:
Headless git-based CMS
58 lines (56 loc) • 1.75 kB
JavaScript
import "../../chunks/chunk-NZLE2WMY.js";
// src/backend/resolver/ParsePreview.ts
import { JsonLoader } from "alinea/backend/loader/JsonLoader";
import { Entry } from "alinea/core";
import { createRecord, parseRecord } from "alinea/core/EntryRecord";
import { applyFilePatch } from "alinea/core/source/FilePatch";
import { createEntryRow } from "alinea/core/util/EntryRows";
import { decodePreviewPayload } from "alinea/preview/PreviewPayload";
var decoder = new TextDecoder();
function createPreviewParser(local) {
return {
async parse(preview, sync) {
if (!(preview && "payload" in preview)) return preview;
const payload = await decodePreviewPayload(preview.payload);
if (local.sha !== payload.contentHash) {
await sync();
if (local.sha !== payload.contentHash) return;
}
const entry = await local.first({
select: Entry,
id: payload.entryId,
locale: payload.locale,
status: "preferDraft"
});
if (!entry) return;
const baseText = decoder.decode(
JsonLoader.format(
local.config.schema,
createRecord(entry, entry.status)
)
);
let updatedText;
try {
updatedText = await applyFilePatch(baseText, payload.patch);
} catch {
return;
}
const { data } = parseRecord(JSON.parse(updatedText));
const { rowHash: _rowHash, fileHash: _fileHash, ...withoutHashes } = entry;
const patched = await createEntryRow(
local.config,
{
...withoutHashes,
title: data.title,
data,
path: entry.path
},
entry.status
);
return { entry: patched };
}
};
}
export {
createPreviewParser
};