import { z } from "zod"; export const migrationModeSchema = z.union([ z.literal("manual"), z.literal("newRoomsOnly"), z.literal("auto"), ]); const resocketMigrationStepSchema = z.union([ z.object({ newRooms: z.array(z.string()), }), z.object({ deletedRooms: z.array(z.string()), }), z.object({ renamedRooms: z.array( z.object({ from: z.string(), to: z.string(), }) ), }), ]); const resocketMigrationsWithoutStepsSchema = z.object({ id: z.string(), renamedRooms: z .array( z.object({ from: z.string(), to: z.string(), }) ) .optional(), deletedRooms: z.array(z.string()).optional(), newRooms: z.array(z.string()).optional(), }); const resocketMigrationsWithStepsSchema = z.object({ id: z.string(), steps: z.array(resocketMigrationStepSchema), }); const resocketMigrationsSchema = z.union([ resocketMigrationsWithoutStepsSchema, resocketMigrationsWithStepsSchema, ]); export const resocketConfigSchema = z.object({ name: z.string(), main: z.string(), port: z.number().optional().default(8000), rooms: z.union([z.string(), z.array(z.string())]), compatibility_date: z.string().optional(), compatibility_flags: z.array(z.string()).optional(), migrations: z.union([z.array(resocketMigrationsSchema), z.undefined()]), migrationMode: migrationModeSchema.optional(), envFiles: z.array(z.string()).optional(), envs: z.record(z.string()).optional(), domain: z.string().optional(), environment: z.string().optional(), }); export const userConfigSchema = z.object({ version: z.literal("0"), username: z.string(), accessToken: z.string(), }); const debugComplexitySchema = z.union([ z.literal("simple"), z.literal("tricky"), z.literal("oh-shit"), ]); export const errorContextSchema = z.object({ coreMessage: z.string(), highlightAffected: z .object({ title: z.string(), value: z.any(), }) .optional(), complexity: debugComplexitySchema.optional(), humanMessage: z.string().optional(), docs: z.string().optional(), proTip: z.string().optional(), stackTrace: z.string().optional(), }); export const apiErrorContextSchema = errorContextSchema.extend({ name: z.union([ //this is caused by user z.literal("ResocketValidationError"), //this is more of internal server error types error z.literal("ResocketServerError"), z.literal("InternalServerError"), ]), }); export const apiResponseBaseSchema = z.union([ z.object({ success: z.literal(true), data: z.any(), }), z.object({ success: z.literal(false), error: apiErrorContextSchema, }), ]);