@marktiderman/genesis-sites 0.1.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.
- package/README.md +241 -13
- package/dist/assets/islands.77d11f5697.js +1 -0
- package/dist/assets/sites-forms.732cc7e0c1.css +10 -0
- package/dist/assets/sites-forms.css +1 -1
- package/dist/assets/sites.716b4ac1a5.css +2 -0
- package/dist/assets/sites.css +1 -1
- package/dist/assets.generated-QSB7EJWX.js +3 -0
- package/dist/assets.generated-QSB7EJWX.js.map +1 -0
- package/dist/blocks.d.ts +1 -1
- package/dist/blocks.js +5 -1
- package/dist/blocks.js.map +1 -1
- package/dist/chunk-3VKTBE7S.js +69 -0
- package/dist/chunk-3VKTBE7S.js.map +1 -0
- package/dist/chunk-5IXDFFEG.js +465 -0
- package/dist/chunk-5IXDFFEG.js.map +1 -0
- package/dist/chunk-C375ZPU2.js +2241 -0
- package/dist/chunk-C375ZPU2.js.map +1 -0
- package/dist/{chunk-GA7U3CIN.js → chunk-FBQF2L7O.js} +317 -97
- package/dist/chunk-FBQF2L7O.js.map +1 -0
- package/dist/chunk-H6ED3K4R.js +18 -0
- package/dist/chunk-H6ED3K4R.js.map +1 -0
- package/dist/chunk-KPOX7D4S.js +250 -0
- package/dist/chunk-KPOX7D4S.js.map +1 -0
- package/dist/chunk-VZUDRPFG.js +13 -0
- package/dist/chunk-VZUDRPFG.js.map +1 -0
- package/dist/{chunk-KEF3V5ZN.js → chunk-ZGWGQGT2.js} +169 -73
- package/dist/chunk-ZGWGQGT2.js.map +1 -0
- package/dist/editor.d.ts +526 -0
- package/dist/editor.js +2480 -0
- package/dist/editor.js.map +1 -0
- package/dist/handler-QHH453YG.js +9 -0
- package/dist/handler-QHH453YG.js.map +1 -0
- package/dist/import.d.ts +130 -0
- package/dist/import.js +330 -0
- package/dist/import.js.map +1 -0
- package/dist/index.d.ts +47 -8
- package/dist/index.js +5 -250
- package/dist/index.js.map +1 -1
- package/dist/{registry-CdgVymsu.d.ts → registry-HBn1X60x.d.ts} +274 -8
- package/dist/sections.d.ts +422 -6
- package/dist/sections.js +4 -2
- package/dist/{store-BzGw2i5J.d.ts → store-BXiZeZzH.d.ts} +119 -53
- package/dist/supabase.d.ts +5 -5
- package/dist/supabase.js +115 -6
- package/dist/supabase.js.map +1 -1
- package/dist/web.d.ts +26 -8
- package/dist/web.js +7 -353
- package/dist/web.js.map +1 -1
- package/migrations/0001_genesis_sites.sql +64 -6
- package/migrations/0002_genesis_sites_posts.sql +404 -0
- package/migrations/tests/0001_genesis_sites.test.sql +30 -1
- package/migrations/tests/0002_genesis_sites_posts.test.sql +242 -0
- package/package.json +28 -10
- package/dist/assets/islands.230b20b9c4.js +0 -1
- package/dist/assets/sites-forms.5e6ebf31c3.css +0 -10
- package/dist/assets/sites.b28b796c6f.css +0 -2
- package/dist/chunk-43XUAO63.js +0 -1255
- package/dist/chunk-43XUAO63.js.map +0 -1
- package/dist/chunk-GA7U3CIN.js.map +0 -1
- package/dist/chunk-KEF3V5ZN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/schemas.ts","../src/core/registry.ts","../src/core/posts.ts","../src/core/seo.ts"],"names":["z"],"mappings":"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","file":"chunk-ZGWGQGT2.js","sourcesContent":["/**\n * The documents a site is made of, as zod 4 schemas: a `SiteDoc` (theme,\n * header, navigation, footer, SEO defaults, redirects), one `PageDoc` per\n * page (its sections and SEO), and the `ReleaseSnapshot` a publish freezes.\n *\n * A page's `content` is an array of `{ id, type, v, variant, props }`\n * section nodes, which is the shape Puck's `content` uses, so the editor\n * reads and writes these documents unchanged. A section's `props` are\n * checked by that section's own schema (see `defineSection`), not here.\n */\nimport { z } from \"zod\";\nimport { MAX_URL_LENGTH, PAGE_PATH, isSafeHref, isSafeImageSrc } from \"./urls\";\n\n/** zod 4 is required: `z.toJSONSchema` (editor fields, AI output) exists only there. */\nif (typeof (z as { toJSONSchema?: unknown }).toJSONSchema !== \"function\") {\n throw new Error(\"@marktiderman/genesis-sites needs zod 4 (zod@^4.0.0): z.toJSONSchema is missing.\");\n}\n\n// ── Building blocks for section schemas ─────────────────────────────────────\n\n/** A link target: a site path, a fragment, or an http(s), mailto or tel URL. */\nexport const Href = z\n .string()\n .max(MAX_URL_LENGTH)\n .refine(isSafeHref, { message: \"Use a site path (/about), a #section, or an https, mailto or tel link.\" })\n .meta({ title: \"Link\", format: \"uri-reference\" });\n\n/** An analytics event name for a link: `data-gs-event` on the page (default `cta` on buttons). */\nexport const LinkEvent = z\n .string()\n .regex(/^[a-z0-9][a-z0-9_.:-]{0,47}$/, \"An event name is lowercase letters, digits and _ . : -\")\n .meta({ title: \"Analytics event\" });\n\n/**\n * A labelled link: a button, a menu entry, a footer link, an outbound\n * booking link.\n *\n * - `external: true` marks a link that leaves the site (a booking or\n * membership system): it must be an `http(s)` URL, and it renders with\n * `rel=\"noopener noreferrer\"` and `data-gs-outbound` for analytics.\n * - `target` (`_blank` for a new tab) applies to http(s) links only;\n * `newTab: true` is the older spelling of `target: \"_blank\"`.\n * - `event` names the click for the host's analytics (`data-gs-event`).\n */\nexport const Link = z\n .object({\n label: z.string().trim().min(1).max(80),\n href: Href,\n /** Opens in a new tab (http(s) links only). The same as `target: \"_blank\"`. */\n newTab: z.boolean().optional(),\n /** Where an http(s) link opens: this tab (`_self`, the default) or a new one (`_blank`). */\n target: z.enum([\"_self\", \"_blank\"]).optional().meta({ title: \"Opens in\" }),\n /** A link that leaves the site (a booking system): http(s) only, `rel=\"noopener noreferrer\"`. */\n external: z.boolean().optional().meta({ title: \"Outbound link\" }),\n event: LinkEvent.optional(),\n })\n .refine((link) => !link.external || /^https?:\\/\\//i.test(link.href), { message: \"An outbound link is an http(s) URL.\", path: [\"href\"] })\n .meta({ title: \"Link\" });\nexport type Link = z.infer<typeof Link>;\n\n/** Does this link open in a new tab? Only an http(s) link can. */\nexport const opensInNewTab = (link: Pick<Link, \"href\" | \"newTab\" | \"target\">): boolean =>\n /^https?:\\/\\//i.test(link.href) && (link.target === \"_blank\" || (link.target === undefined && link.newTab === true));\n\n/**\n * A downloadable file (a PDF timetable, a waiver): a site path (an upload\n * under `sites/<site_id>/files/`) or an https URL. `bytes` and `mime` say\n * what the visitor is about to download.\n */\nexport const FileRef = z\n .object({\n src: z\n .string()\n .max(MAX_URL_LENGTH)\n .refine(isSafeImageSrc, { message: \"A file loads from a site path or an https URL.\" }),\n /** The file's type; PDF unless it is an image. */\n mime: z.enum([\"application/pdf\", \"image/png\", \"image/jpeg\", \"image/webp\", \"image/avif\", \"image/gif\"]).default(\"application/pdf\"),\n /** Its size, shown beside the link (\"PDF, 1.2 MB\"). */\n bytes: z.number().int().positive().max(100 * 1024 * 1024).optional(),\n })\n .meta({ title: \"File\", \"x-genesis-kind\": \"file\" });\nexport type FileRef = z.infer<typeof FileRef>;\n\n/**\n * An image. `alt` describes it for someone who can't see it; an image that\n * adds nothing (a texture) is `decorative: true` and gets an empty alt. The\n * accessibility check refuses to publish an image with neither.\n */\nexport const Image = z\n .object({\n src: z\n .string()\n .max(MAX_URL_LENGTH)\n .refine(isSafeImageSrc, { message: \"An image loads from a site path or an https URL.\" }),\n alt: z.string().max(300).default(\"\"),\n decorative: z.boolean().optional(),\n width: z.number().int().positive().max(10000).optional(),\n height: z.number().int().positive().max(10000).optional(),\n /** Where the subject is, for cropping: 0–100 from the left and top. */\n focal: z.object({ x: z.number().min(0).max(100), y: z.number().min(0).max(100) }).optional(),\n })\n .meta({ title: \"Image\", \"x-genesis-kind\": \"image\" });\nexport type Image = z.infer<typeof Image>;\n\n/**\n * Rich text: the JSON genesis-ui's `RichTextEditor` (TipTap) produces. Only\n * its outline is checked here; genesis-ui's `RichText` sanitizes it again\n * when it renders, so a stored document can never carry raw HTML.\n */\nexport const RichText = z\n .object({\n type: z.literal(\"doc\"),\n content: z.array(z.record(z.string(), z.unknown())).max(2000).optional(),\n })\n .meta({ title: \"Rich text\", \"x-genesis-kind\": \"rich-text\" });\nexport type RichText = z.infer<typeof RichText>;\n\n/** The band a section sits on. */\nexport const Surface = z.enum([\"base\", \"muted\", \"accent\", \"inverse\"]).meta({ title: \"Background\" });\nexport type Surface = z.infer<typeof Surface>;\n\n/** A short line of copy (a heading, a label). */\nexport const Line = (max = 120) => z.string().trim().min(1).max(max);\n/** A paragraph of plain copy. */\nexport const Copy = (max = 600) => z.string().trim().max(max);\n\n// ── Section nodes and pages ─────────────────────────────────────────────────\n\n/** A section's id: stable, letters, digits, `-` and `_` (Shopify's rule). */\nexport const SectionId = z.string().regex(/^[A-Za-z0-9_-]{1,64}$/, \"A section id is 1–64 letters, digits, - or _.\");\n\nexport const SectionNode = z.object({\n id: SectionId,\n /** The section's registry key, such as `hero`. */\n type: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),\n /** The props version the props were written at; `migrateNode` brings them up to date. */\n v: z.number().int().min(1),\n variant: z.string().max(64).optional(),\n /** Kept in the page, not rendered (Shopify's `disabled`). */\n hidden: z.boolean().optional(),\n /** Hidden on phones or on wider screens. */\n hideOn: z.array(z.enum([\"mobile\", \"desktop\"])).max(2).optional(),\n /**\n * Set by a template on content someone must replace (a sample quote). The\n * publish check refuses a visible section that still has it; the editor\n * clears it once the section is edited.\n */\n placeholder: z.boolean().optional(),\n props: z.record(z.string(), z.unknown()),\n});\nexport type SectionNode = z.infer<typeof SectionNode>;\n\nexport const Seo = z.object({\n title: z.string().trim().max(70).optional(),\n description: z.string().trim().max(200).optional(),\n ogImage: Image.optional(),\n /** An absolute canonical URL, when this page's content lives elsewhere. */\n canonical: z.url({ protocol: /^https?$/ }).max(MAX_URL_LENGTH).optional(),\n noindex: z.boolean().optional(),\n});\nexport type Seo = z.infer<typeof Seo>;\n\nexport const PageDoc = z.object({\n schemaVersion: z.literal(1),\n root: z.object({\n props: z.looseObject({\n title: z.string().trim().min(1).max(120),\n /** Leave out the site's header and footer (a focused landing page). */\n hideSiteChrome: z.boolean().optional(),\n }),\n }),\n content: z.array(SectionNode).max(60),\n seo: Seo.optional(),\n});\nexport type PageDoc = z.infer<typeof PageDoc>;\n\n/**\n * What a page is: an ordinary `page`, a focused `landing` page, or the\n * `post` page: the template every blog post renders in. A site has at most\n * one post page; at its own path (`/blog`) it is the blog's index, and at\n * `/blog/<slug>` it shows that post in its `post-body` section.\n */\nexport const PageKind = z.enum([\"page\", \"landing\", \"post\"]);\nexport type PageKind = z.infer<typeof PageKind>;\n\nexport const PagePath = z.string().max(200).regex(PAGE_PATH, 'A page path looks like \"/\" or \"/about\".');\n\n// ── The site ────────────────────────────────────────────────────────────────\n\nexport const MenuItem = z.object({\n label: z.string().trim().min(1).max(40),\n href: Href,\n});\nexport type MenuItem = z.infer<typeof MenuItem>;\n\nexport const Redirect = z.object({\n from: PagePath,\n to: Href,\n status: z.union([z.literal(301), z.literal(302)]),\n});\nexport type Redirect = z.infer<typeof Redirect>;\n\n/** Fonts a site may choose; see `FONT_CHOICES` in theme.ts for their stacks. */\nexport const FontChoice = z.enum([\n \"system\",\n \"inter\",\n \"dm-sans\",\n \"work-sans\",\n \"montserrat\",\n \"poppins\",\n \"space-grotesk\",\n \"source-serif\",\n \"merriweather\",\n \"playfair-display\",\n \"lora\",\n]);\nexport type FontChoice = z.infer<typeof FontChoice>;\n\n/**\n * A site's theme choices on top of the brand: token choices only, never raw\n * CSS, so a site stays inside the design system.\n */\nexport const TokenOverrides = z.object({\n radius: z.enum([\"none\", \"sm\", \"md\", \"lg\", \"full\"]).optional(),\n headingFont: FontChoice.optional(),\n bodyFont: FontChoice.optional(),\n});\nexport type TokenOverrides = z.infer<typeof TokenOverrides>;\n\nexport const SeoDefaults = z.object({\n /** `%s` is the page's title: `\"%s · Riverside Gym\"`. */\n titleTemplate: z.string().max(80).optional(),\n description: z.string().trim().max(200).optional(),\n ogImage: Image.optional(),\n /** Organization facts for JSON-LD. */\n organization: z\n .object({\n name: z.string().trim().min(1).max(120),\n logo: z.string().max(MAX_URL_LENGTH).refine(isSafeImageSrc).optional(),\n sameAs: z.array(z.url({ protocol: /^https$/ }).max(MAX_URL_LENGTH)).max(10).optional(),\n })\n .optional(),\n noindex: z.boolean().optional(),\n});\nexport type SeoDefaults = z.infer<typeof SeoDefaults>;\n\nexport const SiteDoc = z.object({\n schemaVersion: z.literal(1),\n name: z.string().trim().min(1).max(120),\n /** BCP 47 language of the site's pages. */\n lang: z.string().regex(/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/).default(\"en\"),\n theme: z\n .object({\n colorScheme: z.enum([\"light\", \"dark\", \"auto\"]).default(\"light\"),\n overrides: TokenOverrides.optional(),\n })\n .default({ colorScheme: \"light\" }),\n /** The site's header: usually one `nav` section. */\n header: z.array(SectionNode).max(2).default([]),\n /** The header's menu. */\n nav: z.array(MenuItem).max(12).default([]),\n /** The site's footer: usually one `footer` section. */\n footer: z.array(SectionNode).max(3).default([]),\n seo: SeoDefaults.default({}),\n redirects: z.array(Redirect).max(500).default([]),\n});\nexport type SiteDoc = z.infer<typeof SiteDoc>;\n/** A `SiteDoc` as written, before defaults. */\nexport type SiteDocInput = z.input<typeof SiteDoc>;\n\n// ── Releases ────────────────────────────────────────────────────────────────\n\nexport const ReleasePage = z.object({\n id: z.string().min(1),\n path: PagePath,\n kind: PageKind,\n doc: PageDoc,\n});\nexport type ReleasePage = z.infer<typeof ReleasePage>;\n\n/** Everything a published site serves: the site document and every page, frozen at publish. */\nexport const ReleaseSnapshot = z.object({\n schemaVersion: z.literal(1),\n site: SiteDoc,\n pages: z.array(ReleasePage).max(500),\n});\nexport type ReleaseSnapshot = z.infer<typeof ReleaseSnapshot>;\n\n/**\n * Read a stored snapshot page by page: a page that no longer parses (a\n * schema this release tightened, a document written past the checks) is\n * left out and reported, so one bad page doesn't take the whole site down.\n * Null only when the site document itself doesn't parse.\n */\nexport function parseSnapshot(value: unknown, report: (message: string) => void = (m) => console.error(`[genesis-sites] ${m}`)): ReleaseSnapshot | null {\n const raw = value && typeof value === \"object\" ? (value as { schemaVersion?: unknown; site?: unknown; pages?: unknown }) : {};\n if (raw.schemaVersion !== 1) {\n report(\"the snapshot isn't schemaVersion 1.\");\n return null;\n }\n const site = SiteDoc.safeParse(raw.site);\n if (!site.success) {\n report(`the snapshot's site document doesn't parse: ${site.error.message}`);\n return null;\n }\n const pages: ReleasePage[] = [];\n for (const page of Array.isArray(raw.pages) ? raw.pages.slice(0, 500) : []) {\n const parsed = ReleasePage.safeParse(page);\n if (parsed.success) pages.push(parsed.data);\n else report(`the page ${JSON.stringify((page as { path?: unknown })?.path ?? \"?\")} doesn't parse and is left out: ${parsed.error.message}`);\n }\n return { schemaVersion: 1, site: site.data, pages };\n}\n\nexport interface ReleaseMeta {\n id: string;\n siteId: string;\n number: number;\n note: string | null;\n createdAt: string;\n publishedAt: string | null;\n /** The brand the release was checked against (`brandHash`), when known. */\n brandHash: string | null;\n}\n\nexport interface Release extends ReleaseMeta {\n snapshot: ReleaseSnapshot;\n}\n\nexport interface PageMeta {\n id: string;\n siteId: string;\n path: string;\n kind: PageKind;\n title: string;\n sort: number;\n rev: number;\n}\n\n/** The size limit of one stored document, as the database enforces it (512 KiB of JSON). */\nexport const MAX_DOC_BYTES = 512 * 1024;\n","/**\n * Sections: `defineSection` describes one kind of section (its props schema,\n * variants, presets, migrations and server-safe React renderer), and the\n * registry holds every kind a site can use.\n *\n * Modelled on genesis-forms' `registerContentType`: one registry per process,\n * kept on a `Symbol.for` global so two copies of this package (a host's and a\n * dependency's) share it; manifests are frozen; a host adds its own kinds and\n * replaces a built-in only with `{ replace: true }`.\n *\n * Everything the editor needs comes from the definition: `label`,\n * `category`, `variants`, `presets` and `sectionJsonSchema(type)`\n * (`z.toJSONSchema` of the props schema) for its fields and for AI output.\n */\nimport type { ReactNode } from \"react\";\nimport { z } from \"zod\";\nimport type { MenuItem, PageKind, SectionNode } from \"./schemas\";\nimport type { ResolvedForm } from \"./forms\";\nimport type { LivePost, PostSummary } from \"./posts\";\n\nexport const SECTION_CATEGORIES = [\"header\", \"intro\", \"content\", \"social-proof\", \"conversion\", \"footer\"] as const;\nexport type SectionCategory = (typeof SECTION_CATEGORIES)[number];\n\n/** Where on a page a section may go: the site header, the page body, or the site footer. */\nexport type SectionPlacement = \"header\" | \"body\" | \"footer\";\n\nexport interface SectionVariant {\n id: string;\n label: string;\n}\n\nexport interface SectionPreset<P = Record<string, unknown>> {\n /** Shown in the editor's Add picker. */\n name: string;\n variant: string;\n props: P;\n}\n\n/** What a section's renderer is told about the page it is on. */\nexport interface RenderContext {\n /**\n * The level of the section's title: 1 for the page's main heading (the\n * first section that `providesH1`), 2 for every other section. Items in a\n * section are one level below it.\n */\n headingLevel: 1 | 2;\n site: {\n name: string;\n lang: string;\n nav: readonly MenuItem[];\n logo?: { src: string; alt: string } | undefined;\n };\n /** The page's own path, such as `/about`. */\n pagePath: string;\n /** A stored link as the page should print it: site paths get the host's base path. */\n href(href: string): string;\n /** Forms on the page, resolved by slug before rendering (null: the host doesn't know the slug). */\n forms: ReadonlyMap<string, ResolvedForm | null>;\n mode: \"live\" | \"preview\";\n /** A prefix that makes ids unique on the page: the section node's id. */\n idPrefix: string;\n /**\n * The site's blog, when it has a post page: its path, the published posts\n * (newest first, without bodies), the post this page shows (on\n * `<path>/<slug>`), and the list's page number (`?page=`).\n */\n posts?: PostsContext;\n}\n\nexport interface PostsContext {\n /** The post page's path (`/blog`): posts live at `<path>/<slug>`. */\n path: string;\n list: readonly PostSummary[];\n current: LivePost | null;\n /** The list's page, from `?page=` (1 when absent). */\n page: number;\n}\n\nexport interface SectionRenderProps<P> {\n props: P;\n variant: string;\n node: SectionNode;\n ctx: RenderContext;\n}\n\nexport interface SectionDefinition<P = Record<string, unknown>> {\n /** The registry key stored in each node: lowercase, such as `hero`. */\n type: string;\n /** The current props version. Nodes at a lower `v` are migrated on read. */\n version: number;\n label: string;\n description?: string;\n category: SectionCategory;\n /** The props schema (zod 4). Its input type is what an editor writes. */\n schema: z.ZodType<P>;\n variants: readonly SectionVariant[];\n defaultVariant: string;\n presets: readonly SectionPreset<z.input<z.ZodType<P>>>[];\n /** At most this many on a page. */\n limit?: number;\n /** The page kinds it may appear on (default: every kind). */\n enabledOn?: readonly PageKind[];\n /** Where it may go (default: the page body). */\n placement?: SectionPlacement;\n /** Its title is the page's `h1` when it comes first (a hero). */\n providesH1?: boolean;\n /**\n * `migrations[n]` turns version `n - 1` props into version `n` props. Pure\n * functions: `migrateNode` runs them in order on read, in the editor and in\n * the renderer, and a publish writes the result into the release.\n */\n migrations?: Readonly<Record<number, (props: Record<string, unknown>) => Record<string, unknown>>>;\n /**\n * The https origins this section frames (a map), so the page's\n * Content-Security-Policy allows them in `frame-src`. Only origins the\n * section builds itself, never a URL an editor typed.\n */\n frameOrigins?: (props: P) => readonly string[];\n /** It needs the islands loader (a click-to-load map, say). */\n islands?: boolean;\n /** Server-safe React: no state, no effects, no browser APIs. Returning null gives the page's h1 back. */\n render: (input: SectionRenderProps<P>) => ReactNode;\n}\n\n/** A definition as the registry holds it: props erased to a record. */\nexport type AnySectionDefinition = SectionDefinition<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport class SectionDefinitionError extends Error {\n constructor(readonly problems: string[]) {\n super(`Invalid section definition:\\n${problems.map((p) => ` - ${p}`).join(\"\\n\")}`);\n this.name = \"SectionDefinitionError\";\n }\n}\n\nconst TYPE = /^[a-z][a-z0-9-]{0,63}$/;\n\nfunction definitionProblems(def: AnySectionDefinition): string[] {\n const problems: string[] = [];\n if (!def || typeof def !== \"object\") return [\"a section definition is an object\"];\n const at = typeof def.type === \"string\" ? `\"${def.type}\"` : \"a section\";\n if (typeof def.type !== \"string\" || !TYPE.test(def.type)) problems.push(`${at}: \\`type\\` is lowercase letters, digits and -`);\n if (!Number.isInteger(def.version) || def.version < 1) problems.push(`${at}: \\`version\\` is a whole number from 1`);\n if (typeof def.label !== \"string\" || !def.label.trim()) problems.push(`${at}: needs a \\`label\\``);\n if (!(SECTION_CATEGORIES as readonly string[]).includes(def.category)) problems.push(`${at}: \\`category\\` is one of ${SECTION_CATEGORIES.join(\", \")}`);\n if (!def.schema || typeof (def.schema as { safeParse?: unknown }).safeParse !== \"function\") problems.push(`${at}: \\`schema\\` is a zod schema`);\n if (typeof def.render !== \"function\") problems.push(`${at}: \\`render\\` is a function`);\n const ids = new Set<string>();\n if (!Array.isArray(def.variants) || def.variants.length === 0) problems.push(`${at}: needs at least one variant`);\n else\n for (const v of def.variants) {\n if (!v || typeof v.id !== \"string\" || !/^[a-z][a-z0-9-]{0,63}$/.test(v.id) || typeof v.label !== \"string\") problems.push(`${at}: a variant is { id, label }`);\n else if (ids.has(v.id)) problems.push(`${at}: variant \"${v.id}\" is listed twice`);\n else ids.add(v.id);\n }\n if (!ids.has(def.defaultVariant)) problems.push(`${at}: \\`defaultVariant\\` \"${String(def.defaultVariant)}\" is not one of its variants`);\n if (def.limit !== undefined && (!Number.isInteger(def.limit) || def.limit < 1)) problems.push(`${at}: \\`limit\\` is a whole number from 1`);\n if (def.placement !== undefined && ![\"header\", \"body\", \"footer\"].includes(def.placement)) problems.push(`${at}: \\`placement\\` is header, body or footer`);\n if (def.frameOrigins !== undefined && typeof def.frameOrigins !== \"function\") problems.push(`${at}: \\`frameOrigins\\` is a function`);\n for (const [key, fn] of Object.entries(def.migrations ?? {})) {\n const n = Number(key);\n if (!Number.isInteger(n) || n < 2 || n > def.version) problems.push(`${at}: migration ${key} must be between 2 and the version (${def.version})`);\n if (typeof fn !== \"function\") problems.push(`${at}: migration ${key} is a function`);\n }\n for (let n = 2; n <= (Number.isInteger(def.version) ? def.version : 0); n++) {\n if (!def.migrations?.[n]) problems.push(`${at}: version ${def.version} needs a migration to ${n}`);\n }\n if (!Array.isArray(def.presets) || def.presets.length === 0) problems.push(`${at}: needs at least one preset (the editor's Add picker)`);\n else if (def.schema && typeof (def.schema as { safeParse?: unknown }).safeParse === \"function\")\n for (const preset of def.presets) {\n if (!preset || typeof preset.name !== \"string\" || !ids.has(preset.variant)) {\n problems.push(`${at}: preset ${JSON.stringify(preset?.name)} needs a name and one of its variants`);\n continue;\n }\n const parsed = def.schema.safeParse(preset.props);\n if (!parsed.success) problems.push(`${at}: preset \"${preset.name}\" doesn't match the schema: ${parsed.error.issues.map((i) => `${i.path.join(\".\") || \"props\"} ${i.message}`).join(\"; \")}`);\n }\n return problems;\n}\n\n/**\n * Declare a section kind. Checks the definition (and every preset against its\n * schema) and returns it frozen. It isn't registered until `registerSection`.\n *\n * @stability Beta\n */\nexport function defineSection<P>(def: SectionDefinition<P>): Readonly<SectionDefinition<P>> {\n const problems = definitionProblems(def as AnySectionDefinition);\n if (problems.length) throw new SectionDefinitionError(problems);\n return Object.freeze({\n ...def,\n variants: Object.freeze(def.variants.map((v) => Object.freeze({ ...v }))),\n presets: Object.freeze(def.presets.map((p) => Object.freeze({ ...p }))),\n ...(def.enabledOn ? { enabledOn: Object.freeze([...def.enabledOn]) } : {}),\n ...(def.migrations ? { migrations: Object.freeze({ ...def.migrations }) } : {}),\n });\n}\n\n// ── The registry ────────────────────────────────────────────────────────────\n\nconst REGISTRY = Symbol.for(\"@marktiderman/genesis-sites/sections@1\");\nconst BUILT_IN = Symbol.for(\"@marktiderman/genesis-sites/built-in-sections@1\");\ntype Scope = typeof globalThis & { [REGISTRY]?: Map<string, AnySectionDefinition>; [BUILT_IN]?: Set<string> };\nconst scope = globalThis as Scope;\nconst registry: Map<string, AnySectionDefinition> = (scope[REGISTRY] ??= new Map());\nconst builtIns: Set<string> = (scope[BUILT_IN] ??= new Set());\n\n/** The built-in section kinds, which a host replaces only with `{ replace: true }`. */\nexport const BUILT_IN_SECTION_TYPES = Object.freeze([\n \"nav\",\n \"hero\",\n \"features\",\n \"cta\",\n \"testimonials\",\n \"faq\",\n \"pricing\",\n \"logos\",\n \"stats\",\n \"gallery\",\n \"rich-text\",\n \"form-embed\",\n \"footer\",\n \"schedule\",\n \"team\",\n \"blog-list\",\n \"post-body\",\n \"map\",\n \"timeline\",\n \"file\",\n] as const);\nexport type BuiltInSectionType = (typeof BUILT_IN_SECTION_TYPES)[number];\n\nexport interface RegisterSectionOptions {\n /** Replace a built-in kind, for every site in this process. */\n replace?: boolean;\n}\n\n/**\n * Register a section kind (from `defineSection`, or a plain definition, which\n * is checked the same way). Re-registering a host kind replaces it, so hot\n * reload works; a built-in kind's name throws unless `{ replace: true }`.\n *\n * @stability Beta\n */\nexport function registerSection(def: AnySectionDefinition, options: RegisterSectionOptions = {}): void {\n const frozen = Object.isFrozen(def) && definitionProblems(def).length === 0 ? def : defineSection(def);\n if ((BUILT_IN_SECTION_TYPES as readonly string[]).includes(frozen.type) && options.replace !== true) {\n throw new Error(\n `registerSection: \"${frozen.type}\" is a built-in section; pass { replace: true } to replace it for every site in this process.`,\n );\n }\n registry.set(frozen.type, frozen);\n}\n\n/** For `@marktiderman/genesis-sites/sections`: register a built-in unless one (or a replacement) is there. @internal */\nexport function registerBuiltInSection(def: AnySectionDefinition): void {\n if (!registry.has(def.type)) registry.set(def.type, def);\n builtIns.add(def.type);\n}\n\nexport function getSection(type: string): AnySectionDefinition | undefined {\n return registry.get(type);\n}\n\nexport function listSections(): AnySectionDefinition[] {\n return [...registry.values()];\n}\n\n/** Remove a host section kind (tests, hot reload). Built-ins can't be removed, only replaced. */\nexport function unregisterSection(type: string): boolean {\n if ((BUILT_IN_SECTION_TYPES as readonly string[]).includes(type)) throw new Error(`unregisterSection: \"${type}\" is built in; replace it with registerSection(…, { replace: true }).`);\n return registry.delete(type);\n}\n\nconst jsonSchemas = new WeakMap<object, Record<string, unknown>>();\n\n/**\n * The JSON Schema of a section's props (`z.toJSONSchema`, input side), for the\n * editor's fields and for validating AI output. Refinements (safe URLs) don't\n * appear in JSON Schema; the zod schema still checks them on save.\n *\n * @stability Beta\n */\nexport function sectionJsonSchema(typeOrDef: string | AnySectionDefinition): Record<string, unknown> {\n const def = typeof typeOrDef === \"string\" ? registry.get(typeOrDef) : typeOrDef;\n if (!def) throw new Error(`sectionJsonSchema: no section \"${String(typeOrDef)}\" is registered.`);\n let schema = jsonSchemas.get(def.schema);\n if (!schema) {\n schema = z.toJSONSchema(def.schema, { io: \"input\", unrepresentable: \"any\" }) as Record<string, unknown>;\n jsonSchemas.set(def.schema, schema);\n }\n return schema;\n}\n\n/** What the editor's Add picker and fields need about one section kind. */\nexport interface SectionManifest {\n type: string;\n version: number;\n label: string;\n description?: string;\n category: SectionCategory;\n placement: SectionPlacement;\n variants: readonly SectionVariant[];\n defaultVariant: string;\n presets: readonly SectionPreset[];\n limit?: number;\n enabledOn?: readonly PageKind[];\n jsonSchema: Record<string, unknown>;\n}\n\n/** Every registered section as editor data (no renderers): the editor's catalog. @stability Beta */\nexport function sectionManifests(): SectionManifest[] {\n return listSections().map((def) => ({\n type: def.type,\n version: def.version,\n label: def.label,\n ...(def.description ? { description: def.description } : {}),\n category: def.category,\n placement: def.placement ?? \"body\",\n variants: def.variants,\n defaultVariant: def.defaultVariant,\n presets: def.presets as readonly SectionPreset[],\n ...(def.limit ? { limit: def.limit } : {}),\n ...(def.enabledOn ? { enabledOn: def.enabledOn } : {}),\n jsonSchema: sectionJsonSchema(def),\n }));\n}\n\nlet counter = 0;\n/** A new section id: short, alphanumeric, unique enough within a page. */\nexport function newSectionId(prefix = \"s\"): string {\n counter = (counter + 1) % 1_000_000;\n const random = Math.random().toString(36).slice(2, 8);\n return `${prefix}${Date.now().toString(36)}${counter.toString(36)}${random}`.slice(0, 64);\n}\n\n/** A section node from a preset: the editor's Add, and templates. */\nexport function nodeFromPreset(type: string, presetName?: string, id = newSectionId(type.replace(/-/g, \"\").slice(0, 6))): SectionNode {\n const def = registry.get(type);\n if (!def) throw new Error(`nodeFromPreset: no section \"${type}\" is registered.`);\n const preset = presetName ? def.presets.find((p) => p.name === presetName) : def.presets[0];\n if (!preset) throw new Error(`nodeFromPreset: \"${type}\" has no preset \"${presetName}\".`);\n return { id, type, v: def.version, variant: preset.variant, props: structuredClone(preset.props) as Record<string, unknown> };\n}\n","/**\n * Blog posts: a site's collection of dated articles.\n *\n * A post is its own document (`PostDoc`), kept beside the pages rather than\n * in them, with a draft and a published copy. `publishPost` checks the draft\n * and copies it to the published copy; that copy is what visitors see, so\n * a post goes live (and comes down) on its own, without republishing the\n * site. The site's `post` page is the template every post renders in: at its\n * own path it is the blog's index, and at `<path>/<slug>` it shows the post.\n */\nimport { z } from \"zod\";\nimport { Copy, Href, Image, Line, RichText, Seo } from \"./schemas\";\n\n/** A post's slug: lowercase letters, digits and single hyphens (`september-testing`). */\nexport const PostSlug = z\n .string()\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, \"A post slug is lowercase letters, digits and single hyphens.\");\n\nexport const PostAuthor = z.object({\n name: Line(80),\n /** Their page: a site path or an http(s) URL. */\n url: Href.optional(),\n});\n\nexport const PostDoc = z.object({\n schemaVersion: z.literal(1),\n title: Line(160),\n /** A sentence or two for the list, search results and the feed. */\n excerpt: Copy(400).optional(),\n body: RichText,\n cover: Image.optional(),\n author: PostAuthor.optional(),\n category: Line(60).optional(),\n tags: z.array(Line(40)).max(12).optional(),\n seo: Seo.optional(),\n});\nexport type PostDoc = z.infer<typeof PostDoc>;\nexport type PostDocInput = z.input<typeof PostDoc>;\n\nexport type PostStatus = \"draft\" | \"published\";\n\n/** A post as the editor lists it. */\nexport interface PostMeta {\n id: string;\n siteId: string;\n slug: string;\n title: string;\n status: PostStatus;\n /** The draft's revision, for compare-and-swap saves. */\n rev: number;\n /** When it was first published (kept when it is published again), or null. */\n publishedAt: string | null;\n updatedAt: string;\n}\n\n/** A post's draft, for the editor. */\nexport interface PostDraft extends PostMeta {\n doc: PostDoc;\n}\n\n/** A published post, as visitors see it. */\nexport interface LivePost {\n slug: string;\n publishedAt: string;\n /** When its published copy last changed. */\n updatedAt: string;\n doc: PostDoc;\n}\n\n/** A published post in a list: everything but the body. */\nexport interface PostSummary {\n slug: string;\n title: string;\n excerpt?: string;\n cover?: Image;\n author?: z.infer<typeof PostAuthor>;\n category?: string;\n /** Kept out of the sitemap and the feed (`seo.noindex`, or a canonical elsewhere). */\n noindex?: boolean;\n publishedAt: string;\n updatedAt: string;\n}\n\n/** A list item as a store returns it, checked: a stored row that skipped the checks is left out. */\nexport const PostSummarySchema = z.object({\n slug: PostSlug,\n title: Line(160),\n excerpt: Copy(400).optional(),\n cover: Image.optional(),\n author: PostAuthor.optional(),\n category: Line(60).optional(),\n noindex: z.boolean().optional(),\n publishedAt: z.string().refine((s) => !Number.isNaN(Date.parse(s)), \"a date\"),\n updatedAt: z.string().refine((s) => !Number.isNaN(Date.parse(s)), \"a date\"),\n});\n\n/** The most posts a list reads (the newest first). */\nexport const MAX_LIVE_POSTS = 500;\n\n/** A save of a post: a new one (no `id`), or a compare-and-swap of an existing one's draft. */\nexport interface SavePostInput {\n id?: string;\n slug: string;\n /** The draft revision this save started from (required with `id`). */\n rev?: number;\n doc: PostDocInput;\n}\n\nexport type SavePostResult = { id: string; rev: number } | { id: string; conflict: PostDoc; rev: number };\n\n/** One post to import (a move from another site): published as of `publishedAt` unless it fails a check. */\nexport interface ImportPost {\n slug: string;\n doc: PostDocInput;\n /** When it was first published, kept from the old site (default: now). */\n publishedAt?: string;\n /** `draft` imports it unpublished. Default `published`. */\n status?: PostStatus;\n}\n\nexport interface ImportPostsResult {\n /** Imported posts: published, or a draft when asked for or when a check failed (see `issues`). */\n imported: { slug: string; id: string; status: PostStatus; issues?: string[] }[];\n /** Posts left out: a slug the site already has, or a document that doesn't parse. */\n skipped: { slug: string; reason: string }[];\n}\n\n/** The most posts one `importPosts` call takes. */\nexport const MAX_IMPORT_POSTS = 500;\n\n/** A published post as a list item. */\nexport function postSummary(post: LivePost): PostSummary {\n const d = post.doc;\n return {\n slug: post.slug,\n title: d.title,\n ...(d.excerpt ? { excerpt: d.excerpt } : {}),\n ...(d.cover ? { cover: d.cover } : {}),\n ...(d.author ? { author: d.author } : {}),\n ...(d.category ? { category: d.category } : {}),\n ...(d.seo?.noindex || d.seo?.canonical ? { noindex: true } : {}),\n publishedAt: post.publishedAt,\n updatedAt: post.updatedAt,\n };\n}\n\n/** Plain text of a rich text document (for a feed's description when a post has no excerpt). */\nexport function richTextPlain(value: unknown, max = 400): string {\n const out: string[] = [];\n const walk = (node: unknown) => {\n if (out.join(\" \").length > max || !node || typeof node !== \"object\") return;\n const n = node as { type?: unknown; text?: unknown; content?: unknown };\n if (n.type === \"text\" && typeof n.text === \"string\") out.push(n.text);\n if (Array.isArray(n.content)) n.content.forEach(walk);\n };\n walk(value);\n const text = out.join(\" \").replace(/\\s+/g, \" \").trim();\n return text.length > max ? `${text.slice(0, max - 1).trimEnd()}…` : text;\n}\n\n/** Validate a post slug, throwing with a readable message. */\nexport function validatePostSlug(slug: string): string {\n const parsed = PostSlug.safeParse(slug);\n if (!parsed.success) throw new Error(`\"${slug}\": ${parsed.error.issues[0]?.message ?? \"not a post slug\"}`);\n return slug;\n}\n","/**\n * SEO: a page's meta tags (title, description, canonical, robots, Open Graph,\n * Twitter), sitemap.xml, robots.txt, JSON-LD (Organization, WebSite,\n * BreadcrumbList), and the redirects a page move leaves behind.\n *\n * Canonical and absolute URLs are built from `origin`, the site's primary\n * address, which the host passes in. Nothing here reads a request's Host.\n */\nimport type { LivePost, PostSummary } from \"./posts\";\nimport { richTextPlain } from \"./posts\";\nimport type { Image, PageDoc, Redirect, ReleasePage, SiteDoc } from \"./schemas\";\nimport { isSafeHref } from \"./urls\";\n\nexport interface PageMetaInput {\n site: SiteDoc;\n page: ReleasePage;\n /** The site's primary origin, `https://riverside.example`, no trailing slash. */\n origin: string;\n /** The path prefix the site is served under (`\"\"` at the root). */\n basePath?: string;\n /** A preview: always `noindex`. */\n preview?: boolean;\n /** The page is a blog post: Open Graph says `article`, with its dates. */\n article?: { publishedTime: string; modifiedTime?: string; author?: string; section?: string };\n}\n\nexport interface PageMeta {\n title: string;\n description?: string;\n canonical: string;\n robots: string;\n openGraph: Record<string, string>;\n twitter: Record<string, string>;\n}\n\n/** The absolute URL of a site path. */\nexport function absoluteUrl(origin: string, basePath: string, path: string): string {\n const base = origin.replace(/\\/+$/, \"\") + (basePath ?? \"\").replace(/\\/+$/, \"\");\n return path === \"/\" ? `${base}/` : `${base}${path}`;\n}\n\nfunction imageUrl(image: Image | undefined, origin: string, basePath: string): string | undefined {\n if (!image) return undefined;\n return image.src.startsWith(\"/\") ? absoluteUrl(origin, basePath, image.src) : image.src;\n}\n\n/**\n * The page's title with the site's template (`%s · Riverside Gym`), so every\n * tab and search result names the site. An SEO title written for the page\n * (`seo.title`) is used as it is.\n */\nexport function pageTitle(site: SiteDoc, doc: PageDoc, _path: string): string {\n const own = doc.seo?.title?.trim();\n if (own) return own;\n const title = doc.root.props.title;\n const template = site.seo.titleTemplate;\n if (!template || !template.includes(\"%s\")) return title;\n return template.replace(\"%s\", title);\n}\n\n/** Every meta value a page prints in its `<head>`. */\nexport function pageMeta({ site, page, origin, basePath = \"\", preview = false, article }: PageMetaInput): PageMeta {\n const doc = page.doc;\n const title = pageTitle(site, doc, page.path);\n const description = doc.seo?.description?.trim() || site.seo.description?.trim() || undefined;\n const canonical = doc.seo?.canonical ?? absoluteUrl(origin, basePath, page.path);\n const noindex = preview || site.seo.noindex === true || doc.seo?.noindex === true;\n const image = doc.seo?.ogImage ?? site.seo.ogImage;\n const img = imageUrl(image, origin, basePath);\n const openGraph: Record<string, string> = {\n \"og:type\": \"website\",\n \"og:title\": title,\n \"og:url\": canonical,\n \"og:site_name\": site.name,\n \"og:locale\": site.lang.replace(\"-\", \"_\"),\n };\n if (description) openGraph[\"og:description\"] = description;\n if (article) {\n openGraph[\"og:type\"] = \"article\";\n openGraph[\"article:published_time\"] = new Date(article.publishedTime).toISOString();\n if (article.modifiedTime) openGraph[\"article:modified_time\"] = new Date(article.modifiedTime).toISOString();\n if (article.author) openGraph[\"article:author\"] = article.author;\n if (article.section) openGraph[\"article:section\"] = article.section;\n }\n if (img) {\n openGraph[\"og:image\"] = img;\n if (image?.alt) openGraph[\"og:image:alt\"] = image.alt;\n if (image?.width) openGraph[\"og:image:width\"] = String(image.width);\n if (image?.height) openGraph[\"og:image:height\"] = String(image.height);\n }\n const twitter: Record<string, string> = { \"twitter:card\": img ? \"summary_large_image\" : \"summary\", \"twitter:title\": title };\n if (description) twitter[\"twitter:description\"] = description;\n if (img) twitter[\"twitter:image\"] = img;\n return {\n title,\n ...(description ? { description } : {}),\n canonical,\n robots: noindex ? \"noindex, nofollow\" : \"index, follow\",\n openGraph,\n twitter,\n };\n}\n\n// ── JSON-LD ─────────────────────────────────────────────────────────────────\n\nexport function organizationJsonLd(site: SiteDoc, origin: string, basePath = \"\"): Record<string, unknown> {\n const org = site.seo.organization;\n const out: Record<string, unknown> = {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Organization\",\n name: org?.name ?? site.name,\n url: absoluteUrl(origin, basePath, \"/\"),\n };\n if (org?.logo) out.logo = org.logo.startsWith(\"/\") ? absoluteUrl(origin, basePath, org.logo) : org.logo;\n if (org?.sameAs?.length) out.sameAs = org.sameAs;\n return out;\n}\n\nexport function websiteJsonLd(site: SiteDoc, origin: string, basePath = \"\"): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"WebSite\",\n name: site.name,\n url: absoluteUrl(origin, basePath, \"/\"),\n inLanguage: site.lang,\n };\n}\n\n/** The trail from the home page to `page`, through every ancestor path that is a page. */\nexport function breadcrumbJsonLd(pages: readonly ReleasePage[], page: ReleasePage, origin: string, basePath = \"\"): Record<string, unknown> | null {\n if (page.path === \"/\") return null;\n const byPath = new Map(pages.map((p) => [p.path, p]));\n const trail: ReleasePage[] = [];\n const home = byPath.get(\"/\");\n if (home) trail.push(home);\n const segments = page.path.split(\"/\").filter(Boolean);\n for (let i = 1; i <= segments.length; i++) {\n const ancestor = byPath.get(`/${segments.slice(0, i).join(\"/\")}`);\n if (ancestor) trail.push(ancestor);\n }\n if (trail.length < 2) return null;\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: trail.map((p, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: p.doc.root.props.title,\n item: absoluteUrl(origin, basePath, p.path),\n })),\n };\n}\n\n/** An ISO date, or null when the value isn't a date (a stored row that skipped the checks). */\nfunction isoDate(value: unknown): string | null {\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\n/** Text for a feed, or undefined when the value isn't text. */\nconst textOf = (value: unknown): string | undefined => (typeof value === \"string\" && value ? value : undefined);\n\n/** The URL of a post: `<post page path>/<slug>`. */\nexport function postPath(postsPath: string, slug: string): string {\n return `${postsPath === \"/\" ? \"\" : postsPath}/${slug}`;\n}\n\n/** `Article` JSON-LD for a blog post. */\nexport function articleJsonLd(site: SiteDoc, post: LivePost, url: string, origin: string, basePath = \"\"): Record<string, unknown> {\n const d = post.doc;\n const org = site.seo.organization;\n const publisher: Record<string, unknown> = { \"@type\": \"Organization\", name: org?.name ?? site.name, url: absoluteUrl(origin, basePath, \"/\") };\n if (org?.logo) publisher.logo = { \"@type\": \"ImageObject\", url: org.logo.startsWith(\"/\") ? absoluteUrl(origin, basePath, org.logo) : org.logo };\n const description = d.excerpt ?? d.seo?.description;\n const image = imageUrl(d.cover ?? d.seo?.ogImage, origin, basePath);\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Article\",\n headline: d.title.slice(0, 110),\n ...(description ? { description } : {}),\n ...(image ? { image: [image] } : {}),\n datePublished: new Date(post.publishedAt).toISOString(),\n dateModified: new Date(post.updatedAt).toISOString(),\n author: d.author\n ? { \"@type\": \"Person\", name: d.author.name, ...(d.author.url && isSafeHref(d.author.url) ? { url: d.author.url.startsWith(\"/\") ? absoluteUrl(origin, basePath, d.author.url) : d.author.url } : {}) }\n : { \"@type\": \"Organization\", name: org?.name ?? site.name },\n publisher,\n mainEntityOfPage: { \"@type\": \"WebPage\", \"@id\": url },\n ...(d.category ? { articleSection: d.category } : {}),\n ...(d.tags?.length ? { keywords: d.tags.join(\", \") } : {}),\n inLanguage: site.lang,\n };\n}\n\nexport interface RssInput {\n site: SiteDoc;\n /** Published posts, newest first. */\n posts: readonly PostSummary[];\n /** The post page's path (`/blog`). */\n postsPath: string;\n /** Its title, the feed's (default: the site's name). */\n title?: string;\n origin: string;\n basePath?: string;\n /** The most items (default 20). */\n limit?: number;\n}\n\n/** The blog's RSS 2.0 feed: the newest posts, with their excerpts. */\nexport function rssXml({ site, posts, postsPath, title, origin, basePath = \"\", limit = 20 }: RssInput): string {\n const link = absoluteUrl(origin, basePath, postsPath);\n const self = absoluteUrl(origin, basePath, \"/rss.xml\");\n // A post whose stored fields aren't what they should be is left out, not the whole feed.\n const usable = posts.filter((p) => !p.noindex && textOf(p.title) && textOf(p.slug) && isoDate(p.publishedAt));\n const items = usable.slice(0, limit).map((p) => {\n const url = absoluteUrl(origin, basePath, postPath(postsPath, p.slug));\n const excerpt = textOf(p.excerpt);\n const category = textOf(p.category);\n const author = textOf(p.author?.name);\n return [\n \"<item>\",\n `<title>${escapeXml(p.title)}</title>`,\n `<link>${escapeXml(url)}</link>`,\n `<guid isPermaLink=\"true\">${escapeXml(url)}</guid>`,\n `<pubDate>${new Date(isoDate(p.publishedAt)!).toUTCString()}</pubDate>`,\n excerpt ? `<description>${escapeXml(excerpt)}</description>` : \"\",\n category ? `<category>${escapeXml(category)}</category>` : \"\",\n author ? `<dc:creator>${escapeXml(author)}</dc:creator>` : \"\",\n \"</item>\",\n ].join(\"\");\n });\n const newest = usable[0];\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n` +\n `<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"><channel>` +\n `<title>${escapeXml(title ?? site.name)}</title>` +\n `<link>${escapeXml(link)}</link>` +\n `<description>${escapeXml(site.seo.description ?? `Posts from ${site.name}`)}</description>` +\n `<language>${escapeXml(site.lang)}</language>` +\n `<atom:link href=\"${escapeXml(self)}\" rel=\"self\" type=\"application/rss+xml\"/>` +\n (newest ? `<lastBuildDate>${new Date(isoDate(newest.updatedAt) ?? isoDate(newest.publishedAt)!).toUTCString()}</lastBuildDate>` : \"\") +\n `${items.join(\"\")}</channel></rss>\\n`\n );\n}\n\n/** A post's description for a feed or a page with no excerpt: its first words. */\nexport const postDescription = (doc: LivePost[\"doc\"]): string | undefined => doc.excerpt ?? doc.seo?.description ?? (richTextPlain(doc.body, 200) || undefined);\n\n/**\n * JSON for a `<script type=\"application/ld+json\">` (or any JSON inside HTML):\n * `<`, `>`, `&` and the line separators are escaped as `\\uXXXX`, so stored\n * text can never close the script element or open a comment.\n */\nexport function safeJsonForHtml(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, \"\\\\u003c\")\n .replace(/>/g, \"\\\\u003e\")\n .replace(/&/g, \"\\\\u0026\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\n// ── sitemap.xml and robots.txt ──────────────────────────────────────────────\n\nexport function escapeXml(text: string): string {\n return text.replace(/[<>&'\"]/g, (c) => ({ \"<\": \"<\", \">\": \">\", \"&\": \"&\", \"'\": \"'\", '\"': \""\" })[c]!);\n}\n\nexport interface SitemapInput {\n site: SiteDoc;\n pages: readonly ReleasePage[];\n origin: string;\n basePath?: string;\n /** The release's publish time, as every page's `lastmod`. */\n lastModified?: string | null;\n /** The blog: its post page's path and the published posts (each with its own `lastmod`). */\n posts?: { path: string; items: readonly PostSummary[] };\n}\n\n/** sitemap.xml: every indexable page (not `noindex`, not one whose canonical points elsewhere). */\nexport function sitemapXml({ site, pages, origin, basePath = \"\", lastModified, posts }: SitemapInput): string {\n const urls = site.seo.noindex\n ? []\n : pages\n .filter((p) => !p.doc.seo?.noindex && !p.doc.seo?.canonical)\n .sort((a, b) => (a.path === \"/\" ? -1 : b.path === \"/\" ? 1 : a.path.localeCompare(b.path)))\n .map((p) => {\n const loc = `<loc>${escapeXml(absoluteUrl(origin, basePath, p.path))}</loc>`;\n const mod = lastModified ? `<lastmod>${escapeXml(new Date(lastModified).toISOString())}</lastmod>` : \"\";\n return `<url>${loc}${mod}</url>`;\n });\n const blogPage = posts ? pages.find((p) => p.path === posts.path) : undefined;\n if (posts && !site.seo.noindex && blogPage && !blogPage.doc.seo?.noindex) {\n for (const p of posts.items) {\n if (p.noindex) continue;\n const mod = isoDate(p.updatedAt) ?? isoDate(p.publishedAt);\n urls.push(`<url><loc>${escapeXml(absoluteUrl(origin, basePath, postPath(posts.path, p.slug)))}</loc>${mod ? `<lastmod>${escapeXml(mod)}</lastmod>` : \"\"}</url>`);\n }\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">${urls.join(\"\")}</urlset>\\n`;\n}\n\nexport interface RobotsInput {\n origin: string;\n basePath?: string;\n /** `Disallow: /` for everyone: a site that is `noindex`, or a preview. */\n disallowAll?: boolean;\n}\n\nexport function robotsTxt({ origin, basePath = \"\", disallowAll = false }: RobotsInput): string {\n const lines = [\"User-agent: *\", disallowAll ? \"Disallow: /\" : \"Allow: /\"];\n if (!disallowAll) lines.push(\"\", `Sitemap: ${absoluteUrl(origin, basePath, \"/sitemap.xml\")}`);\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n// ── Redirects ───────────────────────────────────────────────────────────────\n\n/**\n * The redirects after a page moves from `from` to `to`: a permanent redirect\n * from the old path, earlier redirects to the old path pointed straight at\n * the new one (no chains), and any redirect away from the new path dropped\n * (a page lives there now). A move back undoes the earlier redirect.\n */\nexport function redirectsAfterMove(redirects: readonly Redirect[], from: string, to: string): Redirect[] {\n if (from === to) return [...redirects];\n const next = redirects\n .filter((r) => r.from !== to && r.from !== from)\n .map((r) => (r.to === from ? { ...r, to } : r))\n .filter((r) => r.from !== r.to);\n next.push({ from, to, status: 301 });\n return next;\n}\n\n/** The redirect for a request path, if any (exact match on the normalised path). */\nexport function matchRedirect(redirects: readonly Redirect[], path: string): Redirect | undefined {\n return redirects.find((r) => r.from === path && isSafeHref(r.to));\n}\n"]}
|