From 1d43b4e6d7df7b832c4d2214ba0b99973ff09cd0 Mon Sep 17 00:00:00 2001 From: Jay V Date: Fri, 7 Nov 2025 18:35:08 -0500 Subject: [PATCH] ignore: docs: add automated sitemap generation for main app and docs routes --- packages/console/app/package.json | 2 +- .../console/app/script/generate-sitemap.ts | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100755 packages/console/app/script/generate-sitemap.ts diff --git a/packages/console/app/package.json b/packages/console/app/package.json index 5e37e214..3074cfc1 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -5,7 +5,7 @@ "typecheck": "tsgo --noEmit", "dev": "vinxi dev --host 0.0.0.0", "dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev", - "build": "vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json", + "build": "./script/generate-sitemap.ts && vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json", "start": "vinxi start", "version": "1.0.44" }, diff --git a/packages/console/app/script/generate-sitemap.ts b/packages/console/app/script/generate-sitemap.ts new file mode 100755 index 00000000..2b003ae2 --- /dev/null +++ b/packages/console/app/script/generate-sitemap.ts @@ -0,0 +1,101 @@ +#!/usr/bin/env bun +import { readdir } from "fs/promises" +import { join } from "path" +import { config } from "../src/config.ts" + +const BASE_URL = config.baseUrl +const PUBLIC_DIR = join(import.meta.dir, "../public") +const ROUTES_DIR = join(import.meta.dir, "../src/routes") +const DOCS_DIR = join(import.meta.dir, "../../../web/src/content/docs") + +interface SitemapEntry { + url: string + priority: number + changefreq: string +} + +async function getMainRoutes(): Promise { + const routes: SitemapEntry[] = [] + + // Add main static routes + const staticRoutes = [ + { path: "/", priority: 1.0, changefreq: "daily" }, + { path: "/enterprise", priority: 0.8, changefreq: "weekly" }, + { path: "/brand", priority: 0.6, changefreq: "monthly" }, + { path: "/zen", priority: 0.8, changefreq: "weekly" }, + ] + + for (const route of staticRoutes) { + routes.push({ + url: `${BASE_URL}${route.path}`, + priority: route.priority, + changefreq: route.changefreq, + }) + } + + return routes +} + +async function getDocsRoutes(): Promise { + const routes: SitemapEntry[] = [] + + try { + const files = await readdir(DOCS_DIR) + + for (const file of files) { + if (!file.endsWith(".mdx")) continue + + const slug = file.replace(".mdx", "") + const path = slug === "index" ? "/docs/" : `/docs/${slug}` + + routes.push({ + url: `${BASE_URL}${path}`, + priority: slug === "index" ? 0.9 : 0.7, + changefreq: "weekly", + }) + } + } catch (error) { + console.error("Error reading docs directory:", error) + } + + return routes +} + +function generateSitemapXML(entries: SitemapEntry[]): string { + const urls = entries + .map( + (entry) => ` + ${entry.url} + ${entry.changefreq} + ${entry.priority} + ` + ) + .join("\n") + + return ` + +${urls} +` +} + +async function main() { + console.log("Generating sitemap...") + + const mainRoutes = await getMainRoutes() + const docsRoutes = await getDocsRoutes() + + const allRoutes = [...mainRoutes, ...docsRoutes] + + console.log(`Found ${mainRoutes.length} main routes`) + console.log(`Found ${docsRoutes.length} docs routes`) + console.log(`Total: ${allRoutes.length} routes`) + + const xml = generateSitemapXML(allRoutes) + + const outputPath = join(PUBLIC_DIR, "sitemap.xml") + await Bun.write(outputPath, xml) + + console.log(`✓ Sitemap generated at ${outputPath}`) +} + +main()