Files
suaveplan/packages/api-stack/api/api-plugin-site/src/schemas/domain.ts
2026-05-27 23:29:53 +01:00

69 lines
2.1 KiB
TypeScript

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<typeof AddDomainRequestSchema>;
export type AddDomainResponse = z.infer<typeof AddDomainResponseSchema>;
export type RemoveDomainRequest = z.infer<typeof RemoveDomainRequestSchema>;
export type RemoveDomainResponse = z.infer<typeof RemoveDomainResponseSchema>;
export type DomainResolveParam = z.infer<typeof DomainResolveParamSchema>;
export type DomainResolveResponse = z.infer<typeof DomainResolveResponseSchema>;