Files
indiekit-blog/theme/_data/cvPageConfig.js
2026-03-08 06:49:12 +01:00

81 lines
2.1 KiB
JavaScript

/**
* CV Page Configuration Data
*
* API-first for split backend/frontend deployments:
* - Try Indiekit public API (`/cvapi/page.json`, fallback `/cv/page.json`)
* - Fallback to local plugin file (`content/.indiekit/cv-page.json`)
*
* Falls back to null so cv.njk can use the hardcoded default layout.
*/
import EleventyFetch from "@11ty/eleventy-fetch";
import { readFileSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import cvPageConfigStatic from "./cvPageConfigStatic.js";
const __dirname = dirname(fileURLToPath(import.meta.url));
const INDIEKIT_URL =
process.env.INDIEKIT_URL || process.env.SITE_URL || "https://example.com";
async function fetchFromIndiekit(path) {
const urls = [
`${INDIEKIT_URL}/cvapi/${path}`,
`${INDIEKIT_URL}/cv/${path}`,
];
for (const url of urls) {
try {
console.log(`[cvPageConfig] Fetching from Indiekit: ${url}`);
const data = await EleventyFetch(url, {
duration: "15m",
type: "json",
});
console.log(`[cvPageConfig] Indiekit ${path} success via ${url}`);
return data;
} catch (error) {
console.log(
`[cvPageConfig] Indiekit API unavailable at ${url}: ${error.message}`
);
}
}
return null;
}
function readLocalConfigFile() {
try {
const configPath = resolve(
__dirname,
"..",
"content",
".indiekit",
"cv-page.json"
);
const raw = readFileSync(configPath, "utf8");
const config = JSON.parse(raw);
console.log("[cvPageConfig] Loaded local CV page builder config");
return config;
} catch {
return null;
}
}
export default async function () {
const apiConfig = await fetchFromIndiekit("page.json");
if (apiConfig && typeof apiConfig === "object") {
return apiConfig;
}
const localConfig = readLocalConfigFile();
if (localConfig && typeof localConfig === "object") {
return localConfig;
}
if (cvPageConfigStatic && typeof cvPageConfigStatic === "object") {
return cvPageConfigStatic;
}
return null;
}