// src/utils/docsContext.js
const path = require("path");
const fs = require("fs/promises");
const yaml = require("js-yaml");
const { qualifyNavLinks } = require("./qualifyLinks");
const { baseUrl } = require("./baseUrl");
const generateDocsMenuModel = require("./generateDocsMenuModel");
const navLinks = require(path.join(__dirname, "../../content/navLinks.json"));
const processMenuLinks = require("../utils/processMenuLinks");
const { meta } = require("../config/loader");
const getSiteTitle = (owner) => `${owner}'s Software Blog`;
const YAML_DOCS_DIR = path.join(__dirname, "../../content/docs");
/**
* Load and parse all YAML documentation files in content/docs/
* Returns an object keyed by filename (without .yaml) with YAML content
*/
async function loadAllYamlDocs() {
const entries = {};
const files = await fs.readdir(YAML_DOCS_DIR);
for (const file of files) {
if (!file.endsWith(".yaml")) continue;
const fullPath = path.join(YAML_DOCS_DIR, file);
const content = await fs.readFile(fullPath, "utf8");
const parsed = yaml.load(content);
const key = path.basename(file, ".yaml");
entries[key] = parsed;
}
return entries;
}
/**
* Base context generator
*/
module.exports = async function getDocsContext(
isAuthenticated,
overrides = {},
) {
const filteredNavLinks = processMenuLinks(navLinks, isAuthenticated);
const qualifiedNavLinks = qualifyNavLinks(filteredNavLinks);
const siteOwner = meta.site_owner;
const allYamlDocs = await loadAllYamlDocs();
const currentPath = overrides.docPath || null;
const currentModule = overrides.docModule || null;
const docsMenu = generateDocsMenuModel(
allYamlDocs,
currentPath,
currentModule,
);
const context = {
title: getSiteTitle(siteOwner),
siteOwner,
originCountry: meta.country,
navLinks: qualifiedNavLinks,
baseUrl,
paths: docsMenu,
isAuthenticated,
showFooter: true,
showSidebar: true,
...overrides,
};
return context;
};