import z from "zod"; import { RecordIdSchema, SiteSchema } from "./site.js"; /** * Domain regex: standard DNS name, `localhost`, IPv4 literal. * * Mirrors the upstream `domain.schema.ts` regex — see `domain.md` * for the full grammar table. */ const DOMAIN_REGEX = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$|^localhost$|^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/i; /** Domain literal schema (1..253 chars, regex-validated). */ export const DomainSchema = z .string() .min(1) .max(253) .regex(DOMAIN_REGEX, "Invalid domain format"); /** `POST /sites/:id/domains` body. */ export const AddDomainRequestSchema = z.object({ domain: DomainSchema, }); /** Response from `POST /sites/:id/domains`. */ export const AddDomainResponseSchema = z.object({ success: z.boolean(), domains: z.array(z.string()), error: z.string().optional(), }); /** `DELETE /sites/:id/domains` body. */ export const RemoveDomainRequestSchema = z.object({ domain: DomainSchema, }); /** Response from `DELETE /sites/:id/domains`. */ export const RemoveDomainResponseSchema = z.object({ success: z.boolean(), domains: z.array(z.string()), error: z.string().optional(), }); /** `GET /sites/resolve/:domain` path param. */ export const DomainResolveParamSchema = z.object({ domain: DomainSchema, }); /** Response from `GET /sites/resolve/:domain`. */ export const DomainResolveResponseSchema = z.object({ success: z.boolean(), site: SiteSchema.optional(), organization: z .object({ id: RecordIdSchema, name: z.string(), slug: z.string(), }) .optional(), error: z.string().optional(), }); export type AddDomainRequest = z.infer; export type AddDomainResponse = z.infer; export type RemoveDomainRequest = z.infer; export type RemoveDomainResponse = z.infer; export type DomainResolveParam = z.infer; export type DomainResolveResponse = z.infer;