import fs from "node:fs/promises"; import path from "node:path"; import { pathExists } from "./source-path-shared.js"; import { setImportedSourceEntry, shouldSkipImportedSourceWrite, type MemoryWikiImportedSourceGroup, } from "./source-sync-state.js"; type ImportedSourceState = Parameters[0]["state"]; export async function writeImportedSourcePage(params: { vaultRoot: string; syncKey: string; sourcePath: string; sourceUpdatedAtMs: number; sourceSize: number; renderFingerprint: string; pagePath: string; group: MemoryWikiImportedSourceGroup; state: ImportedSourceState; buildRendered: (raw: string, updatedAt: string) => string; }): Promise<{ pagePath: string; changed: boolean; created: boolean }> { const pageAbsPath = path.join(params.vaultRoot, params.pagePath); const created = !(await pathExists(pageAbsPath)); const updatedAt = new Date(params.sourceUpdatedAtMs).toISOString(); const shouldSkip = await shouldSkipImportedSourceWrite({ vaultRoot: params.vaultRoot, syncKey: params.syncKey, expectedPagePath: params.pagePath, expectedSourcePath: params.sourcePath, sourceUpdatedAtMs: params.sourceUpdatedAtMs, sourceSize: params.sourceSize, renderFingerprint: params.renderFingerprint, state: params.state, }); if (shouldSkip) { return { pagePath: params.pagePath, changed: false, created }; } const raw = await fs.readFile(params.sourcePath, "utf8"); const rendered = params.buildRendered(raw, updatedAt); const existing = await fs.readFile(pageAbsPath, "utf8").catch(() => ""); if (existing !== rendered) { await fs.writeFile(pageAbsPath, rendered, "utf8"); } setImportedSourceEntry({ syncKey: params.syncKey, state: params.state, entry: { group: params.group, pagePath: params.pagePath, sourcePath: params.sourcePath, sourceUpdatedAtMs: params.sourceUpdatedAtMs, sourceSize: params.sourceSize, renderFingerprint: params.renderFingerprint, }, }); return { pagePath: params.pagePath, changed: existing !== rendered, created }; }