feat: add CI, Docker, auth, typed API client, shiki code blocks, e2e tests
CI / lint + typecheck + test + build (push) Canceled after 0s
CI / lint + typecheck + test + build (push) Canceled after 0s
- CI: GitHub Actions (bun 1.3.14, lint/typecheck/test/build/format gates) - Docker: multi-stage standalone build + .dockerignore (next.config output=standalone) - Auth: better-auth server (memory adapter, drizzle-swap-ready) + react client + /api/auth/[...all] route handler - API: /api/health + /api/openapi routes, openapi-typescript codegen to types/api.ts, typed openapi-fetch client (lib/api, lib/http) - Shiki: server-side CodeBlock component (escaped HTML) - E2E: playwright home + health specs on dedicated :3100 (chromium 1243 installed from GCS after CDN timeout) - Dev: allow 127.0.0.1/localhost dev origins (HMR for local tooling)
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
import { codeToHtml } from "shiki";
|
||||
|
||||
const DEFAULT_THEME = "github-dark";
|
||||
|
||||
export async function CodeBlock({
|
||||
code,
|
||||
lang = "text",
|
||||
theme = DEFAULT_THEME,
|
||||
className,
|
||||
}: {
|
||||
code: string;
|
||||
lang?: string;
|
||||
theme?: string;
|
||||
className?: string;
|
||||
}) {
|
||||
const html = await codeToHtml(code, {
|
||||
lang,
|
||||
theme,
|
||||
});
|
||||
|
||||
// Safe: shiki escapes all input before emitting HTML (no raw user content
|
||||
// reaches innerHTML), so no sanitizer is required here.
|
||||
return <div className={className} dangerouslySetInnerHTML={{ __html: html }} />;
|
||||
}
|
||||
Reference in New Issue
Block a user