/** The closed union stored in `PREVIEW_SITES`. See registry-value.js for why nothing else parses. * `linkKey`/`displayName` are optional on an active record — present or absent, never any other * key, never the wrong shape. An active record carries EXACTLY ONE of `project`/`bucketPrefix` — * never both, never neither; see registry-value.js's header for why that is a data-shape change * with no writer yet, and why `ownsBucketPrefix` (not this parser alone) is what a reader must * call before trusting `bucketPrefix` as an address. `live` (reef #1174): an https origin, or * `false` for "not published yet"; absent = unknown. */ export type RegistryValue = | { ok: true; kind: "active"; project: string; bucketPrefix?: undefined; linkKey?: string; displayName?: string; live?: string | false } | { ok: true; kind: "active"; project?: undefined; bucketPrefix: string; linkKey?: string; displayName?: string; live?: string | false } | { ok: true; kind: "retired"; at: string; siteIncarnationId?: string; rollback?: true } | { ok: false; reason: "invalid_json" | "invalid_shape" }; export function parseRegistryValue(input: unknown): RegistryValue; export const SITE_KEY_SHAPE: RegExp; export const SITE_INCARNATION_SHAPE: RegExp; export function bucketPrefixFor(key: string): string; /** `entry` is a `parseRegistryValue` RESULT — not a raw `JSON.parse`: the narrow type is what makes * skipping the shape check a compile error (review-884 r2). */ export function ownsBucketPrefix(entry: RegistryValue, key: string): boolean; /** #1315 — the zone tombstone kept in the same namespace under `zone-tomb:`. */ export const ZONE_TOMB_PREFIX: string; export function zoneTombKey(apex: string): string; export type ZoneTomb = { accountId: string; at: string | null; host: string | null; siteIncarnationId?: string; via?: "txt"; malformed?: undefined } | { accountId: null; malformed: true }; export function parseZoneTomb(raw: unknown): ZoneTomb | null;