import type { Encodable } from "@automate.ax/codec" import type { Vercel } from "@vercel/sdk" import * as z from "zod" /** * Types an official SDK-decoded object while enforcing stable public fields. * * @param schema - Runtime object shape to enforce. */ export function vercelObjectSchema( schema: z.ZodObject, ): z.ZodType { return z.custom((value) => schema.safeParse(value).success) } /** * Types an official SDK-decoded array while enforcing stable public fields. * * @param itemSchema - Runtime shape required for every array item. */ export function vercelArraySchema( itemSchema: z.ZodType, ): z.ZodType { return z.custom( (value) => Array.isArray(value) && value.every((item) => itemSchema.safeParse(item).success), ) } const VERCEL_USER_RESPONSE_BASE_SCHEMA = z.looseObject({ user: z.looseObject({ id: z.string(), username: z.string().optional() }), }) const VERCEL_TEAM_BASE_SCHEMA = z.looseObject({ id: z.string(), slug: z.string(), }) const VERCEL_TEAM_PAGE_BASE_SCHEMA = z.looseObject({ pagination: z.looseObject({}), teams: VERCEL_TEAM_BASE_SCHEMA.array(), }) const VERCEL_PROJECT_BASE_SCHEMA = z.looseObject({ id: z.string(), name: z.string(), }) const VERCEL_PROJECT_PAGE_BASE_SCHEMA = z.looseObject({ pagination: z.looseObject({}), projects: VERCEL_PROJECT_BASE_SCHEMA.array(), }) const VERCEL_DEPLOYMENT_BASE_SCHEMA = z .looseObject({ id: z.string().optional(), name: z.string(), uid: z.string().optional(), url: z.string(), }) .refine( (deployment) => deployment.id !== undefined || deployment.uid !== undefined, ) const VERCEL_DEPLOYMENT_PAGE_BASE_SCHEMA = z.looseObject({ deployments: VERCEL_DEPLOYMENT_BASE_SCHEMA.array(), pagination: z.looseObject({}), }) const VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA = z.looseObject({ key: z.string(), }) const VERCEL_PROJECT_DOMAIN_BASE_SCHEMA = z.looseObject({ name: z.string(), projectId: z.string(), verified: z.boolean(), }) const VERCEL_PROJECT_DOMAIN_PAGE_BASE_SCHEMA = z.looseObject({ domains: z.looseObject({ name: z.string() }).array(), pagination: z.looseObject({}), }) const VERCEL_GLOBAL_CONFIG_BASE_SCHEMA = z.looseObject({ createdAt: z.number(), digest: z.string(), id: z.string(), itemCount: z.number(), ownerId: z.string(), sizeInBytes: z.number(), slug: z.string(), updatedAt: z.number(), }) /** Official Vercel current-user response. */ type VercelUserResponse = NonNullable< Awaited> > & Encodable /** Official Vercel team response. */ type VercelTeam = Awaited> & Encodable /** Official Vercel team-list response. */ type VercelTeamPage = Awaited> & Encodable /** Official Vercel project response. */ type VercelProject = Awaited> & Encodable /** Official Vercel created-project response. */ type CreatedVercelProject = Awaited< ReturnType > & Encodable /** Official Vercel updated-project response. */ type UpdatedVercelProject = Awaited< ReturnType > & Encodable /** Official Vercel project-list response. */ type VercelProjectPage = Awaited< ReturnType > & Encodable /** Official Vercel deployment response. */ type VercelDeployment = Awaited< ReturnType > & Encodable /** Official Vercel created-deployment response. */ type CreatedVercelDeployment = Awaited< ReturnType > & Encodable /** Official Vercel canceled-deployment response. */ type CanceledVercelDeployment = Awaited< ReturnType > & Encodable /** Official Vercel deployment-list response. */ type VercelDeploymentPage = Awaited< ReturnType > & Encodable /** Official Vercel project environment-variable list response. */ type VercelEnvironmentVariables = Awaited< ReturnType > & Encodable /** Official Vercel created environment-variable response. */ type CreatedVercelEnvironmentVariable = Awaited< ReturnType > & Encodable /** Official Vercel updated environment-variable response. */ type UpdatedVercelEnvironmentVariable = Awaited< ReturnType > & Encodable /** Official Vercel removed environment-variable response. */ type RemovedVercelEnvironmentVariable = Awaited< ReturnType > & Encodable /** Official Vercel project-domain list response. */ type VercelProjectDomainPage = Awaited< ReturnType > & Encodable /** Official Vercel added project-domain response. */ type VercelProjectDomain = Awaited< ReturnType > & Encodable /** Official Vercel verified project-domain response. */ type VerifiedVercelProjectDomain = Awaited< ReturnType > & Encodable /** One item from Vercel's Global Config list response. */ type VercelGlobalConfig = Awaited< ReturnType > & Encodable export const VERCEL_USER_RESPONSE_SCHEMA = z.custom( (value) => VERCEL_USER_RESPONSE_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_TEAM_SCHEMA = z.custom( (value) => VERCEL_TEAM_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_TEAM_PAGE_SCHEMA = z.custom( (value) => VERCEL_TEAM_PAGE_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_PROJECT_SCHEMA = z.custom( (value) => VERCEL_PROJECT_BASE_SCHEMA.safeParse(value).success, ) export const CREATED_VERCEL_PROJECT_SCHEMA = z.custom( (value) => VERCEL_PROJECT_BASE_SCHEMA.safeParse(value).success, ) export const UPDATED_VERCEL_PROJECT_SCHEMA = z.custom( (value) => VERCEL_PROJECT_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_PROJECT_PAGE_SCHEMA = z.custom( (value) => VERCEL_PROJECT_PAGE_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_DEPLOYMENT_SCHEMA = z.custom( (value) => VERCEL_DEPLOYMENT_BASE_SCHEMA.safeParse(value).success, ) export const CREATED_VERCEL_DEPLOYMENT_SCHEMA = z.custom( (value) => VERCEL_DEPLOYMENT_BASE_SCHEMA.safeParse(value).success, ) export const CANCELED_VERCEL_DEPLOYMENT_SCHEMA = z.custom( (value) => VERCEL_DEPLOYMENT_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_DEPLOYMENT_PAGE_SCHEMA = z.custom( (value) => VERCEL_DEPLOYMENT_PAGE_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_ENVIRONMENT_VARIABLES_SCHEMA = z.custom((value) => { if (Array.isArray(value)) { return value.every( (item) => VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA.safeParse(item).success, ) } return z .looseObject({ envs: VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA.array(), }) .safeParse(value).success }) export const CREATED_VERCEL_ENVIRONMENT_VARIABLE_SCHEMA = z.custom( (value) => z .looseObject({ created: z .union([ VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA, VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA.array(), ]) .optional(), failed: z.looseObject({ error: z.looseObject({}) }).array(), }) .safeParse(value).success, ) export const UPDATED_VERCEL_ENVIRONMENT_VARIABLE_SCHEMA = z.custom( (value) => VERCEL_ENVIRONMENT_VARIABLE_BASE_SCHEMA.safeParse(value).success, ) export const REMOVED_VERCEL_ENVIRONMENT_VARIABLE_SCHEMA = z.custom( (value) => z.union([z.array(z.unknown()), z.looseObject({})]).safeParse(value) .success, ) export const VERCEL_PROJECT_DOMAIN_PAGE_SCHEMA = z.custom( (value) => VERCEL_PROJECT_DOMAIN_PAGE_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_PROJECT_DOMAIN_SCHEMA = z.custom( (value) => VERCEL_PROJECT_DOMAIN_BASE_SCHEMA.safeParse(value).success, ) export const VERIFIED_VERCEL_PROJECT_DOMAIN_SCHEMA = z.custom( (value) => VERCEL_PROJECT_DOMAIN_BASE_SCHEMA.safeParse(value).success, ) export const VERCEL_GLOBAL_CONFIGS_SCHEMA = vercelArraySchema< VercelGlobalConfig[] >(VERCEL_GLOBAL_CONFIG_BASE_SCHEMA)