import { type Kysely } from 'kysely'; /** * Site-wide settings: what the site is called, what it falls back to, and how to reach it. * * There was none of this. A site name, a title template, a default meta description, the addresses * of the institution's social accounts, a phone number — every one of those lived in the consumer's * own layout as a string a developer typed, which means an editor cannot change the name of their * own college without a deploy. That is the same complaint that moved branding, the accent colour * and the AI settings into the admin, arriving one layer up. * * **Typed columns for what Taproot itself reads, JSON for what it does not.** The split is the whole * design and it is not tidiness. `resolveSeo` consumes `site_name`, `title_template`, * `seo_description`, `seo_og_image_id` and `seo_no_index`, so those are columns: core must never * depend on a field `api_id` an admin can rename, because the failure would be silent — rename it * and SEO fallbacks simply stop, with nothing thrown and no screen to say so. Everything else an * institution wants here is different in every deployment, so it is defined by the admin and stored * as JSON: `extra_fields` holds the definitions in the shape `repeaterSubField` already describes, * `extra_values` holds one row of answers, and the existing field system renders and validates both. * * **`social` is a list, not a column per platform.** A column per platform dates the schema — a * college on a service nobody predicted needs a migration to say so — so the presets are offered by * the screen and the storage is `[{ platform, url }]`. Same shape as the `embed` field's host * presets: Taproot suggests, and holds no opinion about which ones exist. * * All nullable, all defaulting to nothing, so an existing deployment reads exactly as it did — the * fallback chain simply has one more link that is empty. Nothing is derived from any of it, so there * is no `npm run db:reindex` step. * * These sit on the same one row as branding, which owns a disjoint set of columns and upserts only * its own. Two modules writing one row is safe precisely because neither names the other's columns. */ export declare function up(db: Kysely): Promise; export declare function down(db: Kysely): Promise;