فهرست منبع

ignore: docs: add automated sitemap generation for main app and docs routes

Jay V 3 ماه پیش
والد
کامیت
1d43b4e6d7
2فایلهای تغییر یافته به همراه102 افزوده شده و 1 حذف شده
  1. 1 1
      packages/console/app/package.json
  2. 101 0
      packages/console/app/script/generate-sitemap.ts

+ 1 - 1
packages/console/app/package.json

@@ -5,7 +5,7 @@
     "typecheck": "tsgo --noEmit",
     "typecheck": "tsgo --noEmit",
     "dev": "vinxi dev --host 0.0.0.0",
     "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",
     "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",
     "start": "vinxi start",
     "version": "1.0.44"
     "version": "1.0.44"
   },
   },

+ 101 - 0
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<SitemapEntry[]> {
+  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<SitemapEntry[]> {
+  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) => `  <url>
+    <loc>${entry.url}</loc>
+    <changefreq>${entry.changefreq}</changefreq>
+    <priority>${entry.priority}</priority>
+  </url>`
+    )
+    .join("\n")
+
+  return `<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+${urls}
+</urlset>`
+}
+
+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()