alinea
Version:
Headless git-based CMS
67 lines (65 loc) • 2.32 kB
JavaScript
import {
PLazy
} from "../../chunks/chunk-IKINPSS5.js";
import "../../chunks/chunk-NZLE2WMY.js";
// src/adapter/next/handler.ts
import {
createBackend
} from "alinea/backend/api/CreateBackend";
import {
createHandler as createCoreHandler
} from "alinea/backend/Handler";
import { generatedSource } from "alinea/backend/store/GeneratedSource";
import { JWTPreviews } from "alinea/backend/util/JWTPreviews";
import { CloudRemote } from "alinea/cloud/CloudRemote";
import { LocalDB } from "alinea/core/db/LocalDB";
import { NextCMS } from "./cms.js";
import { requestContext } from "./context.js";
var handlers = /* @__PURE__ */ new WeakMap();
function createHandler(input) {
const options = input instanceof NextCMS ? { cms: input } : input;
const remote = options.remote ?? (options.backend ? createBackend(options.cms.config, options.backend) : (context) => new CloudRemote(context, options.cms));
if (handlers.has(options.cms)) return handlers.get(options.cms);
const config = options.cms.config;
const db = PLazy.from(async () => {
const source = await generatedSource;
const db2 = new LocalDB(config, source);
await db2.sync();
return db2;
});
const handleBackend = createCoreHandler({
...options,
remote,
db
});
const handle = async (request) => {
try {
const context = await requestContext(config);
const previews = new JWTPreviews(context.apiKey);
const { searchParams } = new URL(request.url);
const previewToken = searchParams.get("preview");
if (previewToken) {
const { draftMode } = await import("next/headers");
const { url } = await previews.verify(previewToken);
const source = new URL(request.url);
if (source.hostname === "0.0.0.0") source.hostname = "localhost";
const location = new URL(url, source.origin);
const dm = await draftMode();
dm.enable();
return new Response("Redirecting...", {
status: 302,
headers: { location: String(location) }
});
}
return await handleBackend(request, context);
} catch (error) {
console.error(error);
return new Response("Internal server error", { status: 500 });
}
};
handlers.set(options.cms, handle);
return handle;
}
export {
createHandler
};