@marktiderman/genesis-sites 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/migrate.ts","../src/core/theme.ts","../src/core/a11y.ts","../src/core/store.ts"],"names":["p"],"mappings":"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","file":"chunk-IXMY4B56.js","sourcesContent":["/**\n * Props migrations. A section node records the props version it was written\n * at (`v`); its definition declares the current `version` and a pure\n * function per step. `migrateNode` runs `migrations[v + 1 .. version]` and\n * checks the result against the section's schema. The editor and the\n * renderer both read through it, and a publish writes the migrated props\n * into the release, so old drafts keep working after a section changes.\n */\nimport type { PageDoc, SectionNode, SiteDoc } from \"./schemas\";\nimport { getSection, type AnySectionDefinition } from \"./registry\";\n\nexport interface MigrationIssue {\n severity: \"error\" | \"warning\";\n code: \"unknown-section\" | \"newer-version\" | \"migration-failed\" | \"invalid-props\" | \"unknown-variant\";\n sectionId: string;\n type: string;\n message: string;\n}\n\nexport interface MigratedNode {\n /** The node at the current version with parsed props, or null when it can't be rendered. */\n node: (SectionNode & { variant: string }) | null;\n /** Whether anything changed (the version, the props or the variant). */\n changed: boolean;\n issues: MigrationIssue[];\n}\n\n/** Bring one node up to its section's current version and check its props. */\nexport function migrateNode(node: SectionNode, lookup: (type: string) => AnySectionDefinition | undefined = getSection): MigratedNode {\n const def = lookup(node.type);\n const where = { sectionId: node.id, type: node.type };\n if (!def) {\n return {\n node: null,\n changed: false,\n issues: [{ ...where, severity: \"error\", code: \"unknown-section\", message: `No section \"${node.type}\" is registered; section ${node.id} can't be shown.` }],\n };\n }\n if (node.v > def.version) {\n return {\n node: null,\n changed: false,\n issues: [\n {\n ...where,\n severity: \"error\",\n code: \"newer-version\",\n message: `Section ${node.id} was saved by a newer \"${node.type}\" (v${node.v}) than this code knows (v${def.version}).`,\n },\n ],\n };\n }\n let props: Record<string, unknown> = node.props;\n for (let n = node.v + 1; n <= def.version; n++) {\n const step = def.migrations?.[n];\n try {\n props = step ? step(structuredClone(props)) : props;\n } catch (err) {\n return {\n node: null,\n changed: false,\n issues: [{ ...where, severity: \"error\", code: \"migration-failed\", message: `Migrating section ${node.id} to v${n} failed: ${(err as Error).message}` }],\n };\n }\n }\n const parsed = def.schema.safeParse(props);\n if (!parsed.success) {\n return {\n node: null,\n changed: false,\n issues: [\n {\n ...where,\n severity: \"error\",\n code: \"invalid-props\",\n message: `Section ${node.id} (${def.label}): ${parsed.error.issues.map((i) => `${i.path.join(\".\") || \"props\"}: ${i.message}`).join(\"; \")}`,\n },\n ],\n };\n }\n const issues: MigrationIssue[] = [];\n let variant = node.variant ?? def.defaultVariant;\n if (!def.variants.some((v) => v.id === variant)) {\n issues.push({ ...where, severity: \"warning\", code: \"unknown-variant\", message: `Section ${node.id} asks for variant \"${variant}\", which \"${node.type}\" doesn't have; showing \"${def.defaultVariant}\".` });\n variant = def.defaultVariant;\n }\n const next = { ...node, v: def.version, variant, props: parsed.data as Record<string, unknown> };\n const changed = node.v !== def.version || variant !== node.variant || JSON.stringify(parsed.data) !== JSON.stringify(node.props);\n return { node: next, changed, issues };\n}\n\nexport interface MigratedPage {\n doc: PageDoc;\n changed: boolean;\n issues: MigrationIssue[];\n}\n\n/**\n * Migrate every node of a page. Nodes that can't be shown stay in the\n * document unchanged (an editor must not lose them) and are reported.\n */\nexport function migratePage(doc: PageDoc, lookup?: (type: string) => AnySectionDefinition | undefined): MigratedPage {\n const issues: MigrationIssue[] = [];\n let changed = false;\n const content = doc.content.map((node) => {\n const m = migrateNode(node, lookup);\n issues.push(...m.issues);\n if (m.node && m.changed) changed = true;\n return m.node ?? node;\n });\n return { doc: changed ? { ...doc, content } : doc, changed, issues };\n}\n\nexport function migrateSite(site: SiteDoc, lookup?: (type: string) => AnySectionDefinition | undefined): { site: SiteDoc; changed: boolean; issues: MigrationIssue[] } {\n const issues: MigrationIssue[] = [];\n let changed = false;\n const run = (nodes: SectionNode[]) =>\n nodes.map((node) => {\n const m = migrateNode(node, lookup);\n issues.push(...m.issues);\n if (m.node && m.changed) changed = true;\n return m.node ?? node;\n });\n const header = run(site.header);\n const footer = run(site.footer);\n return { site: changed ? { ...site, header, footer } : site, changed, issues };\n}\n","/**\n * A site's theme, from its brand: one `<style>` of CSS variables per site.\n *\n * The brand comes from the host (`BrandSource`) at render time, never copied\n * into the site. A publish checks the brand's colours and records its hash;\n * a page rendered with a different brand (edited since) is served with a\n * short cache and a warning until the site is published again, which checks\n * the new colours and purges the old pages. It\n * may be a full `CanonicalBrand` or the minimal shape a brand screen collects\n * (`SiteBrand`: a name, a primary colour for light and dark, a heading and a\n * body font from a fixed list, a logo).\n *\n * The variables are design-system `themeFromBrand(brand).variables` (the\n * brand's scales, `--color-*`) plus the genesis-ui roles the sections are\n * styled with (`--primary`, `--background`, `--font-display`, ...), so the\n * one shared stylesheet serves every brand. Foregrounds are picked for\n * contrast: the text on a primary button is whichever of the brand's light\n * or dark text reads better, and the focus ring falls back to the text\n * colour when the primary is too faint on the page.\n */\nimport { genesisBrand, themeFromBrand, type CanonicalBrand } from \"@marktiderman/genesis-design-system\";\nimport type { FontChoice, SiteDoc, TokenOverrides } from \"./schemas\";\n\n/** The minimal brand: what a brand screen collects. */\nexport interface SiteBrand {\n name: string;\n colors: {\n /** The primary colour in light mode, as #rrggbb. */\n primary: string;\n /** The primary in dark mode. Default: the light primary, lightened. */\n primaryDark?: string;\n };\n fonts?: { heading?: FontChoice; body?: FontChoice };\n /** The logo, shown in the header and footer and named in JSON-LD. */\n logo?: { src: string; alt?: string };\n}\n\n/** What a `BrandSource` may return: the minimal brand, or a full design-system brand (with an optional logo). */\nexport type BrandInput = SiteBrand | (CanonicalBrand & { logo?: { src: string; alt?: string }; displayName?: string });\n\n/** The host's brand, read at render time. */\nexport interface BrandSource {\n getBrand(siteId: string): Promise<BrandInput | null> | BrandInput | null;\n}\n\nexport interface FontInfo {\n label: string;\n /** The CSS font stack. */\n stack: string;\n /** The Google Fonts `family=` value, when it isn't a system font. */\n google?: string;\n}\n\n/** The fonts a brand or site may choose. */\nexport const FONT_CHOICES: Readonly<Record<FontChoice, FontInfo>> = Object.freeze({\n system: { label: \"System\", stack: 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif' },\n inter: { label: \"Inter\", stack: \"Inter, ui-sans-serif, system-ui, sans-serif\", google: \"Inter:wght@400;500;600;700\" },\n \"dm-sans\": { label: \"DM Sans\", stack: '\"DM Sans\", ui-sans-serif, system-ui, sans-serif', google: \"DM+Sans:wght@400;500;700\" },\n \"work-sans\": { label: \"Work Sans\", stack: '\"Work Sans\", ui-sans-serif, system-ui, sans-serif', google: \"Work+Sans:wght@400;500;700\" },\n montserrat: { label: \"Montserrat\", stack: \"Montserrat, ui-sans-serif, system-ui, sans-serif\", google: \"Montserrat:wght@400;600;700\" },\n poppins: { label: \"Poppins\", stack: \"Poppins, ui-sans-serif, system-ui, sans-serif\", google: \"Poppins:wght@400;600;700\" },\n \"space-grotesk\": { label: \"Space Grotesk\", stack: '\"Space Grotesk\", ui-sans-serif, system-ui, sans-serif', google: \"Space+Grotesk:wght@400;500;700\" },\n \"source-serif\": { label: \"Source Serif\", stack: '\"Source Serif 4\", Georgia, serif', google: \"Source+Serif+4:wght@400;600;700\" },\n merriweather: { label: \"Merriweather\", stack: \"Merriweather, Georgia, serif\", google: \"Merriweather:wght@400;700\" },\n \"playfair-display\": { label: \"Playfair Display\", stack: '\"Playfair Display\", Georgia, serif', google: \"Playfair+Display:wght@400;600;700\" },\n lora: { label: \"Lora\", stack: \"Lora, Georgia, serif\", google: \"Lora:wght@400;600;700\" },\n});\n\nconst RADIUS: Record<NonNullable<TokenOverrides[\"radius\"]>, string> = { none: \"0rem\", sm: \"0.25rem\", md: \"0.5rem\", lg: \"0.75rem\", full: \"1.25rem\" };\n\n// ── Colour maths ────────────────────────────────────────────────────────────\n\nconst HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n/** `#abc` / `#aabbcc` → [r, g, b] (0–255). Throws on anything else. */\nexport function parseHex(hex: string): [number, number, number] {\n if (!HEX.test(hex)) throw new Error(`\"${hex}\" is not a #rgb or #rrggbb colour.`);\n const h = hex.length === 4 ? [...hex.slice(1)].map((c) => c + c).join(\"\") : hex.slice(1);\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\nconst toHex = (rgb: [number, number, number]) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, \"0\")).join(\"\")}`;\n\n/** WCAG relative luminance. */\nexport function luminance(hex: string): number {\n const [r, g, b] = parseHex(hex).map((c) => {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n }) as [number, number, number];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** WCAG contrast ratio (1–21) of two colours. */\nexport function contrastRatio(a: string, b: string): number {\n const la = luminance(a);\n const lb = luminance(b);\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n/** Mix a colour toward white (`amount` > 0) or black (< 0), 0–1. */\nexport function mix(hex: string, amount: number): string {\n const target = amount >= 0 ? 255 : 0;\n const t = Math.abs(amount);\n return toHex(parseHex(hex).map((c) => c + (target - c) * t) as [number, number, number]);\n}\n\n/** `#4f46e5` → `243 75% 59%`: the HSL triplet genesis-ui's variables hold. */\nexport function hexToHslTriplet(hex: string): string {\n const [r, g, b] = parseHex(hex).map((c) => c / 255) as [number, number, number];\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0);\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n }\n const round = (n: number) => Math.round(n * 10) / 10;\n return `${round(h)} ${round(s * 100)}% ${round(l * 100)}%`;\n}\n\n/** Whichever of `a` and `b` reads better on `background`. */\nfunction readableOn(background: string, a: string, b: string): string {\n return contrastRatio(background, a) >= contrastRatio(background, b) ? a : b;\n}\n\n// ── Brand → canonical brand ─────────────────────────────────────────────────\n\nexport function isSiteBrand(brand: BrandInput): brand is SiteBrand {\n return typeof (brand as SiteBrand).colors === \"object\" && !(\"neutral\" in brand);\n}\n\n/** The minimal brand as a design-system brand (Genesis's neutrals and status colours, the brand's primary and fonts). */\nexport function toCanonicalBrand(brand: BrandInput): CanonicalBrand {\n if (!isSiteBrand(brand)) {\n const { logo: _logo, displayName: _displayName, ...canonical } = brand as CanonicalBrand & { logo?: unknown; displayName?: unknown };\n return canonical;\n }\n const primary = brand.colors.primary.toLowerCase();\n parseHex(primary);\n const primaryDark = (brand.colors.primaryDark ?? mix(primary, 0.35)).toLowerCase();\n parseHex(primaryDark);\n const heading = FONT_CHOICES[brand.fonts?.heading ?? \"inter\"] ?? FONT_CHOICES.inter;\n const body = FONT_CHOICES[brand.fonts?.body ?? \"inter\"] ?? FONT_CHOICES.inter;\n return {\n ...genesisBrand,\n name: brand.name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"site\",\n accent: { DEFAULT: primary, light: primary, dark: primaryDark },\n typography: {\n fontFamily: { body: body.stack.split(/,\\s*/), display: heading.stack.split(/,\\s*/) },\n },\n };\n}\n\n/** The brand's display name: the minimal brand's `name`, a canonical brand's `displayName` or `name`. */\nexport function brandDisplayName(brand: BrandInput): string {\n return isSiteBrand(brand) ? brand.name : ((brand as { displayName?: string }).displayName ?? brand.name);\n}\n\n// ── The theme ───────────────────────────────────────────────────────────────\n\nexport interface ThemePair {\n /** What the pair is, for an accessibility issue: \"body text on the page\". */\n name: string;\n mode: \"light\" | \"dark\";\n foreground: string;\n background: string;\n /** The ratio it must reach: 4.5 for text, 3 for the focus ring and other non-text marks. */\n minimum: number;\n /**\n * `error` (default) blocks the publish; `warning` is shown but doesn't. A\n * mark that never carries meaning alone (each one also has text or a shape)\n * warns, so a light brand colour can still publish.\n */\n severity?: \"error\" | \"warning\";\n}\n\nexport interface SiteTheme {\n light: Record<string, string>;\n dark: Record<string, string>;\n colorScheme: \"light\" | \"dark\" | \"auto\";\n /** The fonts the site uses, to load. */\n fonts: FontInfo[];\n /** The colour pairs the sections draw, for the contrast check. */\n pairs: ThemePair[];\n /** Hash of the brand and overrides it was made from (recorded on a release). */\n brandHash: string;\n}\n\ninterface ModeColours {\n background: string;\n foreground: string;\n muted: string;\n mutedForeground: string;\n primary: string;\n primaryForeground: string;\n ring: string;\n border: string;\n}\n\nfunction modeColours(brand: CanonicalBrand, mode: \"light\" | \"dark\"): ModeColours {\n const n = brand.neutral;\n const light = mode === \"light\";\n const background = (light ? brand.surface.light : brand.surface.dark) ?? brand.surface.DEFAULT;\n const foreground = (light ? brand.text.light : brand.text.dark) ?? brand.text.DEFAULT;\n const primary = (light ? brand.accent.light : brand.accent.dark) ?? brand.accent.DEFAULT;\n const muted = light ? (n[\"100\"] ?? mix(background, -0.04)) : (n[\"800\"] ?? mix(background, 0.08));\n // One step darker (lighter in dark mode) than shadcn's default, so quiet copy reaches 4.5:1 on a muted band too.\n const mutedForeground = light ? (n[\"600\"] ?? mix(foreground, 0.3)) : (n[\"400\"] ?? mix(foreground, -0.3));\n const border = light ? (n[\"200\"] ?? mix(background, -0.1)) : (n[\"700\"] ?? mix(background, 0.15));\n // White or the darkest neutral, whichever reads better; black when neither\n // reaches 4.5:1 (white or black always does, at worst about 4.58:1).\n let primaryForeground = readableOn(primary, \"#ffffff\", n[\"900\"] ?? \"#09090b\");\n if (contrastRatio(primary, primaryForeground) < 4.5) primaryForeground = readableOn(primary, \"#ffffff\", \"#000000\");\n const ring = contrastRatio(primary, background) >= 3 ? primary : foreground;\n return { background, foreground, muted, mutedForeground, primary, primaryForeground, ring, border };\n}\n\nfunction roleVars(c: ModeColours): Record<string, string> {\n const hsl = hexToHslTriplet;\n return {\n \"--background\": hsl(c.background),\n \"--foreground\": hsl(c.foreground),\n \"--card\": hsl(c.background),\n \"--card-foreground\": hsl(c.foreground),\n \"--popover\": hsl(c.background),\n \"--popover-foreground\": hsl(c.foreground),\n \"--primary\": hsl(c.primary),\n \"--primary-foreground\": hsl(c.primaryForeground),\n \"--secondary\": hsl(c.muted),\n \"--secondary-foreground\": hsl(c.foreground),\n \"--muted\": hsl(c.muted),\n \"--muted-foreground\": hsl(c.mutedForeground),\n \"--accent\": hsl(c.muted),\n \"--accent-foreground\": hsl(c.foreground),\n \"--border\": hsl(c.border),\n \"--input\": hsl(c.border),\n \"--ring\": hsl(c.ring),\n };\n}\n\nfunction pairsFor(c: ModeColours, mode: \"light\" | \"dark\"): ThemePair[] {\n return [\n { name: \"body text on the page\", mode, foreground: c.foreground, background: c.background, minimum: 4.5 },\n { name: \"quiet text on the page\", mode, foreground: c.mutedForeground, background: c.background, minimum: 4.5 },\n { name: \"quiet text on a muted band\", mode, foreground: c.mutedForeground, background: c.muted, minimum: 4.5 },\n { name: \"body text on a muted band\", mode, foreground: c.foreground, background: c.muted, minimum: 4.5 },\n { name: \"button and accent-band text on the primary colour\", mode, foreground: c.primaryForeground, background: c.primary, minimum: 4.5 },\n { name: \"text on an inverse band\", mode, foreground: c.background, background: c.foreground, minimum: 4.5 },\n { name: \"the focus ring on the page\", mode, foreground: c.ring, background: c.background, minimum: 3 },\n // Non-text (1.4.11): the primary colour as a border or marker (a timetable chip, the picked day, a timeline's step).\n // Every such mark also has text or a shape (a chip names its type, a marker shows a dot), so it warns.\n { name: \"the primary colour as a border or marker on the page\", mode, foreground: c.primary, background: c.background, minimum: 3, severity: \"warning\" },\n ];\n}\n\n/** FNV-1a, 32 bits twice: a short, stable hash for cache keys and release records (not for security). */\nexport function stableHash(value: unknown): string {\n const text = JSON.stringify(value, (_k, v) => (v && typeof v === \"object\" && !Array.isArray(v) ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : 1))) : v));\n let h1 = 0x811c9dc5;\n let h2 = 0x01000193 ^ text.length;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n h1 = Math.imul(h1 ^ c, 0x01000193) >>> 0;\n h2 = Math.imul(h2 ^ c, 0x5bd1e995) >>> 0;\n }\n return h1.toString(16).padStart(8, \"0\") + h2.toString(16).padStart(8, \"0\");\n}\n\n/**\n * The site's theme: variables for light and dark, the fonts to load, the\n * pairs the contrast check reads, and a hash of what it was made from.\n *\n * @stability Beta\n */\nexport function siteTheme(brand: BrandInput, theme: Partial<SiteDoc[\"theme\"]> = {}): SiteTheme {\n const canonical = toCanonicalBrand(brand);\n const overrides = theme.overrides ?? {};\n const base = themeFromBrand(canonical).variables;\n const fontStack = (family: \"body\" | \"display\") => canonical.typography?.fontFamily?.[family]?.join(\", \");\n const headingFont = overrides.headingFont ? FONT_CHOICES[overrides.headingFont] : undefined;\n const bodyFont = overrides.bodyFont ? FONT_CHOICES[overrides.bodyFont] : undefined;\n const fontVars: Record<string, string> = {};\n const sans = bodyFont?.stack ?? fontStack(\"body\");\n const display = headingFont?.stack ?? fontStack(\"display\") ?? sans;\n if (sans) fontVars[\"--font-sans\"] = sans;\n if (display) fontVars[\"--font-display\"] = display;\n if (overrides.radius) fontVars[\"--radius\"] = RADIUS[overrides.radius];\n\n const light = modeColours(canonical, \"light\");\n const dark = modeColours(canonical, \"dark\");\n const usedFonts = new Map<string, FontInfo>();\n for (const stack of [sans, display]) {\n const info = Object.values(FONT_CHOICES).find((f) => f.stack === stack);\n if (info) usedFonts.set(info.label, info);\n }\n const colorScheme = theme.colorScheme ?? \"light\";\n const pairs = colorScheme === \"light\" ? pairsFor(light, \"light\") : colorScheme === \"dark\" ? pairsFor(dark, \"dark\") : [...pairsFor(light, \"light\"), ...pairsFor(dark, \"dark\")];\n return {\n light: { ...base.light, ...roleVars(light), ...fontVars },\n dark: { ...base.dark, ...roleVars(dark), ...fontVars },\n colorScheme,\n fonts: [...usedFonts.values()],\n pairs,\n brandHash: stableHash({ brand: canonical, overrides, colorScheme }),\n };\n}\n\n/** A CSS value from the theme, made safe to print inside a `<style>`: no `<`, braces or semicolons. */\nfunction cssValue(value: string): string {\n return value.replace(/[<>{};\\\\]/g, \"\");\n}\n\nfunction block(selector: string, vars: Record<string, string>): string {\n const lines = Object.entries(vars)\n .filter(([name]) => /^--[a-z0-9-]+$/i.test(name))\n .map(([name, value]) => `${name}:${cssValue(value)}`);\n return `${selector}{${lines.join(\";\")}}`;\n}\n\n/** The site's `<style>` body: the light variables on `:root`, the dark ones by scheme. */\nexport function themeCss(theme: SiteTheme): string {\n if (theme.colorScheme === \"dark\") return block(\":root\", theme.dark) + \":root{color-scheme:dark}\";\n if (theme.colorScheme === \"auto\") {\n return `${block(\":root\", theme.light)}:root{color-scheme:light dark}@media (prefers-color-scheme: dark){${block(\":root\", theme.dark)}}`;\n }\n return block(\":root\", theme.light) + \":root{color-scheme:light}\";\n}\n","/**\n * Publish checks: what must be true before a release goes live. Each check\n * returns issues; any `error` blocks the publish (`isPublishable`), and\n * `warning`s are shown but don't.\n *\n * Accessibility (WCAG 2.2 AA) that a document can prove:\n * - one `h1` per page: the renderer gives it to the first section that\n * `providesH1` (the hero), or prints the page title as a visually hidden\n * `h1`; a second hero is over its limit;\n * - heading order inside rich text (no skipped levels);\n * - every image has alt text or is marked decorative (1.1.1);\n * - every colour pair the sections draw reaches 4.5:1 for text and 3:1 for\n * the focus ring and the primary colour as a border or marker (1.4.3,\n * 1.4.11).\n *\n * The rest is the renderer's job and is pinned by its tests: visible focus,\n * 24px targets (2.5.8), landmarks, a skip link, link text.\n *\n * And content rules: unknown or invalid sections, sections over their\n * limit or on the wrong kind of page, template placeholders still showing,\n * duplicate or reserved paths, a site with no home page.\n */\nimport { migrateNode } from \"./migrate\";\nimport { getSection, type AnySectionDefinition } from \"./registry\";\nimport { PostDoc, PostSlug } from \"./posts\";\nimport type { PageKind, ReleasePage, ReleaseSnapshot, SectionNode, SiteDoc } from \"./schemas\";\nimport { contrastRatio, type SiteTheme } from \"./theme\";\nimport { isReservedPath, pagePathProblems, type ReservedPaths } from \"./urls\";\n\nexport interface SiteIssue {\n severity: \"error\" | \"warning\";\n code: string;\n message: string;\n pageId?: string;\n path?: string;\n sectionId?: string;\n}\n\nexport const isPublishable = (issues: readonly SiteIssue[]) => !issues.some((i) => i.severity === \"error\");\n\ntype Lookup = (type: string) => AnySectionDefinition | undefined;\n\n/** Every object in a props tree that looks like an image (`{ src, alt?, decorative? }`), with its path. */\nfunction images(value: unknown, path: string[] = []): { path: string; image: { src: unknown; alt?: unknown; decorative?: unknown } }[] {\n if (!value || typeof value !== \"object\") return [];\n if (Array.isArray(value)) return value.flatMap((v, i) => images(v, [...path, String(i)]));\n const record = value as Record<string, unknown>;\n // A file to download (`FileRef`, which carries its `mime`) is a link, not an image on the page.\n const found = typeof record.src === \"string\" && !(\"mime\" in record) && (\"alt\" in record || \"decorative\" in record || /\\.(png|jpe?g|webp|avif|gif|svg)(\\?|$)/i.test(record.src))\n ? [{ path: path.join(\".\"), image: record as { src: unknown; alt?: unknown; decorative?: unknown } }]\n : [];\n return [...found, ...Object.entries(record).flatMap(([k, v]) => (k === \"src\" ? [] : images(v, [...path, k])))];\n}\n\n/** Heading levels in a rich text document, in order. */\nfunction richTextHeadings(value: unknown): number[] {\n if (!value || typeof value !== \"object\") return [];\n if (Array.isArray(value)) return value.flatMap(richTextHeadings);\n const node = value as { type?: unknown; attrs?: { level?: unknown }; content?: unknown };\n if (node.type === \"heading\") return typeof node.attrs?.level === \"number\" ? [node.attrs.level] : [];\n // A rich text node's children are in `content`; any other object is props: look in every value.\n if (node.type === \"doc\" || typeof node.type === \"string\") return richTextHeadings(node.content);\n return Object.values(value).flatMap(richTextHeadings);\n}\n\ninterface NodeContext {\n where: \"header\" | \"body\" | \"footer\";\n kind?: PageKind;\n page?: ReleasePage;\n}\n\nfunction nodeIssues(node: SectionNode, ctx: NodeContext, lookup: Lookup): SiteIssue[] {\n const base = { ...(ctx.page ? { pageId: ctx.page.id, path: ctx.page.path } : {}), sectionId: node.id };\n const at = ctx.page ? `${ctx.page.path}` : `the site ${ctx.where}`;\n const migrated = migrateNode(node, lookup);\n const issues: SiteIssue[] = migrated.issues.map((i) => ({ ...base, severity: i.severity, code: i.code, message: `${at}: ${i.message}` }));\n const def = lookup(node.type);\n if (!def || !migrated.node) return issues;\n if (node.placeholder) {\n issues.push({ ...base, severity: \"error\", code: \"placeholder\", message: `${at}: the ${def.label} section still has the template's sample content. Replace it, or hide the section.` });\n }\n const placement = def.placement ?? \"body\";\n if (placement !== ctx.where) {\n issues.push({ ...base, severity: \"error\", code: \"placement\", message: `${at}: a ${def.label} section belongs in the ${placement === \"body\" ? \"page\" : `site ${placement}`}, not the ${ctx.where === \"body\" ? \"page\" : `site ${ctx.where}`}.` });\n }\n if (ctx.kind && def.enabledOn && !def.enabledOn.includes(ctx.kind)) {\n issues.push({ ...base, severity: \"error\", code: \"enabled-on\", message: `${at}: a ${def.label} section can't go on a ${ctx.kind} page.` });\n }\n for (const { path, image } of images(migrated.node.props)) {\n const alt = typeof image.alt === \"string\" ? image.alt.trim() : \"\";\n if (!alt && image.decorative !== true) {\n issues.push({ ...base, severity: \"error\", code: \"image-alt\", message: `${at}: an image in the ${def.label} section (${path || \"image\"}) needs alt text, or to be marked decorative.` });\n }\n }\n const levels = richTextHeadings(migrated.node.props);\n for (let i = 0; i < levels.length; i++) {\n const level = levels[i]!;\n const previous = i === 0 ? 2 : levels[i - 1]!;\n if (level === 1) issues.push({ ...base, severity: \"error\", code: \"heading-h1\", message: `${at}: rich text can't hold a level 1 heading; the page has one already.` });\n else if (level > previous + 1) {\n issues.push({ ...base, severity: \"error\", code: \"heading-order\", message: `${at}: a level ${level} heading follows a level ${previous} in the ${def.label} section; don't skip a level.` });\n }\n }\n return issues;\n}\n\n/** Issues on one page: its sections, limits and the h1. */\nexport function checkPage(page: ReleasePage, lookup: Lookup = getSection, reserved?: ReservedPaths): SiteIssue[] {\n const issues: SiteIssue[] = [];\n const base = { pageId: page.id, path: page.path };\n for (const problem of pagePathProblems(page.path, reserved)) issues.push({ ...base, severity: \"error\", code: \"path\", message: `${page.path}: ${problem}` });\n const visible = page.doc.content.filter((n) => !n.hidden);\n const counts = new Map<string, number>();\n let h1 = 0;\n for (const node of visible) {\n issues.push(...nodeIssues(node, { where: \"body\", kind: page.kind, page }, lookup));\n counts.set(node.type, (counts.get(node.type) ?? 0) + 1);\n if (lookup(node.type)?.providesH1) h1++;\n }\n for (const [type, count] of counts) {\n const def = lookup(type);\n if (def?.limit && count > def.limit) {\n issues.push({ ...base, severity: \"error\", code: \"limit\", message: `${page.path}: ${count} ${def.label} sections; a page has at most ${def.limit}.` });\n }\n }\n if (h1 === 0) {\n issues.push({ ...base, severity: \"warning\", code: \"no-h1\", message: `${page.path}: no hero, so the page title \"${page.doc.root.props.title}\" becomes its hidden main heading.` });\n }\n if (!page.doc.seo?.description) {\n issues.push({ ...base, severity: \"warning\", code: \"seo-description\", message: `${page.path}: no description for search results and link previews.` });\n }\n return issues;\n}\n\n/** Issues with the site's own parts: header, footer, redirects. */\nexport function checkSiteDoc(site: SiteDoc, lookup: Lookup = getSection): SiteIssue[] {\n const issues: SiteIssue[] = [];\n for (const node of site.header.filter((n) => !n.hidden)) issues.push(...nodeIssues(node, { where: \"header\" }, lookup));\n for (const node of site.footer.filter((n) => !n.hidden)) issues.push(...nodeIssues(node, { where: \"footer\" }, lookup));\n const froms = new Set<string>();\n for (const r of site.redirects) {\n if (froms.has(r.from)) issues.push({ severity: \"error\", code: \"redirect-duplicate\", path: r.from, message: `Two redirects from ${r.from}.` });\n froms.add(r.from);\n if (r.to === r.from) issues.push({ severity: \"error\", code: \"redirect-loop\", path: r.from, message: `The redirect from ${r.from} points at itself.` });\n }\n return issues;\n}\n\n/** Colour pairs below their minimum (1.4.3 text, 1.4.11 focus ring and primary borders and markers). */\nexport function checkContrast(theme: SiteTheme): SiteIssue[] {\n return theme.pairs\n .map((pair) => ({ pair, ratio: contrastRatio(pair.foreground, pair.background) }))\n .filter(({ pair, ratio }) => ratio < pair.minimum)\n .map(({ pair, ratio }) => ({\n severity: pair.severity ?? \"error\",\n code: \"contrast\",\n message: `In ${pair.mode} mode, ${pair.name} is ${ratio.toFixed(2)}:1 (${pair.foreground} on ${pair.background}); it needs ${pair.minimum}:1. Adjust the brand colours.`,\n }));\n}\n\nexport interface CheckReleaseOptions {\n /** The brand's theme: adds the contrast check. */\n theme?: SiteTheme;\n lookup?: Lookup;\n reserved?: ReservedPaths;\n}\n\n/**\n * Everything a publish checks, for a whole release.\n *\n * @stability Beta\n */\nexport function checkRelease(snapshot: ReleaseSnapshot, options: CheckReleaseOptions = {}): SiteIssue[] {\n const lookup = options.lookup ?? getSection;\n const issues: SiteIssue[] = [...checkSiteDoc(snapshot.site, lookup)];\n const paths = new Map<string, string>();\n for (const page of snapshot.pages) {\n const other = paths.get(page.path);\n if (other) issues.push({ severity: \"error\", code: \"path-duplicate\", pageId: page.id, path: page.path, message: `Two pages at ${page.path}.` });\n paths.set(page.path, page.id);\n issues.push(...checkPage(page, lookup, options.reserved));\n }\n if (!paths.has(\"/\")) issues.push({ severity: \"error\", code: \"no-home\", message: \"The site has no home page (a page at /).\" });\n issues.push(...checkBlog(snapshot, lookup));\n for (const r of snapshot.site.redirects) {\n // Redirects answer before pages, so the page there could never be reached.\n if (paths.has(r.from)) issues.push({ severity: \"error\", code: \"redirect-shadows-page\", path: r.from, message: `The redirect from ${r.from} hides the page there; remove the redirect.` });\n const target = r.to.split(/[?#]/)[0]!;\n if (r.to.startsWith(\"/\") && !paths.has(target)) {\n issues.push({ severity: \"warning\", code: \"redirect-to-missing-page\", path: r.from, message: `The redirect from ${r.from} goes to ${target}, where there's no page (was it deleted?).` });\n }\n if (options.reserved !== undefined ? isReservedPath(r.from, options.reserved) : isReservedPath(r.from)) {\n issues.push({ severity: \"error\", code: \"redirect-reserved\", path: r.from, message: `${r.from} is reserved for the app; a site can't redirect it.` });\n }\n }\n if (options.theme) issues.push(...checkContrast(options.theme));\n return issues;\n}\n\n/** The blog's rules: one post page, not the home page, with a post-body section; a post list needs a post page. */\nexport function checkBlog(snapshot: ReleaseSnapshot, lookup: Lookup = getSection): SiteIssue[] {\n const issues: SiteIssue[] = [];\n const postPages = snapshot.pages.filter((p) => p.kind === \"post\");\n if (postPages.length > 1) {\n issues.push({ severity: \"error\", code: \"post-page-count\", message: `The site has ${postPages.length} post pages (${postPages.map((p) => p.path).join(\", \")}); posts render in one.` });\n }\n for (const page of postPages) {\n const base = { pageId: page.id, path: page.path };\n if (page.path === \"/\") issues.push({ ...base, severity: \"error\", code: \"post-page-home\", message: \"The home page can't be the post page: posts would take over the site's paths. Put it at /blog.\" });\n if (page.path.split(\"/\").filter(Boolean).length >= 8) issues.push({ ...base, severity: \"error\", code: \"post-page-depth\", message: `${page.path}: the post page is too deep for posts to go below it.` });\n if (!page.doc.content.some((n) => !n.hidden && n.type === \"post-body\")) {\n issues.push({ ...base, severity: \"error\", code: \"post-page-body\", message: `${page.path}: the post page needs a Post section, where each post's title and text go.` });\n }\n }\n if (!postPages.length) {\n for (const page of snapshot.pages) {\n for (const node of page.doc.content) {\n if (!node.hidden && node.type === \"blog-list\" && lookup(node.type)) {\n issues.push({ pageId: page.id, path: page.path, sectionId: node.id, severity: \"error\", code: \"blog-list-no-post-page\", message: `${page.path}: a post list needs the site's post page (a page of kind \"post\", such as /blog) for its links to open.` });\n }\n }\n }\n }\n return issues;\n}\n\n/**\n * The checks a post passes before it is published: a slug, a title, alt\n * text on its images, and a heading outline under the post's own title\n * (the page's h1): no level 1 heading, none skipped, starting at 2.\n *\n * @stability Beta\n */\nexport function checkPost(slug: string, doc: unknown): SiteIssue[] {\n const issues: SiteIssue[] = [];\n const at = `The post ${JSON.stringify(slug)}`;\n if (!PostSlug.safeParse(slug).success) issues.push({ severity: \"error\", code: \"post-slug\", message: `${at}: a slug is lowercase letters, digits and single hyphens.` });\n const parsed = PostDoc.safeParse(doc);\n if (!parsed.success) {\n issues.push({ severity: \"error\", code: \"post-invalid\", message: `${at}: ${parsed.error.issues.map((i) => `${i.path.join(\".\") || \"post\"} ${i.message}`).join(\"; \")}` });\n return issues;\n }\n for (const { path, image } of images(parsed.data)) {\n if (path.startsWith(\"seo\")) continue;\n const alt = typeof image.alt === \"string\" ? image.alt.trim() : \"\";\n if (!alt && image.decorative !== true) issues.push({ severity: \"error\", code: \"image-alt\", message: `${at}: an image (${path || \"image\"}) needs alt text, or to be marked decorative.` });\n }\n const levels = richTextHeadings(parsed.data.body);\n for (let i = 0; i < levels.length; i++) {\n const level = levels[i]!;\n const previous = i === 0 ? 1 : levels[i - 1]!;\n if (level === 1) issues.push({ severity: \"error\", code: \"heading-h1\", message: `${at}: the text can't hold a level 1 heading; the post's title is the page's.` });\n else if (level > previous + 1) issues.push({ severity: \"error\", code: \"heading-order\", message: `${at}: a level ${level} heading follows a level ${previous}; don't skip a level.` });\n }\n if (!parsed.data.excerpt && !parsed.data.seo?.description) issues.push({ severity: \"warning\", code: \"seo-description\", message: `${at}: no excerpt for the list, search results and the feed.` });\n return issues;\n}\n\n/**\n * A rendered page's outline, from its HTML: one `h1`, no skipped heading\n * level, every `<img>` with an `alt` attribute. For tests and for hosts that\n * want to audit what was actually served.\n */\nexport function checkHtmlOutline(html: string): SiteIssue[] {\n const issues: SiteIssue[] = [];\n const body = html.replace(/<script\\b[\\s\\S]*?<\\/script>/gi, \"\").replace(/<style\\b[\\s\\S]*?<\\/style>/gi, \"\");\n const levels = [...body.matchAll(/<h([1-6])\\b/gi)].map((m) => Number(m[1]));\n const h1 = levels.filter((l) => l === 1).length;\n if (h1 !== 1) issues.push({ severity: \"error\", code: \"h1-count\", message: `The page has ${h1} h1 elements; it needs exactly one.` });\n if (levels[0] !== undefined && levels[0] !== 1) issues.push({ severity: \"error\", code: \"heading-order\", message: `The first heading is an h${levels[0]}, not the h1.` });\n for (let i = 1; i < levels.length; i++) {\n if (levels[i]! > levels[i - 1]! + 1) issues.push({ severity: \"error\", code: \"heading-order\", message: `An h${levels[i]} follows an h${levels[i - 1]}.` });\n }\n for (const m of body.matchAll(/<img\\b[^>]*>/gi)) {\n if (!/\\salt=/.test(m[0])) issues.push({ severity: \"error\", code: \"image-alt\", message: `An image has no alt attribute: ${m[0].slice(0, 120)}` });\n }\n return issues;\n}\n","/**\n * Where sites live: the `SiteStore` contract, the publish pipeline every\n * store shares, cache invalidation, and an in-memory store for tests, demos\n * and previews. `@marktiderman/genesis-sites/supabase` has the Postgres one.\n */\nimport { checkPost, checkRelease, isPublishable, type SiteIssue } from \"./a11y\";\nimport {\n MAX_IMPORT_POSTS,\n MAX_LIVE_POSTS,\n PostDoc,\n postSummary,\n validatePostSlug,\n type ImportPost,\n type ImportPostsResult,\n type LivePost,\n type PostDraft,\n type PostMeta,\n type PostStatus,\n type PostSummary,\n type SavePostInput,\n type SavePostResult,\n} from \"./posts\";\nimport { migratePage, migrateSite } from \"./migrate\";\nimport {\n PageDoc,\n ReleaseSnapshot,\n SiteDoc,\n type PageKind,\n type PageMeta,\n type Release,\n type ReleaseMeta,\n type ReleasePage,\n type SiteDocInput,\n} from \"./schemas\";\nimport { redirectsAfterMove } from \"./seo\";\nimport { siteTheme, type BrandInput } from \"./theme\";\nimport { DEFAULT_RESERVED_PATHS, validatePagePath, type ReservedPaths } from \"./urls\";\n\nexport type SaveResult<T> = { rev: number } | { conflict: T; rev: number };\n\nexport const isConflict = <T>(result: SaveResult<T>): result is { conflict: T; rev: number } => \"conflict\" in result;\n\n/**\n * The file types a site asset may be, as the database checks them: images\n * and PDF. Never SVG or HTML, which a browser runs as a page.\n */\nexport const ASSET_TYPES: readonly string[] = Object.freeze([\"image/png\", \"image/jpeg\", \"image/webp\", \"image/avif\", \"image/gif\", \"application/pdf\"]);\n\n/**\n * The storage key for an upload: `sites/<siteId>/<id>-<name>` for an image,\n * `sites/<siteId>/files/<id>-<name>` for a file to download (a PDF), so\n * storage policies scope by site with `can_edit`.\n */\nexport function assetPath(siteId: string, id: string, name: string | undefined, mime: string): string {\n const clean = (name ?? \"file\").toLowerCase().replace(/[^a-z0-9.]+/g, \"-\").replace(/\\.{2,}/g, \".\").replace(/^[.-]+/, \"\").slice(0, 80) || \"file\";\n return `sites/${siteId}/${mime === \"application/pdf\" ? \"files/\" : \"\"}${id}-${clean}`;\n}\n\nexport interface AssetMeta {\n alt?: string;\n width?: number;\n height?: number;\n /** The file's name, for the storage key. */\n name?: string;\n}\n\nexport interface Asset {\n id: string;\n siteId: string;\n /** The storage key: always `sites/<siteId>/...`, so storage policies can scope by site. */\n path: string;\n /** Where the browser loads it. */\n url: string;\n mime: string;\n alt: string | null;\n width: number | null;\n height: number | null;\n}\n\nexport interface PublishOptions {\n note?: string;\n /** The brand to check contrast against (and record the hash of). Required: a publish without it is blocked. */\n brand?: BrandInput | null;\n reserved?: ReservedPaths;\n}\n\nexport interface NewPage {\n path: string;\n kind?: PageKind;\n doc: PageDoc;\n}\n\nexport interface SiteDraft {\n site: SiteDoc;\n rev: number;\n}\n\nexport interface PageDraft {\n doc: PageDoc;\n rev: number;\n siteId: string;\n path: string;\n kind: PageKind;\n}\n\n/**\n * A site's storage.\n *\n * Drafts change by compare-and-swap on a revision: a save names the revision\n * it started from and gets the new one, or the current document when someone\n * saved first. A publish checks the drafts (`checkRelease`) and freezes them\n * into an immutable release that the live site points at; a rollback moves\n * the pointer back. `getLive` is the public read and needs no session.\n *\n * @stability Beta\n */\nexport interface SiteStore {\n /** The release the live site serves, or null (not published, archived, or unknown). */\n getLive(siteId: string): Promise<Release | null>;\n getDraft(siteId: string): Promise<SiteDraft | null>;\n saveSiteDraft(siteId: string, rev: number, site: SiteDoc): Promise<SaveResult<SiteDoc>>;\n listPages(siteId: string): Promise<PageMeta[]>;\n getPageDraft(pageId: string): Promise<PageDraft | null>;\n savePageDraft(pageId: string, rev: number, doc: PageDoc): Promise<SaveResult<PageDoc>>;\n createPage(siteId: string, page: NewPage): Promise<PageMeta>;\n /** Move a page to a new path; the old path redirects to it (301). */\n movePage(pageId: string, path: string): Promise<PageMeta>;\n deletePage(pageId: string): Promise<void>;\n publish(siteId: string, options?: PublishOptions): Promise<Release>;\n rollback(siteId: string, releaseId: string): Promise<Release>;\n listReleases(siteId: string): Promise<ReleaseMeta[]>;\n /** Store an upload under `sites/<siteId>/...` (a PDF under `files/`) and record it. Images and PDF only. */\n putAsset?(siteId: string, file: Blob, meta?: AssetMeta): Promise<Asset>;\n\n // Posts. Optional: a store without them serves a site with no blog.\n\n /** The published posts, newest first, without bodies (at most `MAX_LIVE_POSTS`). Public, like `getLive`. */\n listLivePosts?(siteId: string): Promise<PostSummary[]>;\n /** One published post. Public, like `getLive`. Null for a draft, an unknown slug, or a site that isn't live. */\n getLivePost?(siteId: string, slug: string): Promise<LivePost | null>;\n /** Every post's meta for the editor (drafts too), newest first. */\n listPosts?(siteId: string): Promise<PostMeta[]>;\n getPost?(postId: string): Promise<PostDraft | null>;\n /** Create a post (no `id`) or save its draft by compare-and-swap. A post keeps its slug once published. */\n savePost?(siteId: string, input: SavePostInput): Promise<SavePostResult>;\n /** Check the draft (`checkPost`) and make it the published copy. Throws `PublishBlockedError`. */\n publishPost?(postId: string): Promise<PostMeta>;\n /** Take the post down; its draft stays. */\n unpublishPost?(postId: string): Promise<PostMeta>;\n /** Delete a post (its row stays, marked deleted). Returns its site, for the cache purge; null when there was no such post. */\n deletePost?(postId: string): Promise<{ siteId: string } | null>;\n /**\n * A one-time import from another site: each post keeps its slug and its\n * date, and is published unless asked otherwise or a check fails (then it\n * is a draft, with its issues). A slug the site already has is skipped.\n */\n importPosts?(siteId: string, posts: readonly ImportPost[]): Promise<ImportPostsResult>;\n}\n\n/** A publish the checks refused: `issues` lists why. */\nexport class PublishBlockedError extends Error {\n constructor(readonly issues: SiteIssue[]) {\n const errors = issues.filter((i) => i.severity === \"error\");\n super(`The site can't be published yet:\\n${errors.map((i) => ` - ${i.message}`).join(\"\\n\")}`);\n this.name = \"PublishBlockedError\";\n }\n}\n\n/** Someone saved first; the store's current document is in the result of the save that raised this. */\nexport class SiteConflictError extends Error {\n constructor(message = \"Someone else changed this site; reload it and try again.\") {\n super(message);\n this.name = \"SiteConflictError\";\n }\n}\n\nexport interface PreparedRelease {\n snapshot: ReleaseSnapshot;\n issues: SiteIssue[];\n /** Drafts whose props a migration changed: a store saves these before it publishes. */\n migratedPages: { id: string; doc: PageDoc }[];\n migratedSite: SiteDoc | null;\n brandHash: string | null;\n}\n\n/**\n * The publish pipeline every store shares: migrate every node, freeze the\n * drafts into a snapshot, and check it. Throws `PublishBlockedError` when a\n * check fails. Pages come in the order they are listed.\n *\n * @stability Beta\n */\nexport function prepareRelease(\n site: SiteDoc,\n pages: readonly { id: string; path: string; kind: PageKind; doc: PageDoc }[],\n options: PublishOptions = {},\n): PreparedRelease {\n const migratedSite = migrateSite(site);\n const migratedPages: { id: string; doc: PageDoc }[] = [];\n const releasePages: ReleasePage[] = pages.map((p) => {\n const m = migratePage(p.doc);\n if (m.changed) migratedPages.push({ id: p.id, doc: m.doc });\n return { id: p.id, path: p.path, kind: p.kind, doc: m.doc };\n });\n // A hidden section stays in the draft, never in the release: a release is public.\n const visible = <T extends { hidden?: boolean | undefined }>(nodes: T[]) => nodes.filter((n) => !n.hidden);\n const snapshot: ReleaseSnapshot = ReleaseSnapshot.parse({\n schemaVersion: 1,\n site: { ...migratedSite.site, header: visible(migratedSite.site.header), footer: visible(migratedSite.site.footer) },\n pages: releasePages.map((p) => ({ ...p, doc: { ...p.doc, content: visible(p.doc.content) } })),\n });\n const theme = options.brand ? siteTheme(options.brand, snapshot.site.theme) : undefined;\n const issues = checkRelease(snapshot, { ...(theme ? { theme } : {}), reserved: options.reserved ?? DEFAULT_RESERVED_PATHS });\n // The contrast check needs the brand: without it a publish can't show its colours are readable.\n if (!theme) issues.push({ severity: \"error\", code: \"brand-missing\", message: \"Publish with the site's brand (`brand`), so its colours can be checked for contrast.\" });\n if (!isPublishable(issues)) throw new PublishBlockedError(issues);\n return { snapshot, issues, migratedPages, migratedSite: migratedSite.changed ? migratedSite.site : null, brandHash: theme?.brandHash ?? null };\n}\n\n/** The cache tag every response of a site carries (`Vercel-Cache-Tag`). */\nexport function siteCacheTag(siteId: string): string {\n return `site:${siteId}`;\n}\n\n/** The cache tag of every page that embeds a form: purge it when the host changes that form. */\nexport function formCacheTag(slug: string): string {\n return `form:${slug}`;\n}\n\n/** Why a site's cache is being purged. */\nexport interface InvalidationInfo {\n siteId: string;\n /** `post`: a post was published, taken down, deleted or imported. */\n action: \"publish\" | \"rollback\" | \"post\";\n}\n\n/**\n * A store that purges the site's cached pages after every publish and\n * rollback: `invalidate` gets `[\"site:<id>\"]` and what happened.\n *\n * Mind what your CDN's purge does. On Vercel, `invalidateByTag` marks pages\n * stale, so each cached URL serves the old release once more while it\n * regenerates (no stampede); `dangerouslyDeleteByTag` drops them, so the\n * next request waits for a render. Use the delete for a rollback that takes\n * something down:\n *\n * withCacheInvalidation(store, (tags, { action }) =>\n * action === \"rollback\" ? dangerouslyDeleteByTag(tags) : invalidateByTag(tags));\n *\n * Archiving a site goes through your own server or the database (the\n * `genesis_sites` notification), so purge there too. A failed purge is\n * logged and rethrown, so the editor shows that the live site may be stale.\n *\n * @stability Beta\n */\nexport function withCacheInvalidation(store: SiteStore, invalidate: (tags: string[], info: InvalidationInfo) => Promise<void> | void): SiteStore {\n const purge = async (siteId: string, action: InvalidationInfo[\"action\"]) => {\n try {\n await invalidate([siteCacheTag(siteId)], { siteId, action });\n } catch (err) {\n console.error(`[genesis-sites] published site ${siteId}, but purging its cache failed; the old pages may be served until their cache expires.`, err);\n throw err;\n }\n };\n return {\n ...store,\n getLive: (id) => store.getLive(id),\n getDraft: (id) => store.getDraft(id),\n saveSiteDraft: (id, rev, site) => store.saveSiteDraft(id, rev, site),\n listPages: (id) => store.listPages(id),\n getPageDraft: (id) => store.getPageDraft(id),\n savePageDraft: (id, rev, doc) => store.savePageDraft(id, rev, doc),\n createPage: (id, page) => store.createPage(id, page),\n movePage: (id, path) => store.movePage(id, path),\n deletePage: (id) => store.deletePage(id),\n listReleases: (id) => store.listReleases(id),\n ...(store.putAsset ? { putAsset: store.putAsset.bind(store) } : {}),\n ...(store.listLivePosts ? { listLivePosts: store.listLivePosts.bind(store) } : {}),\n ...(store.getLivePost ? { getLivePost: store.getLivePost.bind(store) } : {}),\n ...(store.listPosts ? { listPosts: store.listPosts.bind(store) } : {}),\n ...(store.getPost ? { getPost: store.getPost.bind(store) } : {}),\n ...(store.savePost ? { savePost: store.savePost.bind(store) } : {}),\n ...(store.publishPost\n ? {\n async publishPost(postId: string) {\n const meta = await store.publishPost!(postId);\n await purge(meta.siteId, \"post\");\n return meta;\n },\n }\n : {}),\n ...(store.unpublishPost\n ? {\n async unpublishPost(postId: string) {\n const meta = await store.unpublishPost!(postId);\n await purge(meta.siteId, \"post\");\n return meta;\n },\n }\n : {}),\n ...(store.deletePost\n ? {\n async deletePost(postId: string) {\n // The site comes back from the delete itself, so a draft that no longer parses still purges.\n const deleted = await store.deletePost!(postId);\n if (deleted) await purge(deleted.siteId, \"post\");\n return deleted;\n },\n }\n : {}),\n ...(store.importPosts\n ? {\n async importPosts(siteId: string, list: readonly ImportPost[]) {\n const result = await store.importPosts!(siteId, list);\n await purge(siteId, \"post\");\n return result;\n },\n }\n : {}),\n async publish(siteId, options) {\n const release = await store.publish(siteId, options);\n await purge(siteId, \"publish\");\n return release;\n },\n async rollback(siteId, releaseId) {\n const release = await store.rollback(siteId, releaseId);\n await purge(siteId, \"rollback\");\n return release;\n },\n };\n}\n\n/**\n * One post of an import, checked: its document parsed, its status (a draft\n * when asked for, or when a check fails, with the reasons) and its date.\n * Every store's `importPosts` runs it.\n */\nexport function prepareImportPost(item: ImportPost): { doc: PostDoc; status: PostStatus; publishedAt: string; issues: string[] } | { slug: string; reason: string } {\n const slug = typeof item?.slug === \"string\" ? item.slug : String(item?.slug);\n try {\n validatePostSlug(slug);\n } catch (err) {\n return { slug, reason: (err as Error).message };\n }\n const parsed = PostDoc.safeParse(item.doc);\n if (!parsed.success) return { slug, reason: `The post doesn't parse: ${parsed.error.issues.map((i) => `${i.path.join(\".\") || \"post\"} ${i.message}`).join(\"; \")}` };\n const now = Date.now();\n const given = item.publishedAt ? new Date(item.publishedAt) : new Date(now);\n // The same rule as the database: a real date from 1970 on, and never later than now.\n if (Number.isNaN(given.getTime()) || given.getTime() < 0) return { slug, reason: `\"${item.publishedAt}\" isn't a usable publish date.` };\n const date = new Date(Math.min(given.getTime(), now));\n const errors = checkPost(slug, parsed.data).filter((i) => i.severity === \"error\").map((i) => i.message);\n const status: PostStatus = item.status === \"draft\" || errors.length ? \"draft\" : \"published\";\n return { doc: parsed.data, status, publishedAt: date.toISOString(), issues: errors };\n}\n\n// ── In memory ───────────────────────────────────────────────────────────────\n\nexport interface NewSite {\n id?: string;\n /** The site document (defaults applied). */\n site: SiteDocInput;\n pages: { id?: string; path: string; kind?: PageKind; doc: PageDoc }[];\n}\n\nexport interface MemorySiteStore extends SiteStore {\n createSite(input: NewSite): Promise<{ siteId: string; pageIds: string[] }>;\n /** Archive (or bring back) a site: an archived site serves nothing. */\n setStatus(siteId: string, status: \"draft\" | \"live\" | \"archived\"): Promise<void>;\n}\n\ninterface MemSite {\n id: string;\n site: SiteDoc;\n rev: number;\n liveReleaseId: string | null;\n status: \"draft\" | \"live\" | \"archived\";\n}\ninterface MemPost {\n id: string;\n siteId: string;\n slug: string;\n doc: PostDoc;\n rev: number;\n status: PostStatus;\n published: { doc: PostDoc; at: string } | null;\n publishedAt: string | null;\n updatedAt: string;\n deleted: boolean;\n}\ninterface MemPage {\n id: string;\n siteId: string;\n path: string;\n kind: PageKind;\n doc: PageDoc;\n rev: number;\n sort: number;\n deleted: boolean;\n}\n\nexport interface MemoryStoreOptions {\n reserved?: ReservedPaths;\n /** Who may edit (default: everyone). Mirrors the database's `can_edit` hook, for tests. */\n canEdit?: (siteId: string) => boolean;\n now?: () => Date;\n}\n\nconst clone = <T>(value: T): T => structuredClone(value);\n\n/**\n * An in-memory `SiteStore`: the same rules as the database (compare-and-swap\n * revisions, path checks, redirects on move, immutable releases), for tests,\n * demos and local previews. Documents are copied in and out, so callers\n * can't change stored state by mutating what they hold.\n *\n * @stability Beta\n */\nexport function createMemorySiteStore(options: MemoryStoreOptions = {}): MemorySiteStore {\n const reserved = options.reserved ?? DEFAULT_RESERVED_PATHS;\n const now = options.now ?? (() => new Date());\n const sites = new Map<string, MemSite>();\n const pages = new Map<string, MemPage>();\n const releases = new Map<string, Release>();\n const posts = new Map<string, MemPost>();\n let seq = 0;\n const id = (prefix: string) => `${prefix}_${(++seq).toString(36).padStart(4, \"0\")}`;\n\n const editable = (siteId: string): MemSite => {\n const s = sites.get(siteId);\n if (!s) throw new Error(`No site ${siteId}.`);\n if (options.canEdit && !options.canEdit(siteId)) throw new Error(`Not allowed to edit site ${siteId}.`);\n return s;\n };\n const livePages = (siteId: string) => [...pages.values()].filter((p) => p.siteId === siteId && !p.deleted).sort((a, b) => a.sort - b.sort || a.path.localeCompare(b.path));\n const meta = (p: MemPage): PageMeta => ({ id: p.id, siteId: p.siteId, path: p.path, kind: p.kind, title: p.doc.root.props.title, sort: p.sort, rev: p.rev });\n const releaseMeta = ({ snapshot: _s, ...m }: Release): ReleaseMeta => clone(m);\n const pathTaken = (siteId: string, path: string, except?: string) => livePages(siteId).some((p) => p.path === path && p.id !== except);\n const sitePosts = (siteId: string) => [...posts.values()].filter((p) => p.siteId === siteId && !p.deleted);\n const postMeta = (p: MemPost): PostMeta => ({ id: p.id, siteId: p.siteId, slug: p.slug, title: p.doc.title, status: p.status, rev: p.rev, publishedAt: p.publishedAt, updatedAt: p.updatedAt });\n const byNewest = (a: { publishedAt: string | null; updatedAt: string }, b: { publishedAt: string | null; updatedAt: string }) =>\n (b.publishedAt ?? b.updatedAt).localeCompare(a.publishedAt ?? a.updatedAt);\n const livePost = (p: MemPost): LivePost | null =>\n p.status === \"published\" && p.published && p.publishedAt ? { slug: p.slug, publishedAt: p.publishedAt, updatedAt: p.published.at, doc: clone(p.published.doc) } : null;\n const siteIsLive = (siteId: string) => {\n const s = sites.get(siteId);\n return Boolean(s && s.status === \"live\" && s.liveReleaseId);\n };\n const editablePost = (postId: string): MemPost => {\n const p = posts.get(postId);\n if (!p || p.deleted) throw new Error(`No post ${postId}.`);\n editable(p.siteId);\n return p;\n };\n\n const store: MemorySiteStore = {\n async createSite(input) {\n const siteId = input.id ?? id(\"site\");\n if (sites.has(siteId)) throw new Error(`Site ${siteId} exists.`);\n const site = SiteDoc.parse(input.site);\n sites.set(siteId, { id: siteId, site, rev: 1, liveReleaseId: null, status: \"draft\" });\n const pageIds: string[] = [];\n input.pages.forEach((p, i) => {\n validatePagePath(p.path, reserved);\n if (pathTaken(siteId, p.path)) throw new Error(`Two pages at ${p.path}.`);\n const pageId = p.id ?? id(\"page\");\n pages.set(pageId, { id: pageId, siteId, path: p.path, kind: p.kind ?? \"page\", doc: PageDoc.parse(clone(p.doc)), rev: 1, sort: i, deleted: false });\n pageIds.push(pageId);\n });\n return { siteId, pageIds };\n },\n async setStatus(siteId, status) {\n editable(siteId).status = status;\n },\n async getLive(siteId) {\n const s = sites.get(siteId);\n if (!s || s.status !== \"live\" || !s.liveReleaseId) return null;\n const r = releases.get(s.liveReleaseId);\n return r ? clone(r) : null;\n },\n async getDraft(siteId) {\n const s = sites.get(siteId);\n if (!s || (options.canEdit && !options.canEdit(siteId))) return null;\n return { site: clone(s.site), rev: s.rev };\n },\n async saveSiteDraft(siteId, rev, doc) {\n const s = editable(siteId);\n if (s.rev !== rev) return { conflict: clone(s.site), rev: s.rev };\n s.site = SiteDoc.parse(clone(doc));\n s.rev += 1;\n return { rev: s.rev };\n },\n async listPages(siteId) {\n if (options.canEdit && !options.canEdit(siteId)) return [];\n return livePages(siteId).map(meta);\n },\n async getPageDraft(pageId) {\n const p = pages.get(pageId);\n if (!p || p.deleted || (options.canEdit && !options.canEdit(p.siteId))) return null;\n return { doc: clone(p.doc), rev: p.rev, siteId: p.siteId, path: p.path, kind: p.kind };\n },\n async savePageDraft(pageId, rev, doc) {\n const p = pages.get(pageId);\n if (!p || p.deleted) throw new Error(`No page ${pageId}.`);\n editable(p.siteId);\n if (p.rev !== rev) return { conflict: clone(p.doc), rev: p.rev };\n p.doc = PageDoc.parse(clone(doc));\n p.rev += 1;\n return { rev: p.rev };\n },\n async createPage(siteId, page) {\n const s = editable(siteId);\n validatePagePath(page.path, reserved);\n if (pathTaken(siteId, page.path)) throw new Error(`A page is already at ${page.path}.`);\n const pageId = id(\"page\");\n const sort = Math.max(-1, ...livePages(siteId).map((p) => p.sort)) + 1;\n const p: MemPage = { id: pageId, siteId, path: page.path, kind: page.kind ?? \"page\", doc: PageDoc.parse(clone(page.doc)), rev: 1, sort, deleted: false };\n pages.set(pageId, p);\n // A page now lives at this path: a redirect away from it would hide it.\n if (s.site.redirects.some((r) => r.from === page.path)) {\n s.site = { ...s.site, redirects: s.site.redirects.filter((r) => r.from !== page.path) };\n s.rev += 1;\n }\n return meta(p);\n },\n async movePage(pageId, path) {\n const p = pages.get(pageId);\n if (!p || p.deleted) throw new Error(`No page ${pageId}.`);\n const s = editable(p.siteId);\n validatePagePath(path, reserved);\n if (p.path === \"/\") throw new Error(\"The home page stays at /.\");\n if (pathTaken(p.siteId, path, pageId)) throw new Error(`A page is already at ${path}.`);\n const from = p.path;\n p.path = path;\n p.rev += 1;\n s.site = { ...s.site, redirects: redirectsAfterMove(s.site.redirects, from, path) };\n s.rev += 1;\n return meta(p);\n },\n async deletePage(pageId) {\n const p = pages.get(pageId);\n if (!p || p.deleted) return;\n editable(p.siteId);\n if (p.path === \"/\") throw new Error(\"The home page can't be deleted; replace its content instead.\");\n p.deleted = true;\n },\n async publish(siteId, opts = {}) {\n const s = editable(siteId);\n const list = livePages(siteId);\n const prepared = prepareRelease(s.site, list, { reserved, ...opts });\n for (const { id: pid, doc } of prepared.migratedPages) {\n const p = pages.get(pid)!;\n p.doc = doc;\n p.rev += 1;\n }\n if (prepared.migratedSite) {\n s.site = prepared.migratedSite;\n s.rev += 1;\n }\n const number = Math.max(0, ...[...releases.values()].filter((r) => r.siteId === siteId).map((r) => r.number)) + 1;\n const at = now().toISOString();\n const release: Release = {\n id: id(\"rel\"),\n siteId,\n number,\n note: opts.note ?? null,\n createdAt: at,\n publishedAt: at,\n brandHash: prepared.brandHash,\n snapshot: Object.freeze(clone(prepared.snapshot)) as ReleaseSnapshot,\n };\n releases.set(release.id, release);\n s.liveReleaseId = release.id;\n s.status = \"live\";\n return clone(release);\n },\n async rollback(siteId, releaseId) {\n const s = editable(siteId);\n const r = releases.get(releaseId);\n if (!r || r.siteId !== siteId) throw new Error(`Release ${releaseId} isn't one of site ${siteId}'s.`);\n s.liveReleaseId = r.id;\n s.status = \"live\";\n return clone(r);\n },\n async listReleases(siteId) {\n if (options.canEdit && !options.canEdit(siteId)) return [];\n return [...releases.values()].filter((r) => r.siteId === siteId).sort((a, b) => b.number - a.number).map(releaseMeta);\n },\n async putAsset(siteId, file, assetMeta = {}) {\n editable(siteId);\n const mime = file.type || \"application/octet-stream\";\n if (!ASSET_TYPES.includes(mime)) throw new Error(`${mime} isn't an image (PNG, JPEG, WebP, AVIF, GIF) or a PDF.`);\n const assetId = id(\"asset\");\n const path = assetPath(siteId, assetId, assetMeta.name, mime);\n return { id: assetId, siteId, path, url: `/${path}`, mime, alt: assetMeta.alt ?? null, width: assetMeta.width ?? null, height: assetMeta.height ?? null };\n },\n async listLivePosts(siteId) {\n if (!siteIsLive(siteId)) return [];\n return sitePosts(siteId)\n .map(livePost)\n .filter((p): p is LivePost => p !== null)\n .sort(byNewest)\n .slice(0, MAX_LIVE_POSTS)\n .map(postSummary);\n },\n async getLivePost(siteId, slug) {\n if (!siteIsLive(siteId)) return null;\n const p = sitePosts(siteId).find((x) => x.slug === slug);\n return p ? livePost(p) : null;\n },\n async listPosts(siteId) {\n if (options.canEdit && !options.canEdit(siteId)) return [];\n return sitePosts(siteId).map(postMeta).sort(byNewest);\n },\n async getPost(postId) {\n const p = posts.get(postId);\n if (!p || p.deleted || (options.canEdit && !options.canEdit(p.siteId))) return null;\n return { ...postMeta(p), doc: clone(p.doc) };\n },\n async savePost(siteId, input) {\n editable(siteId);\n validatePostSlug(input.slug);\n const doc = PostDoc.parse(clone(input.doc));\n const at = now().toISOString();\n if (!input.id) {\n if (sitePosts(siteId).some((p) => p.slug === input.slug)) throw new Error(`A post is already at ${input.slug}.`);\n const postId = id(\"post\");\n posts.set(postId, { id: postId, siteId, slug: input.slug, doc, rev: 1, status: \"draft\", published: null, publishedAt: null, updatedAt: at, deleted: false });\n return { id: postId, rev: 1 };\n }\n const p = editablePost(input.id);\n if (p.siteId !== siteId) throw new Error(`Post ${input.id} isn't one of site ${siteId}'s.`);\n if (p.rev !== input.rev) return { id: p.id, conflict: clone(p.doc), rev: p.rev };\n if (input.slug !== p.slug) {\n if (p.publishedAt) throw new Error(\"A post keeps its slug once it has been published: its address is out in the world.\");\n if (sitePosts(siteId).some((x) => x.slug === input.slug && x.id !== p.id)) throw new Error(`A post is already at ${input.slug}.`);\n p.slug = input.slug;\n }\n p.doc = doc;\n p.rev += 1;\n p.updatedAt = at;\n return { id: p.id, rev: p.rev };\n },\n async publishPost(postId) {\n const p = editablePost(postId);\n // Archiving is a takedown: no post goes back up (as publish_post refuses).\n if (sites.get(p.siteId)?.status === \"archived\") throw new Error(\"An archived site can't publish posts.\");\n const issues = checkPost(p.slug, p.doc);\n if (!isPublishable(issues)) throw new PublishBlockedError(issues);\n const at = now().toISOString();\n p.published = { doc: clone(p.doc), at };\n p.status = \"published\";\n p.publishedAt ??= at;\n p.updatedAt = at;\n return postMeta(p);\n },\n async unpublishPost(postId) {\n const p = editablePost(postId);\n p.status = \"draft\";\n p.published = null;\n p.updatedAt = now().toISOString();\n return postMeta(p);\n },\n async deletePost(postId) {\n const p = posts.get(postId);\n if (!p || p.deleted) return null;\n editable(p.siteId);\n p.deleted = true;\n p.status = \"draft\";\n p.published = null;\n return { siteId: p.siteId };\n },\n async importPosts(siteId, list) {\n if (editable(siteId).status === \"archived\") throw new Error(`No site ${siteId} to import into: it is archived.`);\n if (list.length > MAX_IMPORT_POSTS) throw new Error(`Import at most ${MAX_IMPORT_POSTS} posts at a time.`);\n const result: ImportPostsResult = { imported: [], skipped: [] };\n const seen = new Set(sitePosts(siteId).map((p) => p.slug));\n for (const item of list) {\n const prepared = prepareImportPost(item);\n if (\"reason\" in prepared) {\n result.skipped.push(prepared);\n continue;\n }\n if (seen.has(item.slug)) {\n result.skipped.push({ slug: item.slug, reason: \"The site already has a post at this slug.\" });\n continue;\n }\n seen.add(item.slug);\n const postId = id(\"post\");\n const at = now().toISOString();\n const published = prepared.status === \"published\" ? { doc: clone(prepared.doc), at: prepared.publishedAt } : null;\n posts.set(postId, { id: postId, siteId, slug: item.slug, doc: prepared.doc, rev: 1, status: prepared.status, published, publishedAt: published ? prepared.publishedAt : null, updatedAt: at, deleted: false });\n result.imported.push({ slug: item.slug, id: postId, status: prepared.status, ...(prepared.issues.length ? { issues: prepared.issues } : {}) });\n }\n return result;\n },\n };\n return store;\n}\n"]}