Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/openstatusHQ/openstatus. ๐ซ Status page with uptime monitoring & API monitoring as code ๐ซ openstatus.dev
bun drizzle-orm monitoring monitoring-as-code nextjs observability on-call open-source shadcn-ui status-page statuspage synthetic-monitoring tinybird turso uptime uptime-checker uptime-monitor
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257import path from "node:path";
import { getDocs } from "../docs";import { type MDXData, getMDXDataFromDir, getMDXDataFromFile } from "./read";
export * from "./schema";export type { MDXData } from "./read";
/** Same rule for the sitemap, llms.txt and search: a noindex page is not advertised anywhere. */export function isIndexable(page: MDXData) { return page.slug !== "not-found" && !page.metadata.seo?.noindex;}
export function getBlogPosts(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "blog"), "/blog", );}
export function getChangelogPosts(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "changelog"), "/changelog", );}
export function getProductPages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "product"), "", );}
export function getGuides(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "guides"), "/guides", );}
export function getUseCasePages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "use-case"), "/use-case", );}
export function getUnrelatedPages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "unrelated"), "", );}
export function getUnrelatedPage(slug: string): MDXData { return getMDXDataFromFile( path.join( process.cwd(), "src", "content", "pages", "unrelated", `${slug}.mdx`, ), "", );}
export function getMainPages(): MDXData[] { return [...getUnrelatedPages(), ...getProductPages()];}
export function getComparePages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "compare"), "/compare", );}
export function getHomePage(): MDXData { return getMDXDataFromFile( path.join(process.cwd(), "src", "content", "pages", "home.mdx"), "", );}
// `*-slug.mdx` files back dynamic routes (e.g. /play/checker/[slug],// /play/mcp-health/[id]) and aren't standalone pages โ exclude them from// listings, sitemaps, and search. Use `getToolsPage("foo-slug")` to fetch one.export function getToolsPages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "tools"), "/play", ).filter((page) => !page.slug.endsWith("-slug"));}
export function getToolsPage(slug: string): MDXData { return getMDXDataFromFile( path.join(process.cwd(), "src", "content", "pages", "tools", `${slug}.mdx`), "/play", );}
export function getToolingPages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "product", "tooling"), "/tooling", );}
export function getToolingPage(slug: string): MDXData { return getMDXDataFromFile( path.join( process.cwd(), "src", "content", "pages", "product", "tooling", `${slug}.mdx`, ), "/tooling", );}
export function getCustomerPages(): MDXData[] { return getMDXDataFromDir( path.join(process.cwd(), "src", "content", "pages", "customers"), "/customers", );}
export function getCustomerPage(slug: string): MDXData { return getMDXDataFromFile( path.join( process.cwd(), "src", "content", "pages", "customers", `${slug}.mdx`, ), "/customers", );}
export function getDocPages(): MDXData[] { return getDocs();}
export const PAGE_TYPES = [ "blog", "changelog", "product", "unrelated", "compare", "tools", "tooling", "customers", "guides", "use-case", "docs", "all",] as const;
export type PageType = (typeof PAGE_TYPES)[number];
export function getPages(type: PageType) { switch (type) { case "blog": return getBlogPosts(); case "changelog": return getChangelogPosts(); case "product": return getProductPages(); case "unrelated": return getUnrelatedPages(); case "compare": return getComparePages(); case "tools": return getToolsPages(); case "tooling": return getToolingPages(); case "customers": return getCustomerPages(); case "guides": return getGuides(); case "use-case": return getUseCasePages(); case "docs": return getDocPages(); case "all": return [ ...getBlogPosts(), ...getChangelogPosts(), ...getProductPages(), ...getUnrelatedPages(), ...getComparePages(), ...getToolsPages(), ...getToolingPages(), ...getCustomerPages(), ...getGuides(), ...getUseCasePages(), ]; default: throw new Error(`Unknown page type: ${type}`); }}
export function getCategories() { return [ ...new Set([ ...getBlogPosts().map((post) => post.metadata.category), ...getChangelogPosts().map((post) => post.metadata.category), ...getProductPages().map((post) => post.metadata.category), ...getUnrelatedPages().map((post) => post.metadata.category), ...getComparePages().map((post) => post.metadata.category), ...getToolsPages().map((post) => post.metadata.category), ...getToolingPages().map((post) => post.metadata.category), ...getCustomerPages().map((post) => post.metadata.category), ]), ] as const;}
export function formatDate(targetDate: Date, includeRelative = false) { const currentDate = new Date();
const yearsAgo = currentDate.getFullYear() - targetDate.getFullYear(); const monthsAgo = currentDate.getMonth() - targetDate.getMonth(); const daysAgo = currentDate.getDate() - targetDate.getDate();
let formattedDate = "";
if (yearsAgo > 0) { formattedDate = `${yearsAgo}y ago`; } else if (monthsAgo > 0) { formattedDate = `${monthsAgo}mo ago`; } else if (daysAgo > 0) { formattedDate = `${daysAgo}d ago`; } else { formattedDate = "Today"; }
const fullDate = targetDate.toLocaleString("en-us", { month: "short", day: "2-digit", year: "numeric", });
if (!includeRelative) { return fullDate; }
return `${fullDate} (${formattedDate})`;}