Files
react-editor-nextjs/lib/publish-page.ts
T

34 lines
1.2 KiB
TypeScript

'use server';
import { writeFile } from 'node:fs/promises';
import path from 'node:path';
const GLOBALS_FILE = path.join(process.cwd(), 'app.globals.json');
export async function publishPage(pagePath: string, page: unknown) {
if (!page || typeof page !== 'object') {
return { error: 'Expected a page object.' };
}
const appDir = path.join(process.cwd(), 'app');
const file = path.resolve(process.cwd(), pagePath);
const relativeToApp = path.relative(appDir, file);
if (!relativeToApp || relativeToApp.startsWith(`..${path.sep}`) || path.isAbsolute(relativeToApp) || path.basename(file) !== 'page.json') {
return { error: 'Invalid page file.' };
}
const { globals, ...pageData } = page as Record<string, unknown>;
try {
await writeFile(file, `${JSON.stringify(pageData, null, 2)}\n`, 'utf8');
if (globals && typeof globals === 'object') {
await writeFile(GLOBALS_FILE, `${JSON.stringify(globals, null, 2)}\n`, 'utf8');
}
return { file: path.relative(process.cwd(), file) };
} catch (error) {
console.error(`Failed to write ${file}:`, error);
return { error: 'Could not save the page. Run the editor on a writable filesystem.' };
}
}