Openstatus www.openstatus.dev

Revert "Migrate zod v3 to v4 (#1592)" (#1686)

This reverts commit 4cd9e153049a35998a4858c8cfcef323635e80c0.

authored by

Thibault Le Ouay and committed by
GitHub
b07f4bfa 4cd9e153

+1197 -1254
+1 -1
apps/dashboard/next-env.d.ts
··· 1 1 /// <reference types="next" /> 2 2 /// <reference types="next/image-types/global" /> 3 - import "./.next/types/routes.d.ts"; 3 + import "./.next/dev/types/routes.d.ts"; 4 4 5 5 // NOTE: This file should not be edited 6 6 // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
+2 -2
apps/dashboard/package.json
··· 19 19 "@dnd-kit/sortable": "10.0.0", 20 20 "@dnd-kit/utilities": "3.2.2", 21 21 "@hookform/devtools": "4.4.0", 22 - "@hookform/resolvers": "5.1.0", 22 + "@hookform/resolvers": "4.1.3", 23 23 "@libsql/client": "0.15.15", 24 24 "@openpanel/nextjs": "1.0.8", 25 25 "@openstatus/analytics": "workspace:*", ··· 100 100 "superjson": "2.2.2", 101 101 "tailwind-merge": "3.3.1", 102 102 "unified": "11.0.5", 103 - "zod": "4.1.13" 103 + "zod": "3.25.76" 104 104 }, 105 105 "devDependencies": { 106 106 "@tailwindcss/postcss": "4.1.11",
+1 -1
apps/dashboard/src/components/forms/maintenance/form.tsx
··· 56 56 notifySubscribers: z.boolean().optional(), 57 57 }) 58 58 .refine((data) => data.endDate > data.startDate, { 59 - error: "End date cannot be earlier than start date.", 59 + message: "End date cannot be earlier than start date.", 60 60 path: ["endDate"], 61 61 }); 62 62
+2 -2
apps/dashboard/src/components/forms/monitor/form-follow-redirect.tsx
··· 29 29 export const FOLLOW_REDIRECTS_DEFAULT = true; 30 30 31 31 const schema = z.object({ 32 - followRedirects: z.boolean().prefault(true), 32 + followRedirects: z.boolean().default(true), 33 33 }); 34 34 35 - type FormValues = z.input<typeof schema>; 35 + type FormValues = z.infer<typeof schema>; 36 36 37 37 export function FormFollowRedirect({ 38 38 defaultValues,
+5 -7
apps/dashboard/src/components/forms/monitor/form-general.tsx
··· 83 83 value: z.string(), 84 84 }), 85 85 ), 86 - active: z.boolean().optional().prefault(true), 86 + active: z.boolean().optional().default(true), 87 87 assertions: z.array( 88 88 z.discriminatedUnion("type", [ 89 89 statusAssertion, ··· 94 94 ]), 95 95 ), 96 96 body: z.string().optional(), 97 - skipCheck: z.boolean().optional().prefault(false), 98 - saveCheck: z.boolean().optional().prefault(false), 97 + skipCheck: z.boolean().optional().default(false), 98 + saveCheck: z.boolean().optional().default(false), 99 99 }); 100 100 101 - type FormValues = z.input<typeof schema>; 101 + type FormValues = z.infer<typeof schema>; 102 102 103 103 export function FormGeneral({ 104 104 defaultValues, ··· 554 554 placeholder="Header key" 555 555 className="w-full" 556 556 {...field} 557 - value={field.value as string} 558 557 /> 559 558 <FormMessage /> 560 559 </FormItem> ··· 778 777 render={({ field }) => ( 779 778 <FormItem> 780 779 <Select 781 - value={field.value as string} 780 + value={field.value} 782 781 onValueChange={field.onChange} 783 782 > 784 783 <SelectTrigger ··· 840 839 placeholder="Header key" 841 840 className="w-full" 842 841 {...field} 843 - value={field.value as string} 844 842 /> 845 843 <FormMessage /> 846 844 </FormItem>
+8 -8
apps/dashboard/src/components/forms/monitor/form-otel.tsx
··· 32 32 // TODO: add headers 33 33 34 34 const schema = z.object({ 35 - endpoint: z.url("Please enter a valid URL"), 35 + endpoint: z.string().url("Please enter a valid URL"), 36 36 headers: z 37 37 .array(z.object({ key: z.string(), value: z.string() })) 38 - .prefault([]), 38 + .default([]), 39 39 }); 40 40 41 - type FormValues = z.input<typeof schema>; 41 + type FormValues = z.infer<typeof schema>; 42 42 43 43 export function FormOtel({ 44 44 locked, ··· 110 110 render={({ field }) => ( 111 111 <FormItem className="col-span-full"> 112 112 <FormLabel>Request Headers</FormLabel> 113 - {field.value?.map((header, index) => ( 113 + {field.value.map((header, index) => ( 114 114 <div key={index} className="grid gap-2 sm:grid-cols-5"> 115 115 <Input 116 116 placeholder="Key" ··· 118 118 value={header.key} 119 119 disabled={locked} 120 120 onChange={(e) => { 121 - const newHeaders = [...(field.value ?? [])]; 121 + const newHeaders = [...field.value]; 122 122 newHeaders[index] = { 123 123 ...newHeaders[index], 124 124 key: e.target.value, ··· 132 132 value={header.value} 133 133 disabled={locked} 134 134 onChange={(e) => { 135 - const newHeaders = [...(field.value ?? [])]; 135 + const newHeaders = [...field.value]; 136 136 newHeaders[index] = { 137 137 ...newHeaders[index], 138 138 value: e.target.value, ··· 144 144 size="icon" 145 145 variant="ghost" 146 146 onClick={() => { 147 - const newHeaders = field.value?.filter( 147 + const newHeaders = field.value.filter( 148 148 (_, i) => i !== index, 149 149 ); 150 150 field.onChange(newHeaders); ··· 162 162 disabled={locked} 163 163 onClick={() => { 164 164 field.onChange([ 165 - ...(field.value ?? []), 165 + ...field.value, 166 166 { key: "", value: "" }, 167 167 ]); 168 168 }}
+3 -3
apps/dashboard/src/components/forms/monitor/form-response-time.tsx
··· 30 30 const TIMEOUT = 45_000; 31 31 32 32 const schema = z.object({ 33 - degradedAfter: z.coerce.number<number>().optional(), 34 - timeout: z.coerce.number<number>(), 33 + degradedAfter: z.coerce.number().optional(), 34 + timeout: z.coerce.number(), 35 35 }); 36 36 37 - type FormValues = z.input<typeof schema>; 37 + type FormValues = z.infer<typeof schema>; 38 38 39 39 export function FormResponseTime({ 40 40 defaultValues,
+2 -6
apps/dashboard/src/components/forms/monitor/form-retry.tsx
··· 32 32 export const RETRY_DEFAULT = 3; 33 33 34 34 const schema = z.object({ 35 - retry: z.coerce 36 - .number<number>() 37 - .min(RETRY_MIN) 38 - .max(RETRY_MAX) 39 - .prefault(RETRY_DEFAULT), 35 + retry: z.coerce.number().min(RETRY_MIN).max(RETRY_MAX).default(RETRY_DEFAULT), 40 36 }); 41 37 42 - type FormValues = z.input<typeof schema>; 38 + type FormValues = z.infer<typeof schema>; 43 39 44 40 export function FormRetry({ 45 41 defaultValues,
+7 -10
apps/dashboard/src/components/forms/monitor/update.tsx
··· 6 6 import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; 7 7 import { useParams, useRouter } from "next/navigation"; 8 8 import { FormDangerZone } from "./form-danger-zone"; 9 - import { 10 - FOLLOW_REDIRECTS_DEFAULT, 11 - FormFollowRedirect, 12 - } from "./form-follow-redirect"; 9 + import { FormFollowRedirect } from "./form-follow-redirect"; 13 10 import { FormGeneral } from "./form-general"; 14 11 import { FormNotifiers } from "./form-notifiers"; 15 12 import { FormOtel } from "./form-otel"; ··· 229 226 onSubmit={async (values) => 230 227 await updateRetryMutation.mutateAsync({ 231 228 id: Number.parseInt(id), 232 - retry: values.retry ?? RETRY_DEFAULT, 229 + retry: values.retry, 233 230 }) 234 231 } 235 232 /> 236 233 <FormFollowRedirect 237 234 defaultValues={{ 238 - followRedirects: monitor.followRedirects ?? FOLLOW_REDIRECTS_DEFAULT, 235 + followRedirects: monitor.followRedirects ?? true, 239 236 }} 240 - onSubmit={async (values) => 237 + onSubmit={async (values) => { 241 238 await updateFollowRedirectsMutation.mutateAsync({ 242 239 id: Number.parseInt(id), 243 - followRedirects: values.followRedirects ?? FOLLOW_REDIRECTS_DEFAULT, 244 - }) 245 - } 240 + followRedirects: values.followRedirects, 241 + }); 242 + }} 246 243 /> 247 244 <FormOtel 248 245 locked={workspace.limits.otel === false}
+1 -1
apps/dashboard/src/components/forms/notifications/form-discord.tsx
··· 32 32 const schema = z.object({ 33 33 name: z.string(), 34 34 provider: z.literal("discord"), 35 - data: z.url("Please enter a valid URL"), 35 + data: z.string(), 36 36 monitors: z.array(z.number()), 37 37 }); 38 38
+1 -1
apps/dashboard/src/components/forms/notifications/form-email.tsx
··· 29 29 const schema = z.object({ 30 30 name: z.string(), 31 31 provider: z.literal("email"), 32 - data: z.email(), 32 + data: z.string().email(), 33 33 monitors: z.array(z.number()), 34 34 }); 35 35
+1 -1
apps/dashboard/src/components/forms/notifications/form-google-chat.tsx
··· 33 33 const schema = z.object({ 34 34 name: z.string(), 35 35 provider: z.literal("google-chat"), 36 - data: z.url("Please enter a valid URL"), 36 + data: z.string(), 37 37 monitors: z.array(z.number()), 38 38 }); 39 39
+1 -1
apps/dashboard/src/components/forms/notifications/form-slack.tsx
··· 32 32 const schema = z.object({ 33 33 name: z.string(), 34 34 provider: z.literal("slack"), 35 - data: z.url("Please enter a valid URL"), 35 + data: z.string().url(), 36 36 monitors: z.array(z.number()), 37 37 }); 38 38
-3
apps/dashboard/src/components/forms/notifications/form-telegram.tsx
··· 115 115 loading: "Sending test...", 116 116 success: "Test sent", 117 117 error: (error) => { 118 - if (isTRPCClientError(error)) { 119 - return error.message; 120 - } 121 118 if (error instanceof Error) { 122 119 return error.message; 123 120 }
+1 -1
apps/dashboard/src/components/forms/onboarding/create-monitor.tsx
··· 18 18 import { z } from "zod"; 19 19 20 20 const schema = z.object({ 21 - url: z.url(), 21 + url: z.string().url(), 22 22 }); 23 23 24 24 export type FormValues = z.infer<typeof schema>;
+1 -1
apps/dashboard/src/components/forms/settings/form-members.tsx
··· 37 37 import { z } from "zod"; 38 38 39 39 const schema = z.object({ 40 - email: z.email(), 40 + email: z.string().email(), 41 41 role: z.enum(["member"]), 42 42 }); 43 43
+1 -1
apps/dashboard/src/components/forms/status-page/form-configuration.tsx
··· 67 67 return true; 68 68 }, 69 69 { 70 - error: "Value must be manual when type is manual", 70 + message: "Value must be manual when type is manual", 71 71 path: ["value"], 72 72 }, 73 73 );
+3 -3
apps/dashboard/src/components/forms/status-page/form-monitors.tsx
··· 103 103 id: z.number(), 104 104 order: z.number(), 105 105 name: z.string(), 106 - monitors: z.array(monitorSchema).min(1, { 107 - error: "At least one monitor is required", 108 - }), 106 + monitors: z 107 + .array(monitorSchema) 108 + .min(1, { message: "At least one monitor is required" }), 109 109 }), 110 110 ), 111 111 });
+3 -9
apps/dashboard/src/components/forms/support-contact/form.tsx
··· 49 49 ]; 50 50 51 51 export const schema = z.object({ 52 - name: z.string().min(1, { 53 - error: "Name is required", 54 - }), 52 + name: z.string().min(1, { message: "Name is required" }), 55 53 type: z.enum(["bug", "demo", "feature", "security", "question"]), 56 - email: z.email({ 57 - error: "Invalid email address", 58 - }), 59 - message: z.string().min(1, { 60 - error: "Message is required", 61 - }), 54 + email: z.string().email({ message: "Invalid email address" }), 55 + message: z.string().min(1, { message: "Message is required" }), 62 56 blocker: z.boolean(), 63 57 }); 64 58
+1 -1
apps/screenshot-service/package.json
··· 14 14 "@upstash/qstash": "2.6.2", 15 15 "hono": "4.5.3", 16 16 "playwright": "1.46.0", 17 - "zod": "4.1.13" 17 + "zod": "3.25.76" 18 18 }, 19 19 "devDependencies": { 20 20 "@openstatus/tsconfig": "workspace:*",
+1 -1
apps/screenshot-service/src/index.ts
··· 35 35 zValidator( 36 36 "json", 37 37 z.object({ 38 - url: z.url(), 38 + url: z.string().url(), 39 39 incidentId: z.number(), 40 40 kind: z.enum(["incident", "recovery"]), 41 41 }),
+2 -2
apps/server/package.json
··· 13 13 }, 14 14 "dependencies": { 15 15 "@hono/sentry": "1.2.2", 16 - "@hono/zod-openapi": "1.1.5", 16 + "@hono/zod-openapi": "0.15.1", 17 17 "@hono/zod-validator": "0.2.2", 18 18 "@logtape/logtape": "1.1.2", 19 19 "@logtape/sentry": "1.1.2", ··· 35 35 "nanoid": "5.0.7", 36 36 "percentile": "1.6.0", 37 37 "validator": "13.12.0", 38 - "zod": "4.1.13" 38 + "zod": "3.25.76" 39 39 }, 40 40 "devDependencies": { 41 41 "@openstatus/tsconfig": "workspace:*",
+1 -1
apps/server/src/env.ts
··· 13 13 CRON_SECRET: z.string(), 14 14 SCREENSHOT_SERVICE_URL: z.string(), 15 15 QSTASH_TOKEN: z.string(), 16 - NODE_ENV: z.string().prefault("development"), 16 + NODE_ENV: z.string().default("development"), 17 17 SUPER_ADMIN_TOKEN: z.string(), 18 18 RESEND_API_KEY: z.string(), 19 19 },
+3 -3
apps/server/src/routes/v1/check/http/schema.ts
··· 13 13 .number() 14 14 .max(5) 15 15 .optional() 16 - .prefault(1) 16 + .default(1) 17 17 .openapi({ description: "The number of times to run the check" }), 18 18 aggregated: z 19 19 .boolean() ··· 87 87 .optional() 88 88 .openapi({ description: "The body of the response" }), 89 89 headers: z 90 - .record(z.string(), z.string()) 90 + .record(z.string()) 91 91 .optional() 92 92 .openapi({ description: "The headers of the response" }), 93 93 timing: TimingSchema.openapi({ ··· 131 131 }); 132 132 133 133 export const CheckPostResponseSchema = z.object({ 134 - id: z.int().openapi({ description: "The id of the check" }), 134 + id: z.number().int().openapi({ description: "The id of the check" }), 135 135 raw: z.array(TimingSchema).openapi({ 136 136 description: "The raw data of the check", 137 137 }),
+1 -4
apps/server/src/routes/v1/incidents/put.test.ts
··· 60 60 }); 61 61 62 62 const result = (await res.json()) as Record<string, unknown>; 63 - // expect(result.message).toBe("invalid_date in 'acknowledgedAt': Invalid date"); 64 - expect(result.message).toBe( 65 - "invalid_type in 'acknowledgedAt': Invalid input: expected date, received Date", 66 - ); 63 + expect(result.message).toBe("invalid_date in 'acknowledgedAt': Invalid date"); 67 64 expect(res.status).toBe(400); 68 65 }); 69 66
+1 -1
apps/server/src/routes/v1/maintenances/schema.ts
··· 37 37 monitorIds: z 38 38 .array(z.number()) 39 39 .optional() 40 - .prefault([]) 40 + .default([]) 41 41 .openapi({ description: "IDs of affected monitors" }), 42 42 pageId: z.number().openapi({ 43 43 description: "The id of the status page this maintenance belongs to",
+1 -1
apps/server/src/routes/v1/monitors/run/schema.ts
··· 2 2 3 3 export const QuerySchema = z 4 4 .object({ 5 - "no-wait": z.coerce.boolean().optional().prefault(false).openapi({ 5 + "no-wait": z.coerce.boolean().optional().default(false).openapi({ 6 6 description: "Don't wait for the result", 7 7 }), 8 8 })
+62 -52
apps/server/src/routes/v1/monitors/schema.ts
··· 20 20 description: "The comparison to run", 21 21 example: "eq", 22 22 }), 23 - target: z.int().positive().openapi({ description: "The target value" }), 23 + target: z 24 + .number() 25 + .int() 26 + .positive() 27 + .openapi({ description: "The target value" }), 24 28 }) 25 29 .openapi({ 26 30 description: "The status assertion", ··· 90 94 }), 91 95 }); 92 96 93 - const PeriodicityEnumHonoSchema = z.enum([...monitorPeriodicitySchema.options]); 94 - 95 97 export const MonitorSchema = z 96 98 .object({ 97 99 id: z.number().openapi({ 98 100 example: 123, 99 101 description: "The id of the monitor", 100 102 }), 101 - periodicity: PeriodicityEnumHonoSchema.openapi({ 103 + periodicity: monitorPeriodicitySchema.openapi({ 102 104 example: "1m", 103 105 description: "How often the monitor should run", 104 106 }), ··· 109 111 regions: z 110 112 .preprocess( 111 113 (val) => { 112 - let parsedRegions: Array<unknown> = []; 113 - if (!val) return parsedRegions; 114 + let regions: Array<unknown> = []; 115 + if (!val) return regions; 114 116 if (Array.isArray(val)) { 115 - parsedRegions = val; 117 + regions = val; 116 118 } 117 119 if (String(val).length > 0) { 118 - parsedRegions = String(val).split(","); 120 + regions = String(val).split(","); 121 + } 122 + 123 + const deprecatedRegions = regions.filter((r) => { 124 + return !AVAILABLE_REGIONS.includes( 125 + r as (typeof AVAILABLE_REGIONS)[number], 126 + ); 127 + }); 128 + 129 + if (deprecatedRegions.length > 0) { 130 + throw new ZodError([ 131 + { 132 + code: "custom", 133 + path: ["regions"], 134 + message: `Deprecated regions are not allowed: ${deprecatedRegions.join( 135 + ", ", 136 + )}`, 137 + }, 138 + ]); 119 139 } 120 - return parsedRegions; 140 + 141 + return regions; 121 142 }, 122 143 z.array(z.enum(monitorRegions)), 123 144 ) 124 - .superRefine((regions, ctx) => { 125 - const deprecatedRegions = regions.filter((r) => { 126 - return !AVAILABLE_REGIONS.includes( 127 - r as (typeof AVAILABLE_REGIONS)[number], 128 - ); 129 - }); 130 - if (deprecatedRegions.length > 0) { 131 - ctx.addIssue({ 132 - code: "custom", 133 - path: ["regions"], 134 - message: `Deprecated regions are not allowed: ${deprecatedRegions.join( 135 - ", ", 136 - )}`, 137 - }); 138 - } 139 - }) 140 - .prefault([]) 145 + .default([]) 141 146 .openapi({ 142 147 example: ["ams"], 143 148 description: "Where we should monitor it", ··· 161 166 return String(val); 162 167 }, z.string()) 163 168 .nullish() 164 - .prefault("") 169 + .default("") 165 170 .openapi({ 166 171 example: "Hello World", 167 172 description: "The body", ··· 185 190 ]); 186 191 } 187 192 }, 188 - z.array(z.object({ key: z.string(), value: z.string() })).prefault([]), 193 + z.array(z.object({ key: z.string(), value: z.string() })).default([]), 189 194 ) 190 195 .nullish() 191 196 .openapi({ ··· 211 216 } 212 217 }, z.array(assertion)) 213 218 .nullish() 214 - .prefault([]) 219 + .default([]) 215 220 .openapi({ 216 221 description: "The assertions to run", 217 222 }), 218 223 active: z 219 224 .boolean() 220 - .prefault(false) 225 + .default(false) 221 226 .openapi({ description: "If the monitor is active" }), 222 227 public: z 223 228 .boolean() 224 - .prefault(false) 229 + .default(false) 225 230 .openapi({ description: "If the monitor is public" }), 226 231 degradedAfter: z.number().nullish().openapi({ 227 232 description: 228 233 "The time after the monitor is considered degraded in milliseconds", 229 234 }), 230 - timeout: z.number().nullish().prefault(45000).openapi({ 235 + timeout: z.number().nullish().default(45000).openapi({ 231 236 description: "The timeout of the request in milliseconds", 232 237 }), 233 - retry: z.number().prefault(3).openapi({ 238 + retry: z.number().default(3).openapi({ 234 239 description: "The number of retries to attempt", 235 240 }), 236 - followRedirects: z.boolean().prefault(true).openapi({ 241 + followRedirects: z.boolean().default(true).openapi({ 237 242 description: "If the monitor should follow redirects", 238 243 }), 239 - jobType: z.enum(monitorJobTypes).optional().prefault("http").openapi({ 244 + jobType: z.enum(monitorJobTypes).optional().default("http").openapi({ 240 245 description: "The type of the monitor", 241 246 }), 242 247 openTelemetry: z 243 248 .object({ 244 - endpoint: z.url().optional().prefault("http://localhost:4317").openapi({ 245 - description: "The endpoint of the OpenTelemetry collector", 246 - }), 247 - headers: z 248 - .record(z.string(), z.string()) 249 + endpoint: z 250 + .string() 251 + .url() 249 252 .optional() 250 - .prefault({}) 253 + .default("http://localhost:4317") 251 254 .openapi({ 252 - description: "The headers to send to the OpenTelemetry collector", 255 + description: "The endpoint of the OpenTelemetry collector", 253 256 }), 257 + headers: z.record(z.string()).optional().default({}).openapi({ 258 + description: "The headers to send to the OpenTelemetry collector", 259 + }), 254 260 }) 255 261 .optional() 256 262 .openapi({ ··· 310 316 ]); 311 317 312 318 export const ResultRun = z.object({ 313 - latency: z.int(), // in ms 314 - statusCode: z.int().nullable().prefault(null), 315 - monitorId: z.string().prefault(""), 319 + latency: z.number().int(), // in ms 320 + statusCode: z.number().int().nullable().default(null), 321 + monitorId: z.string().default(""), 316 322 url: z.string().optional(), 317 - error: z.coerce.boolean().prefault(false), 323 + error: z.coerce.boolean().default(false), 318 324 region: z.enum(monitorRegions), 319 - timestamp: z.int().optional(), 325 + timestamp: z.number().int().optional(), 320 326 message: z.string().nullable().optional(), 321 327 timing: z 322 328 .preprocess((val) => { ··· 407 413 }, 408 414 z.array(z.enum(monitorRegions)), 409 415 ) 410 - .prefault([]) 416 + .default([]) 411 417 .openapi({ 412 418 example: ["ams"], 413 419 description: "Where we should monitor it", ··· 415 421 openTelemetry: z 416 422 .object({ 417 423 endpoint: z 424 + .string() 418 425 .url() 419 426 .optional() 420 427 .openapi({ ··· 434 441 435 442 const httpRequestSchema = z.object({ 436 443 method: z.enum(monitorMethods), 437 - url: z.url().openapi({ 438 - description: "URL to request", 439 - examples: ["https://openstat.us", "https://www.openstatus.dev"], 440 - }), 444 + url: z 445 + .string() 446 + .url() 447 + .openapi({ 448 + description: "URL to request", 449 + examples: ["https://openstat.us", "https://www.openstatus.dev"], 450 + }), 441 451 headers: z 442 452 .record(z.string(), z.string()) 443 453 .optional()
+5 -2
apps/server/src/routes/v1/monitors/summary/schema.ts
··· 4 4 export { ParamsSchema }; 5 5 6 6 export const SummarySchema = z.object({ 7 - ok: z.int().openapi({ 7 + ok: z.number().int().openapi({ 8 8 description: 9 9 "The number of ok responses (defined by the assertions - or by default status code 200)", 10 10 }), 11 - count: z.int().openapi({ description: "The total number of request" }), 11 + count: z 12 + .number() 13 + .int() 14 + .openapi({ description: "The total number of request" }), 12 15 day: z.coerce 13 16 .date() 14 17 .openapi({ description: "The date of the daily stat in ISO8601 format" }),
+1 -1
apps/server/src/routes/v1/pageSubscribers/schema.ts
··· 20 20 description: "The id of the subscriber", 21 21 example: 1, 22 22 }), 23 - email: z.email().openapi({ 23 + email: z.string().email().openapi({ 24 24 description: "The email of the subscriber", 25 25 }), 26 26 pageId: z.number().openapi({
+3 -2
apps/server/src/routes/v1/pages/schema.ts
··· 43 43 example: "status.acme.com", 44 44 }), 45 45 icon: z 46 + .string() 46 47 .url() 47 48 .or(z.literal("")) 48 49 .transform((val) => (val ? val : undefined)) ··· 51 52 description: "The icon of the page", 52 53 example: "https://example.com/icon.png", 53 54 }), 54 - passwordProtected: z.boolean().optional().prefault(false).openapi({ 55 + passwordProtected: z.boolean().optional().default(false).openapi({ 55 56 description: 56 57 "Make the page password protected. Used with the 'passwordProtected' property.", 57 58 example: true, ··· 60 61 description: "Your password to protect the page from the public", 61 62 example: "hidden-password", 62 63 }), 63 - showMonitorValues: z.boolean().optional().nullish().prefault(true).openapi({ 64 + showMonitorValues: z.boolean().optional().nullish().default(true).openapi({ 64 65 description: 65 66 "Displays the total and failed request numbers for each monitor", 66 67 example: true,
+1 -1
apps/server/src/routes/v1/statusReportUpdates/schema.ts
··· 22 22 status: z.enum(statusReportStatus).openapi({ 23 23 description: "The status of the update", 24 24 }), 25 - date: z.coerce.date().prefault(new Date()).openapi({ 25 + date: z.coerce.date().default(new Date()).openapi({ 26 26 description: "The date of the update in ISO8601 format", 27 27 }), 28 28 message: z.string().openapi({
+1 -1
apps/server/src/routes/v1/statusReports/post.ts
··· 32 32 id: true, 33 33 statusReportUpdateIds: true, 34 34 }).extend({ 35 - date: z.coerce.date().optional().prefault(new Date()).openapi({ 35 + date: z.coerce.date().optional().default(new Date()).openapi({ 36 36 description: 37 37 "The date of the report in ISO8601 format, defaults to now", 38 38 }),
+2 -2
apps/server/src/routes/v1/statusReports/schema.ts
··· 30 30 .array(z.number()) 31 31 .optional() 32 32 .nullable() 33 - .prefault([]) 33 + .default([]) 34 34 .openapi({ 35 35 description: "The ids of the status report updates", 36 36 }), 37 37 monitorIds: z 38 38 .array(z.number()) 39 39 .optional() 40 - .prefault([]) 40 + .default([]) 41 41 .openapi({ description: "Ids of the monitors the status report." }), 42 42 pageId: z.number().openapi({ 43 43 description: "The id of the page this status report belongs to",
+1 -1
apps/server/src/routes/v1/whoami/schema.ts
··· 9 9 .optional() 10 10 .openapi({ description: "The current workspace name" }), 11 11 slug: z.string().openapi({ description: "The current workspace slug" }), 12 - plan: z.enum(workspacePlans).nullable().prefault("free").openapi({ 12 + plan: z.enum(workspacePlans).nullable().default("free").openapi({ 13 13 description: "The current workspace plan", 14 14 }), 15 15 })
+2 -2
apps/status-page/package.json
··· 18 18 "@dnd-kit/sortable": "10.0.0", 19 19 "@dnd-kit/utilities": "3.2.2", 20 20 "@hookform/devtools": "4.4.0", 21 - "@hookform/resolvers": "5.1.0", 21 + "@hookform/resolvers": "4.1.3", 22 22 "@libsql/client": "0.15.15", 23 23 "@openpanel/nextjs": "1.0.8", 24 24 "@openstatus/analytics": "workspace:*", ··· 83 83 "superjson": "2.2.2", 84 84 "tailwind-merge": "3.3.1", 85 85 "unified": "11.0.5", 86 - "zod": "4.1.13" 86 + "zod": "3.25.76" 87 87 }, 88 88 "devDependencies": { 89 89 "@openstatus/tsconfig": "workspace:*",
+4 -4
apps/status-page/src/app/(status-page)/[domain]/layout.tsx
··· 18 18 import { z } from "zod"; 19 19 20 20 export const schema = z.object({ 21 - value: z.enum(["duration", "requests", "manual"]).prefault("duration"), 22 - type: z.enum(["absolute", "manual"]).prefault("absolute"), 23 - uptime: z.coerce.boolean().prefault(true), 24 - theme: z.enum(THEME_KEYS as [ThemeKey, ...ThemeKey[]]).prefault("default"), 21 + value: z.enum(["duration", "requests", "manual"]).default("duration"), 22 + type: z.enum(["absolute", "manual"]).default("absolute"), 23 + uptime: z.coerce.boolean().default(true), 24 + theme: z.enum(THEME_KEYS as [ThemeKey, ...ThemeKey[]]).default("default"), 25 25 }); 26 26 27 27 export default async function Layout({
+1 -1
apps/status-page/src/components/forms/form-subscribe-email.tsx
··· 16 16 import { z } from "zod"; 17 17 18 18 const schema = z.object({ 19 - email: z.email(), 19 + email: z.string().email(), 20 20 }); 21 21 22 22 type FormValues = z.infer<typeof schema>;
+1 -1
apps/web/next-env.d.ts
··· 1 1 /// <reference types="next" /> 2 2 /// <reference types="next/image-types/global" /> 3 - import "./.next/types/routes.d.ts"; 3 + import "./.next/dev/types/routes.d.ts"; 4 4 5 5 // NOTE: This file should not be edited 6 6 // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
+2 -2
apps/web/package.json
··· 14 14 "@auth/core": "0.40.0", 15 15 "@auth/drizzle-adapter": "1.10.0", 16 16 "@google-cloud/tasks": "4.0.1", 17 - "@hookform/resolvers": "5.1.0", 17 + "@hookform/resolvers": "4.1.3", 18 18 "@libsql/client": "0.15.15", 19 19 "@openpanel/nextjs": "1.0.8", 20 20 "@openstatus/analytics": "workspace:*", ··· 91 91 "superjson": "2.2.2", 92 92 "tailwind-merge": "3.3.1", 93 93 "tailwindcss-animate": "1.0.7", 94 - "zod": "4.1.13" 94 + "zod": "3.25.76" 95 95 }, 96 96 "devDependencies": { 97 97 "@openstatus/tsconfig": "workspace:*",
+2 -2
apps/web/src/app/(landing)/status/utils.ts
··· 15 15 name: z.string(), 16 16 url: z.string(), 17 17 external_id: z.string(), 18 - last_updated_at: z.iso.datetime({ offset: true }), 18 + last_updated_at: z.string().datetime({ offset: true }), 19 19 time_zone: z.string(), 20 20 status_indicator: z.string(), 21 21 status_description: atlassianDescriptionEnum, 22 22 created_at: z.string(), 23 - updated_at: z.iso.datetime(), 23 + updated_at: z.string().datetime(), 24 24 }); 25 25 26 26 export const externalStatusArray = z.array(externalStatus);
+2 -4
apps/web/src/app/api/checker/cron/_cron.ts
··· 89 89 const monitors = z.array(selectMonitorSchema).safeParse(result); 90 90 const allResult = []; 91 91 if (!monitors.success) { 92 - console.error( 93 - `Error while fetching the monitors ${monitors.error.issues.map((issue) => issue.message).join(", ")}`, 94 - ); 92 + console.error(`Error while fetching the monitors ${monitors.error.errors}`); 95 93 throw new Error("Error while fetching the monitors"); 96 94 } 97 95 ··· 106 104 const monitorStatus = z.array(selectMonitorStatusSchema).safeParse(result); 107 105 if (!monitorStatus.success) { 108 106 console.error( 109 - `Error while fetching the monitor status ${monitorStatus.error.issues.map((issue) => issue.message).join(", ")}`, 107 + `Error while fetching the monitor status ${monitorStatus.error.errors}`, 110 108 ); 111 109 continue; 112 110 }
+1 -1
apps/web/src/app/api/checker/test/http/route.ts
··· 21 21 const json = await request.json(); 22 22 const _valid = httpPayloadSchema 23 23 .pick({ url: true, method: true, headers: true, body: true }) 24 - .extend(z.object({ region: monitorRegionSchema.prefault("ams") }).shape) 24 + .merge(z.object({ region: monitorRegionSchema.default("ams") })) 25 25 .safeParse(json); 26 26 27 27 if (!_valid.success) {
+1 -1
apps/web/src/app/api/checker/test/tcp/route.ts
··· 22 22 const json = await request.json(); 23 23 const _valid = tcpPayload 24 24 .pick({ url: true }) 25 - .extend(z.object({ region: monitorRegionSchema.prefault("ams") }).shape) 25 + .merge(z.object({ region: monitorRegionSchema.default("ams") })) 26 26 .safeParse(json); 27 27 28 28 if (!_valid.success) {
+5 -5
apps/web/src/app/api/checker/test/tcp/schema.ts
··· 7 7 monitorId: z.string(), 8 8 url: z.string(), 9 9 cronTimestamp: z.number(), 10 - timeout: z.number().prefault(45000), 10 + timeout: z.number().default(45000), 11 11 degradedAfter: z.number().nullable(), 12 12 }); 13 13 14 14 export const TCPResponse = z.object({ 15 - type: z.literal("tcp").prefault("tcp"), 15 + type: z.literal("tcp").default("tcp"), 16 16 requestId: z.number().optional(), 17 17 workspaceId: z.number().optional(), 18 18 monitorId: z.number().optional(), ··· 27 27 }); 28 28 29 29 export const TCPResponseTest = TCPResponse.extend({ 30 - state: z.literal("success").prefault("success"), 30 + state: z.literal("success").default("success"), 31 31 }).or( 32 32 z.object({ 33 - type: z.literal("tcp").prefault("tcp"), 34 - state: z.literal("error").prefault("error"), 33 + type: z.literal("tcp").default("tcp"), 34 + state: z.literal("error").default("error"), 35 35 }), 36 36 ); 37 37 export type tcpPayload = z.infer<typeof tcpPayload>;
+6 -6
apps/web/src/components/ping-response-analysis/utils.ts
··· 100 100 }); 101 101 102 102 export const checkerSchema = z.object({ 103 - type: z.literal("http").prefault("http"), 104 - state: z.literal("success").prefault("success"), 103 + type: z.literal("http").default("http"), 104 + state: z.literal("success").default("success"), 105 105 status: z.number(), 106 106 latency: z.number(), 107 - headers: z.record(z.string(), z.string()), 107 + headers: z.record(z.string()), 108 108 timestamp: z.number(), 109 109 timing: timingSchema, 110 110 body: z.string().optional().nullable(), ··· 113 113 export const cachedCheckerSchema = z.object({ 114 114 url: z.string(), 115 115 timestamp: z.number(), 116 - method: z.enum(["GET", "POST", "PUT", "DELETE"]).prefault("GET"), 116 + method: z.enum(["GET", "POST", "PUT", "DELETE"]).default("GET"), 117 117 checks: checkerSchema.extend({ region: monitorRegionSchema }).array(), 118 118 }); 119 119 120 120 const errorRequest = z.object({ 121 121 message: z.string(), 122 - state: z.literal("error").prefault("error"), 122 + state: z.literal("error").default("error"), 123 123 }); 124 124 125 125 export const regionCheckerSchema = checkerSchema.extend({ 126 126 region: monitorRegionSchema, 127 - state: z.literal("success").prefault("success"), 127 + state: z.literal("success").default("success"), 128 128 }); 129 129 130 130 export const regionCheckerSchemaResponse = regionCheckerSchema.or(
+1 -1
apps/web/src/env.ts
··· 19 19 GCP_CLIENT_EMAIL: z.string(), 20 20 GCP_PRIVATE_KEY: z.string(), 21 21 CRON_SECRET: z.string(), 22 - EXTERNAL_API_URL: z.url(), 22 + EXTERNAL_API_URL: z.string().url(), 23 23 CLICKHOUSE_URL: z.string(), 24 24 CLICKHOUSE_USERNAME: z.string(), 25 25 CLICKHOUSE_PASSWORD: z.string(),
+1 -1
apps/web/src/lib/preferred-settings/validation.ts
··· 2 2 3 3 export const preferencesSchema = z 4 4 .object({ 5 - combinedRegions: z.boolean().nullable().prefault(false).optional(), 5 + combinedRegions: z.boolean().nullable().default(false).optional(), 6 6 // ... other settings to store user preferences 7 7 // accessible via document.cookie in the client and cookies() on the server 8 8 })
+1 -1
apps/workflows/package.json
··· 33 33 "effect": "3.19.12", 34 34 "hono": "4.5.3", 35 35 "limiter": "^3.0.0", 36 - "zod": "4.1.13" 36 + "zod": "3.25.76" 37 37 }, 38 38 "devDependencies": { 39 39 "@openstatus/tsconfig": "workspace:*",
+17 -17
apps/workflows/src/env.ts
··· 3 3 export const env = () => 4 4 z 5 5 .object({ 6 - NODE_ENV: z.string().prefault("development"), 7 - PORT: z.coerce.number().prefault(3000), 8 - GCP_PROJECT_ID: z.string().prefault(""), 9 - GCP_CLIENT_EMAIL: z.string().prefault(""), 10 - GCP_PRIVATE_KEY: z.string().prefault(""), 11 - GCP_LOCATION: z.string().prefault("europe-west1"), 12 - CRON_SECRET: z.string().prefault(""), 13 - SITE_URL: z.string().prefault("http://localhost:3000"), 14 - DATABASE_URL: z.string().prefault("http://localhost:8080"), 15 - DATABASE_AUTH_TOKEN: z.string().prefault(""), 16 - RESEND_API_KEY: z.string().prefault(""), 17 - TINY_BIRD_API_KEY: z.string().prefault(""), 18 - QSTASH_TOKEN: z.string().prefault(""), 19 - SCREENSHOT_SERVICE_URL: z.string().prefault(""), 20 - TWILLIO_AUTH_TOKEN: z.string().prefault(""), 21 - TWILLIO_ACCOUNT_ID: z.string().prefault(""), 22 - SENTRY_DSN: z.string().prefault(""), 6 + NODE_ENV: z.string().default("development"), 7 + PORT: z.coerce.number().default(3000), 8 + GCP_PROJECT_ID: z.string().default(""), 9 + GCP_CLIENT_EMAIL: z.string().default(""), 10 + GCP_PRIVATE_KEY: z.string().default(""), 11 + GCP_LOCATION: z.string().default("europe-west1"), 12 + CRON_SECRET: z.string().default(""), 13 + SITE_URL: z.string().default("http://localhost:3000"), 14 + DATABASE_URL: z.string().default("http://localhost:8080"), 15 + DATABASE_AUTH_TOKEN: z.string().default(""), 16 + RESEND_API_KEY: z.string().default(""), 17 + TINY_BIRD_API_KEY: z.string().default(""), 18 + QSTASH_TOKEN: z.string().default(""), 19 + SCREENSHOT_SERVICE_URL: z.string().default(""), 20 + TWILLIO_AUTH_TOKEN: z.string().default(""), 21 + TWILLIO_ACCOUNT_ID: z.string().default(""), 22 + SENTRY_DSN: z.string().default(""), 23 23 }) 24 24 .parse(process.env);
+1 -1
packages/analytics/package.json
··· 6 6 "dependencies": { 7 7 "@openpanel/sdk": "1.0.0", 8 8 "@t3-oss/env-core": "0.7.1", 9 - "zod": "4.1.13" 9 + "zod": "3.25.76" 10 10 }, 11 11 "devDependencies": { 12 12 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/api/package.json
··· 32 32 "random-word-slugs": "0.1.7", 33 33 "stripe": "13.8.0", 34 34 "superjson": "2.2.2", 35 - "zod": "4.1.13" 35 + "zod": "3.25.76" 36 36 }, 37 37 "devDependencies": { 38 38 "@openstatus/tsconfig": "workspace:*",
+18 -20
packages/api/src/router/checker.ts
··· 26 26 27 27 // Input schemas 28 28 const httpTestInput = z.object({ 29 - url: z.url(), 29 + url: z.string().url(), 30 30 method: z 31 31 .enum([ 32 32 "GET", ··· 39 39 "CONNECT", 40 40 "TRACE", 41 41 ]) 42 - .prefault("GET"), 42 + .default("GET"), 43 43 headers: z.array(z.object({ key: z.string(), value: z.string() })).optional(), 44 44 body: z.string().optional(), 45 - region: monitorRegionSchema.optional().prefault("ams"), 45 + region: monitorRegionSchema.optional().default("ams"), 46 46 assertions: z 47 47 .array( 48 48 z.discriminatedUnion("type", [ ··· 53 53 recordAssertion, 54 54 ]), 55 55 ) 56 - .prefault([]), 56 + .default([]), 57 57 }); 58 58 59 59 const tcpTestInput = z.object({ 60 60 url: z.string(), 61 - region: monitorRegionSchema.optional().prefault("ams"), 61 + region: monitorRegionSchema.optional().default("ams"), 62 62 }); 63 63 64 64 const dnsTestInput = z.object({ 65 65 url: z.string(), 66 - region: monitorRegionSchema.optional().prefault("ams"), 66 + region: monitorRegionSchema.optional().default("ams"), 67 67 assertions: z 68 68 .array( 69 69 z.discriminatedUnion("type", [ ··· 74 74 jsonBodyAssertion, 75 75 ]), 76 76 ) 77 - .prefault([]), 77 + .default([]), 78 78 }); 79 79 80 80 export const tcpOutput = z 81 81 .object({ 82 - state: z.literal("success").prefault("success"), 83 - type: z.literal("tcp").prefault("tcp"), 82 + state: z.literal("success").default("success"), 83 + type: z.literal("tcp").default("tcp"), 84 84 requestId: z.number().optional(), 85 85 workspaceId: z.number().optional(), 86 86 monitorId: z.number().optional(), ··· 95 95 }) 96 96 .or( 97 97 z.object({ 98 - state: z.literal("error").prefault("error"), 98 + state: z.literal("error").default("error"), 99 99 message: z.string(), 100 100 }), 101 101 ); 102 102 103 103 export const httpOutput = z 104 104 .object({ 105 - state: z.literal("success").prefault("success"), 106 - type: z.literal("http").prefault("http"), 105 + state: z.literal("success").default("success"), 106 + type: z.literal("http").default("http"), 107 107 status: z.number(), 108 108 latency: z.number(), 109 - headers: z.record(z.string(), z.string()), 109 + headers: z.record(z.string()), 110 110 timestamp: z.number(), 111 111 timing: z.object({ 112 112 dnsStart: z.number(), ··· 125 125 }) 126 126 .or( 127 127 z.object({ 128 - state: z.literal("error").prefault("error"), 128 + state: z.literal("error").default("error"), 129 129 message: z.string(), 130 130 }), 131 131 ); 132 132 133 133 export const dnsOutput = z 134 134 .object({ 135 - state: z.literal("success").prefault("success"), 136 - type: z.literal("dns").prefault("dns"), 137 - records: z 138 - .partialRecord(z.enum(dnsRecords), z.array(z.string())) 139 - .prefault({}), 135 + state: z.literal("success").default("success"), 136 + type: z.literal("dns").default("dns"), 137 + records: z.record(z.enum(dnsRecords), z.array(z.string())).default({}), 140 138 latency: z.number().optional(), 141 139 timestamp: z.number(), 142 140 region: monitorRegionSchema, 143 141 }) 144 142 .or( 145 143 z.object({ 146 - state: z.literal("error").prefault("error"), 144 + state: z.literal("error").default("error"), 147 145 message: z.string(), 148 146 }), 149 147 );
+1 -1
packages/api/src/router/domain.ts
··· 13 13 .array(z.union([z.literal("dns-01"), z.literal("http-01")])) 14 14 .optional() 15 15 .nullable(), 16 - misconfigured: z.boolean().prefault(true).optional(), 16 + misconfigured: z.boolean().default(true).optional(), 17 17 }); 18 18 19 19 export const domainResponseSchema = z.object({
+1 -1
packages/api/src/router/feedback.ts
··· 13 13 isMobile: z.boolean().optional(), 14 14 // NOTE: coming from ContactForm 15 15 name: z.string().optional(), 16 - email: z.email().optional(), 16 + email: z.string().email().optional(), 17 17 blocker: z.boolean().optional(), 18 18 type: z.string().optional(), 19 19 }),
+18 -18
packages/api/src/router/monitor.ts
··· 218 218 monitorTag: selectMonitorTagSchema, 219 219 }) 220 220 .array(), 221 - maintenance: z.boolean().prefault(false).optional(), 221 + maintenance: z.boolean().default(false).optional(), 222 222 monitorsToNotifications: z 223 223 .object({ 224 224 notification: selectNotificationSchema, ··· 659 659 selectMonitorSchema.extend({ 660 660 monitorTagsToMonitors: z 661 661 .array(z.object({ monitorTag: selectMonitorTagSchema })) 662 - .prefault([]), 662 + .default([]), 663 663 }), 664 664 ) 665 665 .parse(monitors); ··· 695 695 selectMonitorSchema.extend({ 696 696 monitorTagsToMonitors: z 697 697 .array(z.object({ monitorTag: selectMonitorTagSchema })) 698 - .prefault([]), 698 + .default([]), 699 699 }), 700 700 ) 701 701 .parse( ··· 853 853 return z 854 854 .array( 855 855 selectMonitorSchema.extend({ 856 - tags: z.array(selectMonitorTagSchema).prefault([]), 857 - incidents: z.array(selectIncidentSchema).prefault([]), 856 + tags: z.array(selectMonitorTagSchema).default([]), 857 + incidents: z.array(selectIncidentSchema).default([]), 858 858 }), 859 859 ) 860 860 .parse( ··· 900 900 901 901 return selectMonitorSchema 902 902 .extend({ 903 - notifications: z.array(selectNotificationSchema).prefault([]), 904 - pages: z.array(selectPageSchema).prefault([]), 905 - tags: z.array(selectMonitorTagSchema).prefault([]), 906 - maintenances: z.array(selectMaintenanceSchema).prefault([]), 907 - incidents: z.array(selectIncidentSchema).prefault([]), 908 - privateLocations: z.array(selectPrivateLocationSchema).prefault([]), 903 + notifications: z.array(selectNotificationSchema).default([]), 904 + pages: z.array(selectPageSchema).default([]), 905 + tags: z.array(selectMonitorTagSchema).default([]), 906 + maintenances: z.array(selectMaintenanceSchema).default([]), 907 + incidents: z.array(selectIncidentSchema).default([]), 908 + privateLocations: z.array(selectPrivateLocationSchema).default([]), 909 909 }) 910 910 .parse({ 911 911 ...data, ··· 1140 1140 z.object({ 1141 1141 id: z.number(), 1142 1142 timeout: z.number(), 1143 - degradedAfter: z.number().nullish(), 1143 + degradedAfter: z.number().optional(), 1144 1144 }), 1145 1145 ) 1146 1146 .mutation(async ({ ctx, input }) => { ··· 1292 1292 recordAssertion, 1293 1293 ]), 1294 1294 ), 1295 - active: z.boolean().prefault(true), 1295 + active: z.boolean().default(true), 1296 1296 // skip the test check if assertions are OK 1297 - skipCheck: z.boolean().prefault(true), 1297 + skipCheck: z.boolean().default(true), 1298 1298 // save check in db (iff success? -> e.g. onboarding to get a first ping) 1299 - saveCheck: z.boolean().prefault(false), 1299 + saveCheck: z.boolean().default(false), 1300 1300 }), 1301 1301 ) 1302 1302 .mutation(async ({ ctx, input }) => { ··· 1418 1418 recordAssertion, 1419 1419 ]), 1420 1420 ), 1421 - active: z.boolean().prefault(false), 1422 - saveCheck: z.boolean().prefault(false), 1423 - skipCheck: z.boolean().prefault(false), 1421 + active: z.boolean().default(false), 1422 + saveCheck: z.boolean().default(false), 1423 + skipCheck: z.boolean().default(false), 1424 1424 }), 1425 1425 ) 1426 1426 .mutation(async ({ ctx, input }) => {
+4 -4
packages/api/src/router/notification.ts
··· 281 281 z.object({ 282 282 id: z.number(), 283 283 name: z.string(), 284 - data: z.partialRecord( 284 + data: z.record( 285 285 z.enum(notificationProvider), 286 286 z.string().or(z.record(z.string(), z.string())), 287 287 ), ··· 350 350 .input( 351 351 z.object({ 352 352 provider: z.enum(notificationProvider), 353 - data: z.partialRecord( 353 + data: z.record( 354 354 z.enum(notificationProvider), 355 355 z.record(z.string(), z.string()).or(z.string()), 356 356 ), 357 357 name: z.string(), 358 - monitors: z.array(z.number()).prefault([]), 358 + monitors: z.array(z.number()).default([]), 359 359 }), 360 360 ) 361 361 .mutation(async (opts) => { ··· 460 460 .input( 461 461 z.object({ 462 462 provider: z.enum(notificationProvider), 463 - data: z.partialRecord( 463 + data: z.record( 464 464 z.enum(notificationProvider), 465 465 z.record(z.string(), z.string()).or(z.string()), 466 466 ),
+8 -5
packages/api/src/router/page.ts
··· 32 32 } from "@openstatus/db/src/schema"; 33 33 34 34 import { Events } from "@openstatus/analytics"; 35 + import { Redis } from "@openstatus/upstash"; 35 36 import { env } from "../env"; 36 37 import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; 37 38 38 39 if (process.env.NODE_ENV === "test") { 39 40 require("../test/preload"); 40 41 } 42 + 43 + const _redis = Redis.fromEnv(); 41 44 42 45 // Helper functions to reuse Vercel API logic 43 46 async function addDomainToVercel(domain: string) { ··· 499 502 monitors: z 500 503 .array( 501 504 selectMonitorSchema.extend({ 502 - order: z.number().prefault(0), 503 - groupOrder: z.number().prefault(0), 505 + order: z.number().default(0), 506 + groupOrder: z.number().default(0), 504 507 groupId: z.number().nullable(), 505 508 }), 506 509 ) 507 - .prefault([]), 508 - monitorGroups: z.array(selectMonitorGroupSchema).prefault([]), 509 - maintenances: z.array(selectMaintenanceSchema).prefault([]), 510 + .default([]), 511 + monitorGroups: z.array(selectMonitorGroupSchema).default([]), 512 + maintenances: z.array(selectMaintenanceSchema).default([]), 510 513 }) 511 514 .parse({ 512 515 ...data,
+5 -5
packages/api/src/router/statusPage.ts
··· 357 357 monitorIds: z.string().array(), 358 358 cardType: z 359 359 .enum(["requests", "duration", "dominant", "manual"]) 360 - .prefault("requests"), 361 - barType: z 362 - .enum(["absolute", "dominant", "manual"]) 363 - .prefault("dominant"), 360 + .default("requests"), 361 + barType: z.enum(["absolute", "dominant", "manual"]).default("dominant"), 364 362 }), 365 363 ) 366 364 .query(async (opts) => { ··· 834 832 835 833 subscribe: publicProcedure 836 834 .meta({ track: Events.SubscribePage, trackProps: ["slug", "email"] }) 837 - .input(z.object({ slug: z.string().toLowerCase(), email: z.email() })) 835 + .input( 836 + z.object({ slug: z.string().toLowerCase(), email: z.string().email() }), 837 + ) 838 838 .mutation(async (opts) => { 839 839 if (!opts.input.slug) return null; 840 840
+9 -9
packages/api/src/router/statusReport.ts
··· 227 227 .query(async (opts) => { 228 228 const selectPublicStatusReportSchemaWithRelation = 229 229 selectStatusReportSchema.extend({ 230 - status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 230 + status: statusReportStatusSchema.default("investigating"), // TODO: remove! 231 231 monitorsToStatusReports: z 232 232 .array( 233 233 z.object({ ··· 236 236 monitor: selectMonitorSchema, 237 237 }), 238 238 ) 239 - .prefault([]), 239 + .default([]), 240 240 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 241 - date: z.date().prefault(new Date()), 241 + date: z.date().default(new Date()), 242 242 }); 243 243 244 244 const data = await opts.ctx.db.query.statusReport.findFirst({ ··· 275 275 getStatusReportByWorkspace: protectedProcedure.query(async (opts) => { 276 276 // FIXME: can we get rid of that? 277 277 const selectStatusSchemaWithRelation = selectStatusReportSchema.extend({ 278 - status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 278 + status: statusReportStatusSchema.default("investigating"), // TODO: remove! 279 279 monitorsToStatusReports: z 280 280 .array( 281 281 z.object({ ··· 284 284 monitor: selectMonitorSchema, 285 285 }), 286 286 ) 287 - .prefault([]), 287 + .default([]), 288 288 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 289 289 }); 290 290 ··· 308 308 .query(async (opts) => { 309 309 // FIXME: can we get rid of that? 310 310 const selectStatusSchemaWithRelation = selectStatusReportSchema.extend({ 311 - status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 311 + status: statusReportStatusSchema.default("investigating"), // TODO: remove! 312 312 monitorsToStatusReports: z 313 313 .array( 314 314 z.object({ ··· 317 317 monitor: selectMonitorSchema, 318 318 }), 319 319 ) 320 - .prefault([]), 320 + .default([]), 321 321 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 322 322 }); 323 323 ··· 412 412 413 413 return selectStatusReportSchema 414 414 .extend({ 415 - updates: z.array(selectStatusReportUpdateSchema).prefault([]), 416 - monitors: z.array(selectMonitorSchema).prefault([]), 415 + updates: z.array(selectStatusReportUpdateSchema).default([]), 416 + monitors: z.array(selectMonitorSchema).default([]), 417 417 page: selectPageSchema, 418 418 }) 419 419 .array()
+1 -1
packages/api/src/router/stripe/webhook.ts
··· 19 19 account: z.string().nullish(), 20 20 created: z.number(), 21 21 data: z.object({ 22 - object: z.record(z.string(), z.any()), 22 + object: z.record(z.any()), 23 23 }), 24 24 type: z.string(), 25 25 }),
+24 -24
packages/api/src/router/tinybird/index.ts
··· 226 226 z.object({ 227 227 monitorId: z.string(), 228 228 region: z.enum(monitorRegions).or(z.string()).optional(), 229 - cronTimestamp: z.int().optional(), 229 + cronTimestamp: z.number().int().optional(), 230 230 }), 231 231 ) 232 232 .query(async (opts) => { ··· 239 239 z.object({ 240 240 monitorId: z.string(), 241 241 region: z.enum(monitorRegions).or(z.string()).optional(), 242 - cronTimestamp: z.int().optional(), 242 + cronTimestamp: z.number().int().optional(), 243 243 from: z.coerce.date().optional(), 244 244 to: z.coerce.date().optional(), 245 245 }), ··· 280 280 monitorId: z.string(), 281 281 fromDate: z.string().optional(), 282 282 toDate: z.string().optional(), 283 - interval: z.int().optional(), // in minutes, default 30 283 + interval: z.number().int().optional(), // in minutes, default 30 284 284 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 285 - type: z.enum(types).prefault("http"), 286 - period: z.enum(["7d", "30d"]).prefault("30d"), 285 + type: z.enum(types).default("http"), 286 + period: z.enum(["7d", "30d"]).default("30d"), 287 287 }), 288 288 ) 289 289 .query(async (opts) => { ··· 311 311 .input( 312 312 z.object({ 313 313 monitorId: z.string(), 314 - interval: z.int().prefault(30), // in days 314 + interval: z.number().int().default(30), // in days 315 315 }), 316 316 ) 317 317 .query(async (opts) => { ··· 342 342 z.object({ 343 343 monitorId: z.string(), 344 344 period: z.enum(periods), 345 - type: z.enum(types).prefault("http"), 345 + type: z.enum(types).default("http"), 346 346 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 347 - cronTimestamp: z.int().optional(), 347 + cronTimestamp: z.number().int().optional(), 348 348 }), 349 349 ) 350 350 .query(async (opts) => { ··· 377 377 z.object({ 378 378 monitorId: z.string(), 379 379 period: z.enum(periods), 380 - type: z.enum(types).prefault("http"), 380 + type: z.enum(types).default("http"), 381 381 region: z.enum(monitorRegions).or(z.string()).optional(), 382 - cronTimestamp: z.int().optional(), 382 + cronTimestamp: z.number().int().optional(), 383 383 }), 384 384 ) 385 385 .query(async (opts) => { ··· 411 411 z.object({ 412 412 monitorId: z.string(), 413 413 period: z.enum(periods), 414 - type: z.enum(types).prefault("http"), 414 + type: z.enum(types).default("http"), 415 415 region: z.enum(monitorRegions).or(z.string()).optional(), 416 - cronTimestamp: z.int().optional(), 416 + cronTimestamp: z.number().int().optional(), 417 417 }), 418 418 ) 419 419 .query(async (opts) => { ··· 445 445 z.object({ 446 446 monitorId: z.string(), 447 447 period: z.enum(periods), 448 - type: z.enum(types).prefault("http"), 448 + type: z.enum(types).default("http"), 449 449 // Additional filters 450 - interval: z.int().optional(), 450 + interval: z.number().int().optional(), 451 451 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 452 - cronTimestamp: z.int().optional(), 452 + cronTimestamp: z.number().int().optional(), 453 453 fromDate: z.string().optional(), 454 454 toDate: z.string().optional(), 455 455 }), ··· 487 487 z.object({ 488 488 monitorIds: z.string().array(), 489 489 period: z.enum(["45d"]), 490 - type: z.enum(types).prefault("http"), 490 + type: z.enum(types).default("http"), 491 491 region: z.enum(monitorRegions).or(z.string()).optional(), 492 - cronTimestamp: z.int().optional(), 492 + cronTimestamp: z.number().int().optional(), 493 493 }), 494 494 ) 495 495 .query(async (opts) => { ··· 518 518 z.object({ 519 519 id: z.string().nullable(), 520 520 monitorId: z.string(), 521 - period: z.enum(["14d"]).prefault("14d"), 521 + period: z.enum(["14d"]).default("14d"), 522 522 }), 523 523 ) 524 524 .query(async (opts) => { ··· 549 549 .input( 550 550 z.object({ 551 551 monitorIds: z.string().array(), 552 - type: z.enum(types).prefault("http"), 552 + type: z.enum(types).default("http"), 553 553 }), 554 554 ) 555 555 .query(async (opts) => { ··· 579 579 monitorId: z.string(), 580 580 period: z.enum(periods), 581 581 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 582 - type: z.enum(types).prefault("http"), 582 + type: z.enum(types).default("http"), 583 583 fromDate: z.string().optional(), 584 584 toDate: z.string().optional(), 585 585 }), ··· 601 601 z.object({ 602 602 monitorId: z.string(), 603 603 period: z.enum(periods), 604 - interval: z.int().optional(), 604 + interval: z.number().int().optional(), 605 605 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 606 606 type: z.literal("http"), 607 607 }), ··· 627 627 .input( 628 628 z.object({ 629 629 monitorIds: z.string().array(), 630 - period: z.enum(["1d"]).prefault("1d"), 631 - type: z.enum(types).prefault("http"), 630 + period: z.enum(["1d"]).default("1d"), 631 + type: z.enum(types).default("http"), 632 632 }), 633 633 ) 634 634 .query(async (opts) => { ··· 642 642 workspace30d: protectedProcedure 643 643 .input( 644 644 z.object({ 645 - type: z.enum(types).prefault("http"), 645 + type: z.enum(types).default("http"), 646 646 }), 647 647 ) 648 648 .query(async (opts) => {
+2 -2
packages/api/src/trpc.ts
··· 1 1 import { TRPCError, initTRPC } from "@trpc/server"; 2 2 import { type NextRequest, after } from "next/server"; 3 3 import superjson from "superjson"; 4 - import { ZodError, treeifyError } from "zod"; 4 + import { ZodError } from "zod"; 5 5 6 6 import { 7 7 type EventProps, ··· 106 106 data: { 107 107 ...shape.data, 108 108 zodError: 109 - error.cause instanceof ZodError ? treeifyError(error.cause) : null, 109 + error.cause instanceof ZodError ? error.cause.flatten() : null, 110 110 }, 111 111 }; 112 112 },
+1 -1
packages/assertions/package.json
··· 10 10 "devDependencies": { 11 11 "@openstatus/tsconfig": "workspace:*", 12 12 "typescript": "5.9.3", 13 - "zod": "4.1.13" 13 + "zod": "3.25.76" 14 14 }, 15 15 "keywords": [], 16 16 "author": "",
+17 -15
packages/assertions/src/v1.ts
··· 211 211 return { success: true }; 212 212 } 213 213 214 - export const base = z.looseObject({ 215 - version: z.enum(["v1"]).prefault("v1"), 216 - type: z.string(), 217 - }); 218 - export const statusAssertion = base.extend( 214 + export const base = z 215 + .object({ 216 + version: z.enum(["v1"]).default("v1"), 217 + type: z.string(), 218 + }) 219 + .passthrough(); 220 + export const statusAssertion = base.merge( 219 221 z.object({ 220 222 type: z.literal("status"), 221 223 compare: numberCompare, 222 - target: z.int().positive(), 223 - }).shape, 224 + target: z.number().int().positive(), 225 + }), 224 226 ); 225 227 226 - export const headerAssertion = base.extend( 228 + export const headerAssertion = base.merge( 227 229 z.object({ 228 230 type: z.literal("header"), 229 231 compare: stringCompare, 230 232 key: z.string(), 231 233 target: z.string(), 232 - }).shape, 234 + }), 233 235 ); 234 236 235 - export const textBodyAssertion = base.extend( 237 + export const textBodyAssertion = base.merge( 236 238 z.object({ 237 239 type: z.literal("textBody"), 238 240 compare: stringCompare, 239 241 target: z.string(), 240 - }).shape, 242 + }), 241 243 ); 242 244 243 - export const jsonBodyAssertion = base.extend( 245 + export const jsonBodyAssertion = base.merge( 244 246 z.object({ 245 247 type: z.literal("jsonBody"), 246 248 path: z.string(), // https://www.npmjs.com/package/jsonpath-plus 247 249 compare: stringCompare, 248 250 target: z.string(), 249 - }).shape, 251 + }), 250 252 ); 251 253 252 254 export const dnsRecords = ["A", "AAAA", "CNAME", "MX", "TXT", "NS"] as const; 253 255 254 - export const recordAssertion = base.extend( 256 + export const recordAssertion = base.merge( 255 257 z.object({ 256 258 type: z.literal("dnsRecord"), 257 259 key: z.enum(dnsRecords), 258 260 compare: recordCompare, 259 261 target: z.string(), 260 - }).shape, 262 + }), 261 263 ); 262 264 263 265 export const assertion = z.discriminatedUnion("type", [
+2 -2
packages/db/package.json
··· 19 19 "@openstatus/theme-store": "workspace:*", 20 20 "@t3-oss/env-core": "0.7.1", 21 21 "drizzle-orm": "0.44.4", 22 - "drizzle-zod": "0.8.3", 23 - "zod": "4.1.13" 22 + "drizzle-zod": "0.5.1", 23 + "zod": "3.25.76" 24 24 }, 25 25 "devDependencies": { 26 26 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/db/src/schema/invitations/validation.ts
··· 4 4 import { invitation } from "./invitation"; 5 5 6 6 export const insertInvitationSchema = createInsertSchema(invitation, { 7 - email: z.email(), 7 + email: z.string().email(), 8 8 }); 9 9 10 10 export const selectInvitationSchema = createSelectSchema(invitation);
+5 -9
packages/db/src/schema/maintenances/validation.ts
··· 5 5 export const insertMaintenanceSchema = createInsertSchema(maintenance) 6 6 .extend({ 7 7 // REMINDER: trick to make the react-hook-form controlled but not allow empty string 8 - title: z.string().min(1, { 9 - error: "Required", 10 - }), 11 - message: z.string().min(1, { 12 - error: "Required", 13 - }), 8 + title: z.string().min(1, { message: "Required" }), 9 + message: z.string().min(1, { message: "Required" }), 14 10 15 - monitors: z.number().array().prefault([]).optional(), 11 + monitors: z.number().array().default([]).optional(), 16 12 }) 17 13 // REMINDER: validate that `from` date is before `to` date 18 14 .refine((data) => data.from < data.to, { 19 15 path: ["to"], 20 - error: "End date cannot be earlier than start date.", 16 + message: "End date cannot be earlier than start date.", 21 17 }); 22 18 23 19 export const selectMaintenanceSchema = createSelectSchema(maintenance).extend({ 24 - monitors: z.number().array().prefault([]).optional(), 20 + monitors: z.number().array().default([]).optional(), 25 21 }); 26 22 27 23 export type InsertMaintenance = z.infer<typeof insertMaintenanceSchema>;
+23 -23
packages/db/src/schema/monitors/validation.ts
··· 37 37 } 38 38 return []; 39 39 }, 40 - z.array(z.object({ key: z.string(), value: z.string() })).prefault([]), 40 + z.array(z.object({ key: z.string(), value: z.string() })).default([]), 41 41 ); 42 42 43 43 export const selectMonitorSchema = createSelectSchema(monitor, { 44 - periodicity: monitorPeriodicitySchema.prefault("10m"), 45 - status: monitorStatusSchema.prefault("active"), 46 - jobType: monitorJobTypesSchema.prefault("http"), 47 - timeout: z.number().prefault(45), 48 - followRedirects: z.boolean().prefault(true), 49 - retry: z.number().prefault(3), 50 - regions: regionsToArraySchema.prefault([]), 44 + periodicity: monitorPeriodicitySchema.default("10m"), 45 + status: monitorStatusSchema.default("active"), 46 + jobType: monitorJobTypesSchema.default("http"), 47 + timeout: z.number().default(45), 48 + followRedirects: z.boolean().default(true), 49 + retry: z.number().default(3), 50 + regions: regionsToArraySchema.default([]), 51 51 }).extend({ 52 - headers: headersToArraySchema.prefault([]), 53 - otelHeaders: headersToArraySchema.prefault([]), 54 - body: bodyToStringSchema.prefault(""), 52 + headers: headersToArraySchema.default([]), 53 + otelHeaders: headersToArraySchema.default([]), 54 + body: bodyToStringSchema.default(""), 55 55 // for tcp monitors the method is not needed 56 - method: monitorMethodsSchema.prefault("GET"), 56 + method: monitorMethodsSchema.default("GET"), 57 57 }); 58 58 59 59 const headersSchema = z ··· 65 65 .string() 66 66 .min(1, "Name must be at least 1 character long") 67 67 .max(255, "Name must be at most 255 characters long"), 68 - periodicity: monitorPeriodicitySchema.prefault("10m"), 69 - status: monitorStatusSchema.prefault("active"), 70 - regions: z.array(monitorRegionSchema).prefault([]).optional(), 71 - headers: headersSchema.prefault([]), 72 - otelHeaders: headersSchema.prefault([]), 68 + periodicity: monitorPeriodicitySchema.default("10m"), 69 + status: monitorStatusSchema.default("active"), 70 + regions: z.array(monitorRegionSchema).default([]).optional(), 71 + headers: headersSchema.default([]), 72 + otelHeaders: headersSchema.default([]), 73 73 }).extend({ 74 - method: monitorMethodsSchema.prefault("GET"), 75 - notifications: z.array(z.number()).optional().prefault([]), 76 - pages: z.array(z.number()).optional().prefault([]), 77 - body: z.string().prefault("").optional(), 78 - tags: z.array(z.number()).optional().prefault([]), 74 + method: monitorMethodsSchema.default("GET"), 75 + notifications: z.array(z.number()).optional().default([]), 76 + pages: z.array(z.number()).optional().default([]), 77 + body: z.string().default("").optional(), 78 + tags: z.array(z.number()).optional().default([]), 79 79 statusAssertions: z.array(assertions.statusAssertion).optional(), 80 80 headerAssertions: z.array(assertions.headerAssertion).optional(), 81 81 textBodyAssertions: z.array(assertions.textBodyAssertion).optional(), 82 - timeout: z.coerce.number().gte(0).lte(60000).prefault(45000), 82 + timeout: z.coerce.number().gte(0).lte(60000).default(45000), 83 83 degradedAfter: z.coerce.number().gte(0).lte(60000).nullish(), 84 84 }); 85 85
+26 -26
packages/db/src/schema/notifications/validation.ts
··· 12 12 .preprocess((val) => { 13 13 return String(val); 14 14 }, z.string()) 15 - .prefault("{}"), 15 + .default("{}"), 16 16 }, 17 17 ); 18 18 19 19 // we need to extend, otherwise data can be `null` or `undefined` - default is not 20 20 export const insertNotificationSchema = createInsertSchema(notification).extend( 21 21 { 22 - data: z.string().prefault("{}"), 23 - monitors: z.array(z.number()).optional().prefault([]), 22 + data: z.string().default("{}"), 23 + monitors: z.array(z.number()).optional().default([]), 24 24 }, 25 25 ); 26 26 ··· 33 33 ); 34 34 35 35 export const phoneSchema = z.string().regex(phoneRegex, "Invalid Number!"); 36 - export const emailSchema = z.email(); 37 - export const urlSchema = z.url(); 36 + export const emailSchema = z.string().email(); 37 + export const urlSchema = z.string().url(); 38 38 39 39 export const ntfyDataSchema = z.object({ 40 40 ntfy: z.object({ 41 - topic: z.string().prefault(""), 42 - serverUrl: z.string().prefault("https://ntfy.sh"), 41 + topic: z.string().default(""), 42 + serverUrl: z.string().default("https://ntfy.sh"), 43 43 token: z.string().optional(), 44 44 }), 45 45 }); 46 46 export const webhookDataSchema = z.object({ 47 47 webhook: z.object({ 48 - endpoint: z.url(), 48 + endpoint: z.string().url(), 49 49 headers: z 50 50 .array(z.object({ key: z.string(), value: z.string() })) 51 51 .optional(), ··· 88 88 export const InsertNotificationWithDataSchema = z.discriminatedUnion( 89 89 "provider", 90 90 [ 91 - insertNotificationSchema.extend( 91 + insertNotificationSchema.merge( 92 92 z.object({ 93 93 provider: z.literal("discord"), 94 94 data: discordDataSchema, 95 - }).shape, 95 + }), 96 96 ), 97 - insertNotificationSchema.extend( 97 + insertNotificationSchema.merge( 98 98 z.object({ 99 99 provider: z.literal("email"), 100 100 data: emailDataSchema, 101 - }).shape, 101 + }), 102 102 ), 103 - insertNotificationSchema.extend( 103 + insertNotificationSchema.merge( 104 104 z.object({ 105 105 provider: z.literal("google-chat"), 106 106 data: googleChatDataSchema, 107 - }).shape, 107 + }), 108 108 ), 109 - insertNotificationSchema.extend( 109 + insertNotificationSchema.merge( 110 110 z.object({ 111 111 provider: z.literal("ntfy"), 112 112 data: ntfyDataSchema, 113 - }).shape, 113 + }), 114 114 ), 115 - insertNotificationSchema.extend( 115 + insertNotificationSchema.merge( 116 116 z.object({ 117 117 provider: z.literal("pagerduty"), 118 118 data: pagerdutyDataSchema, 119 - }).shape, 119 + }), 120 120 ), 121 - insertNotificationSchema.extend( 121 + insertNotificationSchema.merge( 122 122 z.object({ 123 123 provider: z.literal("opsgenie"), 124 124 data: opsgenieDataSchema, 125 - }).shape, 125 + }), 126 126 ), 127 - insertNotificationSchema.extend( 127 + insertNotificationSchema.merge( 128 128 z.object({ 129 129 provider: z.literal("sms"), 130 130 data: phoneDataSchema, 131 - }).shape, 131 + }), 132 132 ), 133 - insertNotificationSchema.extend( 133 + insertNotificationSchema.merge( 134 134 z.object({ 135 135 provider: z.literal("slack"), 136 136 data: slackDataSchema, 137 - }).shape, 137 + }), 138 138 ), 139 - insertNotificationSchema.extend( 139 + insertNotificationSchema.merge( 140 140 z.object({ 141 141 provider: z.literal("webhook"), 142 142 data: webhookDataSchema, 143 - }).shape, 143 + }), 144 144 ), 145 145 insertNotificationSchema.merge( 146 146 z.object({
+1 -1
packages/db/src/schema/page_subscribers/validation.ts
··· 4 4 import { pageSubscriber } from "./page_subscribers"; 5 5 6 6 export const insertPageSubscriberSchema = createInsertSchema(pageSubscriber, { 7 - email: z.email(), 7 + email: z.string().email(), 8 8 }); 9 9 10 10 export const selectPageSubscriberSchema = createSelectSchema(pageSubscriber);
+10 -10
packages/db/src/schema/pages/validation.ts
··· 23 23 .or(z.enum([""])); 24 24 25 25 export const insertPageSchema = createInsertSchema(page, { 26 - customDomain: customDomainSchema.prefault(""), 26 + customDomain: customDomainSchema.default(""), 27 27 icon: z.string().optional(), 28 28 slug: slugSchema, 29 29 }).extend({ 30 - password: z.string().nullable().optional().prefault(""), 30 + password: z.string().nullable().optional().default(""), 31 31 monitors: z 32 32 .array( 33 33 z.object({ 34 34 // REMINDER: has to be different from `id` in as the prop is already used by react-hook-form 35 35 monitorId: z.number(), 36 - order: z.number().prefault(0).optional(), 36 + order: z.number().default(0).optional(), 37 37 }), 38 38 ) 39 39 .optional() 40 - .prefault([]), 40 + .default([]), 41 41 }); 42 42 43 43 export const pageConfigurationSchema = z.object({ 44 44 value: z 45 45 .enum(["duration", "requests", "manual"]) 46 46 .nullish() 47 - .prefault("requests"), 48 - type: z.enum(["absolute", "manual"]).nullish().prefault("absolute"), 49 - uptime: z.coerce.boolean().nullish().prefault(true), 47 + .default("requests"), 48 + type: z.enum(["absolute", "manual"]).nullish().default("absolute"), 49 + uptime: z.coerce.boolean().nullish().default(true), 50 50 theme: z 51 51 .enum(THEME_KEYS as [ThemeKey, ...ThemeKey[]]) 52 52 .nullish() 53 - .prefault("default"), 53 + .default("default"), 54 54 }); 55 55 56 56 export const selectPageSchema = createSelectSchema(page).extend({ 57 - password: z.string().optional().nullable().prefault(""), 58 - configuration: pageConfigurationSchema.nullish().prefault({}), 57 + password: z.string().optional().nullable().default(""), 58 + configuration: pageConfigurationSchema.nullish().default({}), 59 59 }); 60 60 61 61 export type InsertPage = z.infer<typeof insertPageSchema>;
+27 -29
packages/db/src/schema/plan/schema.ts
··· 10 10 /** 11 11 * Monitor limits 12 12 */ 13 - monitors: z.number().prefault(1), 14 - "synthetic-checks": z.number().prefault(30), // monthly limits 15 - periodicity: monitorPeriodicitySchema.array().prefault(["10m", "30m", "1h"]), 16 - "multi-region": z.boolean().prefault(true), 17 - "max-regions": z.number().prefault(6), 13 + monitors: z.number().default(1), 14 + "synthetic-checks": z.number().default(30), // monthly limits 15 + periodicity: monitorPeriodicitySchema.array().default(["10m", "30m", "1h"]), 16 + "multi-region": z.boolean().default(true), 17 + "max-regions": z.number().default(6), 18 18 "data-retention": z 19 19 .enum(["14 days", "3 months", "12 months", "24 months"]) 20 - .prefault("14 days"), 21 - regions: monitorRegionSchema.array().prefault(FREE_FLY_REGIONS), 22 - "private-locations": z.boolean().prefault(false), 23 - screenshots: z.boolean().prefault(false), 24 - "response-logs": z.boolean().prefault(false), 25 - otel: z.boolean().prefault(false), 20 + .default("14 days"), 21 + regions: monitorRegionSchema.array().default(FREE_FLY_REGIONS), 22 + "private-locations": z.boolean().default(false), 23 + screenshots: z.boolean().default(false), 24 + "response-logs": z.boolean().default(false), 25 + otel: z.boolean().default(false), 26 26 /** 27 27 * Status page limits 28 28 */ 29 - "status-pages": z.number().prefault(1), 30 - maintenance: z.boolean().prefault(true), 31 - "monitor-values-visibility": z.boolean().prefault(true), 32 - "status-subscribers": z.boolean().prefault(false), 33 - "custom-domain": z.boolean().prefault(false), 34 - "password-protection": z.boolean().prefault(false), 35 - "white-label": z.boolean().prefault(false), 29 + "status-pages": z.number().default(1), 30 + maintenance: z.boolean().default(true), 31 + "monitor-values-visibility": z.boolean().default(true), 32 + "status-subscribers": z.boolean().default(false), 33 + "custom-domain": z.boolean().default(false), 34 + "password-protection": z.boolean().default(false), 35 + "white-label": z.boolean().default(false), 36 36 /** 37 37 * Notification limits 38 38 */ 39 - 40 - notifications: z.boolean().prefault(true), 41 - pagerduty: z.boolean().prefault(false), 42 - opsgenie: z.boolean().prefault(false), 43 - whatsapp: z.boolean().prefault(false), 44 - sms: z.boolean().prefault(false), 45 - "sms-limit": z.number().prefault(0), 46 - "notification-channels": z.number().prefault(1), 47 - 39 + notifications: z.boolean().default(true), 40 + pagerduty: z.boolean().default(false), 41 + opsgenie: z.boolean().default(false), 42 + whatsapp: z.boolean().default(false), 43 + sms: z.boolean().default(false), 44 + "sms-limit": z.number().default(0), 45 + "notification-channels": z.number().default(1), 48 46 /** 49 47 * Collaboration limits 50 48 */ 51 - members: z.literal("Unlimited").or(z.number()).prefault(1), 52 - "audit-log": z.boolean().prefault(false), 49 + members: z.literal("Unlimited").or(z.number()).default(1), 50 + "audit-log": z.boolean().default(false), 53 51 }); 54 52 55 53 export type Limits = z.infer<typeof limitsSchema>;
+19 -21
packages/db/src/schema/shared.ts
··· 29 29 })); 30 30 31 31 export const selectStatusReportPageSchema = selectStatusReportSchema.extend({ 32 - statusReportUpdates: z.array(selectStatusReportUpdateSchema).prefault([]), 32 + statusReportUpdates: z.array(selectStatusReportUpdateSchema).default([]), 33 33 monitorsToStatusReports: z 34 34 .array( 35 35 z.object({ ··· 38 38 monitor: selectPublicMonitorSchema, 39 39 }), 40 40 ) 41 - .prefault([]), 41 + .default([]), 42 42 }); 43 43 44 44 export const selectMaintenancePageSchema = selectMaintenanceSchema.extend({ ··· 50 50 monitor: selectPublicMonitorSchema, 51 51 }), 52 52 ) 53 - .prefault([]), 53 + .default([]), 54 54 }); 55 55 // TODO: it would be nice to automatically add the monitor relation here 56 56 // .refine((data) => ({ monitors: data.maintenancesToMonitors.map((m) => m.monitorId) })); ··· 65 65 z.object({ 66 66 monitorId: z.number(), 67 67 pageId: z.number(), 68 - order: z.number().prefault(0).optional(), 68 + order: z.number().default(0).optional(), 69 69 monitor: selectMonitorSchema, 70 70 }), 71 71 ), 72 - maintenances: selectMaintenanceSchema.array().prefault([]), 72 + maintenances: selectMaintenanceSchema.array().default([]), 73 73 statusReports: selectStatusReportSchema 74 74 .extend({ statusReportUpdates: selectStatusReportUpdateSchema.array() }) 75 75 .array() 76 - .prefault([]), 76 + .default([]), 77 77 }); 78 78 79 79 export const legacy_selectPublicPageSchemaWithRelation = selectPageSchema 80 80 .extend({ 81 - monitors: z.array(selectPublicMonitorSchema).prefault([]), 82 - statusReports: z.array(selectStatusReportPageSchema).prefault([]), 83 - incidents: z.array(selectIncidentSchema).prefault([]), 84 - maintenances: z.array(selectMaintenancePageSchema).prefault([]), 81 + monitors: z.array(selectPublicMonitorSchema).default([]), 82 + statusReports: z.array(selectStatusReportPageSchema).default([]), 83 + incidents: z.array(selectIncidentSchema).default([]), 84 + maintenances: z.array(selectMaintenancePageSchema).default([]), 85 85 workspacePlan: workspacePlanSchema 86 86 .nullable() 87 - .prefault("free") 87 + .default("free") 88 88 .transform((val) => val ?? "free"), 89 89 }) 90 90 .omit({ ··· 94 94 95 95 const selectPublicMonitorWithStatusSchema = selectPublicMonitorBaseSchema 96 96 .extend({ 97 - status: z 98 - .enum(["success", "degraded", "error", "info"]) 99 - .prefault("success"), 97 + status: z.enum(["success", "degraded", "error", "info"]).default("success"), 100 98 monitorGroupId: z.number().nullable().optional(), 101 99 order: z.number().default(0).optional(), 102 100 groupOrder: z.number().default(0).optional(), ··· 121 119 monitors: z.array(selectPublicMonitorWithStatusSchema), 122 120 status: z 123 121 .enum(["success", "degraded", "error", "info"]) 124 - .prefault("success"), 122 + .default("success"), 125 123 order: z.number(), 126 124 }), 127 125 ]), 128 126 ) 129 - .prefault([]); 127 + .default([]); 130 128 131 129 export const statusPageEventSchema = z.object({ 132 130 id: z.number(), 133 131 name: z.string(), 134 132 from: z.date(), 135 133 to: z.date().nullable(), 136 - status: z.enum(["success", "degraded", "error", "info"]).prefault("success"), 134 + status: z.enum(["success", "degraded", "error", "info"]).default("success"), 137 135 type: z.enum(["maintenance", "incident", "report"]), 138 136 }); 139 137 140 138 export const selectPublicPageSchemaWithRelation = selectPageSchema.extend({ 141 - monitorGroups: selectMonitorGroupSchema.array().prefault([]), 139 + monitorGroups: selectMonitorGroupSchema.array().default([]), 142 140 // TODO: include status of the monitor 143 141 monitors: selectPublicMonitorWithStatusSchema.array(), 144 142 trackers: trackersSchema, ··· 147 145 statusReports: z.array(selectStatusReportPageSchema), 148 146 incidents: z.array(selectIncidentSchema), 149 147 maintenances: z.array(selectMaintenancePageSchema), 150 - status: z.enum(["success", "degraded", "error", "info"]).prefault("success"), 148 + status: z.enum(["success", "degraded", "error", "info"]).default("success"), 151 149 workspacePlan: workspacePlanSchema 152 150 .nullable() 153 - .prefault("free") 151 + .default("free") 154 152 .transform((val) => val ?? "free"), 155 153 }); 156 154 ··· 164 162 monitor: selectPublicMonitorSchema, 165 163 }), 166 164 ) 167 - .prefault([]), 165 + .default([]), 168 166 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 169 167 }); 170 168
+3 -3
packages/db/src/schema/status_reports/validation.ts
··· 15 15 status: statusReportStatusSchema, 16 16 }, 17 17 ).extend({ 18 - date: z.coerce.date().optional().prefault(new Date()), 18 + date: z.coerce.date().optional().default(new Date()), 19 19 }); 20 20 21 21 export const insertStatusReportSchema = createInsertSchema(statusReport, { 22 22 status: statusReportStatusSchema, 23 23 }) 24 24 .extend({ 25 - date: z.coerce.date().optional().prefault(new Date()), 25 + date: z.coerce.date().optional().default(new Date()), 26 26 /** 27 27 * relationship to monitors and pages 28 28 */ 29 - monitors: z.number().array().optional().prefault([]), 29 + monitors: z.number().array().optional().default([]), 30 30 }) 31 31 .extend({ 32 32 /**
+8 -32
packages/db/src/schema/workspaces/validation.ts
··· 15 15 export const selectWorkspaceSchema = createSelectSchema(workspace) 16 16 .extend({ 17 17 limits: z.string().transform((val) => { 18 - try { 19 - const parsed = JSON.parse(val); 20 - 21 - // Only validate properties that are actually present in the parsed object 22 - // This avoids triggering .prefault() for missing properties 23 - const validated: Record<string, unknown> = {}; 24 - const limitsShape = limitsSchema.shape; 25 - 26 - for (const key in parsed) { 27 - if (key in limitsShape) { 28 - // Validate only the properties that exist in the parsed object 29 - const propertySchema = limitsShape[key as keyof typeof limitsShape]; 30 - const result = propertySchema.safeParse(parsed[key]); 31 - if (result.success) { 32 - validated[key] = result.data; 33 - } else { 34 - console.warn(`Invalid value for limits.${key}:`, result.error); 35 - // Skip invalid properties instead of failing entirely 36 - } 37 - } 38 - // Unknown properties are ignored 39 - } 40 - 41 - return validated; 42 - } catch (error) { 43 - console.error("Error parsing limits:", error); 44 - return {}; 45 - } 18 + const parsed = JSON.parse(val); 19 + const result = limitsSchema.partial().safeParse(parsed); 20 + if (result.error) return {}; 21 + return result.data; 46 22 }), 47 23 plan: z 48 24 .enum(workspacePlans) 49 25 .nullable() 50 - .prefault("free") 26 + .default("free") 51 27 .transform((val) => val ?? "free"), 52 28 // REMINDER: workspace usage 53 29 usage: z 54 30 .object({ 55 - monitors: z.number().prefault(0), 56 - notifications: z.number().prefault(0), 57 - pages: z.number().prefault(0), 31 + monitors: z.number().default(0), 32 + notifications: z.number().default(0), 33 + pages: z.number().default(0), 58 34 // checks: z.number().default(0), 59 35 }) 60 36 .nullish(),
+1 -1
packages/emails/package.json
··· 19 19 "@t3-oss/env-core": "0.7.1", 20 20 "react-email": "5.0.8", 21 21 "resend": "6.6.0", 22 - "zod": "4.1.13" 22 + "zod": "3.25.76" 23 23 }, 24 24 "devDependencies": { 25 25 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/error/package.json
··· 5 5 "main": "index.ts", 6 6 "scripts": {}, 7 7 "dependencies": { 8 - "zod": "4.1.13" 8 + "zod": "3.25.76" 9 9 }, 10 10 "devDependencies": { 11 11 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/error/src/utils.ts
··· 57 57 return issues 58 58 .map((i) => 59 59 i.code === "invalid_union" 60 - ? i.errors.map((ue) => parseZodErrorIssues(ue)).join("; ") 60 + ? i.unionErrors.map((ue) => parseZodErrorIssues(ue.issues)).join("; ") 61 61 : i.code === "unrecognized_keys" 62 62 ? i.message 63 63 : `${i.path.length ? `${i.code} in '${i.path}': ` : ""}${i.message}`,
+1 -1
packages/notifications/discord/package.json
··· 7 7 }, 8 8 "dependencies": { 9 9 "@openstatus/db": "workspace:*", 10 - "zod": "4.1.13" 10 + "zod": "3.25.76" 11 11 }, 12 12 "devDependencies": { 13 13 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/notifications/email/package.json
··· 17 17 "@t3-oss/env-core": "0.7.1", 18 18 "react-dom": "19.2.2", 19 19 "resend": "6.6.0", 20 - "zod": "4.1.13" 20 + "zod": "3.25.76" 21 21 }, 22 22 "devDependencies": { 23 23 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/notifications/ntfy/package.json
··· 7 7 }, 8 8 "dependencies": { 9 9 "@openstatus/db": "workspace:*", 10 - "zod": "4.1.13" 10 + "zod": "3.25.76" 11 11 }, 12 12 "devDependencies": { 13 13 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/notifications/ntfy/src/schema.ts
··· 3 3 export const NtfySchema = z.object({ 4 4 ntfy: z.object({ 5 5 topic: z.string(), 6 - serverUrl: z.string().prefault("https://ntfy.sh"), 6 + serverUrl: z.string().default("https://ntfy.sh"), 7 7 token: z.string().optional(), 8 8 }), 9 9 });
+1 -1
packages/notifications/opsgenie/package.json
··· 10 10 "@t3-oss/env-core": "0.7.1", 11 11 "@types/validator": "13.12.0", 12 12 "validator": "13.12.0", 13 - "zod": "4.1.13" 13 + "zod": "3.25.76" 14 14 }, 15 15 "devDependencies": { 16 16 "@openstatus/tsconfig": "workspace:*",
+2 -2
packages/notifications/opsgenie/src/schema.ts
··· 7 7 message: z.string(), 8 8 alias: z.string(), 9 9 description: z.string(), 10 - source: z.string().prefault("OpenStatus"), 10 + source: z.string().default("OpenStatus"), 11 11 details: z 12 12 .object({ 13 13 message: z.string(), ··· 18 18 }); 19 19 20 20 export const OpsGenieCloseAlert = z.object({ 21 - source: z.string().prefault("OpenStatus"), 21 + source: z.string().default("OpenStatus"), 22 22 });
+1 -1
packages/notifications/pagerduty/package.json
··· 10 10 "@t3-oss/env-core": "0.7.1", 11 11 "@types/validator": "13.12.0", 12 12 "validator": "13.12.0", 13 - "zod": "4.1.13" 13 + "zod": "3.25.76" 14 14 }, 15 15 "devDependencies": { 16 16 "@openstatus/tsconfig": "workspace:*",
+6 -6
packages/notifications/pagerduty/src/schema/config.ts
··· 41 41 dedup_key: z.string(), 42 42 }); 43 43 44 - export const triggerEventPayloadSchema = baseEventPayloadSchema.extend( 44 + export const triggerEventPayloadSchema = baseEventPayloadSchema.merge( 45 45 z.object({ 46 46 event_action: z.literal("trigger"), 47 47 payload: z.object({ ··· 56 56 }), 57 57 images: z.array(imageSchema).optional(), 58 58 links: z.array(linkSchema).optional(), 59 - }).shape, 59 + }), 60 60 ); 61 61 62 - export const acknowledgeEventPayloadSchema = baseEventPayloadSchema.extend( 62 + export const acknowledgeEventPayloadSchema = baseEventPayloadSchema.merge( 63 63 z.object({ 64 64 event_action: z.literal("acknowledge"), 65 - }).shape, 65 + }), 66 66 ); 67 67 68 - export const resolveEventPayloadSchema = baseEventPayloadSchema.extend( 68 + export const resolveEventPayloadSchema = baseEventPayloadSchema.merge( 69 69 z.object({ 70 70 event_action: z.literal("resolve"), 71 - }).shape, 71 + }), 72 72 ); 73 73 74 74 export const eventPayloadV2Schema = z.discriminatedUnion("event_action", [
+1 -1
packages/notifications/slack/package.json
··· 7 7 }, 8 8 "dependencies": { 9 9 "@openstatus/db": "workspace:*", 10 - "zod": "4.1.13" 10 + "zod": "3.25.76" 11 11 }, 12 12 "devDependencies": { 13 13 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/notifications/twillio-sms/package.json
··· 9 9 "@openstatus/db": "workspace:*", 10 10 "@t3-oss/env-core": "0.7.1", 11 11 "validator": "13.12.0", 12 - "zod": "4.1.13" 12 + "zod": "3.25.76" 13 13 }, 14 14 "devDependencies": { 15 15 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/notifications/webhook/package.json
··· 8 8 "dependencies": { 9 9 "@openstatus/db": "workspace:*", 10 10 "@openstatus/utils": "workspace:*", 11 - "zod": "4.1.13" 11 + "zod": "3.25.76" 12 12 }, 13 13 "devDependencies": { 14 14 "@openstatus/tsconfig": "workspace:*",
+1 -1
packages/regions/package.json
··· 5 5 "main": "index.ts", 6 6 "scripts": {}, 7 7 "dependencies": { 8 - "zod": "4.1.13" 8 + "zod": "3.25.76" 9 9 }, 10 10 "devDependencies": { 11 11 "@openstatus/tsconfig": "workspace:*",
+2 -2
packages/tinybird/package.json
··· 4 4 "main": "src/index.ts", 5 5 "license": "MIT", 6 6 "dependencies": { 7 - "@chronark/zod-bird": "1.0.0", 8 - "zod": "4.1.13" 7 + "@chronark/zod-bird": "0.3.6", 8 + "zod": "3.25.76" 9 9 }, 10 10 "devDependencies": { 11 11 "@openstatus/tsconfig": "workspace:*",
+3 -2
packages/tinybird/src/audit-log/base-validation.ts
··· 9 9 action: z.string(), 10 10 // REMINDER: do not use .default(Date.now()), it will be evaluated only once 11 11 timestamp: z 12 + .number() 12 13 .int() 13 14 .optional() 14 15 .transform((val) => val || Date.now()), 15 - version: z.int().prefault(1), 16 + version: z.number().int().default(1), 16 17 }); 17 18 18 19 /** ··· 30 31 id: z.string(), 31 32 type: actorTypeSchema, 32 33 }) 33 - .prefault({ 34 + .default({ 34 35 id: "server", 35 36 type: "system", 36 37 });
+512 -512
packages/tinybird/src/client.ts
··· 33 33 return this.tb.buildPipe({ 34 34 pipe: "endpoint__stats_global__v0", 35 35 parameters: z.object({ 36 - cronTimestamp: z.int().optional(), 36 + cronTimestamp: z.number().int().optional(), 37 37 period: z.enum(["total", "1h", "10m", "1d", "1w", "1m"]).optional(), 38 38 }), 39 39 data: z.object({ 40 - count: z.int(), 40 + count: z.number().int(), 41 41 }), 42 42 // REMINDER: cache on build time as it's a global stats 43 43 opts: { cache: "force-cache" }, ··· 51 51 monitorId: z.string(), 52 52 }), 53 53 data: z.object({ 54 - type: z.literal("http").prefault("http"), 55 - latency: z.int(), 56 - statusCode: z.int().nullable(), 54 + type: z.literal("http").default("http"), 55 + latency: z.number().int(), 56 + statusCode: z.number().int().nullable(), 57 57 monitorId: z.string(), 58 58 error: z.coerce.boolean(), 59 59 region: z.enum(monitorRegions).or(z.string()), 60 - cronTimestamp: z.int(), 61 - trigger: z.enum(triggers).nullable().prefault("cron"), 60 + cronTimestamp: z.number().int(), 61 + trigger: z.enum(triggers).nullable().default("cron"), 62 62 timestamp: z.number(), 63 63 workspaceId: z.string(), 64 64 }), ··· 71 71 pipe: "endpoint__http_list_1d__v1", 72 72 parameters: z.object({ 73 73 monitorId: z.string(), 74 - fromDate: z.int().optional(), 75 - toDate: z.int().optional(), 74 + fromDate: z.number().int().optional(), 75 + toDate: z.number().int().optional(), 76 76 }), 77 77 data: z.object({ 78 - type: z.literal("http").prefault("http"), 78 + type: z.literal("http").default("http"), 79 79 id: z.string().nullable(), 80 - latency: z.int(), 81 - statusCode: z.int().nullable(), 80 + latency: z.number().int(), 81 + statusCode: z.number().int().nullable(), 82 82 monitorId: z.string(), 83 83 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 84 84 region: z.enum(monitorRegions).or(z.string()), 85 - cronTimestamp: z.int(), 86 - trigger: z.enum(triggers).nullable().prefault("cron"), 85 + cronTimestamp: z.number().int(), 86 + trigger: z.enum(triggers).nullable().default("cron"), 87 87 timestamp: z.number(), 88 88 timing: timingPhasesSchema, 89 89 }), ··· 98 98 monitorId: z.string(), 99 99 }), 100 100 data: z.object({ 101 - type: z.literal("http").prefault("http"), 102 - latency: z.int(), 103 - statusCode: z.int().nullable(), 101 + type: z.literal("http").default("http"), 102 + latency: z.number().int(), 103 + statusCode: z.number().int().nullable(), 104 104 monitorId: z.string(), 105 105 error: z.coerce.boolean(), 106 106 region: z.enum(monitorRegions).or(z.string()), 107 - cronTimestamp: z.int(), 108 - trigger: z.enum(triggers).nullable().prefault("cron"), 107 + cronTimestamp: z.number().int(), 108 + trigger: z.enum(triggers).nullable().default("cron"), 109 109 timestamp: z.number(), 110 110 workspaceId: z.string(), 111 111 }), ··· 118 118 pipe: "endpoint__http_list_7d__v1", 119 119 parameters: z.object({ 120 120 monitorId: z.string(), 121 - fromDate: z.int().optional(), 122 - toDate: z.int().optional(), 121 + fromDate: z.number().int().optional(), 122 + toDate: z.number().int().optional(), 123 123 }), 124 124 data: z.object({ 125 - type: z.literal("http").prefault("http"), 125 + type: z.literal("http").default("http"), 126 126 id: z.string().nullable(), 127 - latency: z.int(), 128 - statusCode: z.int().nullable(), 127 + latency: z.number().int(), 128 + statusCode: z.number().int().nullable(), 129 129 monitorId: z.string(), 130 130 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 131 131 region: z.enum(monitorRegions).or(z.string()), 132 - cronTimestamp: z.int(), 133 - trigger: z.enum(triggers).nullable().prefault("cron"), 132 + cronTimestamp: z.number().int(), 133 + trigger: z.enum(triggers).nullable().default("cron"), 134 134 timestamp: z.number(), 135 135 timing: timingPhasesSchema, 136 136 }), ··· 145 145 monitorId: z.string(), 146 146 }), 147 147 data: z.object({ 148 - type: z.literal("http").prefault("http"), 149 - latency: z.int(), 150 - statusCode: z.int().nullable(), 148 + type: z.literal("http").default("http"), 149 + latency: z.number().int(), 150 + statusCode: z.number().int().nullable(), 151 151 monitorId: z.string(), 152 152 error: z.coerce.boolean(), 153 153 region: z.enum(monitorRegions).or(z.string()), 154 - cronTimestamp: z.int(), 155 - trigger: z.enum(triggers).nullable().prefault("cron"), 154 + cronTimestamp: z.number().int(), 155 + trigger: z.enum(triggers).nullable().default("cron"), 156 156 timestamp: z.number(), 157 157 workspaceId: z.string(), 158 158 }), ··· 165 165 pipe: "endpoint__http_list_14d__v1", 166 166 parameters: z.object({ 167 167 monitorId: z.string(), 168 - fromDate: z.int().optional(), 169 - toDate: z.int().optional(), 168 + fromDate: z.number().int().optional(), 169 + toDate: z.number().int().optional(), 170 170 }), 171 171 data: z.object({ 172 - type: z.literal("http").prefault("http"), 172 + type: z.literal("http").default("http"), 173 173 id: z.string().nullable(), 174 - latency: z.int(), 175 - statusCode: z.int().nullable(), 174 + latency: z.number().int(), 175 + statusCode: z.number().int().nullable(), 176 176 monitorId: z.string(), 177 177 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 178 178 region: z.enum(monitorRegions).or(z.string()), 179 - cronTimestamp: z.int(), 180 - trigger: z.enum(triggers).nullable().prefault("cron"), 179 + cronTimestamp: z.number().int(), 180 + trigger: z.enum(triggers).nullable().default("cron"), 181 181 timestamp: z.number(), 182 182 timing: timingPhasesSchema, 183 183 }), ··· 190 190 pipe: "endpoint__http_metrics_1d__v0", 191 191 parameters: z.object({ 192 192 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 193 - interval: z.int().optional(), 193 + interval: z.number().int().optional(), 194 194 monitorId: z.string(), 195 195 }), 196 196 data: z.object({ 197 - p50Latency: z.number().nullable().prefault(0), 198 - p75Latency: z.number().nullable().prefault(0), 199 - p90Latency: z.number().nullable().prefault(0), 200 - p95Latency: z.number().nullable().prefault(0), 201 - p99Latency: z.number().nullable().prefault(0), 202 - count: z.int(), 203 - ok: z.int(), 204 - lastTimestamp: z.int().nullable(), 197 + p50Latency: z.number().nullable().default(0), 198 + p75Latency: z.number().nullable().default(0), 199 + p90Latency: z.number().nullable().default(0), 200 + p95Latency: z.number().nullable().default(0), 201 + p99Latency: z.number().nullable().default(0), 202 + count: z.number().int(), 203 + ok: z.number().int(), 204 + lastTimestamp: z.number().int().nullable(), 205 205 }), 206 206 opts: { next: { revalidate: REVALIDATE } }, 207 207 }); ··· 211 211 return this.tb.buildPipe({ 212 212 pipe: "endpoint__http_metrics_1d__v1", 213 213 parameters: z.object({ 214 - interval: z.int().optional(), 214 + interval: z.number().int().optional(), 215 215 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 216 216 monitorId: z.string(), 217 217 }), 218 218 data: z.object({ 219 - p50Latency: z.number().nullable().prefault(0), 220 - p75Latency: z.number().nullable().prefault(0), 221 - p90Latency: z.number().nullable().prefault(0), 222 - p95Latency: z.number().nullable().prefault(0), 223 - p99Latency: z.number().nullable().prefault(0), 224 - count: z.int().prefault(0), 225 - success: z.int().prefault(0), 226 - degraded: z.int().prefault(0), 227 - error: z.int().prefault(0), 228 - lastTimestamp: z.int().nullable(), 219 + p50Latency: z.number().nullable().default(0), 220 + p75Latency: z.number().nullable().default(0), 221 + p90Latency: z.number().nullable().default(0), 222 + p95Latency: z.number().nullable().default(0), 223 + p99Latency: z.number().nullable().default(0), 224 + count: z.number().int().default(0), 225 + success: z.number().int().default(0), 226 + degraded: z.number().int().default(0), 227 + error: z.number().int().default(0), 228 + lastTimestamp: z.number().int().nullable(), 229 229 }), 230 230 opts: { next: { revalidate: REVALIDATE } }, 231 231 }); ··· 236 236 pipe: "endpoint__http_metrics_7d__v0", 237 237 parameters: z.object({ 238 238 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 239 - interval: z.int().optional(), 239 + interval: z.number().int().optional(), 240 240 monitorId: z.string(), 241 241 }), 242 242 data: z.object({ 243 - p50Latency: z.number().nullable().prefault(0), 244 - p75Latency: z.number().nullable().prefault(0), 245 - p90Latency: z.number().nullable().prefault(0), 246 - p95Latency: z.number().nullable().prefault(0), 247 - p99Latency: z.number().nullable().prefault(0), 248 - count: z.int(), 249 - ok: z.int(), 250 - lastTimestamp: z.int().nullable(), 243 + p50Latency: z.number().nullable().default(0), 244 + p75Latency: z.number().nullable().default(0), 245 + p90Latency: z.number().nullable().default(0), 246 + p95Latency: z.number().nullable().default(0), 247 + p99Latency: z.number().nullable().default(0), 248 + count: z.number().int(), 249 + ok: z.number().int(), 250 + lastTimestamp: z.number().int().nullable(), 251 251 }), 252 252 opts: { next: { revalidate: REVALIDATE } }, 253 253 }); ··· 257 257 return this.tb.buildPipe({ 258 258 pipe: "endpoint__http_metrics_7d__v1", 259 259 parameters: z.object({ 260 - interval: z.int().optional(), 260 + interval: z.number().int().optional(), 261 261 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 262 262 monitorId: z.string(), 263 263 }), 264 264 data: z.object({ 265 - p50Latency: z.number().nullable().prefault(0), 266 - p75Latency: z.number().nullable().prefault(0), 267 - p90Latency: z.number().nullable().prefault(0), 268 - p95Latency: z.number().nullable().prefault(0), 269 - p99Latency: z.number().nullable().prefault(0), 270 - count: z.int().prefault(0), 271 - success: z.int().prefault(0), 272 - degraded: z.int().prefault(0), 273 - error: z.int().prefault(0), 274 - lastTimestamp: z.int().nullable(), 265 + p50Latency: z.number().nullable().default(0), 266 + p75Latency: z.number().nullable().default(0), 267 + p90Latency: z.number().nullable().default(0), 268 + p95Latency: z.number().nullable().default(0), 269 + p99Latency: z.number().nullable().default(0), 270 + count: z.number().int().default(0), 271 + success: z.number().int().default(0), 272 + degraded: z.number().int().default(0), 273 + error: z.number().int().default(0), 274 + lastTimestamp: z.number().int().nullable(), 275 275 }), 276 276 opts: { next: { revalidate: REVALIDATE } }, 277 277 }); ··· 282 282 pipe: "endpoint__http_metrics_14d__v0", 283 283 parameters: z.object({ 284 284 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 285 - interval: z.int().optional(), 285 + interval: z.number().int().optional(), 286 286 monitorId: z.string(), 287 287 }), 288 288 data: z.object({ 289 - p50Latency: z.number().nullable().prefault(0), 290 - p75Latency: z.number().nullable().prefault(0), 291 - p90Latency: z.number().nullable().prefault(0), 292 - p95Latency: z.number().nullable().prefault(0), 293 - p99Latency: z.number().nullable().prefault(0), 294 - count: z.int(), 295 - ok: z.int(), 296 - lastTimestamp: z.int().nullable(), 289 + p50Latency: z.number().nullable().default(0), 290 + p75Latency: z.number().nullable().default(0), 291 + p90Latency: z.number().nullable().default(0), 292 + p95Latency: z.number().nullable().default(0), 293 + p99Latency: z.number().nullable().default(0), 294 + count: z.number().int(), 295 + ok: z.number().int(), 296 + lastTimestamp: z.number().int().nullable(), 297 297 }), 298 298 opts: { next: { revalidate: REVALIDATE } }, 299 299 }); ··· 303 303 return this.tb.buildPipe({ 304 304 pipe: "endpoint__http_metrics_14d__v1", 305 305 parameters: z.object({ 306 - interval: z.int().optional(), 306 + interval: z.number().int().optional(), 307 307 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 308 308 monitorId: z.string(), 309 309 }), 310 310 data: z.object({ 311 - p50Latency: z.number().nullable().prefault(0), 312 - p75Latency: z.number().nullable().prefault(0), 313 - p90Latency: z.number().nullable().prefault(0), 314 - p95Latency: z.number().nullable().prefault(0), 315 - p99Latency: z.number().nullable().prefault(0), 316 - count: z.int().prefault(0), 317 - success: z.int().prefault(0), 318 - degraded: z.int().prefault(0), 319 - error: z.int().prefault(0), 320 - lastTimestamp: z.int().nullable(), 311 + p50Latency: z.number().nullable().default(0), 312 + p75Latency: z.number().nullable().default(0), 313 + p90Latency: z.number().nullable().default(0), 314 + p95Latency: z.number().nullable().default(0), 315 + p99Latency: z.number().nullable().default(0), 316 + count: z.number().int().default(0), 317 + success: z.number().int().default(0), 318 + degraded: z.number().int().default(0), 319 + error: z.number().int().default(0), 320 + lastTimestamp: z.number().int().nullable(), 321 321 }), 322 322 opts: { next: { revalidate: REVALIDATE } }, 323 323 }); ··· 327 327 return this.tb.buildPipe({ 328 328 pipe: "endpoint__http_metrics_by_interval_1d__v0", 329 329 parameters: z.object({ 330 - interval: z.int().optional(), 330 + interval: z.number().int().optional(), 331 331 monitorId: z.string(), 332 332 }), 333 333 data: z.object({ 334 334 region: z.enum(monitorRegions).or(z.string()), 335 - timestamp: z.int(), 336 - p50Latency: z.number().nullable().prefault(0), 337 - p75Latency: z.number().nullable().prefault(0), 338 - p90Latency: z.number().nullable().prefault(0), 339 - p95Latency: z.number().nullable().prefault(0), 340 - p99Latency: z.number().nullable().prefault(0), 335 + timestamp: z.number().int(), 336 + p50Latency: z.number().nullable().default(0), 337 + p75Latency: z.number().nullable().default(0), 338 + p90Latency: z.number().nullable().default(0), 339 + p95Latency: z.number().nullable().default(0), 340 + p99Latency: z.number().nullable().default(0), 341 341 }), 342 342 opts: { next: { revalidate: REVALIDATE } }, 343 343 }); ··· 347 347 return this.tb.buildPipe({ 348 348 pipe: "endpoint__http_metrics_by_interval_7d__v0", 349 349 parameters: z.object({ 350 - interval: z.int().optional(), 350 + interval: z.number().int().optional(), 351 351 monitorId: z.string(), 352 352 }), 353 353 data: z.object({ 354 354 region: z.enum(monitorRegions).or(z.string()), 355 - timestamp: z.int(), 356 - p50Latency: z.number().nullable().prefault(0), 357 - p75Latency: z.number().nullable().prefault(0), 358 - p90Latency: z.number().nullable().prefault(0), 359 - p95Latency: z.number().nullable().prefault(0), 360 - p99Latency: z.number().nullable().prefault(0), 355 + timestamp: z.number().int(), 356 + p50Latency: z.number().nullable().default(0), 357 + p75Latency: z.number().nullable().default(0), 358 + p90Latency: z.number().nullable().default(0), 359 + p95Latency: z.number().nullable().default(0), 360 + p99Latency: z.number().nullable().default(0), 361 361 }), 362 362 opts: { next: { revalidate: REVALIDATE } }, 363 363 }); ··· 367 367 return this.tb.buildPipe({ 368 368 pipe: "endpoint__http_metrics_by_interval_14d__v0", 369 369 parameters: z.object({ 370 - interval: z.int().optional(), 370 + interval: z.number().int().optional(), 371 371 monitorId: z.string(), 372 372 }), 373 373 data: z.object({ 374 374 region: z.enum(monitorRegions).or(z.string()), 375 - timestamp: z.int(), 376 - p50Latency: z.number().nullable().prefault(0), 377 - p75Latency: z.number().nullable().prefault(0), 378 - p90Latency: z.number().nullable().prefault(0), 379 - p95Latency: z.number().nullable().prefault(0), 380 - p99Latency: z.number().nullable().prefault(0), 375 + timestamp: z.number().int(), 376 + p50Latency: z.number().nullable().default(0), 377 + p75Latency: z.number().nullable().default(0), 378 + p90Latency: z.number().nullable().default(0), 379 + p95Latency: z.number().nullable().default(0), 380 + p99Latency: z.number().nullable().default(0), 381 381 }), 382 382 opts: { next: { revalidate: REVALIDATE } }, 383 383 }); ··· 392 392 }), 393 393 data: z.object({ 394 394 region: z.enum(monitorRegions).or(z.string()), 395 - count: z.int(), 396 - ok: z.int(), 397 - p50Latency: z.number().nullable().prefault(0), 398 - p75Latency: z.number().nullable().prefault(0), 399 - p90Latency: z.number().nullable().prefault(0), 400 - p95Latency: z.number().nullable().prefault(0), 401 - p99Latency: z.number().nullable().prefault(0), 395 + count: z.number().int(), 396 + ok: z.number().int(), 397 + p50Latency: z.number().nullable().default(0), 398 + p75Latency: z.number().nullable().default(0), 399 + p90Latency: z.number().nullable().default(0), 400 + p95Latency: z.number().nullable().default(0), 401 + p99Latency: z.number().nullable().default(0), 402 402 }), 403 403 opts: { next: { revalidate: REVALIDATE } }, 404 404 }); ··· 413 413 }), 414 414 data: z.object({ 415 415 region: z.enum(monitorRegions).or(z.string()), 416 - count: z.int(), 417 - ok: z.int(), 418 - p50Latency: z.number().nullable().prefault(0), 419 - p75Latency: z.number().nullable().prefault(0), 420 - p90Latency: z.number().nullable().prefault(0), 421 - p95Latency: z.number().nullable().prefault(0), 422 - p99Latency: z.number().nullable().prefault(0), 416 + count: z.number().int(), 417 + ok: z.number().int(), 418 + p50Latency: z.number().nullable().default(0), 419 + p75Latency: z.number().nullable().default(0), 420 + p90Latency: z.number().nullable().default(0), 421 + p95Latency: z.number().nullable().default(0), 422 + p99Latency: z.number().nullable().default(0), 423 423 }), 424 424 opts: { next: { revalidate: REVALIDATE } }, 425 425 }); ··· 434 434 }), 435 435 data: z.object({ 436 436 region: z.enum(monitorRegions).or(z.string()), 437 - count: z.int(), 438 - ok: z.int(), 439 - p50Latency: z.number().nullable().prefault(0), 440 - p75Latency: z.number().nullable().prefault(0), 441 - p90Latency: z.number().nullable().prefault(0), 442 - p95Latency: z.number().nullable().prefault(0), 443 - p99Latency: z.number().nullable().prefault(0), 437 + count: z.number().int(), 438 + ok: z.number().int(), 439 + p50Latency: z.number().nullable().default(0), 440 + p75Latency: z.number().nullable().default(0), 441 + p90Latency: z.number().nullable().default(0), 442 + p95Latency: z.number().nullable().default(0), 443 + p99Latency: z.number().nullable().default(0), 444 444 }), 445 445 opts: { next: { revalidate: REVALIDATE } }, 446 446 }); ··· 457 457 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 458 458 return new Date(`${val} GMT`).toISOString(); 459 459 }), 460 - count: z.number().prefault(0), 461 - ok: z.number().prefault(0), 460 + count: z.number().default(0), 461 + ok: z.number().default(0), 462 462 }), 463 463 opts: { next: { revalidate: REVALIDATE } }, 464 464 }); ··· 469 469 pipe: "endpoint__http_status_45d__v0", 470 470 parameters: z.object({ 471 471 monitorId: z.string(), 472 - days: z.int().max(45).optional(), 472 + days: z.number().int().max(45).optional(), 473 473 }), 474 474 data: z.object({ 475 475 day: z.string().transform((val) => { 476 476 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 477 477 return new Date(`${val} GMT`).toISOString(); 478 478 }), 479 - count: z.number().prefault(0), 480 - ok: z.number().prefault(0), 479 + count: z.number().default(0), 480 + ok: z.number().default(0), 481 481 }), 482 482 opts: { 483 483 next: { ··· 498 498 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 499 499 return new Date(`${val} GMT`).toISOString(); 500 500 }), 501 - count: z.number().prefault(0), 502 - ok: z.number().prefault(0), 503 - degraded: z.number().prefault(0), 504 - error: z.number().prefault(0), 501 + count: z.number().default(0), 502 + ok: z.number().default(0), 503 + degraded: z.number().default(0), 504 + error: z.number().default(0), 505 505 monitorId: z.string(), 506 506 }), 507 507 opts: { next: { revalidate: REVALIDATE } }, ··· 516 516 monitorId: z.string(), 517 517 }), 518 518 data: z.object({ 519 - type: z.literal("http").prefault("http"), 520 - latency: z.int(), 521 - statusCode: z.int().nullable(), 519 + type: z.literal("http").default("http"), 520 + latency: z.number().int(), 521 + statusCode: z.number().int().nullable(), 522 522 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 523 523 monitorId: z.string(), 524 - url: z.url(), 524 + url: z.string().url(), 525 525 error: z.coerce.boolean(), 526 526 region: z.enum(monitorRegions).or(z.string()), 527 - cronTimestamp: z.int(), 527 + cronTimestamp: z.number().int(), 528 528 message: z.string().nullable(), 529 529 headers: headersSchema, 530 530 timing: timingPhasesSchema, 531 531 assertions: z.string().nullable(), 532 532 body: z.string().nullable(), 533 - trigger: z.enum(triggers).nullable().prefault("cron"), 533 + trigger: z.enum(triggers).nullable().default("cron"), 534 534 timestamp: z.number(), 535 535 workspaceId: z.string(), 536 536 id: z.string().nullable(), ··· 546 546 parameters: z.object({ 547 547 monitorId: z.string(), 548 548 region: z.enum(monitorRegions).or(z.string()).optional(), 549 - cronTimestamp: z.int().optional(), 549 + cronTimestamp: z.number().int().optional(), 550 550 }), 551 551 data: z.object({ 552 - type: z.literal("http").prefault("http"), 553 - latency: z.int(), 554 - statusCode: z.int().nullable(), 552 + type: z.literal("http").default("http"), 553 + latency: z.number().int(), 554 + statusCode: z.number().int().nullable(), 555 555 monitorId: z.string(), 556 - url: z.url(), 556 + url: z.string().url(), 557 557 error: z.coerce.boolean(), 558 558 region: z.enum(monitorRegions).or(z.string()), 559 - cronTimestamp: z.int(), 559 + cronTimestamp: z.number().int(), 560 560 message: z.string().nullable(), 561 561 headers: headersSchema, 562 562 timing: timingSchema, 563 563 assertions: z.string().nullable(), 564 - trigger: z.enum(triggers).nullable().prefault("cron"), 564 + trigger: z.enum(triggers).nullable().default("cron"), 565 565 timestamp: z.number(), 566 566 workspaceId: z.string(), 567 567 }), ··· 575 575 return this.tb.buildPipe({ 576 576 pipe: "get_result_for_on_demand_check_http", 577 577 parameters: z.object({ 578 - monitorId: z.int(), 578 + monitorId: z.number().int(), 579 579 timestamp: z.number(), 580 580 url: z.string(), 581 581 }), 582 582 data: z.object({ 583 - latency: z.int(), // in ms 584 - statusCode: z.int().nullable().prefault(null), 585 - monitorId: z.string().prefault(""), 586 - url: z.url().optional(), 583 + latency: z.number().int(), // in ms 584 + statusCode: z.number().int().nullable().default(null), 585 + monitorId: z.string().default(""), 586 + url: z.string().url().optional(), 587 587 error: z 588 588 .number() 589 - .prefault(0) 589 + .default(0) 590 590 .transform((val) => val !== 0), 591 591 region: z.enum(monitorRegions), 592 - timestamp: z.int().optional(), 592 + timestamp: z.number().int().optional(), 593 593 message: z.string().nullable().optional(), 594 594 timing: timingSchema, 595 595 // TODO: make sure to include all data! ··· 606 606 monitorId: z.string(), 607 607 }), 608 608 data: z.object({ 609 - type: z.literal("tcp").prefault("tcp"), 610 - latency: z.int(), 609 + type: z.literal("tcp").default("tcp"), 610 + latency: z.number().int(), 611 611 monitorId: z.coerce.string(), 612 612 error: z.coerce.boolean(), 613 613 region: z.enum(monitorRegions).or(z.string()), 614 - cronTimestamp: z.int(), 615 - trigger: z.enum(triggers).nullable().prefault("cron"), 614 + cronTimestamp: z.number().int(), 615 + trigger: z.enum(triggers).nullable().default("cron"), 616 616 timestamp: z.number(), 617 617 workspaceId: z.coerce.string(), 618 618 }), ··· 625 625 pipe: "endpoint__tcp_list_1d__v1", 626 626 parameters: z.object({ 627 627 monitorId: z.string(), 628 - fromDate: z.int().optional(), 629 - toDate: z.int().optional(), 628 + fromDate: z.number().int().optional(), 629 + toDate: z.number().int().optional(), 630 630 }), 631 631 data: z.object({ 632 - type: z.literal("tcp").prefault("tcp"), 632 + type: z.literal("tcp").default("tcp"), 633 633 id: z.string().nullable(), 634 - latency: z.int(), 634 + latency: z.number().int(), 635 635 monitorId: z.coerce.string(), 636 636 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 637 637 region: z.enum(monitorRegions).or(z.string()), 638 - cronTimestamp: z.int(), 639 - trigger: z.enum(triggers).nullable().prefault("cron"), 638 + cronTimestamp: z.number().int(), 639 + trigger: z.enum(triggers).nullable().default("cron"), 640 640 timestamp: z.number(), 641 641 }), 642 642 opts: { next: { revalidate: REVALIDATE } }, ··· 650 650 monitorId: z.string(), 651 651 }), 652 652 data: z.object({ 653 - type: z.literal("tcp").prefault("tcp"), 654 - latency: z.int(), 653 + type: z.literal("tcp").default("tcp"), 654 + latency: z.number().int(), 655 655 monitorId: z.coerce.string(), 656 656 error: z.coerce.boolean(), 657 657 region: z.enum(monitorRegions).or(z.string()), 658 - cronTimestamp: z.int(), 659 - trigger: z.enum(triggers).nullable().prefault("cron"), 658 + cronTimestamp: z.number().int(), 659 + trigger: z.enum(triggers).nullable().default("cron"), 660 660 timestamp: z.number(), 661 661 workspaceId: z.coerce.string(), 662 662 }), ··· 669 669 pipe: "endpoint__tcp_list_7d__v1", 670 670 parameters: z.object({ 671 671 monitorId: z.string(), 672 - fromDate: z.int().optional(), 673 - toDate: z.int().optional(), 672 + fromDate: z.number().int().optional(), 673 + toDate: z.number().int().optional(), 674 674 }), 675 675 data: z.object({ 676 - type: z.literal("tcp").prefault("tcp"), 676 + type: z.literal("tcp").default("tcp"), 677 677 id: z.string().nullable(), 678 - latency: z.int(), 678 + latency: z.number().int(), 679 679 monitorId: z.coerce.string(), 680 680 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 681 681 region: z.enum(monitorRegions).or(z.string()), 682 - cronTimestamp: z.int(), 683 - trigger: z.enum(triggers).nullable().prefault("cron"), 682 + cronTimestamp: z.number().int(), 683 + trigger: z.enum(triggers).nullable().default("cron"), 684 684 timestamp: z.number(), 685 685 }), 686 686 opts: { next: { revalidate: REVALIDATE } }, ··· 694 694 monitorId: z.string(), 695 695 }), 696 696 data: z.object({ 697 - type: z.literal("tcp").prefault("tcp"), 698 - latency: z.int(), 697 + type: z.literal("tcp").default("tcp"), 698 + latency: z.number().int(), 699 699 monitorId: z.coerce.string(), 700 700 error: z.coerce.boolean(), 701 701 region: z.enum(monitorRegions).or(z.string()), 702 - cronTimestamp: z.int(), 703 - trigger: z.enum(triggers).nullable().prefault("cron"), 702 + cronTimestamp: z.number().int(), 703 + trigger: z.enum(triggers).nullable().default("cron"), 704 704 timestamp: z.number(), 705 705 workspaceId: z.coerce.string(), 706 706 }), ··· 713 713 pipe: "endpoint__tcp_list_14d__v1", 714 714 parameters: z.object({ 715 715 monitorId: z.string(), 716 - fromDate: z.int().optional(), 717 - toDate: z.int().optional(), 716 + fromDate: z.number().int().optional(), 717 + toDate: z.number().int().optional(), 718 718 }), 719 719 data: z.object({ 720 - type: z.literal("tcp").prefault("tcp"), 720 + type: z.literal("tcp").default("tcp"), 721 721 id: z.string().nullable(), 722 - latency: z.int(), 722 + latency: z.number().int(), 723 723 monitorId: z.coerce.string(), 724 724 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 725 725 region: z.enum(monitorRegions).or(z.string()), 726 - cronTimestamp: z.int(), 727 - trigger: z.enum(triggers).nullable().prefault("cron"), 726 + cronTimestamp: z.number().int(), 727 + trigger: z.enum(triggers).nullable().default("cron"), 728 728 timestamp: z.number(), 729 729 }), 730 730 opts: { next: { revalidate: REVALIDATE } }, ··· 736 736 pipe: "endpoint__tcp_metrics_1d__v0", 737 737 parameters: z.object({ 738 738 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 739 - interval: z.int().optional(), 739 + interval: z.number().int().optional(), 740 740 monitorId: z.string(), 741 741 }), 742 742 data: z.object({ 743 - p50Latency: z.number().nullable().prefault(0), 744 - p75Latency: z.number().nullable().prefault(0), 745 - p90Latency: z.number().nullable().prefault(0), 746 - p95Latency: z.number().nullable().prefault(0), 747 - p99Latency: z.number().nullable().prefault(0), 748 - count: z.int(), 749 - ok: z.int(), 750 - lastTimestamp: z.int().nullable(), 743 + p50Latency: z.number().nullable().default(0), 744 + p75Latency: z.number().nullable().default(0), 745 + p90Latency: z.number().nullable().default(0), 746 + p95Latency: z.number().nullable().default(0), 747 + p99Latency: z.number().nullable().default(0), 748 + count: z.number().int(), 749 + ok: z.number().int(), 750 + lastTimestamp: z.number().int().nullable(), 751 751 }), 752 752 opts: { next: { revalidate: REVALIDATE } }, 753 753 }); ··· 757 757 return this.tb.buildPipe({ 758 758 pipe: "endpoint__tcp_metrics_1d__v1", 759 759 parameters: z.object({ 760 - interval: z.int().optional(), 760 + interval: z.number().int().optional(), 761 761 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 762 762 monitorId: z.string(), 763 763 }), 764 764 data: z.object({ 765 - p50Latency: z.number().nullable().prefault(0), 766 - p75Latency: z.number().nullable().prefault(0), 767 - p90Latency: z.number().nullable().prefault(0), 768 - p95Latency: z.number().nullable().prefault(0), 769 - p99Latency: z.number().nullable().prefault(0), 770 - count: z.int().prefault(0), 771 - success: z.int().prefault(0), 772 - degraded: z.int().prefault(0), 773 - error: z.int().prefault(0), 774 - lastTimestamp: z.int().nullable(), 765 + p50Latency: z.number().nullable().default(0), 766 + p75Latency: z.number().nullable().default(0), 767 + p90Latency: z.number().nullable().default(0), 768 + p95Latency: z.number().nullable().default(0), 769 + p99Latency: z.number().nullable().default(0), 770 + count: z.number().int().default(0), 771 + success: z.number().int().default(0), 772 + degraded: z.number().int().default(0), 773 + error: z.number().int().default(0), 774 + lastTimestamp: z.number().int().nullable(), 775 775 }), 776 776 opts: { next: { revalidate: REVALIDATE } }, 777 777 }); ··· 781 781 return this.tb.buildPipe({ 782 782 pipe: "endpoint__tcp_metrics_7d__v0", 783 783 parameters: z.object({ 784 - interval: z.int().optional(), 784 + interval: z.number().int().optional(), 785 785 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 786 786 monitorId: z.string(), 787 787 }), 788 788 data: z.object({ 789 - p50Latency: z.number().nullable().prefault(0), 790 - p75Latency: z.number().nullable().prefault(0), 791 - p90Latency: z.number().nullable().prefault(0), 792 - p95Latency: z.number().nullable().prefault(0), 793 - p99Latency: z.number().nullable().prefault(0), 794 - count: z.int(), 795 - ok: z.int(), 796 - lastTimestamp: z.int().nullable(), 789 + p50Latency: z.number().nullable().default(0), 790 + p75Latency: z.number().nullable().default(0), 791 + p90Latency: z.number().nullable().default(0), 792 + p95Latency: z.number().nullable().default(0), 793 + p99Latency: z.number().nullable().default(0), 794 + count: z.number().int(), 795 + ok: z.number().int(), 796 + lastTimestamp: z.number().int().nullable(), 797 797 }), 798 798 opts: { next: { revalidate: REVALIDATE } }, 799 799 }); ··· 803 803 return this.tb.buildPipe({ 804 804 pipe: "endpoint__tcp_metrics_7d__v1", 805 805 parameters: z.object({ 806 - interval: z.int().optional(), 806 + interval: z.number().int().optional(), 807 807 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 808 808 monitorId: z.string(), 809 809 }), 810 810 data: z.object({ 811 - p50Latency: z.number().nullable().prefault(0), 812 - p75Latency: z.number().nullable().prefault(0), 813 - p90Latency: z.number().nullable().prefault(0), 814 - p95Latency: z.number().nullable().prefault(0), 815 - p99Latency: z.number().nullable().prefault(0), 816 - count: z.int().prefault(0), 817 - success: z.int().prefault(0), 818 - degraded: z.int().prefault(0), 819 - error: z.int().prefault(0), 820 - lastTimestamp: z.int().nullable(), 811 + p50Latency: z.number().nullable().default(0), 812 + p75Latency: z.number().nullable().default(0), 813 + p90Latency: z.number().nullable().default(0), 814 + p95Latency: z.number().nullable().default(0), 815 + p99Latency: z.number().nullable().default(0), 816 + count: z.number().int().default(0), 817 + success: z.number().int().default(0), 818 + degraded: z.number().int().default(0), 819 + error: z.number().int().default(0), 820 + lastTimestamp: z.number().int().nullable(), 821 821 }), 822 822 opts: { next: { revalidate: REVALIDATE } }, 823 823 }); ··· 828 828 pipe: "endpoint__tcp_metrics_14d__v0", 829 829 parameters: z.object({ 830 830 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 831 - interval: z.int().optional(), 831 + interval: z.number().int().optional(), 832 832 monitorId: z.string(), 833 833 }), 834 834 data: z.object({ 835 - p50Latency: z.number().nullable().prefault(0), 836 - p75Latency: z.number().nullable().prefault(0), 837 - p90Latency: z.number().nullable().prefault(0), 838 - p95Latency: z.number().nullable().prefault(0), 839 - p99Latency: z.number().nullable().prefault(0), 840 - count: z.int(), 841 - ok: z.int(), 842 - lastTimestamp: z.int().nullable(), 835 + p50Latency: z.number().nullable().default(0), 836 + p75Latency: z.number().nullable().default(0), 837 + p90Latency: z.number().nullable().default(0), 838 + p95Latency: z.number().nullable().default(0), 839 + p99Latency: z.number().nullable().default(0), 840 + count: z.number().int(), 841 + ok: z.number().int(), 842 + lastTimestamp: z.number().int().nullable(), 843 843 }), 844 844 opts: { next: { revalidate: REVALIDATE } }, 845 845 }); ··· 849 849 return this.tb.buildPipe({ 850 850 pipe: "endpoint__tcp_metrics_14d__v1", 851 851 parameters: z.object({ 852 - interval: z.int().optional(), 852 + interval: z.number().int().optional(), 853 853 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 854 854 monitorId: z.string(), 855 855 }), 856 856 data: z.object({ 857 - p50Latency: z.number().nullable().prefault(0), 858 - p75Latency: z.number().nullable().prefault(0), 859 - p90Latency: z.number().nullable().prefault(0), 860 - p95Latency: z.number().nullable().prefault(0), 861 - p99Latency: z.number().nullable().prefault(0), 862 - count: z.int().prefault(0), 863 - success: z.int().prefault(0), 864 - degraded: z.int().prefault(0), 865 - error: z.int().prefault(0), 866 - lastTimestamp: z.int().nullable(), 857 + p50Latency: z.number().nullable().default(0), 858 + p75Latency: z.number().nullable().default(0), 859 + p90Latency: z.number().nullable().default(0), 860 + p95Latency: z.number().nullable().default(0), 861 + p99Latency: z.number().nullable().default(0), 862 + count: z.number().int().default(0), 863 + success: z.number().int().default(0), 864 + degraded: z.number().int().default(0), 865 + error: z.number().int().default(0), 866 + lastTimestamp: z.number().int().nullable(), 867 867 }), 868 868 opts: { next: { revalidate: REVALIDATE } }, 869 869 }); ··· 874 874 pipe: "endpoint__tcp_metrics_by_interval_1d__v0", 875 875 parameters: z.object({ 876 876 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 877 - interval: z.int().optional(), 877 + interval: z.number().int().optional(), 878 878 monitorId: z.string(), 879 879 }), 880 880 data: z.object({ 881 881 region: z.enum(monitorRegions).or(z.string()), 882 - timestamp: z.int(), 883 - p50Latency: z.number().nullable().prefault(0), 884 - p75Latency: z.number().nullable().prefault(0), 885 - p90Latency: z.number().nullable().prefault(0), 886 - p95Latency: z.number().nullable().prefault(0), 887 - p99Latency: z.number().nullable().prefault(0), 882 + timestamp: z.number().int(), 883 + p50Latency: z.number().nullable().default(0), 884 + p75Latency: z.number().nullable().default(0), 885 + p90Latency: z.number().nullable().default(0), 886 + p95Latency: z.number().nullable().default(0), 887 + p99Latency: z.number().nullable().default(0), 888 888 }), 889 889 opts: { next: { revalidate: REVALIDATE } }, 890 890 }); ··· 895 895 pipe: "endpoint__tcp_metrics_by_interval_7d__v0", 896 896 parameters: z.object({ 897 897 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 898 - interval: z.int().optional(), 898 + interval: z.number().int().optional(), 899 899 monitorId: z.string(), 900 900 }), 901 901 data: z.object({ 902 902 region: z.enum(monitorRegions).or(z.string()), 903 - timestamp: z.int(), 904 - p50Latency: z.number().nullable().prefault(0), 905 - p75Latency: z.number().nullable().prefault(0), 906 - p90Latency: z.number().nullable().prefault(0), 907 - p95Latency: z.number().nullable().prefault(0), 908 - p99Latency: z.number().nullable().prefault(0), 903 + timestamp: z.number().int(), 904 + p50Latency: z.number().nullable().default(0), 905 + p75Latency: z.number().nullable().default(0), 906 + p90Latency: z.number().nullable().default(0), 907 + p95Latency: z.number().nullable().default(0), 908 + p99Latency: z.number().nullable().default(0), 909 909 }), 910 910 opts: { next: { revalidate: REVALIDATE } }, 911 911 }); ··· 916 916 pipe: "endpoint__tcp_metrics_by_interval_14d__v0", 917 917 parameters: z.object({ 918 918 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 919 - interval: z.int().optional(), 919 + interval: z.number().int().optional(), 920 920 monitorId: z.string(), 921 921 }), 922 922 data: z.object({ 923 923 region: z.enum(monitorRegions).or(z.string()), 924 - timestamp: z.int(), 925 - p50Latency: z.number().nullable().prefault(0), 926 - p75Latency: z.number().nullable().prefault(0), 927 - p90Latency: z.number().nullable().prefault(0), 928 - p95Latency: z.number().nullable().prefault(0), 929 - p99Latency: z.number().nullable().prefault(0), 924 + timestamp: z.number().int(), 925 + p50Latency: z.number().nullable().default(0), 926 + p75Latency: z.number().nullable().default(0), 927 + p90Latency: z.number().nullable().default(0), 928 + p95Latency: z.number().nullable().default(0), 929 + p99Latency: z.number().nullable().default(0), 930 930 }), 931 931 opts: { next: { revalidate: REVALIDATE } }, 932 932 }); ··· 941 941 }), 942 942 data: z.object({ 943 943 region: z.enum(monitorRegions).or(z.string()), 944 - count: z.int(), 945 - ok: z.int(), 946 - p50Latency: z.number().nullable().prefault(0), 947 - p75Latency: z.number().nullable().prefault(0), 948 - p90Latency: z.number().nullable().prefault(0), 949 - p95Latency: z.number().nullable().prefault(0), 950 - p99Latency: z.number().nullable().prefault(0), 944 + count: z.number().int(), 945 + ok: z.number().int(), 946 + p50Latency: z.number().nullable().default(0), 947 + p75Latency: z.number().nullable().default(0), 948 + p90Latency: z.number().nullable().default(0), 949 + p95Latency: z.number().nullable().default(0), 950 + p99Latency: z.number().nullable().default(0), 951 951 }), 952 952 opts: { next: { revalidate: REVALIDATE } }, 953 953 }); ··· 962 962 }), 963 963 data: z.object({ 964 964 region: z.enum(monitorRegions).or(z.string()), 965 - count: z.int(), 966 - ok: z.int(), 967 - p50Latency: z.number().nullable().prefault(0), 968 - p75Latency: z.number().nullable().prefault(0), 969 - p90Latency: z.number().nullable().prefault(0), 970 - p95Latency: z.number().nullable().prefault(0), 971 - p99Latency: z.number().nullable().prefault(0), 965 + count: z.number().int(), 966 + ok: z.number().int(), 967 + p50Latency: z.number().nullable().default(0), 968 + p75Latency: z.number().nullable().default(0), 969 + p90Latency: z.number().nullable().default(0), 970 + p95Latency: z.number().nullable().default(0), 971 + p99Latency: z.number().nullable().default(0), 972 972 }), 973 973 opts: { next: { revalidate: REVALIDATE } }, 974 974 }); ··· 983 983 }), 984 984 data: z.object({ 985 985 region: z.enum(monitorRegions).or(z.string()), 986 - count: z.int(), 987 - ok: z.int(), 988 - p50Latency: z.number().nullable().prefault(0), 989 - p75Latency: z.number().nullable().prefault(0), 990 - p90Latency: z.number().nullable().prefault(0), 991 - p95Latency: z.number().nullable().prefault(0), 992 - p99Latency: z.number().nullable().prefault(0), 986 + count: z.number().int(), 987 + ok: z.number().int(), 988 + p50Latency: z.number().nullable().default(0), 989 + p75Latency: z.number().nullable().default(0), 990 + p90Latency: z.number().nullable().default(0), 991 + p95Latency: z.number().nullable().default(0), 992 + p99Latency: z.number().nullable().default(0), 993 993 }), 994 994 opts: { next: { revalidate: REVALIDATE } }, 995 995 }); ··· 1006 1006 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 1007 1007 return new Date(`${val} GMT`).toISOString(); 1008 1008 }), 1009 - count: z.number().prefault(0), 1010 - ok: z.number().prefault(0), 1009 + count: z.number().default(0), 1010 + ok: z.number().default(0), 1011 1011 }), 1012 1012 opts: { next: { revalidate: REVALIDATE } }, 1013 1013 }); ··· 1018 1018 pipe: "endpoint__tcp_status_45d__v0", 1019 1019 parameters: z.object({ 1020 1020 monitorId: z.string(), 1021 - days: z.int().max(45).optional(), 1021 + days: z.number().int().max(45).optional(), 1022 1022 }), 1023 1023 data: z.object({ 1024 1024 day: z.string().transform((val) => { 1025 1025 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 1026 1026 return new Date(`${val} GMT`).toISOString(); 1027 1027 }), 1028 - count: z.number().prefault(0), 1029 - ok: z.number().prefault(0), 1028 + count: z.number().default(0), 1029 + ok: z.number().default(0), 1030 1030 }), 1031 1031 opts: { 1032 1032 next: { ··· 1041 1041 pipe: "endpoint__tcp_status_45d__v1", 1042 1042 parameters: z.object({ 1043 1043 monitorIds: z.string().array(), 1044 - days: z.int().max(45).optional(), 1044 + days: z.number().int().max(45).optional(), 1045 1045 }), 1046 1046 data: z.object({ 1047 1047 day: z.string().transform((val) => { 1048 1048 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 1049 1049 return new Date(`${val} GMT`).toISOString(); 1050 1050 }), 1051 - count: z.number().prefault(0), 1052 - ok: z.number().prefault(0), 1053 - degraded: z.number().prefault(0), 1054 - error: z.number().prefault(0), 1051 + count: z.number().default(0), 1052 + ok: z.number().default(0), 1053 + degraded: z.number().default(0), 1054 + error: z.number().default(0), 1055 1055 monitorId: z.coerce.string(), 1056 1056 }), 1057 1057 opts: { next: { revalidate: REVALIDATE } }, ··· 1068 1068 day: z 1069 1069 .string() 1070 1070 .transform((val) => new Date(`${val} GMT`).toISOString()), 1071 - count: z.int(), 1071 + count: z.number().int(), 1072 1072 }), 1073 1073 opts: { next: { revalidate: REVALIDATE } }, 1074 1074 }); ··· 1084 1084 day: z 1085 1085 .string() 1086 1086 .transform((val) => new Date(`${val} GMT`).toISOString()), 1087 - count: z.int(), 1087 + count: z.number().int(), 1088 1088 }), 1089 1089 opts: { next: { revalidate: REVALIDATE } }, 1090 1090 }); ··· 1098 1098 monitorId: z.string(), 1099 1099 }), 1100 1100 data: z.object({ 1101 - type: z.literal("tcp").prefault("tcp"), 1101 + type: z.literal("tcp").default("tcp"), 1102 1102 id: z.string().nullable(), 1103 1103 uri: z.string(), 1104 - latency: z.int(), 1104 + latency: z.number().int(), 1105 1105 monitorId: z.coerce.string(), 1106 1106 error: z.coerce.boolean(), 1107 1107 region: z.enum(monitorRegions).or(z.string()), 1108 - cronTimestamp: z.int(), 1109 - trigger: z.enum(triggers).nullable().prefault("cron"), 1108 + cronTimestamp: z.number().int(), 1109 + trigger: z.enum(triggers).nullable().default("cron"), 1110 1110 timestamp: z.number(), 1111 1111 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 1112 1112 errorMessage: z.string().nullable(), ··· 1122 1122 parameters: z.object({ 1123 1123 monitorId: z.string(), 1124 1124 region: z.enum(monitorRegions).or(z.string()).optional(), 1125 - cronTimestamp: z.int().optional(), 1125 + cronTimestamp: z.number().int().optional(), 1126 1126 }), 1127 1127 data: z.object({ 1128 - type: z.literal("tcp").prefault("tcp"), 1129 - latency: z.int(), 1128 + type: z.literal("tcp").default("tcp"), 1129 + latency: z.number().int(), 1130 1130 monitorId: z.string(), 1131 1131 error: z.coerce.boolean(), 1132 1132 region: z.enum(monitorRegions).or(z.string()), 1133 - cronTimestamp: z.int(), 1134 - trigger: z.enum(triggers).nullable().prefault("cron"), 1133 + cronTimestamp: z.number().int(), 1134 + trigger: z.enum(triggers).nullable().default("cron"), 1135 1135 timestamp: z.number(), 1136 1136 workspaceId: z.string(), 1137 1137 }), ··· 1149 1149 pipe: "endpoint__http_metrics_regions_1d__v0", 1150 1150 parameters: z.object({ 1151 1151 monitorId: z.string(), 1152 - interval: z.int().optional(), 1152 + interval: z.number().int().optional(), 1153 1153 // Comma-separated list of regions, e.g. "ams,fra". Keeping string to pass directly. 1154 1154 regions: z.string().array().optional(), 1155 1155 }), 1156 1156 data: z.object({ 1157 1157 region: z.enum(monitorRegions).or(z.string()), 1158 - timestamp: z.int(), 1159 - p50Latency: z.number().nullable().prefault(0), 1160 - p75Latency: z.number().nullable().prefault(0), 1161 - p90Latency: z.number().nullable().prefault(0), 1162 - p95Latency: z.number().nullable().prefault(0), 1163 - p99Latency: z.number().nullable().prefault(0), 1158 + timestamp: z.number().int(), 1159 + p50Latency: z.number().nullable().default(0), 1160 + p75Latency: z.number().nullable().default(0), 1161 + p90Latency: z.number().nullable().default(0), 1162 + p95Latency: z.number().nullable().default(0), 1163 + p99Latency: z.number().nullable().default(0), 1164 1164 }), 1165 1165 opts: { next: { revalidate: REVALIDATE } }, 1166 1166 }); ··· 1171 1171 pipe: "endpoint__http_metrics_regions_7d__v0", 1172 1172 parameters: z.object({ 1173 1173 monitorId: z.string(), 1174 - interval: z.int().optional(), 1174 + interval: z.number().int().optional(), 1175 1175 regions: z.string().array().optional(), 1176 1176 }), 1177 1177 data: z.object({ 1178 1178 region: z.enum(monitorRegions).or(z.string()), 1179 - timestamp: z.int(), 1180 - p50Latency: z.number().nullable().prefault(0), 1181 - p75Latency: z.number().nullable().prefault(0), 1182 - p90Latency: z.number().nullable().prefault(0), 1183 - p95Latency: z.number().nullable().prefault(0), 1184 - p99Latency: z.number().nullable().prefault(0), 1179 + timestamp: z.number().int(), 1180 + p50Latency: z.number().nullable().default(0), 1181 + p75Latency: z.number().nullable().default(0), 1182 + p90Latency: z.number().nullable().default(0), 1183 + p95Latency: z.number().nullable().default(0), 1184 + p99Latency: z.number().nullable().default(0), 1185 1185 }), 1186 1186 opts: { next: { revalidate: REVALIDATE } }, 1187 1187 }); ··· 1192 1192 pipe: "endpoint__http_metrics_regions_14d__v0", 1193 1193 parameters: z.object({ 1194 1194 monitorId: z.string(), 1195 - interval: z.int().optional(), 1195 + interval: z.number().int().optional(), 1196 1196 regions: z.string().array().optional(), 1197 1197 }), 1198 1198 data: z.object({ 1199 1199 region: z.enum(monitorRegions).or(z.string()), 1200 - timestamp: z.int(), 1201 - p50Latency: z.number().nullable().prefault(0), 1202 - p75Latency: z.number().nullable().prefault(0), 1203 - p90Latency: z.number().nullable().prefault(0), 1204 - p95Latency: z.number().nullable().prefault(0), 1205 - p99Latency: z.number().nullable().prefault(0), 1200 + timestamp: z.number().int(), 1201 + p50Latency: z.number().nullable().default(0), 1202 + p75Latency: z.number().nullable().default(0), 1203 + p90Latency: z.number().nullable().default(0), 1204 + p95Latency: z.number().nullable().default(0), 1205 + p99Latency: z.number().nullable().default(0), 1206 1206 }), 1207 1207 opts: { next: { revalidate: REVALIDATE } }, 1208 1208 }); ··· 1216 1216 fromDate: z.string().optional(), 1217 1217 toDate: z.string().optional(), 1218 1218 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 1219 - interval: z.int().optional(), 1219 + interval: z.number().int().optional(), 1220 1220 }), 1221 1221 data: z.object({ 1222 1222 interval: z.coerce.date(), 1223 - success: z.int(), 1224 - degraded: z.int(), 1225 - error: z.int(), 1223 + success: z.number().int(), 1224 + degraded: z.number().int(), 1225 + error: z.number().int(), 1226 1226 }), 1227 1227 }); 1228 1228 } ··· 1235 1235 fromDate: z.string().optional(), 1236 1236 toDate: z.string().optional(), 1237 1237 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 1238 - interval: z.int().optional(), 1238 + interval: z.number().int().optional(), 1239 1239 }), 1240 1240 data: z.object({ 1241 1241 interval: z.coerce.date(), 1242 - success: z.int(), 1243 - degraded: z.int(), 1244 - error: z.int(), 1242 + success: z.number().int(), 1243 + degraded: z.number().int(), 1244 + error: z.number().int(), 1245 1245 }), 1246 1246 }); 1247 1247 } ··· 1254 1254 fromDate: z.string().optional(), 1255 1255 toDate: z.string().optional(), 1256 1256 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 1257 - interval: z.int().optional(), 1257 + interval: z.number().int().optional(), 1258 1258 }), 1259 1259 data: z.object({ 1260 1260 interval: z.coerce.date(), 1261 - success: z.int(), 1262 - degraded: z.int(), 1263 - error: z.int(), 1261 + success: z.number().int(), 1262 + degraded: z.number().int(), 1263 + error: z.number().int(), 1264 1264 }), 1265 1265 }); 1266 1266 } ··· 1273 1273 fromDate: z.string().optional(), 1274 1274 toDate: z.string().optional(), 1275 1275 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 1276 - interval: z.int().optional(), 1276 + interval: z.number().int().optional(), 1277 1277 }), 1278 1278 data: z.object({ 1279 1279 interval: z.coerce.date(), 1280 - success: z.int(), 1281 - degraded: z.int(), 1282 - error: z.int(), 1280 + success: z.number().int(), 1281 + degraded: z.number().int(), 1282 + error: z.number().int(), 1283 1283 }), 1284 1284 }); 1285 1285 } ··· 1289 1289 pipe: "endpoint__audit_log__v1", 1290 1290 parameters: z.object({ 1291 1291 monitorId: z.string(), 1292 - interval: z.int().prefault(30), // in days 1292 + interval: z.number().int().default(30), // in days 1293 1293 }), 1294 1294 data: z.object({ 1295 1295 action: z.string(), ··· 1302 1302 return {}; 1303 1303 } 1304 1304 }), 1305 - timestamp: z.int(), 1305 + timestamp: z.number().int(), 1306 1306 }), 1307 1307 opts: { next: { revalidate: REVALIDATE } }, 1308 1308 }); ··· 1315 1315 monitorIds: z.string().array(), 1316 1316 }), 1317 1317 data: z.object({ 1318 - minLatency: z.int(), 1319 - maxLatency: z.int(), 1320 - p50Latency: z.int(), 1321 - p75Latency: z.int(), 1322 - p90Latency: z.int(), 1323 - p95Latency: z.int(), 1324 - p99Latency: z.int(), 1325 - lastTimestamp: z.int(), 1326 - count: z.int(), 1318 + minLatency: z.number().int(), 1319 + maxLatency: z.number().int(), 1320 + p50Latency: z.number().int(), 1321 + p75Latency: z.number().int(), 1322 + p90Latency: z.number().int(), 1323 + p95Latency: z.number().int(), 1324 + p99Latency: z.number().int(), 1325 + lastTimestamp: z.number().int(), 1326 + count: z.number().int(), 1327 1327 monitorId: z.string(), 1328 1328 }), 1329 1329 opts: { next: { revalidate: REVALIDATE } }, ··· 1337 1337 monitorIds: z.string().array(), 1338 1338 }), 1339 1339 data: z.object({ 1340 - minLatency: z.int(), 1341 - maxLatency: z.int(), 1342 - p50Latency: z.int(), 1343 - p75Latency: z.int(), 1344 - p90Latency: z.int(), 1345 - p95Latency: z.int(), 1346 - p99Latency: z.int(), 1347 - lastTimestamp: z.int(), 1348 - count: z.int(), 1340 + minLatency: z.number().int(), 1341 + maxLatency: z.number().int(), 1342 + p50Latency: z.number().int(), 1343 + p75Latency: z.number().int(), 1344 + p90Latency: z.number().int(), 1345 + p95Latency: z.number().int(), 1346 + p99Latency: z.number().int(), 1347 + lastTimestamp: z.number().int(), 1348 + count: z.number().int(), 1349 1349 monitorId: z.coerce.string(), 1350 1350 }), 1351 1351 opts: { next: { revalidate: REVALIDATE } }, ··· 1357 1357 pipe: "endpoint__http_timing_phases_14d__v1", 1358 1358 parameters: z.object({ 1359 1359 monitorId: z.string(), 1360 - interval: z.int().optional(), 1360 + interval: z.number().int().optional(), 1361 1361 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 1362 1362 }), 1363 1363 data: z.object({ 1364 - timestamp: z.int(), 1365 - p50Dns: z.int(), 1366 - p50Ttfb: z.int(), 1367 - p50Transfer: z.int(), 1368 - p50Connect: z.int(), 1369 - p50Tls: z.int(), 1370 - p75Dns: z.int(), 1371 - p75Ttfb: z.int(), 1372 - p75Transfer: z.int(), 1373 - p75Connect: z.int(), 1374 - p75Tls: z.int(), 1375 - p90Dns: z.int(), 1376 - p90Ttfb: z.int(), 1377 - p90Transfer: z.int(), 1378 - p90Connect: z.int(), 1379 - p90Tls: z.int(), 1380 - p95Dns: z.int(), 1381 - p95Ttfb: z.int(), 1382 - p95Transfer: z.int(), 1383 - p95Connect: z.int(), 1384 - p95Tls: z.int(), 1385 - p99Dns: z.int(), 1386 - p99Ttfb: z.int(), 1387 - p99Transfer: z.int(), 1388 - p99Connect: z.int(), 1389 - p99Tls: z.int(), 1364 + timestamp: z.number().int(), 1365 + p50Dns: z.number().int(), 1366 + p50Ttfb: z.number().int(), 1367 + p50Transfer: z.number().int(), 1368 + p50Connect: z.number().int(), 1369 + p50Tls: z.number().int(), 1370 + p75Dns: z.number().int(), 1371 + p75Ttfb: z.number().int(), 1372 + p75Transfer: z.number().int(), 1373 + p75Connect: z.number().int(), 1374 + p75Tls: z.number().int(), 1375 + p90Dns: z.number().int(), 1376 + p90Ttfb: z.number().int(), 1377 + p90Transfer: z.number().int(), 1378 + p90Connect: z.number().int(), 1379 + p90Tls: z.number().int(), 1380 + p95Dns: z.number().int(), 1381 + p95Ttfb: z.number().int(), 1382 + p95Transfer: z.number().int(), 1383 + p95Connect: z.number().int(), 1384 + p95Tls: z.number().int(), 1385 + p99Dns: z.number().int(), 1386 + p99Ttfb: z.number().int(), 1387 + p99Transfer: z.number().int(), 1388 + p99Connect: z.number().int(), 1389 + p99Tls: z.number().int(), 1390 1390 }), 1391 1391 }); 1392 1392 } ··· 1400 1400 toDate: z.string().optional(), 1401 1401 }), 1402 1402 data: z.object({ 1403 - timestamp: z.int(), 1404 - p50Latency: z.int(), 1405 - p75Latency: z.int(), 1406 - p90Latency: z.int(), 1407 - p95Latency: z.int(), 1408 - p99Latency: z.int(), 1403 + timestamp: z.number().int(), 1404 + p50Latency: z.number().int(), 1405 + p75Latency: z.number().int(), 1406 + p90Latency: z.number().int(), 1407 + p95Latency: z.number().int(), 1408 + p99Latency: z.number().int(), 1409 1409 }), 1410 1410 }); 1411 1411 } ··· 1419 1419 toDate: z.string().optional(), 1420 1420 }), 1421 1421 data: z.object({ 1422 - timestamp: z.int(), 1423 - p50Latency: z.int(), 1424 - p75Latency: z.int(), 1425 - p90Latency: z.int(), 1426 - p95Latency: z.int(), 1427 - p99Latency: z.int(), 1422 + timestamp: z.number().int(), 1423 + p50Latency: z.number().int(), 1424 + p75Latency: z.number().int(), 1425 + p90Latency: z.number().int(), 1426 + p95Latency: z.number().int(), 1427 + p99Latency: z.number().int(), 1428 1428 }), 1429 1429 }); 1430 1430 } ··· 1438 1438 toDate: z.string().optional(), 1439 1439 }), 1440 1440 data: z.object({ 1441 - timestamp: z.int(), 1441 + timestamp: z.number().int(), 1442 1442 monitorId: z.string(), 1443 - p50Latency: z.int(), 1444 - p75Latency: z.int(), 1445 - p90Latency: z.int(), 1446 - p95Latency: z.int(), 1447 - p99Latency: z.int(), 1443 + p50Latency: z.number().int(), 1444 + p75Latency: z.number().int(), 1445 + p90Latency: z.number().int(), 1446 + p95Latency: z.number().int(), 1447 + p99Latency: z.number().int(), 1448 1448 }), 1449 1449 opts: { next: { revalidate: REVALIDATE } }, 1450 1450 }); ··· 1460 1460 toDate: z.string().optional(), 1461 1461 }), 1462 1462 data: z.object({ 1463 - timestamp: z.int(), 1464 - p50Latency: z.int(), 1465 - p75Latency: z.int(), 1466 - p90Latency: z.int(), 1467 - p95Latency: z.int(), 1468 - p99Latency: z.int(), 1463 + timestamp: z.number().int(), 1464 + p50Latency: z.number().int(), 1465 + p75Latency: z.number().int(), 1466 + p90Latency: z.number().int(), 1467 + p95Latency: z.number().int(), 1468 + p99Latency: z.number().int(), 1469 1469 }), 1470 1470 }); 1471 1471 } ··· 1479 1479 toDate: z.string().optional(), 1480 1480 }), 1481 1481 data: z.object({ 1482 - timestamp: z.int(), 1483 - p50Latency: z.int(), 1484 - p75Latency: z.int(), 1485 - p90Latency: z.int(), 1486 - p95Latency: z.int(), 1487 - p99Latency: z.int(), 1482 + timestamp: z.number().int(), 1483 + p50Latency: z.number().int(), 1484 + p75Latency: z.number().int(), 1485 + p90Latency: z.number().int(), 1486 + p95Latency: z.number().int(), 1487 + p99Latency: z.number().int(), 1488 1488 }), 1489 1489 }); 1490 1490 } ··· 1498 1498 toDate: z.string().optional(), 1499 1499 }), 1500 1500 data: z.object({ 1501 - timestamp: z.int(), 1501 + timestamp: z.number().int(), 1502 1502 monitorId: z.coerce.string(), 1503 - p50Latency: z.int(), 1504 - p75Latency: z.int(), 1505 - p90Latency: z.int(), 1506 - p95Latency: z.int(), 1507 - p99Latency: z.int(), 1503 + p50Latency: z.number().int(), 1504 + p75Latency: z.number().int(), 1505 + p90Latency: z.number().int(), 1506 + p95Latency: z.number().int(), 1507 + p99Latency: z.number().int(), 1508 1508 }), 1509 1509 opts: { next: { revalidate: REVALIDATE } }, 1510 1510 }); ··· 1518 1518 monitorId: z.string(), 1519 1519 }), 1520 1520 data: z.object({ 1521 - type: z.literal("dns").prefault("dns"), 1521 + type: z.literal("dns").default("dns"), 1522 1522 id: z.coerce.string().nullable(), 1523 1523 uri: z.string(), 1524 - latency: z.int(), 1524 + latency: z.number().int(), 1525 1525 monitorId: z.coerce.string(), 1526 1526 error: z.coerce.boolean(), 1527 1527 region: z.enum(monitorRegions).or(z.string()), 1528 - cronTimestamp: z.int(), 1529 - trigger: z.enum(triggers).nullable().prefault("cron"), 1528 + cronTimestamp: z.number().int(), 1529 + trigger: z.enum(triggers).nullable().default("cron"), 1530 1530 timestamp: z.number(), 1531 1531 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 1532 1532 errorMessage: z.string().nullable(), ··· 1553 1553 pipe: "endpoint__dns_list_14d__v0", 1554 1554 parameters: z.object({ 1555 1555 monitorId: z.string(), 1556 - fromDate: z.int().optional(), 1557 - toDate: z.int().optional(), 1556 + fromDate: z.number().int().optional(), 1557 + toDate: z.number().int().optional(), 1558 1558 }), 1559 1559 data: z.object({ 1560 - type: z.literal("dns").prefault("dns"), 1560 + type: z.literal("dns").default("dns"), 1561 1561 id: z.coerce.string().nullable(), 1562 1562 uri: z.string(), 1563 - latency: z.int(), 1563 + latency: z.number().int(), 1564 1564 monitorId: z.coerce.string(), 1565 1565 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 1566 1566 region: z.enum(monitorRegions).or(z.string()), 1567 - cronTimestamp: z.int(), 1568 - trigger: z.enum(triggers).nullable().prefault("cron"), 1567 + cronTimestamp: z.number().int(), 1568 + trigger: z.enum(triggers).nullable().default("cron"), 1569 1569 timestamp: z.number(), 1570 1570 records: z 1571 1571 .string() ··· 1587 1587 return this.tb.buildPipe({ 1588 1588 pipe: "endpoint__dns_metrics_1d__v0", 1589 1589 parameters: z.object({ 1590 - interval: z.int().optional(), 1590 + interval: z.number().int().optional(), 1591 1591 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 1592 1592 monitorId: z.string(), 1593 1593 }), 1594 1594 data: z.object({ 1595 - p50Latency: z.number().nullable().prefault(0), 1596 - p75Latency: z.number().nullable().prefault(0), 1597 - p90Latency: z.number().nullable().prefault(0), 1598 - p95Latency: z.number().nullable().prefault(0), 1599 - p99Latency: z.number().nullable().prefault(0), 1600 - count: z.int().prefault(0), 1601 - success: z.int().prefault(0), 1602 - degraded: z.int().prefault(0), 1603 - error: z.int().prefault(0), 1604 - lastTimestamp: z.int().nullable(), 1595 + p50Latency: z.number().nullable().default(0), 1596 + p75Latency: z.number().nullable().default(0), 1597 + p90Latency: z.number().nullable().default(0), 1598 + p95Latency: z.number().nullable().default(0), 1599 + p99Latency: z.number().nullable().default(0), 1600 + count: z.number().int().default(0), 1601 + success: z.number().int().default(0), 1602 + degraded: z.number().int().default(0), 1603 + error: z.number().int().default(0), 1604 + lastTimestamp: z.number().int().nullable(), 1605 1605 }), 1606 1606 opts: { next: { revalidate: REVALIDATE } }, 1607 1607 }); ··· 1611 1611 return this.tb.buildPipe({ 1612 1612 pipe: "endpoint__dns_metrics_7d__v0", 1613 1613 parameters: z.object({ 1614 - interval: z.int().optional(), 1614 + interval: z.number().int().optional(), 1615 1615 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 1616 1616 monitorId: z.string(), 1617 1617 }), 1618 1618 data: z.object({ 1619 - p50Latency: z.number().nullable().prefault(0), 1620 - p75Latency: z.number().nullable().prefault(0), 1621 - p90Latency: z.number().nullable().prefault(0), 1622 - p95Latency: z.number().nullable().prefault(0), 1623 - p99Latency: z.number().nullable().prefault(0), 1624 - count: z.int().prefault(0), 1625 - success: z.int().prefault(0), 1626 - degraded: z.int().prefault(0), 1627 - error: z.int().prefault(0), 1628 - lastTimestamp: z.int().nullable(), 1619 + p50Latency: z.number().nullable().default(0), 1620 + p75Latency: z.number().nullable().default(0), 1621 + p90Latency: z.number().nullable().default(0), 1622 + p95Latency: z.number().nullable().default(0), 1623 + p99Latency: z.number().nullable().default(0), 1624 + count: z.number().int().default(0), 1625 + success: z.number().int().default(0), 1626 + degraded: z.number().int().default(0), 1627 + error: z.number().int().default(0), 1628 + lastTimestamp: z.number().int().nullable(), 1629 1629 }), 1630 1630 opts: { next: { revalidate: REVALIDATE } }, 1631 1631 }); ··· 1635 1635 return this.tb.buildPipe({ 1636 1636 pipe: "endpoint__dns_metrics_14d__v0", 1637 1637 parameters: z.object({ 1638 - interval: z.int().optional(), 1638 + interval: z.number().int().optional(), 1639 1639 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 1640 1640 monitorId: z.string(), 1641 1641 }), 1642 1642 data: z.object({ 1643 - p50Latency: z.number().nullable().prefault(0), 1644 - p75Latency: z.number().nullable().prefault(0), 1645 - p90Latency: z.number().nullable().prefault(0), 1646 - p95Latency: z.number().nullable().prefault(0), 1647 - p99Latency: z.number().nullable().prefault(0), 1648 - count: z.int().prefault(0), 1649 - success: z.int().prefault(0), 1650 - degraded: z.int().prefault(0), 1651 - error: z.int().prefault(0), 1652 - lastTimestamp: z.int().nullable(), 1643 + p50Latency: z.number().nullable().default(0), 1644 + p75Latency: z.number().nullable().default(0), 1645 + p90Latency: z.number().nullable().default(0), 1646 + p95Latency: z.number().nullable().default(0), 1647 + p99Latency: z.number().nullable().default(0), 1648 + count: z.number().int().default(0), 1649 + success: z.number().int().default(0), 1650 + degraded: z.number().int().default(0), 1651 + error: z.number().int().default(0), 1652 + lastTimestamp: z.number().int().nullable(), 1653 1653 }), 1654 1654 opts: { next: { revalidate: REVALIDATE } }, 1655 1655 }); ··· 1663 1663 fromDate: z.string().optional(), 1664 1664 toDate: z.string().optional(), 1665 1665 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 1666 - interval: z.int().optional(), 1666 + interval: z.number().int().optional(), 1667 1667 }), 1668 1668 data: z.object({ 1669 1669 interval: z.coerce.date(), 1670 - success: z.int(), 1671 - degraded: z.int(), 1672 - error: z.int(), 1670 + success: z.number().int(), 1671 + degraded: z.number().int(), 1672 + error: z.number().int(), 1673 1673 }), 1674 1674 }); 1675 1675 } ··· 1683 1683 toDate: z.string().optional(), 1684 1684 }), 1685 1685 data: z.object({ 1686 - timestamp: z.int(), 1687 - p50Latency: z.int(), 1688 - p75Latency: z.int(), 1689 - p90Latency: z.int(), 1690 - p95Latency: z.int(), 1691 - p99Latency: z.int(), 1686 + timestamp: z.number().int(), 1687 + p50Latency: z.number().int(), 1688 + p75Latency: z.number().int(), 1689 + p90Latency: z.number().int(), 1690 + p95Latency: z.number().int(), 1691 + p99Latency: z.number().int(), 1692 1692 }), 1693 1693 }); 1694 1694 } ··· 1698 1698 pipe: "endpoint__dns_metrics_regions_14d__v0", 1699 1699 parameters: z.object({ 1700 1700 monitorId: z.string(), 1701 - interval: z.int().optional(), 1701 + interval: z.number().int().optional(), 1702 1702 // Comma-separated list of regions, e.g. "ams,fra". Keeping string to pass directly. 1703 1703 regions: z.string().array().optional(), 1704 1704 fromDate: z.string().optional(), ··· 1706 1706 }), 1707 1707 data: z.object({ 1708 1708 region: z.enum(monitorRegions).or(z.string()), 1709 - timestamp: z.int(), 1710 - p50Latency: z.number().nullable().prefault(0), 1711 - p75Latency: z.number().nullable().prefault(0), 1712 - p90Latency: z.number().nullable().prefault(0), 1713 - p95Latency: z.number().nullable().prefault(0), 1714 - p99Latency: z.number().nullable().prefault(0), 1709 + timestamp: z.number().int(), 1710 + p50Latency: z.number().nullable().default(0), 1711 + p75Latency: z.number().nullable().default(0), 1712 + p90Latency: z.number().nullable().default(0), 1713 + p95Latency: z.number().nullable().default(0), 1714 + p99Latency: z.number().nullable().default(0), 1715 1715 }), 1716 1716 opts: { next: { revalidate: REVALIDATE } }, 1717 1717 }); ··· 1728 1728 // That's a hack because clickhouse return the date in UTC but in shitty format (2021-09-01 00:00:00) 1729 1729 return new Date(`${val} GMT`).toISOString(); 1730 1730 }), 1731 - count: z.number().prefault(0), 1732 - ok: z.number().prefault(0), 1733 - degraded: z.number().prefault(0), 1734 - error: z.number().prefault(0), 1731 + count: z.number().default(0), 1732 + ok: z.number().default(0), 1733 + degraded: z.number().default(0), 1734 + error: z.number().default(0), 1735 1735 monitorId: z.coerce.string(), 1736 1736 }), 1737 1737 opts: { next: { revalidate: REVALIDATE } }, ··· 1747 1747 toDate: z.string().optional(), 1748 1748 }), 1749 1749 data: z.object({ 1750 - timestamp: z.int(), 1750 + timestamp: z.number().int(), 1751 1751 monitorId: z.coerce.string(), 1752 - p50Latency: z.int(), 1753 - p75Latency: z.int(), 1754 - p90Latency: z.int(), 1755 - p95Latency: z.int(), 1756 - p99Latency: z.int(), 1752 + p50Latency: z.number().int(), 1753 + p75Latency: z.number().int(), 1754 + p90Latency: z.number().int(), 1755 + p95Latency: z.number().int(), 1756 + p99Latency: z.number().int(), 1757 1757 }), 1758 1758 opts: { next: { revalidate: REVALIDATE } }, 1759 1759 });
+1 -1
packages/tracker/package.json
··· 7 7 "dependencies": { 8 8 "@openstatus/db": "workspace:*", 9 9 "@openstatus/tinybird": "workspace:*", 10 - "zod": "4.1.13" 10 + "zod": "3.25.76" 11 11 }, 12 12 "devDependencies": { 13 13 "@openstatus/tsconfig": "workspace:*",
+2 -2
packages/ui/package.json
··· 22 22 "@dnd-kit/modifiers": "9.0.0", 23 23 "@dnd-kit/sortable": "10.0.0", 24 24 "@dnd-kit/utilities": "3.2.2", 25 - "@hookform/resolvers": "5.1.0", 25 + "@hookform/resolvers": "4.1.3", 26 26 "@radix-ui/react-accordion": "1.2.2", 27 27 "@radix-ui/react-alert-dialog": "1.1.4", 28 28 "@radix-ui/react-avatar": "1.1.2", ··· 58 58 "recharts": "2.15.0", 59 59 "tailwind-merge": "2.5.5", 60 60 "tailwindcss-animate": "1.0.7", 61 - "zod": "4.1.13" 61 + "zod": "3.25.76" 62 62 }, 63 63 "peerDependencies": { 64 64 "next-themes": "0.2.1",
+13 -13
packages/utils/index.ts
··· 13 13 cronTimestamp: z.number(), 14 14 status: z.enum(monitorStatus), 15 15 assertions: z.array(base).nullable(), 16 - timeout: z.number().prefault(45000), 16 + timeout: z.number().default(45000), 17 17 degradedAfter: z.number().nullable(), 18 - trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 18 + trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 19 19 otelConfig: z 20 20 .object({ 21 21 endpoint: z.string(), 22 - headers: z.record(z.string(), z.string()), 22 + headers: z.record(z.string()), 23 23 }) 24 24 .optional(), 25 - retry: z.number().prefault(3), 26 - followRedirects: z.boolean().prefault(true), 25 + retry: z.number().default(3), 26 + followRedirects: z.boolean().default(true), 27 27 }); 28 28 29 29 export type HttpPayload = z.infer<typeof httpPayloadSchema>; ··· 35 35 monitorId: z.string(), 36 36 assertions: z.array(base).nullable(), 37 37 cronTimestamp: z.number(), 38 - timeout: z.number().prefault(45000), 38 + timeout: z.number().default(45000), 39 39 degradedAfter: z.number().nullable(), 40 - trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 40 + trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 41 41 otelConfig: z 42 42 .object({ 43 43 endpoint: z.string(), 44 - headers: z.record(z.string(), z.string()), 44 + headers: z.record(z.string()), 45 45 }) 46 46 .optional(), 47 - retry: z.number().prefault(3), 47 + retry: z.number().default(3), 48 48 }); 49 49 50 50 export type TcpPayload = z.infer<typeof tpcPayloadSchema>; ··· 56 56 monitorId: z.string(), 57 57 assertions: z.array(base).nullable(), 58 58 cronTimestamp: z.number(), 59 - timeout: z.number().prefault(45000), 59 + timeout: z.number().default(45000), 60 60 degradedAfter: z.number().nullable(), 61 - trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 61 + trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 62 62 otelConfig: z 63 63 .object({ 64 64 endpoint: z.string(), 65 - headers: z.record(z.string(), z.string()), 65 + headers: z.record(z.string()), 66 66 }) 67 67 .optional(), 68 - retry: z.number().prefault(3), 68 + retry: z.number().default(3), 69 69 }); 70 70 71 71 export type DNSPayload = z.infer<typeof DNSPayloadSchema>;
+1 -1
packages/utils/package.json
··· 8 8 "@openstatus/assertions": "workspace:*", 9 9 "@openstatus/db": "workspace:*", 10 10 "@openstatus/regions": "workspace:*", 11 - "zod": "4.1.13" 11 + "zod": "3.25.76" 12 12 }, 13 13 "devDependencies": { 14 14 "@openstatus/tsconfig": "workspace:*",
+228 -248
pnpm-lock.yaml
··· 69 69 specifier: 4.4.0 70 70 version: 4.4.0(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 71 71 '@hookform/resolvers': 72 - specifier: 5.1.0 73 - version: 5.1.0(react-hook-form@7.68.0(react@19.2.2)) 72 + specifier: 4.1.3 73 + version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 74 74 '@libsql/client': 75 75 specifier: 0.15.15 76 76 version: 0.15.15 77 77 '@openpanel/nextjs': 78 78 specifier: 1.0.8 79 - version: 1.0.8(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 79 + version: 1.0.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 80 80 '@openstatus/analytics': 81 81 specifier: workspace:* 82 82 version: link:../../packages/analytics ··· 211 211 version: 1.2.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 212 212 '@sentry/nextjs': 213 213 specifier: 10.31.0 214 - version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 214 + version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 215 215 '@stripe/stripe-js': 216 216 specifier: 2.1.6 217 217 version: 2.1.6 ··· 226 226 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) 227 227 '@trpc/next': 228 228 specifier: 11.4.4 229 - version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 229 + version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 230 230 '@trpc/react-query': 231 231 specifier: 11.4.4 232 232 version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) ··· 265 265 version: 0.4.6(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 266 266 nuqs: 267 267 specifier: 2.8.5 268 - version: 2.8.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 268 + version: 2.8.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 269 269 random-word-slugs: 270 270 specifier: 0.1.7 271 271 version: 0.1.7 ··· 312 312 specifier: 11.0.5 313 313 version: 11.0.5 314 314 zod: 315 - specifier: 4.1.13 316 - version: 4.1.13 315 + specifier: 3.25.76 316 + version: 3.25.76 317 317 devDependencies: 318 318 '@tailwindcss/postcss': 319 319 specifier: 4.1.11 ··· 414 414 version: 3.550.0 415 415 '@hono/zod-validator': 416 416 specifier: 0.2.2 417 - version: 0.2.2(hono@4.5.3)(zod@4.1.13) 417 + version: 0.2.2(hono@4.5.3)(zod@3.25.76) 418 418 '@openstatus/db': 419 419 specifier: workspace:* 420 420 version: link:../../packages/db ··· 423 423 version: link:../../packages/utils 424 424 '@t3-oss/env-core': 425 425 specifier: 0.7.1 426 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 426 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 427 427 '@upstash/qstash': 428 428 specifier: 2.6.2 429 429 version: 2.6.2 ··· 434 434 specifier: 1.46.0 435 435 version: 1.46.0 436 436 zod: 437 - specifier: 4.1.13 438 - version: 4.1.13 437 + specifier: 3.25.76 438 + version: 3.25.76 439 439 devDependencies: 440 440 '@openstatus/tsconfig': 441 441 specifier: workspace:* ··· 450 450 specifier: 1.2.2 451 451 version: 1.2.2(hono@4.5.3) 452 452 '@hono/zod-openapi': 453 - specifier: 1.1.5 454 - version: 1.1.5(hono@4.5.3)(zod@4.1.13) 453 + specifier: 0.15.1 454 + version: 0.15.1(hono@4.5.3)(zod@3.25.76) 455 455 '@hono/zod-validator': 456 456 specifier: 0.2.2 457 - version: 0.2.2(hono@4.5.3)(zod@4.1.13) 457 + version: 0.2.2(hono@4.5.3)(zod@3.25.76) 458 458 '@logtape/logtape': 459 459 specifier: 1.1.2 460 460 version: 1.1.2 ··· 496 496 version: 0.8.5(hono@4.5.3) 497 497 '@t3-oss/env-core': 498 498 specifier: 0.7.1 499 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 499 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 500 500 '@unkey/api': 501 501 specifier: 2.2.0 502 502 version: 2.2.0 ··· 516 516 specifier: 13.12.0 517 517 version: 13.12.0 518 518 zod: 519 - specifier: 4.1.13 520 - version: 4.1.13 519 + specifier: 3.25.76 520 + version: 3.25.76 521 521 devDependencies: 522 522 '@openstatus/tsconfig': 523 523 specifier: workspace:* ··· 556 556 specifier: 4.4.0 557 557 version: 4.4.0(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 558 558 '@hookform/resolvers': 559 - specifier: 5.1.0 560 - version: 5.1.0(react-hook-form@7.68.0(react@19.2.2)) 559 + specifier: 4.1.3 560 + version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 561 561 '@libsql/client': 562 562 specifier: 0.15.15 563 563 version: 0.15.15 564 564 '@openpanel/nextjs': 565 565 specifier: 1.0.8 566 - version: 1.0.8(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 566 + version: 1.0.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 567 567 '@openstatus/analytics': 568 568 specifier: workspace:* 569 569 version: link:../../packages/analytics ··· 653 653 version: 1.2.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 654 654 '@sentry/nextjs': 655 655 specifier: 10.31.0 656 - version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 656 + version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 657 657 '@stripe/stripe-js': 658 658 specifier: 2.1.6 659 659 version: 2.1.6 ··· 668 668 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) 669 669 '@trpc/next': 670 670 specifier: 11.4.4 671 - version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 671 + version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 672 672 '@trpc/react-query': 673 673 specifier: 11.4.4 674 674 version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) ··· 704 704 version: 5.0.0-beta.29(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 705 705 next-plausible: 706 706 specifier: 3.12.5 707 - version: 3.12.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 707 + version: 3.12.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 708 708 next-themes: 709 709 specifier: 0.4.6 710 710 version: 0.4.6(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 711 711 nuqs: 712 712 specifier: 2.8.5 713 - version: 2.8.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 713 + version: 2.8.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 714 714 react: 715 715 specifier: 19.2.2 716 716 version: 19.2.2 ··· 751 751 specifier: 11.0.5 752 752 version: 11.0.5 753 753 zod: 754 - specifier: 4.1.13 755 - version: 4.1.13 754 + specifier: 3.25.76 755 + version: 3.25.76 756 756 devDependencies: 757 757 '@openstatus/tsconfig': 758 758 specifier: workspace:* ··· 800 800 specifier: 4.0.1 801 801 version: 4.0.1 802 802 '@hookform/resolvers': 803 - specifier: 5.1.0 804 - version: 5.1.0(react-hook-form@7.68.0(react@19.2.2)) 803 + specifier: 4.1.3 804 + version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 805 805 '@libsql/client': 806 806 specifier: 0.15.15 807 807 version: 0.15.15 808 808 '@openpanel/nextjs': 809 809 specifier: 1.0.8 810 - version: 1.0.8(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 810 + version: 1.0.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 811 811 '@openstatus/analytics': 812 812 specifier: workspace:* 813 813 version: link:../../packages/analytics ··· 882 882 version: 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 883 883 '@sentry/nextjs': 884 884 specifier: 10.31.0 885 - version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 885 + version: 10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0) 886 886 '@stripe/stripe-js': 887 887 specifier: 2.1.6 888 888 version: 2.1.6 889 889 '@t3-oss/env-nextjs': 890 890 specifier: 0.7.0 891 - version: 0.7.0(typescript@5.9.3)(zod@4.1.13) 891 + version: 0.7.0(typescript@5.9.3)(zod@3.25.76) 892 892 '@tailwindcss/container-queries': 893 893 specifier: 0.1.1 894 894 version: 0.1.1(tailwindcss@4.1.11) ··· 909 909 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) 910 910 '@trpc/next': 911 911 specifier: 11.4.4 912 - version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 912 + version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) 913 913 '@trpc/react-query': 914 914 specifier: 11.4.4 915 915 version: 11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3) ··· 963 963 version: 5.0.0(@types/react@19.2.2)(react@19.2.2) 964 964 next-plausible: 965 965 specifier: 3.12.5 966 - version: 3.12.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 966 + version: 3.12.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 967 967 next-themes: 968 968 specifier: 0.4.6 969 969 version: 0.4.6(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 970 970 nuqs: 971 971 specifier: 2.8.5 972 - version: 2.8.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 972 + version: 2.8.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2) 973 973 random-word-slugs: 974 974 specifier: 0.1.7 975 975 version: 0.1.7 ··· 1031 1031 specifier: 1.0.7 1032 1032 version: 1.0.7(tailwindcss@4.1.11) 1033 1033 zod: 1034 - specifier: 4.1.13 1035 - version: 4.1.13 1034 + specifier: 3.25.76 1035 + version: 3.25.76 1036 1036 devDependencies: 1037 1037 '@openstatus/tsconfig': 1038 1038 specifier: workspace:* ··· 1155 1155 specifier: ^3.0.0 1156 1156 version: 3.0.0 1157 1157 zod: 1158 - specifier: 4.1.13 1159 - version: 4.1.13 1158 + specifier: 3.25.76 1159 + version: 3.25.76 1160 1160 devDependencies: 1161 1161 '@openstatus/tsconfig': 1162 1162 specifier: workspace:* ··· 1175 1175 version: 1.0.0 1176 1176 '@t3-oss/env-core': 1177 1177 specifier: 0.7.1 1178 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1178 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1179 1179 zod: 1180 - specifier: 4.1.13 1181 - version: 4.1.13 1180 + specifier: 3.25.76 1181 + version: 3.25.76 1182 1182 devDependencies: 1183 1183 '@openstatus/tsconfig': 1184 1184 specifier: workspace:* ··· 1230 1230 version: link:../utils 1231 1231 '@t3-oss/env-core': 1232 1232 specifier: 0.7.1 1233 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1233 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1234 1234 '@trpc/client': 1235 1235 specifier: 11.4.4 1236 1236 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) ··· 1265 1265 specifier: 2.2.2 1266 1266 version: 2.2.2 1267 1267 zod: 1268 - specifier: 4.1.13 1269 - version: 4.1.13 1268 + specifier: 3.25.76 1269 + version: 3.25.76 1270 1270 devDependencies: 1271 1271 '@openstatus/tsconfig': 1272 1272 specifier: workspace:* ··· 1297 1297 specifier: 5.9.3 1298 1298 version: 5.9.3 1299 1299 zod: 1300 - specifier: 4.1.13 1301 - version: 4.1.13 1300 + specifier: 3.25.76 1301 + version: 3.25.76 1302 1302 1303 1303 packages/db: 1304 1304 dependencies: ··· 1316 1316 version: link:../theme-store 1317 1317 '@t3-oss/env-core': 1318 1318 specifier: 0.7.1 1319 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1319 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1320 1320 drizzle-orm: 1321 1321 specifier: 0.44.4 1322 1322 version: 0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5) 1323 1323 drizzle-zod: 1324 - specifier: 0.8.3 1325 - version: 0.8.3(drizzle-orm@0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5))(zod@4.1.13) 1324 + specifier: 0.5.1 1325 + version: 0.5.1(drizzle-orm@0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5))(zod@3.25.76) 1326 1326 zod: 1327 - specifier: 4.1.13 1328 - version: 4.1.13 1327 + specifier: 3.25.76 1328 + version: 3.25.76 1329 1329 devDependencies: 1330 1330 '@openstatus/tsconfig': 1331 1331 specifier: workspace:* ··· 1365 1365 version: 2.0.1(@react-email/body@0.2.0(react@19.2.2))(@react-email/button@0.2.0(react@19.2.2))(@react-email/code-block@0.2.0(react@19.2.2))(@react-email/code-inline@0.0.5(react@19.2.2))(@react-email/container@0.0.15(react@19.2.2))(@react-email/heading@0.0.15(react@19.2.2))(@react-email/hr@0.0.11(react@19.2.2))(@react-email/img@0.0.11(react@19.2.2))(@react-email/link@0.0.12(react@19.2.2))(@react-email/preview@0.0.13(react@19.2.2))(@react-email/text@0.1.5(react@19.2.2))(react@19.2.2) 1366 1366 '@t3-oss/env-core': 1367 1367 specifier: 0.7.1 1368 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1368 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1369 1369 react-email: 1370 1370 specifier: 5.0.8 1371 1371 version: 5.0.8 ··· 1373 1373 specifier: 6.6.0 1374 1374 version: 6.6.0(@react-email/render@2.0.0(react-dom@19.2.2(react@19.2.2))(react@19.2.2)) 1375 1375 zod: 1376 - specifier: 4.1.13 1377 - version: 4.1.13 1376 + specifier: 3.25.76 1377 + version: 3.25.76 1378 1378 devDependencies: 1379 1379 '@openstatus/tsconfig': 1380 1380 specifier: workspace:* ··· 1398 1398 packages/error: 1399 1399 dependencies: 1400 1400 zod: 1401 - specifier: 4.1.13 1402 - version: 4.1.13 1401 + specifier: 3.25.76 1402 + version: 3.25.76 1403 1403 devDependencies: 1404 1404 '@openstatus/tsconfig': 1405 1405 specifier: workspace:* ··· 1445 1445 specifier: workspace:* 1446 1446 version: link:../../db 1447 1447 zod: 1448 - specifier: 4.1.13 1449 - version: 4.1.13 1448 + specifier: 3.25.76 1449 + version: 3.25.76 1450 1450 devDependencies: 1451 1451 '@openstatus/tsconfig': 1452 1452 specifier: workspace:* ··· 1486 1486 version: 2.0.0(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 1487 1487 '@t3-oss/env-core': 1488 1488 specifier: 0.7.1 1489 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1489 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1490 1490 react-dom: 1491 1491 specifier: 19.2.2 1492 1492 version: 19.2.2(react@19.2.2) ··· 1494 1494 specifier: 6.6.0 1495 1495 version: 6.6.0(@react-email/render@2.0.0(react-dom@19.2.2(react@19.2.2))(react@19.2.2)) 1496 1496 zod: 1497 - specifier: 4.1.13 1498 - version: 4.1.13 1497 + specifier: 3.25.76 1498 + version: 3.25.76 1499 1499 devDependencies: 1500 1500 '@openstatus/tsconfig': 1501 1501 specifier: workspace:* ··· 1541 1541 specifier: workspace:* 1542 1542 version: link:../../db 1543 1543 zod: 1544 - specifier: 4.1.13 1545 - version: 4.1.13 1544 + specifier: 3.25.76 1545 + version: 3.25.76 1546 1546 devDependencies: 1547 1547 '@openstatus/tsconfig': 1548 1548 specifier: workspace:* ··· 1564 1564 version: link:../../db 1565 1565 '@t3-oss/env-core': 1566 1566 specifier: 0.7.1 1567 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1567 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1568 1568 '@types/validator': 1569 1569 specifier: 13.12.0 1570 1570 version: 13.12.0 ··· 1572 1572 specifier: 13.12.0 1573 1573 version: 13.12.0 1574 1574 zod: 1575 - specifier: 4.1.13 1576 - version: 4.1.13 1575 + specifier: 3.25.76 1576 + version: 3.25.76 1577 1577 devDependencies: 1578 1578 '@openstatus/tsconfig': 1579 1579 specifier: workspace:* ··· 1601 1601 version: link:../../db 1602 1602 '@t3-oss/env-core': 1603 1603 specifier: 0.7.1 1604 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1604 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1605 1605 '@types/validator': 1606 1606 specifier: 13.12.0 1607 1607 version: 13.12.0 ··· 1609 1609 specifier: 13.12.0 1610 1610 version: 13.12.0 1611 1611 zod: 1612 - specifier: 4.1.13 1613 - version: 4.1.13 1612 + specifier: 3.25.76 1613 + version: 3.25.76 1614 1614 devDependencies: 1615 1615 '@openstatus/tsconfig': 1616 1616 specifier: workspace:* ··· 1637 1637 specifier: workspace:* 1638 1638 version: link:../../db 1639 1639 zod: 1640 - specifier: 4.1.13 1641 - version: 4.1.13 1640 + specifier: 3.25.76 1641 + version: 3.25.76 1642 1642 devDependencies: 1643 1643 '@openstatus/tsconfig': 1644 1644 specifier: workspace:* ··· 1682 1682 version: link:../../db 1683 1683 '@t3-oss/env-core': 1684 1684 specifier: 0.7.1 1685 - version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1685 + version: 0.7.1(typescript@5.9.3)(zod@3.25.76) 1686 1686 validator: 1687 1687 specifier: 13.12.0 1688 1688 version: 13.12.0 1689 1689 zod: 1690 - specifier: 4.1.13 1691 - version: 4.1.13 1690 + specifier: 3.25.76 1691 + version: 3.25.76 1692 1692 devDependencies: 1693 1693 '@openstatus/tsconfig': 1694 1694 specifier: workspace:* ··· 1746 1746 specifier: workspace:* 1747 1747 version: link:../../utils 1748 1748 zod: 1749 - specifier: 4.1.13 1750 - version: 4.1.13 1749 + specifier: 3.25.76 1750 + version: 3.25.76 1751 1751 devDependencies: 1752 1752 '@openstatus/tsconfig': 1753 1753 specifier: workspace:* ··· 1799 1799 packages/regions: 1800 1800 dependencies: 1801 1801 zod: 1802 - specifier: 4.1.13 1803 - version: 4.1.13 1802 + specifier: 3.25.76 1803 + version: 3.25.76 1804 1804 devDependencies: 1805 1805 '@openstatus/tsconfig': 1806 1806 specifier: workspace:* ··· 1821 1821 packages/tinybird: 1822 1822 dependencies: 1823 1823 '@chronark/zod-bird': 1824 - specifier: 1.0.0 1825 - version: 1.0.0(zod@4.1.13) 1824 + specifier: 0.3.6 1825 + version: 0.3.6 1826 1826 zod: 1827 - specifier: 4.1.13 1828 - version: 4.1.13 1827 + specifier: 3.25.76 1828 + version: 3.25.76 1829 1829 devDependencies: 1830 1830 '@openstatus/tsconfig': 1831 1831 specifier: workspace:* ··· 1849 1849 specifier: workspace:* 1850 1850 version: link:../tinybird 1851 1851 zod: 1852 - specifier: 4.1.13 1853 - version: 4.1.13 1852 + specifier: 3.25.76 1853 + version: 3.25.76 1854 1854 devDependencies: 1855 1855 '@openstatus/tsconfig': 1856 1856 specifier: workspace:* ··· 1876 1876 specifier: 3.2.2 1877 1877 version: 3.2.2(react@19.2.2) 1878 1878 '@hookform/resolvers': 1879 - specifier: 5.1.0 1880 - version: 5.1.0(react-hook-form@7.68.0(react@19.2.2)) 1879 + specifier: 4.1.3 1880 + version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 1881 1881 '@radix-ui/react-accordion': 1882 1882 specifier: 1.2.2 1883 1883 version: 1.2.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) ··· 1990 1990 specifier: 1.0.7 1991 1991 version: 1.0.7(tailwindcss@4.1.8) 1992 1992 zod: 1993 - specifier: 4.1.13 1994 - version: 4.1.13 1993 + specifier: 3.25.76 1994 + version: 3.25.76 1995 1995 devDependencies: 1996 1996 '@biomejs/biome': 1997 1997 specifier: 1.9.4 ··· 2058 2058 specifier: workspace:* 2059 2059 version: link:../regions 2060 2060 zod: 2061 - specifier: 4.1.13 2062 - version: 4.1.13 2061 + specifier: 3.25.76 2062 + version: 3.25.76 2063 2063 devDependencies: 2064 2064 '@openstatus/tsconfig': 2065 2065 specifier: workspace:* ··· 2094 2094 '@apm-js-collab/tracing-hooks@0.3.1': 2095 2095 resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} 2096 2096 2097 - '@asteasolutions/zod-to-openapi@8.2.0': 2098 - resolution: {integrity: sha512-u05zNUirlukJAf9oEHmxSF31L1XQhz9XdpVILt7+xhrz65oQqBpiOWFkGvRWL0IpjOUJ878idKoNmYPxrFnkeg==} 2097 + '@asteasolutions/zod-to-openapi@7.3.4': 2098 + resolution: {integrity: sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA==} 2099 2099 peerDependencies: 2100 - zod: ^4.0.0 2100 + zod: ^3.20.2 2101 2101 2102 2102 '@astro-community/astro-embed-twitter@0.5.9': 2103 2103 resolution: {integrity: sha512-bTIP/2LB3iEzlZ58L7dFyLJuWLeFDXgzZUQZKlWIfsXiKYqKIfLTQ01U10sh9UiHpm1M+4kOVPpue5LbUpJXHw==} ··· 2656 2656 '@capsizecss/unpack@2.4.0': 2657 2657 resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} 2658 2658 2659 - '@chronark/zod-bird@1.0.0': 2660 - resolution: {integrity: sha512-OWdZt5EULFgDaHTbkxkxN130ohapRxSMaYdaW/fZTcQP3z1c4cYk4izJwbbTPOP4GdQeys18Prls0xz4NpFV0A==} 2661 - peerDependencies: 2662 - zod: ^4.0.0 2659 + '@chronark/zod-bird@0.3.6': 2660 + resolution: {integrity: sha512-hE8kCGLJK5ncH8F7uPaqPiOOqo68vUI66nusg7HO5X9BcyN8lXfeQliu6Ou1kOSq95OYshf9nB2fk2+LEvF4ng==} 2663 2661 2664 2662 '@cspotcode/source-map-support@0.8.1': 2665 2663 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} ··· 3144 3142 peerDependencies: 3145 3143 hono: '>=3.*' 3146 3144 3147 - '@hono/zod-openapi@1.1.5': 3148 - resolution: {integrity: sha512-EAnY6ad4yt/MUKHx716BEGGOXSl5d0/FOLozOYB/pmSEFq07qrzefKFtBEMAgd3hlpJXjH+4lwgTtlAo+BGBgQ==} 3145 + '@hono/zod-openapi@0.15.1': 3146 + resolution: {integrity: sha512-2Un3D5xD1j4tIvUwzQ/XkB6xwrEA0Ne23TRjB8UVw0PgUWzsB3xiB8Hl/y2ZEMfcIfrA15/ga4P6Bkct8uYaLg==} 3149 3147 engines: {node: '>=16.0.0'} 3150 3148 peerDependencies: 3151 3149 hono: '>=4.3.6' 3152 - zod: ^4.0.0 3150 + zod: 3.* 3153 3151 3154 3152 '@hono/zod-validator@0.2.2': 3155 3153 resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==} ··· 3157 3155 hono: '>=3.9.0' 3158 3156 zod: ^3.19.1 3159 3157 3160 - '@hono/zod-validator@0.7.6': 3161 - resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} 3162 - peerDependencies: 3163 - hono: '>=3.9.0' 3164 - zod: ^3.25.0 || ^4.0.0 3165 - 3166 3158 '@hookform/devtools@4.4.0': 3167 3159 resolution: {integrity: sha512-Mtlic+uigoYBPXlfvPBfiYYUZuyMrD3pTjDpVIhL6eCZTvQkHsKBSKeZCvXWUZr8fqrkzDg27N+ZuazLKq6Vmg==} 3168 3160 peerDependencies: 3169 3161 react: ^16.8.0 || ^17 || ^18 || ^19 3170 3162 react-dom: ^16.8.0 || ^17 || ^18 || ^19 3171 3163 3172 - '@hookform/resolvers@5.1.0': 3173 - resolution: {integrity: sha512-A5tY8gxqvvR0lFfropqpy/gUDOxjwT7LZCxJ8lNA9puK7nFNRl/O0egGKxzdF4JSz/pnnT1O8g76P/YMyTBEFw==} 3164 + '@hookform/resolvers@4.1.3': 3165 + resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} 3174 3166 peerDependencies: 3175 - react-hook-form: ^7.55.0 3167 + react-hook-form: ^7.0.0 3176 3168 3177 3169 '@iconify-json/lucide@1.2.26': 3178 3170 resolution: {integrity: sha512-arD/8mK0lRxFY2LgLf345NhWVWiOtV8sOxJuLnq4QRz3frMiOwVwGxEgp5Xe/bRGzxO2CxxCBok0bPRpCkYZQQ==} ··· 3602 3594 resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} 3603 3595 engines: {node: '>=18'} 3604 3596 3605 - '@napi-rs/wasm-runtime@1.1.1': 3606 - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} 3597 + '@napi-rs/wasm-runtime@1.1.0': 3598 + resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} 3607 3599 3608 3600 '@neon-rs/load@0.0.4': 3609 3601 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} ··· 3885 3877 '@oslojs/encoding@1.1.0': 3886 3878 resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 3887 3879 3888 - '@oxc-resolver/binding-android-arm-eabi@11.16.2': 3889 - resolution: {integrity: sha512-lVJbvydLQIDZHKUb6Zs9Rq80QVTQ9xdCQE30eC9/cjg4wsMoEOg65QZPymUAIVJotpUAWJD0XYcwE7ugfxx5kQ==} 3880 + '@oxc-resolver/binding-android-arm-eabi@11.15.0': 3881 + resolution: {integrity: sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw==} 3890 3882 cpu: [arm] 3891 3883 os: [android] 3892 3884 3893 - '@oxc-resolver/binding-android-arm64@11.16.2': 3894 - resolution: {integrity: sha512-fEk+g/g2rJ6LnBVPqeLcx+/alWZ/Db1UlXG+ZVivip0NdrnOzRL48PAmnxTMGOrLwsH1UDJkwY3wOjrrQltCqg==} 3885 + '@oxc-resolver/binding-android-arm64@11.15.0': 3886 + resolution: {integrity: sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw==} 3895 3887 cpu: [arm64] 3896 3888 os: [android] 3897 3889 3898 - '@oxc-resolver/binding-darwin-arm64@11.16.2': 3899 - resolution: {integrity: sha512-Pkbp1qi7kdUX6k3Fk1PvAg6p7ruwaWKg1AhOlDgrg2vLXjtv9ZHo7IAQN6kLj0W771dPJZWqNxoqTPacp2oYWA==} 3890 + '@oxc-resolver/binding-darwin-arm64@11.15.0': 3891 + resolution: {integrity: sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA==} 3900 3892 cpu: [arm64] 3901 3893 os: [darwin] 3902 3894 3903 - '@oxc-resolver/binding-darwin-x64@11.16.2': 3904 - resolution: {integrity: sha512-FYCGcU1iSoPkADGLfQbuj0HWzS+0ItjDCt9PKtu2Hzy6T0dxO4Y1enKeCOxCweOlmLEkSxUlW5UPT4wvT3LnAg==} 3895 + '@oxc-resolver/binding-darwin-x64@11.15.0': 3896 + resolution: {integrity: sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ==} 3905 3897 cpu: [x64] 3906 3898 os: [darwin] 3907 3899 3908 - '@oxc-resolver/binding-freebsd-x64@11.16.2': 3909 - resolution: {integrity: sha512-1zHCoK6fMcBjE54P2EG/z70rTjcRxvyKfvk4E/QVrWLxNahuGDFZIxoEoo4kGnnEcmPj41F0c2PkrQbqlpja5g==} 3900 + '@oxc-resolver/binding-freebsd-x64@11.15.0': 3901 + resolution: {integrity: sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw==} 3910 3902 cpu: [x64] 3911 3903 os: [freebsd] 3912 3904 3913 - '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': 3914 - resolution: {integrity: sha512-+ucLYz8EO5FDp6kZ4o1uDmhoP+M98ysqiUW4hI3NmfiOJQWLrAzQjqaTdPfIOzlCXBU9IHp5Cgxu6wPjVb8dbA==} 3905 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': 3906 + resolution: {integrity: sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ==} 3915 3907 cpu: [arm] 3916 3908 os: [linux] 3917 3909 3918 - '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': 3919 - resolution: {integrity: sha512-qq+TpNXyw1odDgoONRpMLzH4hzhwnEw55398dL8rhKGvvYbio71WrJ00jE+hGlEi7H1Gkl11KoPJRaPlRAVGPw==} 3910 + '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': 3911 + resolution: {integrity: sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw==} 3920 3912 cpu: [arm] 3921 3913 os: [linux] 3922 3914 3923 - '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': 3924 - resolution: {integrity: sha512-xlMh4gNtplNQEwuF5icm69udC7un0WyzT5ywOeHrPMEsghKnLjXok2wZgAA7ocTm9+JsI+nVXIQa5XO1x+HPQg==} 3915 + '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': 3916 + resolution: {integrity: sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==} 3925 3917 cpu: [arm64] 3926 3918 os: [linux] 3927 3919 3928 - '@oxc-resolver/binding-linux-arm64-musl@11.16.2': 3929 - resolution: {integrity: sha512-OZs33QTMi0xmHv/4P0+RAKXJTBk7UcMH5tpTaCytWRXls/DGaJ48jOHmriQGK2YwUqXl+oneuNyPOUO0obJ+Hg==} 3920 + '@oxc-resolver/binding-linux-arm64-musl@11.15.0': 3921 + resolution: {integrity: sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==} 3930 3922 cpu: [arm64] 3931 3923 os: [linux] 3932 3924 3933 - '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': 3934 - resolution: {integrity: sha512-UVyuhaV32dJGtF6fDofOcBstg9JwB2Jfnjfb8jGlu3xcG+TsubHRhuTwQ6JZ1sColNT1nMxBiu7zdKUEZi1kwg==} 3925 + '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': 3926 + resolution: {integrity: sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==} 3935 3927 cpu: [ppc64] 3936 3928 os: [linux] 3937 3929 3938 - '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': 3939 - resolution: {integrity: sha512-YZZS0yv2q5nE1uL/Fk4Y7m9018DSEmDNSG8oJzy1TJjA1jx5HL52hEPxi98XhU6OYhSO/vC1jdkJeE8TIHugug==} 3930 + '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': 3931 + resolution: {integrity: sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==} 3940 3932 cpu: [riscv64] 3941 3933 os: [linux] 3942 3934 3943 - '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': 3944 - resolution: {integrity: sha512-9VYuypwtx4kt1lUcwJAH4dPmgJySh4/KxtAPdRoX2BTaZxVm/yEXHq0mnl/8SEarjzMvXKbf7Cm6UBgptm3DZw==} 3935 + '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': 3936 + resolution: {integrity: sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==} 3945 3937 cpu: [riscv64] 3946 3938 os: [linux] 3947 3939 3948 - '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': 3949 - resolution: {integrity: sha512-3gbwQ+xlL5gpyzgSDdC8B4qIM4mZaPDLaFOi3c/GV7CqIdVJc5EZXW4V3T6xwtPBOpXPXfqQLbhTnUD4SqwJtA==} 3940 + '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': 3941 + resolution: {integrity: sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==} 3950 3942 cpu: [s390x] 3951 3943 os: [linux] 3952 3944 3953 - '@oxc-resolver/binding-linux-x64-gnu@11.16.2': 3954 - resolution: {integrity: sha512-m0WcK0j54tSwWa+hQaJMScZdWneqE7xixp/vpFqlkbhuKW9dRHykPAFvSYg1YJ3MJgu9ZzVNpYHhPKJiEQq57Q==} 3945 + '@oxc-resolver/binding-linux-x64-gnu@11.15.0': 3946 + resolution: {integrity: sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==} 3955 3947 cpu: [x64] 3956 3948 os: [linux] 3957 3949 3958 - '@oxc-resolver/binding-linux-x64-musl@11.16.2': 3959 - resolution: {integrity: sha512-ZjUm3w96P2t47nWywGwj1A2mAVBI/8IoS7XHhcogWCfXnEI3M6NPIRQPYAZW4s5/u3u6w1uPtgOwffj2XIOb/g==} 3950 + '@oxc-resolver/binding-linux-x64-musl@11.15.0': 3951 + resolution: {integrity: sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==} 3960 3952 cpu: [x64] 3961 3953 os: [linux] 3962 3954 3963 - '@oxc-resolver/binding-openharmony-arm64@11.16.2': 3964 - resolution: {integrity: sha512-OFVQ2x3VenTp13nIl6HcQ/7dmhFmM9dg2EjKfHcOtYfrVLQdNR6THFU7GkMdmc8DdY1zLUeilHwBIsyxv5hkwQ==} 3955 + '@oxc-resolver/binding-openharmony-arm64@11.15.0': 3956 + resolution: {integrity: sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==} 3965 3957 cpu: [arm64] 3966 3958 os: [openharmony] 3967 3959 3968 - '@oxc-resolver/binding-wasm32-wasi@11.16.2': 3969 - resolution: {integrity: sha512-+O1sY3RrGyA2AqDnd3yaDCsqZqCblSTEpY7TbbaOaw0X7iIbGjjRLdrQk9StG3QSiZuBy9FdFwotIiSXtwvbAQ==} 3960 + '@oxc-resolver/binding-wasm32-wasi@11.15.0': 3961 + resolution: {integrity: sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg==} 3970 3962 engines: {node: '>=14.0.0'} 3971 3963 cpu: [wasm32] 3972 3964 3973 - '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': 3974 - resolution: {integrity: sha512-jMrMJL+fkx6xoSMFPOeyQ1ctTFjavWPOSZEKUY5PebDwQmC9cqEr4LhdTnGsOtFrWYLXlEU4xWeMdBoc/XKkOA==} 3965 + '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': 3966 + resolution: {integrity: sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w==} 3975 3967 cpu: [arm64] 3976 3968 os: [win32] 3977 3969 3978 - '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': 3979 - resolution: {integrity: sha512-tl0xDA5dcQplG2yg2ZhgVT578dhRFafaCfyqMEAXq8KNpor85nJ53C3PLpfxD2NKzPioFgWEexNsjqRi+kW2Mg==} 3970 + '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': 3971 + resolution: {integrity: sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA==} 3980 3972 cpu: [ia32] 3981 3973 os: [win32] 3982 3974 3983 - '@oxc-resolver/binding-win32-x64-msvc@11.16.2': 3984 - resolution: {integrity: sha512-M7z0xjYQq1HdJk2DxTSLMvRMyBSI4wn4FXGcVQBsbAihgXevAReqwMdb593nmCK/OiFwSNcOaGIzUvzyzQ+95w==} 3975 + '@oxc-resolver/binding-win32-x64-msvc@11.15.0': 3976 + resolution: {integrity: sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ==} 3985 3977 cpu: [x64] 3986 3978 os: [win32] 3987 3979 ··· 7576 7568 sqlite3: 7577 7569 optional: true 7578 7570 7579 - drizzle-zod@0.8.3: 7580 - resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==} 7571 + drizzle-zod@0.5.1: 7572 + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} 7581 7573 peerDependencies: 7582 - drizzle-orm: '>=0.36.0' 7583 - zod: ^3.25.0 || ^4.0.0 7574 + drizzle-orm: '>=0.23.13' 7575 + zod: '*' 7584 7576 7585 7577 dset@3.1.4: 7586 7578 resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} ··· 8264 8256 resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 8265 8257 engines: {node: '>=6'} 8266 8258 8267 - import-in-the-middle@2.0.1: 8268 - resolution: {integrity: sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==} 8259 + import-in-the-middle@2.0.0: 8260 + resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==} 8269 8261 8270 8262 import-meta-resolve@4.2.0: 8271 8263 resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} ··· 9323 9315 outvariant@1.4.3: 9324 9316 resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} 9325 9317 9326 - oxc-resolver@11.16.2: 9327 - resolution: {integrity: sha512-Uy76u47vwhhF7VAmVY61Srn+ouiOobf45MU9vGct9GD2ARy6hKoqEElyHDB0L+4JOM6VLuZ431KiLwyjI/A21g==} 9318 + oxc-resolver@11.15.0: 9319 + resolution: {integrity: sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw==} 9328 9320 9329 9321 oxfmt@0.18.0: 9330 9322 resolution: {integrity: sha512-XqVS+LQi7ARsFlIftB69+jGN2qQaJNBjQU2b9ZQYt+iaUV9digh+dBIsU0isQIZhaQ1ihxGFfsTYQXE/Oak8Qw==} ··· 11313 11305 zod@3.25.76: 11314 11306 resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 11315 11307 11316 - zod@4.1.13: 11317 - resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} 11308 + zod@4.2.1: 11309 + resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} 11318 11310 11319 11311 zwitch@2.0.4: 11320 11312 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} ··· 11347 11339 transitivePeerDependencies: 11348 11340 - supports-color 11349 11341 11350 - '@asteasolutions/zod-to-openapi@8.2.0(zod@4.1.13)': 11342 + '@asteasolutions/zod-to-openapi@7.3.4(zod@3.25.76)': 11351 11343 dependencies: 11352 11344 openapi3-ts: 4.5.0 11353 - zod: 4.1.13 11345 + zod: 3.25.76 11354 11346 11355 11347 '@astro-community/astro-embed-twitter@0.5.9(astro@5.13.7(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.1))': 11356 11348 dependencies: ··· 12378 12370 transitivePeerDependencies: 12379 12371 - encoding 12380 12372 12381 - '@chronark/zod-bird@1.0.0(zod@4.1.13)': 12373 + '@chronark/zod-bird@0.3.6': 12382 12374 dependencies: 12383 - zod: 4.1.13 12375 + zod: 3.25.76 12384 12376 12385 12377 '@cspotcode/source-map-support@0.8.1': 12386 12378 dependencies: ··· 12779 12771 hono: 4.5.3 12780 12772 toucan-js: 4.1.1 12781 12773 12782 - '@hono/zod-openapi@1.1.5(hono@4.5.3)(zod@4.1.13)': 12774 + '@hono/zod-openapi@0.15.1(hono@4.5.3)(zod@3.25.76)': 12783 12775 dependencies: 12784 - '@asteasolutions/zod-to-openapi': 8.2.0(zod@4.1.13) 12785 - '@hono/zod-validator': 0.7.6(hono@4.5.3)(zod@4.1.13) 12776 + '@asteasolutions/zod-to-openapi': 7.3.4(zod@3.25.76) 12777 + '@hono/zod-validator': 0.2.2(hono@4.5.3)(zod@3.25.76) 12786 12778 hono: 4.5.3 12787 - openapi3-ts: 4.5.0 12788 - zod: 4.1.13 12789 - 12790 - '@hono/zod-validator@0.2.2(hono@4.5.3)(zod@4.1.13)': 12791 - dependencies: 12792 - hono: 4.5.3 12793 - zod: 4.1.13 12779 + zod: 3.25.76 12794 12780 12795 - '@hono/zod-validator@0.7.6(hono@4.5.3)(zod@4.1.13)': 12781 + '@hono/zod-validator@0.2.2(hono@4.5.3)(zod@3.25.76)': 12796 12782 dependencies: 12797 12783 hono: 4.5.3 12798 - zod: 4.1.13 12784 + zod: 3.25.76 12799 12785 12800 12786 '@hookform/devtools@4.4.0(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': 12801 12787 dependencies: ··· 12813 12799 - '@types/react' 12814 12800 - supports-color 12815 12801 12816 - '@hookform/resolvers@5.1.0(react-hook-form@7.68.0(react@19.2.2))': 12802 + '@hookform/resolvers@4.1.3(react-hook-form@7.68.0(react@19.2.2))': 12817 12803 dependencies: 12818 12804 '@standard-schema/utils': 0.3.0 12819 12805 react-hook-form: 7.68.0(react@19.2.2) ··· 13226 13212 outvariant: 1.4.3 13227 13213 strict-event-emitter: 0.5.1 13228 13214 13229 - '@napi-rs/wasm-runtime@1.1.1': 13215 + '@napi-rs/wasm-runtime@1.1.0': 13230 13216 dependencies: 13231 13217 '@emnapi/core': 1.7.1 13232 13218 '@emnapi/runtime': 1.7.1 ··· 13287 13273 '@openpanel/web': 1.0.1 13288 13274 astro: 5.13.7(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.44.1)(typescript@5.9.3)(yaml@2.8.1) 13289 13275 13290 - '@openpanel/nextjs@1.0.8(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': 13276 + '@openpanel/nextjs@1.0.8(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': 13291 13277 dependencies: 13292 13278 '@openpanel/web': 1.0.1 13293 13279 next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) ··· 13504 13490 dependencies: 13505 13491 '@opentelemetry/api': 1.9.0 13506 13492 '@opentelemetry/api-logs': 0.208.0 13507 - import-in-the-middle: 2.0.1 13493 + import-in-the-middle: 2.0.0 13508 13494 require-in-the-middle: 8.0.1 13509 13495 transitivePeerDependencies: 13510 13496 - supports-color ··· 13533 13519 13534 13520 '@oslojs/encoding@1.1.0': {} 13535 13521 13536 - '@oxc-resolver/binding-android-arm-eabi@11.16.2': 13522 + '@oxc-resolver/binding-android-arm-eabi@11.15.0': 13537 13523 optional: true 13538 13524 13539 - '@oxc-resolver/binding-android-arm64@11.16.2': 13525 + '@oxc-resolver/binding-android-arm64@11.15.0': 13540 13526 optional: true 13541 13527 13542 - '@oxc-resolver/binding-darwin-arm64@11.16.2': 13528 + '@oxc-resolver/binding-darwin-arm64@11.15.0': 13543 13529 optional: true 13544 13530 13545 - '@oxc-resolver/binding-darwin-x64@11.16.2': 13531 + '@oxc-resolver/binding-darwin-x64@11.15.0': 13546 13532 optional: true 13547 13533 13548 - '@oxc-resolver/binding-freebsd-x64@11.16.2': 13534 + '@oxc-resolver/binding-freebsd-x64@11.15.0': 13549 13535 optional: true 13550 13536 13551 - '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': 13537 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': 13552 13538 optional: true 13553 13539 13554 - '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': 13540 + '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': 13555 13541 optional: true 13556 13542 13557 - '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': 13543 + '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': 13558 13544 optional: true 13559 13545 13560 - '@oxc-resolver/binding-linux-arm64-musl@11.16.2': 13546 + '@oxc-resolver/binding-linux-arm64-musl@11.15.0': 13561 13547 optional: true 13562 13548 13563 - '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': 13549 + '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': 13564 13550 optional: true 13565 13551 13566 - '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': 13552 + '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': 13567 13553 optional: true 13568 13554 13569 - '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': 13555 + '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': 13570 13556 optional: true 13571 13557 13572 - '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': 13558 + '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': 13573 13559 optional: true 13574 13560 13575 - '@oxc-resolver/binding-linux-x64-gnu@11.16.2': 13561 + '@oxc-resolver/binding-linux-x64-gnu@11.15.0': 13576 13562 optional: true 13577 13563 13578 - '@oxc-resolver/binding-linux-x64-musl@11.16.2': 13564 + '@oxc-resolver/binding-linux-x64-musl@11.15.0': 13579 13565 optional: true 13580 13566 13581 - '@oxc-resolver/binding-openharmony-arm64@11.16.2': 13567 + '@oxc-resolver/binding-openharmony-arm64@11.15.0': 13582 13568 optional: true 13583 13569 13584 - '@oxc-resolver/binding-wasm32-wasi@11.16.2': 13570 + '@oxc-resolver/binding-wasm32-wasi@11.15.0': 13585 13571 dependencies: 13586 - '@napi-rs/wasm-runtime': 1.1.1 13572 + '@napi-rs/wasm-runtime': 1.1.0 13587 13573 optional: true 13588 13574 13589 - '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': 13575 + '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': 13590 13576 optional: true 13591 13577 13592 - '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': 13578 + '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': 13593 13579 optional: true 13594 13580 13595 - '@oxc-resolver/binding-win32-x64-msvc@11.16.2': 13581 + '@oxc-resolver/binding-win32-x64-msvc@11.15.0': 13596 13582 optional: true 13597 13583 13598 13584 '@oxfmt/darwin-arm64@0.18.0': ··· 15233 15219 15234 15220 '@sentry/core@9.47.1': {} 15235 15221 15236 - '@sentry/nextjs@10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0)': 15222 + '@sentry/nextjs@10.31.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2)(webpack@5.103.0)': 15237 15223 dependencies: 15238 15224 '@opentelemetry/api': 1.9.0 15239 15225 '@opentelemetry/semantic-conventions': 1.38.0 ··· 15271 15257 '@opentelemetry/semantic-conventions': 1.38.0 15272 15258 '@sentry/core': 10.31.0 15273 15259 '@sentry/opentelemetry': 10.31.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) 15274 - import-in-the-middle: 2.0.1 15260 + import-in-the-middle: 2.0.0 15275 15261 transitivePeerDependencies: 15276 15262 - supports-color 15277 15263 ··· 15310 15296 '@sentry/core': 10.31.0 15311 15297 '@sentry/node-core': 10.31.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) 15312 15298 '@sentry/opentelemetry': 10.31.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) 15313 - import-in-the-middle: 2.0.1 15299 + import-in-the-middle: 2.0.0 15314 15300 minimatch: 9.0.5 15315 15301 transitivePeerDependencies: 15316 15302 - supports-color ··· 15720 15706 dependencies: 15721 15707 tslib: 2.8.1 15722 15708 15723 - '@t3-oss/env-core@0.7.0(typescript@5.9.3)(zod@4.1.13)': 15709 + '@t3-oss/env-core@0.7.0(typescript@5.9.3)(zod@3.25.76)': 15724 15710 dependencies: 15725 - zod: 4.1.13 15711 + zod: 3.25.76 15726 15712 optionalDependencies: 15727 15713 typescript: 5.9.3 15728 15714 ··· 15732 15718 optionalDependencies: 15733 15719 typescript: 5.9.3 15734 15720 15735 - '@t3-oss/env-core@0.7.1(typescript@5.9.3)(zod@4.1.13)': 15721 + '@t3-oss/env-nextjs@0.7.0(typescript@5.9.3)(zod@3.25.76)': 15736 15722 dependencies: 15737 - zod: 4.1.13 15738 - optionalDependencies: 15739 - typescript: 5.9.3 15740 - 15741 - '@t3-oss/env-nextjs@0.7.0(typescript@5.9.3)(zod@4.1.13)': 15742 - dependencies: 15743 - '@t3-oss/env-core': 0.7.0(typescript@5.9.3)(zod@4.1.13) 15744 - zod: 4.1.13 15723 + '@t3-oss/env-core': 0.7.0(typescript@5.9.3)(zod@3.25.76) 15724 + zod: 3.25.76 15745 15725 optionalDependencies: 15746 15726 typescript: 5.9.3 15747 15727 ··· 15942 15922 '@trpc/server': 11.4.4(typescript@5.9.3) 15943 15923 typescript: 5.9.3 15944 15924 15945 - '@trpc/next@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3)': 15925 + '@trpc/next@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/react-query@11.4.4(@tanstack/react-query@5.81.5(react@19.2.2))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3))(@trpc/server@11.4.4(typescript@5.9.3))(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2)(typescript@5.9.3)': 15946 15926 dependencies: 15947 15927 '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) 15948 15928 '@trpc/server': 11.4.4(typescript@5.9.3) ··· 16266 16246 16267 16247 '@unkey/api@2.2.0': 16268 16248 dependencies: 16269 - zod: 4.1.13 16249 + zod: 3.25.76 16270 16250 16271 16251 '@upstash/core-analytics@0.0.6': 16272 16252 dependencies: ··· 17326 17306 '@types/pg': 8.15.6 17327 17307 bun-types: 1.3.5 17328 17308 17329 - drizzle-zod@0.8.3(drizzle-orm@0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5))(zod@4.1.13): 17309 + drizzle-zod@0.5.1(drizzle-orm@0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5))(zod@3.25.76): 17330 17310 dependencies: 17331 17311 drizzle-orm: 0.44.4(@libsql/client@0.15.15)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(bun-types@1.3.5) 17332 - zod: 4.1.13 17312 + zod: 3.25.76 17333 17313 17334 17314 dset@3.1.4: {} 17335 17315 ··· 18347 18327 parent-module: 1.0.1 18348 18328 resolve-from: 4.0.0 18349 18329 18350 - import-in-the-middle@2.0.1: 18330 + import-in-the-middle@2.0.0: 18351 18331 dependencies: 18352 18332 acorn: 8.15.0 18353 18333 acorn-import-attributes: 1.9.5(acorn@8.15.0) ··· 18601 18581 jiti: 2.6.1 18602 18582 js-yaml: 4.1.1 18603 18583 minimist: 1.2.8 18604 - oxc-resolver: 11.16.2 18584 + oxc-resolver: 11.15.0 18605 18585 picocolors: 1.1.1 18606 18586 picomatch: 4.0.3 18607 18587 smol-toml: 1.5.2 18608 18588 strip-json-comments: 5.0.3 18609 18589 typescript: 5.9.3 18610 - zod: 4.1.13 18590 + zod: 4.2.1 18611 18591 18612 18592 kolorist@1.8.0: {} 18613 18593 ··· 19408 19388 - '@types/react' 19409 19389 - supports-color 19410 19390 19411 - next-plausible@3.12.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2): 19391 + next-plausible@3.12.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react-dom@19.2.2(react@19.2.2))(react@19.2.2): 19412 19392 dependencies: 19413 19393 next: 16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2) 19414 19394 react: 19.2.2 ··· 19505 19485 dependencies: 19506 19486 boolbase: 1.0.0 19507 19487 19508 - nuqs@2.8.5(next@16.0.10(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2): 19488 + nuqs@2.8.5(next@16.0.10(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.2(react@19.2.2))(react@19.2.2))(react@19.2.2): 19509 19489 dependencies: 19510 19490 '@standard-schema/spec': 1.0.0 19511 19491 react: 19.2.2 ··· 19619 19599 19620 19600 outvariant@1.4.3: {} 19621 19601 19622 - oxc-resolver@11.16.2: 19602 + oxc-resolver@11.15.0: 19623 19603 optionalDependencies: 19624 - '@oxc-resolver/binding-android-arm-eabi': 11.16.2 19625 - '@oxc-resolver/binding-android-arm64': 11.16.2 19626 - '@oxc-resolver/binding-darwin-arm64': 11.16.2 19627 - '@oxc-resolver/binding-darwin-x64': 11.16.2 19628 - '@oxc-resolver/binding-freebsd-x64': 11.16.2 19629 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.16.2 19630 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.16.2 19631 - '@oxc-resolver/binding-linux-arm64-gnu': 11.16.2 19632 - '@oxc-resolver/binding-linux-arm64-musl': 11.16.2 19633 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.16.2 19634 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.16.2 19635 - '@oxc-resolver/binding-linux-riscv64-musl': 11.16.2 19636 - '@oxc-resolver/binding-linux-s390x-gnu': 11.16.2 19637 - '@oxc-resolver/binding-linux-x64-gnu': 11.16.2 19638 - '@oxc-resolver/binding-linux-x64-musl': 11.16.2 19639 - '@oxc-resolver/binding-openharmony-arm64': 11.16.2 19640 - '@oxc-resolver/binding-wasm32-wasi': 11.16.2 19641 - '@oxc-resolver/binding-win32-arm64-msvc': 11.16.2 19642 - '@oxc-resolver/binding-win32-ia32-msvc': 11.16.2 19643 - '@oxc-resolver/binding-win32-x64-msvc': 11.16.2 19604 + '@oxc-resolver/binding-android-arm-eabi': 11.15.0 19605 + '@oxc-resolver/binding-android-arm64': 11.15.0 19606 + '@oxc-resolver/binding-darwin-arm64': 11.15.0 19607 + '@oxc-resolver/binding-darwin-x64': 11.15.0 19608 + '@oxc-resolver/binding-freebsd-x64': 11.15.0 19609 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.15.0 19610 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.15.0 19611 + '@oxc-resolver/binding-linux-arm64-gnu': 11.15.0 19612 + '@oxc-resolver/binding-linux-arm64-musl': 11.15.0 19613 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.15.0 19614 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.15.0 19615 + '@oxc-resolver/binding-linux-riscv64-musl': 11.15.0 19616 + '@oxc-resolver/binding-linux-s390x-gnu': 11.15.0 19617 + '@oxc-resolver/binding-linux-x64-gnu': 11.15.0 19618 + '@oxc-resolver/binding-linux-x64-musl': 11.15.0 19619 + '@oxc-resolver/binding-openharmony-arm64': 11.15.0 19620 + '@oxc-resolver/binding-wasm32-wasi': 11.15.0 19621 + '@oxc-resolver/binding-win32-arm64-msvc': 11.15.0 19622 + '@oxc-resolver/binding-win32-ia32-msvc': 11.15.0 19623 + '@oxc-resolver/binding-win32-x64-msvc': 11.15.0 19644 19624 19645 19625 oxfmt@0.18.0: 19646 19626 dependencies: ··· 21967 21947 21968 21948 zod@3.25.76: {} 21969 21949 21970 - zod@4.1.13: {} 21950 + zod@4.2.1: {} 21971 21951 21972 21952 zwitch@2.0.4: {}