Openstatus www.openstatus.dev

Migrate zod v3 to v4 (#1592)

* fix: duplicate verification email

* Updated dashboard tsconfig

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Status page migrated zod

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Migrated web tsconfig.json

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Update zod v4 migration

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Update default to prefault

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Updated zod to v4

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Update zod deprecated

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* ci: apply automated fixes

* Updated some packages for server and test

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Updated the errors for invalid union

* Remove unused redis from page

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* update pnpmlock

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Update the monitor schema

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* ci: apply automated fixes

* Updated the typeerror coming from application

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Update the type error in dashboard

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* Migrated to zod and updated to latest

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>

* fix: workspace limit validation

* chore: improve types

* ci: apply automated fixes

* fix: react-hook-form zod resolver

* fix: url zod notification

---------

Signed-off-by: Moulik Aggarwal <qwertymoulik@gmail.com>
Co-authored-by: Maximilian Kaske <maximilian@kaske.org>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>

authored by

Moulik Aggarwal
Maximilian Kaske
autofix-ci[bot]
and committed by
GitHub
4cd9e153 356c1d05

+1254 -1197
+1 -1
apps/dashboard/next-env.d.ts
··· 1 1 /// <reference types="next" /> 2 2 /// <reference types="next/image-types/global" /> 3 - import "./.next/dev/types/routes.d.ts"; 3 + import "./.next/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": "4.1.3", 22 + "@hookform/resolvers": "5.1.0", 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": "3.25.76" 103 + "zod": "4.1.13" 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 - message: "End date cannot be earlier than start date.", 59 + error: "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().default(true), 32 + followRedirects: z.boolean().prefault(true), 33 33 }); 34 34 35 - type FormValues = z.infer<typeof schema>; 35 + type FormValues = z.input<typeof schema>; 36 36 37 37 export function FormFollowRedirect({ 38 38 defaultValues,
+7 -5
apps/dashboard/src/components/forms/monitor/form-general.tsx
··· 83 83 value: z.string(), 84 84 }), 85 85 ), 86 - active: z.boolean().optional().default(true), 86 + active: z.boolean().optional().prefault(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().default(false), 98 - saveCheck: z.boolean().optional().default(false), 97 + skipCheck: z.boolean().optional().prefault(false), 98 + saveCheck: z.boolean().optional().prefault(false), 99 99 }); 100 100 101 - type FormValues = z.infer<typeof schema>; 101 + type FormValues = z.input<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} 557 558 /> 558 559 <FormMessage /> 559 560 </FormItem> ··· 777 778 render={({ field }) => ( 778 779 <FormItem> 779 780 <Select 780 - value={field.value} 781 + value={field.value as string} 781 782 onValueChange={field.onChange} 782 783 > 783 784 <SelectTrigger ··· 839 840 placeholder="Header key" 840 841 className="w-full" 841 842 {...field} 843 + value={field.value as string} 842 844 /> 843 845 <FormMessage /> 844 846 </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.string().url("Please enter a valid URL"), 35 + endpoint: z.url("Please enter a valid URL"), 36 36 headers: z 37 37 .array(z.object({ key: z.string(), value: z.string() })) 38 - .default([]), 38 + .prefault([]), 39 39 }); 40 40 41 - type FormValues = z.infer<typeof schema>; 41 + type FormValues = z.input<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().optional(), 34 - timeout: z.coerce.number(), 33 + degradedAfter: z.coerce.number<number>().optional(), 34 + timeout: z.coerce.number<number>(), 35 35 }); 36 36 37 - type FormValues = z.infer<typeof schema>; 37 + type FormValues = z.input<typeof schema>; 38 38 39 39 export function FormResponseTime({ 40 40 defaultValues,
+6 -2
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.number().min(RETRY_MIN).max(RETRY_MAX).default(RETRY_DEFAULT), 35 + retry: z.coerce 36 + .number<number>() 37 + .min(RETRY_MIN) 38 + .max(RETRY_MAX) 39 + .prefault(RETRY_DEFAULT), 36 40 }); 37 41 38 - type FormValues = z.infer<typeof schema>; 42 + type FormValues = z.input<typeof schema>; 39 43 40 44 export function FormRetry({ 41 45 defaultValues,
+10 -7
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 { FormFollowRedirect } from "./form-follow-redirect"; 9 + import { 10 + FOLLOW_REDIRECTS_DEFAULT, 11 + FormFollowRedirect, 12 + } from "./form-follow-redirect"; 10 13 import { FormGeneral } from "./form-general"; 11 14 import { FormNotifiers } from "./form-notifiers"; 12 15 import { FormOtel } from "./form-otel"; ··· 226 229 onSubmit={async (values) => 227 230 await updateRetryMutation.mutateAsync({ 228 231 id: Number.parseInt(id), 229 - retry: values.retry, 232 + retry: values.retry ?? RETRY_DEFAULT, 230 233 }) 231 234 } 232 235 /> 233 236 <FormFollowRedirect 234 237 defaultValues={{ 235 - followRedirects: monitor.followRedirects ?? true, 238 + followRedirects: monitor.followRedirects ?? FOLLOW_REDIRECTS_DEFAULT, 236 239 }} 237 - onSubmit={async (values) => { 240 + onSubmit={async (values) => 238 241 await updateFollowRedirectsMutation.mutateAsync({ 239 242 id: Number.parseInt(id), 240 - followRedirects: values.followRedirects, 241 - }); 242 - }} 243 + followRedirects: values.followRedirects ?? FOLLOW_REDIRECTS_DEFAULT, 244 + }) 245 + } 243 246 /> 244 247 <FormOtel 245 248 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.string(), 35 + data: z.url("Please enter a valid URL"), 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.string().email(), 32 + data: z.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.string(), 36 + data: z.url("Please enter a valid URL"), 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.string().url(), 35 + data: z.url("Please enter a valid 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 + } 118 121 if (error instanceof Error) { 119 122 return error.message; 120 123 }
+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.string().url(), 21 + url: z.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.string().email(), 40 + email: z.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 - message: "Value must be manual when type is manual", 70 + error: "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 107 - .array(monitorSchema) 108 - .min(1, { message: "At least one monitor is required" }), 106 + monitors: z.array(monitorSchema).min(1, { 107 + error: "At least one monitor is required", 108 + }), 109 109 }), 110 110 ), 111 111 });
+9 -3
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, { message: "Name is required" }), 52 + name: z.string().min(1, { 53 + error: "Name is required", 54 + }), 53 55 type: z.enum(["bug", "demo", "feature", "security", "question"]), 54 - email: z.string().email({ message: "Invalid email address" }), 55 - message: z.string().min(1, { message: "Message is required" }), 56 + email: z.email({ 57 + error: "Invalid email address", 58 + }), 59 + message: z.string().min(1, { 60 + error: "Message is required", 61 + }), 56 62 blocker: z.boolean(), 57 63 }); 58 64
+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": "3.25.76" 17 + "zod": "4.1.13" 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.string().url(), 38 + url: z.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": "0.15.1", 16 + "@hono/zod-openapi": "1.1.5", 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": "3.25.76" 38 + "zod": "4.1.13" 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().default("development"), 16 + NODE_ENV: z.string().prefault("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 - .default(1) 16 + .prefault(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()) 90 + .record(z.string(), 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.number().int().openapi({ description: "The id of the check" }), 134 + id: z.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 }),
+4 -1
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"); 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 + ); 64 67 expect(res.status).toBe(400); 65 68 }); 66 69
+1 -1
apps/server/src/routes/v1/maintenances/schema.ts
··· 37 37 monitorIds: z 38 38 .array(z.number()) 39 39 .optional() 40 - .default([]) 40 + .prefault([]) 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().default(false).openapi({ 5 + "no-wait": z.coerce.boolean().optional().prefault(false).openapi({ 6 6 description: "Don't wait for the result", 7 7 }), 8 8 })
+52 -62
apps/server/src/routes/v1/monitors/schema.ts
··· 20 20 description: "The comparison to run", 21 21 example: "eq", 22 22 }), 23 - target: z 24 - .number() 25 - .int() 26 - .positive() 27 - .openapi({ description: "The target value" }), 23 + target: z.int().positive().openapi({ description: "The target value" }), 28 24 }) 29 25 .openapi({ 30 26 description: "The status assertion", ··· 94 90 }), 95 91 }); 96 92 93 + const PeriodicityEnumHonoSchema = z.enum([...monitorPeriodicitySchema.options]); 94 + 97 95 export const MonitorSchema = z 98 96 .object({ 99 97 id: z.number().openapi({ 100 98 example: 123, 101 99 description: "The id of the monitor", 102 100 }), 103 - periodicity: monitorPeriodicitySchema.openapi({ 101 + periodicity: PeriodicityEnumHonoSchema.openapi({ 104 102 example: "1m", 105 103 description: "How often the monitor should run", 106 104 }), ··· 111 109 regions: z 112 110 .preprocess( 113 111 (val) => { 114 - let regions: Array<unknown> = []; 115 - if (!val) return regions; 112 + let parsedRegions: Array<unknown> = []; 113 + if (!val) return parsedRegions; 116 114 if (Array.isArray(val)) { 117 - regions = val; 115 + parsedRegions = val; 118 116 } 119 117 if (String(val).length > 0) { 120 - regions = String(val).split(","); 118 + parsedRegions = String(val).split(","); 121 119 } 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 - ]); 139 - } 140 - 141 - return regions; 120 + return parsedRegions; 142 121 }, 143 122 z.array(z.enum(monitorRegions)), 144 123 ) 145 - .default([]) 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([]) 146 141 .openapi({ 147 142 example: ["ams"], 148 143 description: "Where we should monitor it", ··· 166 161 return String(val); 167 162 }, z.string()) 168 163 .nullish() 169 - .default("") 164 + .prefault("") 170 165 .openapi({ 171 166 example: "Hello World", 172 167 description: "The body", ··· 190 185 ]); 191 186 } 192 187 }, 193 - z.array(z.object({ key: z.string(), value: z.string() })).default([]), 188 + z.array(z.object({ key: z.string(), value: z.string() })).prefault([]), 194 189 ) 195 190 .nullish() 196 191 .openapi({ ··· 216 211 } 217 212 }, z.array(assertion)) 218 213 .nullish() 219 - .default([]) 214 + .prefault([]) 220 215 .openapi({ 221 216 description: "The assertions to run", 222 217 }), 223 218 active: z 224 219 .boolean() 225 - .default(false) 220 + .prefault(false) 226 221 .openapi({ description: "If the monitor is active" }), 227 222 public: z 228 223 .boolean() 229 - .default(false) 224 + .prefault(false) 230 225 .openapi({ description: "If the monitor is public" }), 231 226 degradedAfter: z.number().nullish().openapi({ 232 227 description: 233 228 "The time after the monitor is considered degraded in milliseconds", 234 229 }), 235 - timeout: z.number().nullish().default(45000).openapi({ 230 + timeout: z.number().nullish().prefault(45000).openapi({ 236 231 description: "The timeout of the request in milliseconds", 237 232 }), 238 - retry: z.number().default(3).openapi({ 233 + retry: z.number().prefault(3).openapi({ 239 234 description: "The number of retries to attempt", 240 235 }), 241 - followRedirects: z.boolean().default(true).openapi({ 236 + followRedirects: z.boolean().prefault(true).openapi({ 242 237 description: "If the monitor should follow redirects", 243 238 }), 244 - jobType: z.enum(monitorJobTypes).optional().default("http").openapi({ 239 + jobType: z.enum(monitorJobTypes).optional().prefault("http").openapi({ 245 240 description: "The type of the monitor", 246 241 }), 247 242 openTelemetry: z 248 243 .object({ 249 - endpoint: z 250 - .string() 251 - .url() 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()) 252 249 .optional() 253 - .default("http://localhost:4317") 250 + .prefault({}) 254 251 .openapi({ 255 - description: "The endpoint of the OpenTelemetry collector", 252 + description: "The headers to send to the OpenTelemetry collector", 256 253 }), 257 - headers: z.record(z.string()).optional().default({}).openapi({ 258 - description: "The headers to send to the OpenTelemetry collector", 259 - }), 260 254 }) 261 255 .optional() 262 256 .openapi({ ··· 316 310 ]); 317 311 318 312 export const ResultRun = z.object({ 319 - latency: z.number().int(), // in ms 320 - statusCode: z.number().int().nullable().default(null), 321 - monitorId: z.string().default(""), 313 + latency: z.int(), // in ms 314 + statusCode: z.int().nullable().prefault(null), 315 + monitorId: z.string().prefault(""), 322 316 url: z.string().optional(), 323 - error: z.coerce.boolean().default(false), 317 + error: z.coerce.boolean().prefault(false), 324 318 region: z.enum(monitorRegions), 325 - timestamp: z.number().int().optional(), 319 + timestamp: z.int().optional(), 326 320 message: z.string().nullable().optional(), 327 321 timing: z 328 322 .preprocess((val) => { ··· 413 407 }, 414 408 z.array(z.enum(monitorRegions)), 415 409 ) 416 - .default([]) 410 + .prefault([]) 417 411 .openapi({ 418 412 example: ["ams"], 419 413 description: "Where we should monitor it", ··· 421 415 openTelemetry: z 422 416 .object({ 423 417 endpoint: z 424 - .string() 425 418 .url() 426 419 .optional() 427 420 .openapi({ ··· 441 434 442 435 const httpRequestSchema = z.object({ 443 436 method: z.enum(monitorMethods), 444 - url: z 445 - .string() 446 - .url() 447 - .openapi({ 448 - description: "URL to request", 449 - examples: ["https://openstat.us", "https://www.openstatus.dev"], 450 - }), 437 + url: z.url().openapi({ 438 + description: "URL to request", 439 + examples: ["https://openstat.us", "https://www.openstatus.dev"], 440 + }), 451 441 headers: z 452 442 .record(z.string(), z.string()) 453 443 .optional()
+2 -5
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.number().int().openapi({ 7 + ok: z.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 12 - .number() 13 - .int() 14 - .openapi({ description: "The total number of request" }), 11 + count: z.int().openapi({ description: "The total number of request" }), 15 12 day: z.coerce 16 13 .date() 17 14 .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.string().email().openapi({ 23 + email: z.email().openapi({ 24 24 description: "The email of the subscriber", 25 25 }), 26 26 pageId: z.number().openapi({
+2 -3
apps/server/src/routes/v1/pages/schema.ts
··· 43 43 example: "status.acme.com", 44 44 }), 45 45 icon: z 46 - .string() 47 46 .url() 48 47 .or(z.literal("")) 49 48 .transform((val) => (val ? val : undefined)) ··· 52 51 description: "The icon of the page", 53 52 example: "https://example.com/icon.png", 54 53 }), 55 - passwordProtected: z.boolean().optional().default(false).openapi({ 54 + passwordProtected: z.boolean().optional().prefault(false).openapi({ 56 55 description: 57 56 "Make the page password protected. Used with the 'passwordProtected' property.", 58 57 example: true, ··· 61 60 description: "Your password to protect the page from the public", 62 61 example: "hidden-password", 63 62 }), 64 - showMonitorValues: z.boolean().optional().nullish().default(true).openapi({ 63 + showMonitorValues: z.boolean().optional().nullish().prefault(true).openapi({ 65 64 description: 66 65 "Displays the total and failed request numbers for each monitor", 67 66 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().default(new Date()).openapi({ 25 + date: z.coerce.date().prefault(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().default(new Date()).openapi({ 35 + date: z.coerce.date().optional().prefault(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 - .default([]) 33 + .prefault([]) 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 - .default([]) 40 + .prefault([]) 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().default("free").openapi({ 12 + plan: z.enum(workspacePlans).nullable().prefault("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": "4.1.3", 21 + "@hookform/resolvers": "5.1.0", 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": "3.25.76" 86 + "zod": "4.1.13" 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"]).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"), 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"), 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.string().email(), 19 + email: z.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/dev/types/routes.d.ts"; 3 + import "./.next/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": "4.1.3", 17 + "@hookform/resolvers": "5.1.0", 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": "3.25.76" 94 + "zod": "4.1.13" 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.string().datetime({ offset: true }), 18 + last_updated_at: z.iso.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.string().datetime(), 23 + updated_at: z.iso.datetime(), 24 24 }); 25 25 26 26 export const externalStatusArray = z.array(externalStatus);
+4 -2
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(`Error while fetching the monitors ${monitors.error.errors}`); 92 + console.error( 93 + `Error while fetching the monitors ${monitors.error.issues.map((issue) => issue.message).join(", ")}`, 94 + ); 93 95 throw new Error("Error while fetching the monitors"); 94 96 } 95 97 ··· 104 106 const monitorStatus = z.array(selectMonitorStatusSchema).safeParse(result); 105 107 if (!monitorStatus.success) { 106 108 console.error( 107 - `Error while fetching the monitor status ${monitorStatus.error.errors}`, 109 + `Error while fetching the monitor status ${monitorStatus.error.issues.map((issue) => issue.message).join(", ")}`, 108 110 ); 109 111 continue; 110 112 }
+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 - .merge(z.object({ region: monitorRegionSchema.default("ams") })) 24 + .extend(z.object({ region: monitorRegionSchema.prefault("ams") }).shape) 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 - .merge(z.object({ region: monitorRegionSchema.default("ams") })) 25 + .extend(z.object({ region: monitorRegionSchema.prefault("ams") }).shape) 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().default(45000), 10 + timeout: z.number().prefault(45000), 11 11 degradedAfter: z.number().nullable(), 12 12 }); 13 13 14 14 export const TCPResponse = z.object({ 15 - type: z.literal("tcp").default("tcp"), 15 + type: z.literal("tcp").prefault("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").default("success"), 30 + state: z.literal("success").prefault("success"), 31 31 }).or( 32 32 z.object({ 33 - type: z.literal("tcp").default("tcp"), 34 - state: z.literal("error").default("error"), 33 + type: z.literal("tcp").prefault("tcp"), 34 + state: z.literal("error").prefault("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").default("http"), 104 - state: z.literal("success").default("success"), 103 + type: z.literal("http").prefault("http"), 104 + state: z.literal("success").prefault("success"), 105 105 status: z.number(), 106 106 latency: z.number(), 107 - headers: z.record(z.string()), 107 + headers: z.record(z.string(), 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"]).default("GET"), 116 + method: z.enum(["GET", "POST", "PUT", "DELETE"]).prefault("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").default("error"), 122 + state: z.literal("error").prefault("error"), 123 123 }); 124 124 125 125 export const regionCheckerSchema = checkerSchema.extend({ 126 126 region: monitorRegionSchema, 127 - state: z.literal("success").default("success"), 127 + state: z.literal("success").prefault("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.string().url(), 22 + EXTERNAL_API_URL: z.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().default(false).optional(), 5 + combinedRegions: z.boolean().nullable().prefault(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": "3.25.76" 36 + "zod": "4.1.13" 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().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(""), 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(""), 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": "3.25.76" 9 + "zod": "4.1.13" 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": "3.25.76" 35 + "zod": "4.1.13" 36 36 }, 37 37 "devDependencies": { 38 38 "@openstatus/tsconfig": "workspace:*",
+20 -18
packages/api/src/router/checker.ts
··· 26 26 27 27 // Input schemas 28 28 const httpTestInput = z.object({ 29 - url: z.string().url(), 29 + url: z.url(), 30 30 method: z 31 31 .enum([ 32 32 "GET", ··· 39 39 "CONNECT", 40 40 "TRACE", 41 41 ]) 42 - .default("GET"), 42 + .prefault("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().default("ams"), 45 + region: monitorRegionSchema.optional().prefault("ams"), 46 46 assertions: z 47 47 .array( 48 48 z.discriminatedUnion("type", [ ··· 53 53 recordAssertion, 54 54 ]), 55 55 ) 56 - .default([]), 56 + .prefault([]), 57 57 }); 58 58 59 59 const tcpTestInput = z.object({ 60 60 url: z.string(), 61 - region: monitorRegionSchema.optional().default("ams"), 61 + region: monitorRegionSchema.optional().prefault("ams"), 62 62 }); 63 63 64 64 const dnsTestInput = z.object({ 65 65 url: z.string(), 66 - region: monitorRegionSchema.optional().default("ams"), 66 + region: monitorRegionSchema.optional().prefault("ams"), 67 67 assertions: z 68 68 .array( 69 69 z.discriminatedUnion("type", [ ··· 74 74 jsonBodyAssertion, 75 75 ]), 76 76 ) 77 - .default([]), 77 + .prefault([]), 78 78 }); 79 79 80 80 export const tcpOutput = z 81 81 .object({ 82 - state: z.literal("success").default("success"), 83 - type: z.literal("tcp").default("tcp"), 82 + state: z.literal("success").prefault("success"), 83 + type: z.literal("tcp").prefault("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").default("error"), 98 + state: z.literal("error").prefault("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").default("success"), 106 - type: z.literal("http").default("http"), 105 + state: z.literal("success").prefault("success"), 106 + type: z.literal("http").prefault("http"), 107 107 status: z.number(), 108 108 latency: z.number(), 109 - headers: z.record(z.string()), 109 + headers: z.record(z.string(), 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").default("error"), 128 + state: z.literal("error").prefault("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").default("success"), 136 - type: z.literal("dns").default("dns"), 137 - records: z.record(z.enum(dnsRecords), z.array(z.string())).default({}), 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({}), 138 140 latency: z.number().optional(), 139 141 timestamp: z.number(), 140 142 region: monitorRegionSchema, 141 143 }) 142 144 .or( 143 145 z.object({ 144 - state: z.literal("error").default("error"), 146 + state: z.literal("error").prefault("error"), 145 147 message: z.string(), 146 148 }), 147 149 );
+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().default(true).optional(), 16 + misconfigured: z.boolean().prefault(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.string().email().optional(), 16 + email: z.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().default(false).optional(), 221 + maintenance: z.boolean().prefault(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 - .default([]), 662 + .prefault([]), 663 663 }), 664 664 ) 665 665 .parse(monitors); ··· 695 695 selectMonitorSchema.extend({ 696 696 monitorTagsToMonitors: z 697 697 .array(z.object({ monitorTag: selectMonitorTagSchema })) 698 - .default([]), 698 + .prefault([]), 699 699 }), 700 700 ) 701 701 .parse( ··· 853 853 return z 854 854 .array( 855 855 selectMonitorSchema.extend({ 856 - tags: z.array(selectMonitorTagSchema).default([]), 857 - incidents: z.array(selectIncidentSchema).default([]), 856 + tags: z.array(selectMonitorTagSchema).prefault([]), 857 + incidents: z.array(selectIncidentSchema).prefault([]), 858 858 }), 859 859 ) 860 860 .parse( ··· 900 900 901 901 return selectMonitorSchema 902 902 .extend({ 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([]), 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([]), 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().optional(), 1143 + degradedAfter: z.number().nullish(), 1144 1144 }), 1145 1145 ) 1146 1146 .mutation(async ({ ctx, input }) => { ··· 1292 1292 recordAssertion, 1293 1293 ]), 1294 1294 ), 1295 - active: z.boolean().default(true), 1295 + active: z.boolean().prefault(true), 1296 1296 // skip the test check if assertions are OK 1297 - skipCheck: z.boolean().default(true), 1297 + skipCheck: z.boolean().prefault(true), 1298 1298 // save check in db (iff success? -> e.g. onboarding to get a first ping) 1299 - saveCheck: z.boolean().default(false), 1299 + saveCheck: z.boolean().prefault(false), 1300 1300 }), 1301 1301 ) 1302 1302 .mutation(async ({ ctx, input }) => { ··· 1418 1418 recordAssertion, 1419 1419 ]), 1420 1420 ), 1421 - active: z.boolean().default(false), 1422 - saveCheck: z.boolean().default(false), 1423 - skipCheck: z.boolean().default(false), 1421 + active: z.boolean().prefault(false), 1422 + saveCheck: z.boolean().prefault(false), 1423 + skipCheck: z.boolean().prefault(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.record( 284 + data: z.partialRecord( 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.record( 353 + data: z.partialRecord( 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()).default([]), 358 + monitors: z.array(z.number()).prefault([]), 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.record( 463 + data: z.partialRecord( 464 464 z.enum(notificationProvider), 465 465 z.record(z.string(), z.string()).or(z.string()), 466 466 ),
+5 -8
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"; 36 35 import { env } from "../env"; 37 36 import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc"; 38 37 39 38 if (process.env.NODE_ENV === "test") { 40 39 require("../test/preload"); 41 40 } 42 - 43 - const _redis = Redis.fromEnv(); 44 41 45 42 // Helper functions to reuse Vercel API logic 46 43 async function addDomainToVercel(domain: string) { ··· 502 499 monitors: z 503 500 .array( 504 501 selectMonitorSchema.extend({ 505 - order: z.number().default(0), 506 - groupOrder: z.number().default(0), 502 + order: z.number().prefault(0), 503 + groupOrder: z.number().prefault(0), 507 504 groupId: z.number().nullable(), 508 505 }), 509 506 ) 510 - .default([]), 511 - monitorGroups: z.array(selectMonitorGroupSchema).default([]), 512 - maintenances: z.array(selectMaintenanceSchema).default([]), 507 + .prefault([]), 508 + monitorGroups: z.array(selectMonitorGroupSchema).prefault([]), 509 + maintenances: z.array(selectMaintenanceSchema).prefault([]), 513 510 }) 514 511 .parse({ 515 512 ...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 - .default("requests"), 361 - barType: z.enum(["absolute", "dominant", "manual"]).default("dominant"), 360 + .prefault("requests"), 361 + barType: z 362 + .enum(["absolute", "dominant", "manual"]) 363 + .prefault("dominant"), 362 364 }), 363 365 ) 364 366 .query(async (opts) => { ··· 832 834 833 835 subscribe: publicProcedure 834 836 .meta({ track: Events.SubscribePage, trackProps: ["slug", "email"] }) 835 - .input( 836 - z.object({ slug: z.string().toLowerCase(), email: z.string().email() }), 837 - ) 837 + .input(z.object({ slug: z.string().toLowerCase(), email: z.email() })) 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.default("investigating"), // TODO: remove! 230 + status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 231 231 monitorsToStatusReports: z 232 232 .array( 233 233 z.object({ ··· 236 236 monitor: selectMonitorSchema, 237 237 }), 238 238 ) 239 - .default([]), 239 + .prefault([]), 240 240 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 241 - date: z.date().default(new Date()), 241 + date: z.date().prefault(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.default("investigating"), // TODO: remove! 278 + status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 279 279 monitorsToStatusReports: z 280 280 .array( 281 281 z.object({ ··· 284 284 monitor: selectMonitorSchema, 285 285 }), 286 286 ) 287 - .default([]), 287 + .prefault([]), 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.default("investigating"), // TODO: remove! 311 + status: statusReportStatusSchema.prefault("investigating"), // TODO: remove! 312 312 monitorsToStatusReports: z 313 313 .array( 314 314 z.object({ ··· 317 317 monitor: selectMonitorSchema, 318 318 }), 319 319 ) 320 - .default([]), 320 + .prefault([]), 321 321 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 322 322 }); 323 323 ··· 412 412 413 413 return selectStatusReportSchema 414 414 .extend({ 415 - updates: z.array(selectStatusReportUpdateSchema).default([]), 416 - monitors: z.array(selectMonitorSchema).default([]), 415 + updates: z.array(selectStatusReportUpdateSchema).prefault([]), 416 + monitors: z.array(selectMonitorSchema).prefault([]), 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.any()), 22 + object: z.record(z.string(), 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.number().int().optional(), 229 + cronTimestamp: z.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.number().int().optional(), 242 + cronTimestamp: z.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.number().int().optional(), // in minutes, default 30 283 + interval: z.int().optional(), // in minutes, default 30 284 284 regions: z.enum(monitorRegions).or(z.string()).array().optional(), 285 - type: z.enum(types).default("http"), 286 - period: z.enum(["7d", "30d"]).default("30d"), 285 + type: z.enum(types).prefault("http"), 286 + period: z.enum(["7d", "30d"]).prefault("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.number().int().default(30), // in days 314 + interval: z.int().prefault(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).default("http"), 345 + type: z.enum(types).prefault("http"), 346 346 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 347 - cronTimestamp: z.number().int().optional(), 347 + cronTimestamp: z.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).default("http"), 380 + type: z.enum(types).prefault("http"), 381 381 region: z.enum(monitorRegions).or(z.string()).optional(), 382 - cronTimestamp: z.number().int().optional(), 382 + cronTimestamp: z.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).default("http"), 414 + type: z.enum(types).prefault("http"), 415 415 region: z.enum(monitorRegions).or(z.string()).optional(), 416 - cronTimestamp: z.number().int().optional(), 416 + cronTimestamp: z.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).default("http"), 448 + type: z.enum(types).prefault("http"), 449 449 // Additional filters 450 - interval: z.number().int().optional(), 450 + interval: z.int().optional(), 451 451 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 452 - cronTimestamp: z.number().int().optional(), 452 + cronTimestamp: z.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).default("http"), 490 + type: z.enum(types).prefault("http"), 491 491 region: z.enum(monitorRegions).or(z.string()).optional(), 492 - cronTimestamp: z.number().int().optional(), 492 + cronTimestamp: z.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"]).default("14d"), 521 + period: z.enum(["14d"]).prefault("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).default("http"), 552 + type: z.enum(types).prefault("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).default("http"), 582 + type: z.enum(types).prefault("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.number().int().optional(), 604 + interval: z.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"]).default("1d"), 631 - type: z.enum(types).default("http"), 630 + period: z.enum(["1d"]).prefault("1d"), 631 + type: z.enum(types).prefault("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).default("http"), 645 + type: z.enum(types).prefault("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 } from "zod"; 4 + import { ZodError, treeifyError } 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 ? error.cause.flatten() : null, 109 + error.cause instanceof ZodError ? treeifyError(error.cause) : 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": "3.25.76" 13 + "zod": "4.1.13" 14 14 }, 15 15 "keywords": [], 16 16 "author": "",
+15 -17
packages/assertions/src/v1.ts
··· 211 211 return { success: true }; 212 212 } 213 213 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( 214 + export const base = z.looseObject({ 215 + version: z.enum(["v1"]).prefault("v1"), 216 + type: z.string(), 217 + }); 218 + export const statusAssertion = base.extend( 221 219 z.object({ 222 220 type: z.literal("status"), 223 221 compare: numberCompare, 224 - target: z.number().int().positive(), 225 - }), 222 + target: z.int().positive(), 223 + }).shape, 226 224 ); 227 225 228 - export const headerAssertion = base.merge( 226 + export const headerAssertion = base.extend( 229 227 z.object({ 230 228 type: z.literal("header"), 231 229 compare: stringCompare, 232 230 key: z.string(), 233 231 target: z.string(), 234 - }), 232 + }).shape, 235 233 ); 236 234 237 - export const textBodyAssertion = base.merge( 235 + export const textBodyAssertion = base.extend( 238 236 z.object({ 239 237 type: z.literal("textBody"), 240 238 compare: stringCompare, 241 239 target: z.string(), 242 - }), 240 + }).shape, 243 241 ); 244 242 245 - export const jsonBodyAssertion = base.merge( 243 + export const jsonBodyAssertion = base.extend( 246 244 z.object({ 247 245 type: z.literal("jsonBody"), 248 246 path: z.string(), // https://www.npmjs.com/package/jsonpath-plus 249 247 compare: stringCompare, 250 248 target: z.string(), 251 - }), 249 + }).shape, 252 250 ); 253 251 254 252 export const dnsRecords = ["A", "AAAA", "CNAME", "MX", "TXT", "NS"] as const; 255 253 256 - export const recordAssertion = base.merge( 254 + export const recordAssertion = base.extend( 257 255 z.object({ 258 256 type: z.literal("dnsRecord"), 259 257 key: z.enum(dnsRecords), 260 258 compare: recordCompare, 261 259 target: z.string(), 262 - }), 260 + }).shape, 263 261 ); 264 262 265 263 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.5.1", 23 - "zod": "3.25.76" 22 + "drizzle-zod": "0.8.3", 23 + "zod": "4.1.13" 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.string().email(), 7 + email: z.email(), 8 8 }); 9 9 10 10 export const selectInvitationSchema = createSelectSchema(invitation);
+9 -5
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, { message: "Required" }), 9 - message: z.string().min(1, { message: "Required" }), 8 + title: z.string().min(1, { 9 + error: "Required", 10 + }), 11 + message: z.string().min(1, { 12 + error: "Required", 13 + }), 10 14 11 - monitors: z.number().array().default([]).optional(), 15 + monitors: z.number().array().prefault([]).optional(), 12 16 }) 13 17 // REMINDER: validate that `from` date is before `to` date 14 18 .refine((data) => data.from < data.to, { 15 19 path: ["to"], 16 - message: "End date cannot be earlier than start date.", 20 + error: "End date cannot be earlier than start date.", 17 21 }); 18 22 19 23 export const selectMaintenanceSchema = createSelectSchema(maintenance).extend({ 20 - monitors: z.number().array().default([]).optional(), 24 + monitors: z.number().array().prefault([]).optional(), 21 25 }); 22 26 23 27 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() })).default([]), 40 + z.array(z.object({ key: z.string(), value: z.string() })).prefault([]), 41 41 ); 42 42 43 43 export const selectMonitorSchema = createSelectSchema(monitor, { 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([]), 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([]), 51 51 }).extend({ 52 - headers: headersToArraySchema.default([]), 53 - otelHeaders: headersToArraySchema.default([]), 54 - body: bodyToStringSchema.default(""), 52 + headers: headersToArraySchema.prefault([]), 53 + otelHeaders: headersToArraySchema.prefault([]), 54 + body: bodyToStringSchema.prefault(""), 55 55 // for tcp monitors the method is not needed 56 - method: monitorMethodsSchema.default("GET"), 56 + method: monitorMethodsSchema.prefault("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.default("10m"), 69 - status: monitorStatusSchema.default("active"), 70 - regions: z.array(monitorRegionSchema).default([]).optional(), 71 - headers: headersSchema.default([]), 72 - otelHeaders: headersSchema.default([]), 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([]), 73 73 }).extend({ 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([]), 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([]), 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).default(45000), 82 + timeout: z.coerce.number().gte(0).lte(60000).prefault(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 - .default("{}"), 15 + .prefault("{}"), 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().default("{}"), 23 - monitors: z.array(z.number()).optional().default([]), 22 + data: z.string().prefault("{}"), 23 + monitors: z.array(z.number()).optional().prefault([]), 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.string().email(); 37 - export const urlSchema = z.string().url(); 36 + export const emailSchema = z.email(); 37 + export const urlSchema = z.url(); 38 38 39 39 export const ntfyDataSchema = z.object({ 40 40 ntfy: z.object({ 41 - topic: z.string().default(""), 42 - serverUrl: z.string().default("https://ntfy.sh"), 41 + topic: z.string().prefault(""), 42 + serverUrl: z.string().prefault("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.string().url(), 48 + endpoint: z.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.merge( 91 + insertNotificationSchema.extend( 92 92 z.object({ 93 93 provider: z.literal("discord"), 94 94 data: discordDataSchema, 95 - }), 95 + }).shape, 96 96 ), 97 - insertNotificationSchema.merge( 97 + insertNotificationSchema.extend( 98 98 z.object({ 99 99 provider: z.literal("email"), 100 100 data: emailDataSchema, 101 - }), 101 + }).shape, 102 102 ), 103 - insertNotificationSchema.merge( 103 + insertNotificationSchema.extend( 104 104 z.object({ 105 105 provider: z.literal("google-chat"), 106 106 data: googleChatDataSchema, 107 - }), 107 + }).shape, 108 108 ), 109 - insertNotificationSchema.merge( 109 + insertNotificationSchema.extend( 110 110 z.object({ 111 111 provider: z.literal("ntfy"), 112 112 data: ntfyDataSchema, 113 - }), 113 + }).shape, 114 114 ), 115 - insertNotificationSchema.merge( 115 + insertNotificationSchema.extend( 116 116 z.object({ 117 117 provider: z.literal("pagerduty"), 118 118 data: pagerdutyDataSchema, 119 - }), 119 + }).shape, 120 120 ), 121 - insertNotificationSchema.merge( 121 + insertNotificationSchema.extend( 122 122 z.object({ 123 123 provider: z.literal("opsgenie"), 124 124 data: opsgenieDataSchema, 125 - }), 125 + }).shape, 126 126 ), 127 - insertNotificationSchema.merge( 127 + insertNotificationSchema.extend( 128 128 z.object({ 129 129 provider: z.literal("sms"), 130 130 data: phoneDataSchema, 131 - }), 131 + }).shape, 132 132 ), 133 - insertNotificationSchema.merge( 133 + insertNotificationSchema.extend( 134 134 z.object({ 135 135 provider: z.literal("slack"), 136 136 data: slackDataSchema, 137 - }), 137 + }).shape, 138 138 ), 139 - insertNotificationSchema.merge( 139 + insertNotificationSchema.extend( 140 140 z.object({ 141 141 provider: z.literal("webhook"), 142 142 data: webhookDataSchema, 143 - }), 143 + }).shape, 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.string().email(), 7 + email: z.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.default(""), 26 + customDomain: customDomainSchema.prefault(""), 27 27 icon: z.string().optional(), 28 28 slug: slugSchema, 29 29 }).extend({ 30 - password: z.string().nullable().optional().default(""), 30 + password: z.string().nullable().optional().prefault(""), 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().default(0).optional(), 36 + order: z.number().prefault(0).optional(), 37 37 }), 38 38 ) 39 39 .optional() 40 - .default([]), 40 + .prefault([]), 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 - .default("requests"), 48 - type: z.enum(["absolute", "manual"]).nullish().default("absolute"), 49 - uptime: z.coerce.boolean().nullish().default(true), 47 + .prefault("requests"), 48 + type: z.enum(["absolute", "manual"]).nullish().prefault("absolute"), 49 + uptime: z.coerce.boolean().nullish().prefault(true), 50 50 theme: z 51 51 .enum(THEME_KEYS as [ThemeKey, ...ThemeKey[]]) 52 52 .nullish() 53 - .default("default"), 53 + .prefault("default"), 54 54 }); 55 55 56 56 export const selectPageSchema = createSelectSchema(page).extend({ 57 - password: z.string().optional().nullable().default(""), 58 - configuration: pageConfigurationSchema.nullish().default({}), 57 + password: z.string().optional().nullable().prefault(""), 58 + configuration: pageConfigurationSchema.nullish().prefault({}), 59 59 }); 60 60 61 61 export type InsertPage = z.infer<typeof insertPageSchema>;
+29 -27
packages/db/src/schema/plan/schema.ts
··· 10 10 /** 11 11 * Monitor limits 12 12 */ 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), 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), 18 18 "data-retention": z 19 19 .enum(["14 days", "3 months", "12 months", "24 months"]) 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), 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), 26 26 /** 27 27 * Status page limits 28 28 */ 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), 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), 36 36 /** 37 37 * Notification limits 38 38 */ 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), 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 + 46 48 /** 47 49 * Collaboration limits 48 50 */ 49 - members: z.literal("Unlimited").or(z.number()).default(1), 50 - "audit-log": z.boolean().default(false), 51 + members: z.literal("Unlimited").or(z.number()).prefault(1), 52 + "audit-log": z.boolean().prefault(false), 51 53 }); 52 54 53 55 export type Limits = z.infer<typeof limitsSchema>;
+21 -19
packages/db/src/schema/shared.ts
··· 29 29 })); 30 30 31 31 export const selectStatusReportPageSchema = selectStatusReportSchema.extend({ 32 - statusReportUpdates: z.array(selectStatusReportUpdateSchema).default([]), 32 + statusReportUpdates: z.array(selectStatusReportUpdateSchema).prefault([]), 33 33 monitorsToStatusReports: z 34 34 .array( 35 35 z.object({ ··· 38 38 monitor: selectPublicMonitorSchema, 39 39 }), 40 40 ) 41 - .default([]), 41 + .prefault([]), 42 42 }); 43 43 44 44 export const selectMaintenancePageSchema = selectMaintenanceSchema.extend({ ··· 50 50 monitor: selectPublicMonitorSchema, 51 51 }), 52 52 ) 53 - .default([]), 53 + .prefault([]), 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().default(0).optional(), 68 + order: z.number().prefault(0).optional(), 69 69 monitor: selectMonitorSchema, 70 70 }), 71 71 ), 72 - maintenances: selectMaintenanceSchema.array().default([]), 72 + maintenances: selectMaintenanceSchema.array().prefault([]), 73 73 statusReports: selectStatusReportSchema 74 74 .extend({ statusReportUpdates: selectStatusReportUpdateSchema.array() }) 75 75 .array() 76 - .default([]), 76 + .prefault([]), 77 77 }); 78 78 79 79 export const legacy_selectPublicPageSchemaWithRelation = selectPageSchema 80 80 .extend({ 81 - monitors: z.array(selectPublicMonitorSchema).default([]), 82 - statusReports: z.array(selectStatusReportPageSchema).default([]), 83 - incidents: z.array(selectIncidentSchema).default([]), 84 - maintenances: z.array(selectMaintenancePageSchema).default([]), 81 + monitors: z.array(selectPublicMonitorSchema).prefault([]), 82 + statusReports: z.array(selectStatusReportPageSchema).prefault([]), 83 + incidents: z.array(selectIncidentSchema).prefault([]), 84 + maintenances: z.array(selectMaintenancePageSchema).prefault([]), 85 85 workspacePlan: workspacePlanSchema 86 86 .nullable() 87 - .default("free") 87 + .prefault("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.enum(["success", "degraded", "error", "info"]).default("success"), 97 + status: z 98 + .enum(["success", "degraded", "error", "info"]) 99 + .prefault("success"), 98 100 monitorGroupId: z.number().nullable().optional(), 99 101 order: z.number().default(0).optional(), 100 102 groupOrder: z.number().default(0).optional(), ··· 119 121 monitors: z.array(selectPublicMonitorWithStatusSchema), 120 122 status: z 121 123 .enum(["success", "degraded", "error", "info"]) 122 - .default("success"), 124 + .prefault("success"), 123 125 order: z.number(), 124 126 }), 125 127 ]), 126 128 ) 127 - .default([]); 129 + .prefault([]); 128 130 129 131 export const statusPageEventSchema = z.object({ 130 132 id: z.number(), 131 133 name: z.string(), 132 134 from: z.date(), 133 135 to: z.date().nullable(), 134 - status: z.enum(["success", "degraded", "error", "info"]).default("success"), 136 + status: z.enum(["success", "degraded", "error", "info"]).prefault("success"), 135 137 type: z.enum(["maintenance", "incident", "report"]), 136 138 }); 137 139 138 140 export const selectPublicPageSchemaWithRelation = selectPageSchema.extend({ 139 - monitorGroups: selectMonitorGroupSchema.array().default([]), 141 + monitorGroups: selectMonitorGroupSchema.array().prefault([]), 140 142 // TODO: include status of the monitor 141 143 monitors: selectPublicMonitorWithStatusSchema.array(), 142 144 trackers: trackersSchema, ··· 145 147 statusReports: z.array(selectStatusReportPageSchema), 146 148 incidents: z.array(selectIncidentSchema), 147 149 maintenances: z.array(selectMaintenancePageSchema), 148 - status: z.enum(["success", "degraded", "error", "info"]).default("success"), 150 + status: z.enum(["success", "degraded", "error", "info"]).prefault("success"), 149 151 workspacePlan: workspacePlanSchema 150 152 .nullable() 151 - .default("free") 153 + .prefault("free") 152 154 .transform((val) => val ?? "free"), 153 155 }); 154 156 ··· 162 164 monitor: selectPublicMonitorSchema, 163 165 }), 164 166 ) 165 - .default([]), 167 + .prefault([]), 166 168 statusReportUpdates: z.array(selectStatusReportUpdateSchema), 167 169 }); 168 170
+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().default(new Date()), 18 + date: z.coerce.date().optional().prefault(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().default(new Date()), 25 + date: z.coerce.date().optional().prefault(new Date()), 26 26 /** 27 27 * relationship to monitors and pages 28 28 */ 29 - monitors: z.number().array().optional().default([]), 29 + monitors: z.number().array().optional().prefault([]), 30 30 }) 31 31 .extend({ 32 32 /**
+32 -8
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 - const parsed = JSON.parse(val); 19 - const result = limitsSchema.partial().safeParse(parsed); 20 - if (result.error) return {}; 21 - return result.data; 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 + } 22 46 }), 23 47 plan: z 24 48 .enum(workspacePlans) 25 49 .nullable() 26 - .default("free") 50 + .prefault("free") 27 51 .transform((val) => val ?? "free"), 28 52 // REMINDER: workspace usage 29 53 usage: z 30 54 .object({ 31 - monitors: z.number().default(0), 32 - notifications: z.number().default(0), 33 - pages: z.number().default(0), 55 + monitors: z.number().prefault(0), 56 + notifications: z.number().prefault(0), 57 + pages: z.number().prefault(0), 34 58 // checks: z.number().default(0), 35 59 }) 36 60 .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": "3.25.76" 22 + "zod": "4.1.13" 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": "3.25.76" 8 + "zod": "4.1.13" 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.unionErrors.map((ue) => parseZodErrorIssues(ue.issues)).join("; ") 60 + ? i.errors.map((ue) => parseZodErrorIssues(ue)).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": "3.25.76" 10 + "zod": "4.1.13" 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": "3.25.76" 20 + "zod": "4.1.13" 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": "3.25.76" 10 + "zod": "4.1.13" 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().default("https://ntfy.sh"), 6 + serverUrl: z.string().prefault("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": "3.25.76" 13 + "zod": "4.1.13" 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().default("OpenStatus"), 10 + source: z.string().prefault("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().default("OpenStatus"), 21 + source: z.string().prefault("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": "3.25.76" 13 + "zod": "4.1.13" 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.merge( 44 + export const triggerEventPayloadSchema = baseEventPayloadSchema.extend( 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 - }), 59 + }).shape, 60 60 ); 61 61 62 - export const acknowledgeEventPayloadSchema = baseEventPayloadSchema.merge( 62 + export const acknowledgeEventPayloadSchema = baseEventPayloadSchema.extend( 63 63 z.object({ 64 64 event_action: z.literal("acknowledge"), 65 - }), 65 + }).shape, 66 66 ); 67 67 68 - export const resolveEventPayloadSchema = baseEventPayloadSchema.merge( 68 + export const resolveEventPayloadSchema = baseEventPayloadSchema.extend( 69 69 z.object({ 70 70 event_action: z.literal("resolve"), 71 - }), 71 + }).shape, 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": "3.25.76" 10 + "zod": "4.1.13" 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": "3.25.76" 12 + "zod": "4.1.13" 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": "3.25.76" 11 + "zod": "4.1.13" 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": "3.25.76" 8 + "zod": "4.1.13" 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": "0.3.6", 8 - "zod": "3.25.76" 7 + "@chronark/zod-bird": "1.0.0", 8 + "zod": "4.1.13" 9 9 }, 10 10 "devDependencies": { 11 11 "@openstatus/tsconfig": "workspace:*",
+2 -3
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() 13 12 .int() 14 13 .optional() 15 14 .transform((val) => val || Date.now()), 16 - version: z.number().int().default(1), 15 + version: z.int().prefault(1), 17 16 }); 18 17 19 18 /** ··· 31 30 id: z.string(), 32 31 type: actorTypeSchema, 33 32 }) 34 - .default({ 33 + .prefault({ 35 34 id: "server", 36 35 type: "system", 37 36 });
+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.number().int().optional(), 36 + cronTimestamp: z.int().optional(), 37 37 period: z.enum(["total", "1h", "10m", "1d", "1w", "1m"]).optional(), 38 38 }), 39 39 data: z.object({ 40 - count: z.number().int(), 40 + count: z.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").default("http"), 55 - latency: z.number().int(), 56 - statusCode: z.number().int().nullable(), 54 + type: z.literal("http").prefault("http"), 55 + latency: z.int(), 56 + statusCode: z.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.number().int(), 61 - trigger: z.enum(triggers).nullable().default("cron"), 60 + cronTimestamp: z.int(), 61 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 75 - toDate: z.number().int().optional(), 74 + fromDate: z.int().optional(), 75 + toDate: z.int().optional(), 76 76 }), 77 77 data: z.object({ 78 - type: z.literal("http").default("http"), 78 + type: z.literal("http").prefault("http"), 79 79 id: z.string().nullable(), 80 - latency: z.number().int(), 81 - statusCode: z.number().int().nullable(), 80 + latency: z.int(), 81 + statusCode: z.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.number().int(), 86 - trigger: z.enum(triggers).nullable().default("cron"), 85 + cronTimestamp: z.int(), 86 + trigger: z.enum(triggers).nullable().prefault("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").default("http"), 102 - latency: z.number().int(), 103 - statusCode: z.number().int().nullable(), 101 + type: z.literal("http").prefault("http"), 102 + latency: z.int(), 103 + statusCode: z.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.number().int(), 108 - trigger: z.enum(triggers).nullable().default("cron"), 107 + cronTimestamp: z.int(), 108 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 122 - toDate: z.number().int().optional(), 121 + fromDate: z.int().optional(), 122 + toDate: z.int().optional(), 123 123 }), 124 124 data: z.object({ 125 - type: z.literal("http").default("http"), 125 + type: z.literal("http").prefault("http"), 126 126 id: z.string().nullable(), 127 - latency: z.number().int(), 128 - statusCode: z.number().int().nullable(), 127 + latency: z.int(), 128 + statusCode: z.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.number().int(), 133 - trigger: z.enum(triggers).nullable().default("cron"), 132 + cronTimestamp: z.int(), 133 + trigger: z.enum(triggers).nullable().prefault("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").default("http"), 149 - latency: z.number().int(), 150 - statusCode: z.number().int().nullable(), 148 + type: z.literal("http").prefault("http"), 149 + latency: z.int(), 150 + statusCode: z.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.number().int(), 155 - trigger: z.enum(triggers).nullable().default("cron"), 154 + cronTimestamp: z.int(), 155 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 169 - toDate: z.number().int().optional(), 168 + fromDate: z.int().optional(), 169 + toDate: z.int().optional(), 170 170 }), 171 171 data: z.object({ 172 - type: z.literal("http").default("http"), 172 + type: z.literal("http").prefault("http"), 173 173 id: z.string().nullable(), 174 - latency: z.number().int(), 175 - statusCode: z.number().int().nullable(), 174 + latency: z.int(), 175 + statusCode: z.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.number().int(), 180 - trigger: z.enum(triggers).nullable().default("cron"), 179 + cronTimestamp: z.int(), 180 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 193 + interval: z.int().optional(), 194 194 monitorId: z.string(), 195 195 }), 196 196 data: z.object({ 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(), 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(), 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.number().int().optional(), 214 + interval: z.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().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(), 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(), 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.number().int().optional(), 239 + interval: z.int().optional(), 240 240 monitorId: z.string(), 241 241 }), 242 242 data: z.object({ 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(), 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(), 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.number().int().optional(), 260 + interval: z.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().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(), 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(), 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.number().int().optional(), 285 + interval: z.int().optional(), 286 286 monitorId: z.string(), 287 287 }), 288 288 data: z.object({ 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(), 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(), 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.number().int().optional(), 306 + interval: z.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().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(), 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(), 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.number().int().optional(), 330 + interval: z.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.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), 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), 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.number().int().optional(), 350 + interval: z.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.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), 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), 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.number().int().optional(), 370 + interval: z.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.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), 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), 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.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), 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), 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.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), 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), 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.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), 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), 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().default(0), 461 - ok: z.number().default(0), 460 + count: z.number().prefault(0), 461 + ok: z.number().prefault(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.number().int().max(45).optional(), 472 + days: z.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().default(0), 480 - ok: z.number().default(0), 479 + count: z.number().prefault(0), 480 + ok: z.number().prefault(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().default(0), 502 - ok: z.number().default(0), 503 - degraded: z.number().default(0), 504 - error: z.number().default(0), 501 + count: z.number().prefault(0), 502 + ok: z.number().prefault(0), 503 + degraded: z.number().prefault(0), 504 + error: z.number().prefault(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").default("http"), 520 - latency: z.number().int(), 521 - statusCode: z.number().int().nullable(), 519 + type: z.literal("http").prefault("http"), 520 + latency: z.int(), 521 + statusCode: z.int().nullable(), 522 522 requestStatus: z.enum(["error", "success", "degraded"]).nullable(), 523 523 monitorId: z.string(), 524 - url: z.string().url(), 524 + url: z.url(), 525 525 error: z.coerce.boolean(), 526 526 region: z.enum(monitorRegions).or(z.string()), 527 - cronTimestamp: z.number().int(), 527 + cronTimestamp: z.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().default("cron"), 533 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 549 + cronTimestamp: z.int().optional(), 550 550 }), 551 551 data: z.object({ 552 - type: z.literal("http").default("http"), 553 - latency: z.number().int(), 554 - statusCode: z.number().int().nullable(), 552 + type: z.literal("http").prefault("http"), 553 + latency: z.int(), 554 + statusCode: z.int().nullable(), 555 555 monitorId: z.string(), 556 - url: z.string().url(), 556 + url: z.url(), 557 557 error: z.coerce.boolean(), 558 558 region: z.enum(monitorRegions).or(z.string()), 559 - cronTimestamp: z.number().int(), 559 + cronTimestamp: z.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().default("cron"), 564 + trigger: z.enum(triggers).nullable().prefault("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.number().int(), 578 + monitorId: z.int(), 579 579 timestamp: z.number(), 580 580 url: z.string(), 581 581 }), 582 582 data: z.object({ 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(), 583 + latency: z.int(), // in ms 584 + statusCode: z.int().nullable().prefault(null), 585 + monitorId: z.string().prefault(""), 586 + url: z.url().optional(), 587 587 error: z 588 588 .number() 589 - .default(0) 589 + .prefault(0) 590 590 .transform((val) => val !== 0), 591 591 region: z.enum(monitorRegions), 592 - timestamp: z.number().int().optional(), 592 + timestamp: z.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").default("tcp"), 610 - latency: z.number().int(), 609 + type: z.literal("tcp").prefault("tcp"), 610 + latency: z.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.number().int(), 615 - trigger: z.enum(triggers).nullable().default("cron"), 614 + cronTimestamp: z.int(), 615 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 629 - toDate: z.number().int().optional(), 628 + fromDate: z.int().optional(), 629 + toDate: z.int().optional(), 630 630 }), 631 631 data: z.object({ 632 - type: z.literal("tcp").default("tcp"), 632 + type: z.literal("tcp").prefault("tcp"), 633 633 id: z.string().nullable(), 634 - latency: z.number().int(), 634 + latency: z.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.number().int(), 639 - trigger: z.enum(triggers).nullable().default("cron"), 638 + cronTimestamp: z.int(), 639 + trigger: z.enum(triggers).nullable().prefault("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").default("tcp"), 654 - latency: z.number().int(), 653 + type: z.literal("tcp").prefault("tcp"), 654 + latency: z.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.number().int(), 659 - trigger: z.enum(triggers).nullable().default("cron"), 658 + cronTimestamp: z.int(), 659 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 673 - toDate: z.number().int().optional(), 672 + fromDate: z.int().optional(), 673 + toDate: z.int().optional(), 674 674 }), 675 675 data: z.object({ 676 - type: z.literal("tcp").default("tcp"), 676 + type: z.literal("tcp").prefault("tcp"), 677 677 id: z.string().nullable(), 678 - latency: z.number().int(), 678 + latency: z.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.number().int(), 683 - trigger: z.enum(triggers).nullable().default("cron"), 682 + cronTimestamp: z.int(), 683 + trigger: z.enum(triggers).nullable().prefault("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").default("tcp"), 698 - latency: z.number().int(), 697 + type: z.literal("tcp").prefault("tcp"), 698 + latency: z.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.number().int(), 703 - trigger: z.enum(triggers).nullable().default("cron"), 702 + cronTimestamp: z.int(), 703 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 717 - toDate: z.number().int().optional(), 716 + fromDate: z.int().optional(), 717 + toDate: z.int().optional(), 718 718 }), 719 719 data: z.object({ 720 - type: z.literal("tcp").default("tcp"), 720 + type: z.literal("tcp").prefault("tcp"), 721 721 id: z.string().nullable(), 722 - latency: z.number().int(), 722 + latency: z.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.number().int(), 727 - trigger: z.enum(triggers).nullable().default("cron"), 726 + cronTimestamp: z.int(), 727 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 739 + interval: z.int().optional(), 740 740 monitorId: z.string(), 741 741 }), 742 742 data: z.object({ 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(), 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(), 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.number().int().optional(), 760 + interval: z.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().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(), 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(), 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.number().int().optional(), 784 + interval: z.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().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(), 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(), 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.number().int().optional(), 806 + interval: z.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().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(), 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(), 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.number().int().optional(), 831 + interval: z.int().optional(), 832 832 monitorId: z.string(), 833 833 }), 834 834 data: z.object({ 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(), 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(), 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.number().int().optional(), 852 + interval: z.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().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(), 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(), 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.number().int().optional(), 877 + interval: z.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.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), 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), 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.number().int().optional(), 898 + interval: z.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.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), 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), 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.number().int().optional(), 919 + interval: z.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.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), 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), 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.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), 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), 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.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), 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), 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.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), 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), 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().default(0), 1010 - ok: z.number().default(0), 1009 + count: z.number().prefault(0), 1010 + ok: z.number().prefault(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.number().int().max(45).optional(), 1021 + days: z.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().default(0), 1029 - ok: z.number().default(0), 1028 + count: z.number().prefault(0), 1029 + ok: z.number().prefault(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.number().int().max(45).optional(), 1044 + days: z.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().default(0), 1052 - ok: z.number().default(0), 1053 - degraded: z.number().default(0), 1054 - error: z.number().default(0), 1051 + count: z.number().prefault(0), 1052 + ok: z.number().prefault(0), 1053 + degraded: z.number().prefault(0), 1054 + error: z.number().prefault(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.number().int(), 1071 + count: z.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.number().int(), 1087 + count: z.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").default("tcp"), 1101 + type: z.literal("tcp").prefault("tcp"), 1102 1102 id: z.string().nullable(), 1103 1103 uri: z.string(), 1104 - latency: z.number().int(), 1104 + latency: z.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.number().int(), 1109 - trigger: z.enum(triggers).nullable().default("cron"), 1108 + cronTimestamp: z.int(), 1109 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 1125 + cronTimestamp: z.int().optional(), 1126 1126 }), 1127 1127 data: z.object({ 1128 - type: z.literal("tcp").default("tcp"), 1129 - latency: z.number().int(), 1128 + type: z.literal("tcp").prefault("tcp"), 1129 + latency: z.int(), 1130 1130 monitorId: z.string(), 1131 1131 error: z.coerce.boolean(), 1132 1132 region: z.enum(monitorRegions).or(z.string()), 1133 - cronTimestamp: z.number().int(), 1134 - trigger: z.enum(triggers).nullable().default("cron"), 1133 + cronTimestamp: z.int(), 1134 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 1152 + interval: z.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.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), 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), 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.number().int().optional(), 1174 + interval: z.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.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), 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), 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.number().int().optional(), 1195 + interval: z.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.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), 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), 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.number().int().optional(), 1219 + interval: z.int().optional(), 1220 1220 }), 1221 1221 data: z.object({ 1222 1222 interval: z.coerce.date(), 1223 - success: z.number().int(), 1224 - degraded: z.number().int(), 1225 - error: z.number().int(), 1223 + success: z.int(), 1224 + degraded: z.int(), 1225 + error: z.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.number().int().optional(), 1238 + interval: z.int().optional(), 1239 1239 }), 1240 1240 data: z.object({ 1241 1241 interval: z.coerce.date(), 1242 - success: z.number().int(), 1243 - degraded: z.number().int(), 1244 - error: z.number().int(), 1242 + success: z.int(), 1243 + degraded: z.int(), 1244 + error: z.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.number().int().optional(), 1257 + interval: z.int().optional(), 1258 1258 }), 1259 1259 data: z.object({ 1260 1260 interval: z.coerce.date(), 1261 - success: z.number().int(), 1262 - degraded: z.number().int(), 1263 - error: z.number().int(), 1261 + success: z.int(), 1262 + degraded: z.int(), 1263 + error: z.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.number().int().optional(), 1276 + interval: z.int().optional(), 1277 1277 }), 1278 1278 data: z.object({ 1279 1279 interval: z.coerce.date(), 1280 - success: z.number().int(), 1281 - degraded: z.number().int(), 1282 - error: z.number().int(), 1280 + success: z.int(), 1281 + degraded: z.int(), 1282 + error: z.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.number().int().default(30), // in days 1292 + interval: z.int().prefault(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.number().int(), 1305 + timestamp: z.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.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(), 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(), 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.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(), 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(), 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.number().int().optional(), 1360 + interval: z.int().optional(), 1361 1361 regions: z.array(z.enum(monitorRegions).or(z.string())).optional(), 1362 1362 }), 1363 1363 data: z.object({ 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(), 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(), 1390 1390 }), 1391 1391 }); 1392 1392 } ··· 1400 1400 toDate: z.string().optional(), 1401 1401 }), 1402 1402 data: z.object({ 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(), 1403 + timestamp: z.int(), 1404 + p50Latency: z.int(), 1405 + p75Latency: z.int(), 1406 + p90Latency: z.int(), 1407 + p95Latency: z.int(), 1408 + p99Latency: z.int(), 1409 1409 }), 1410 1410 }); 1411 1411 } ··· 1419 1419 toDate: z.string().optional(), 1420 1420 }), 1421 1421 data: z.object({ 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(), 1422 + timestamp: z.int(), 1423 + p50Latency: z.int(), 1424 + p75Latency: z.int(), 1425 + p90Latency: z.int(), 1426 + p95Latency: z.int(), 1427 + p99Latency: z.int(), 1428 1428 }), 1429 1429 }); 1430 1430 } ··· 1438 1438 toDate: z.string().optional(), 1439 1439 }), 1440 1440 data: z.object({ 1441 - timestamp: z.number().int(), 1441 + timestamp: z.int(), 1442 1442 monitorId: z.string(), 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(), 1443 + p50Latency: z.int(), 1444 + p75Latency: z.int(), 1445 + p90Latency: z.int(), 1446 + p95Latency: z.int(), 1447 + p99Latency: z.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.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(), 1463 + timestamp: z.int(), 1464 + p50Latency: z.int(), 1465 + p75Latency: z.int(), 1466 + p90Latency: z.int(), 1467 + p95Latency: z.int(), 1468 + p99Latency: z.int(), 1469 1469 }), 1470 1470 }); 1471 1471 } ··· 1479 1479 toDate: z.string().optional(), 1480 1480 }), 1481 1481 data: z.object({ 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(), 1482 + timestamp: z.int(), 1483 + p50Latency: z.int(), 1484 + p75Latency: z.int(), 1485 + p90Latency: z.int(), 1486 + p95Latency: z.int(), 1487 + p99Latency: z.int(), 1488 1488 }), 1489 1489 }); 1490 1490 } ··· 1498 1498 toDate: z.string().optional(), 1499 1499 }), 1500 1500 data: z.object({ 1501 - timestamp: z.number().int(), 1501 + timestamp: z.int(), 1502 1502 monitorId: z.coerce.string(), 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(), 1503 + p50Latency: z.int(), 1504 + p75Latency: z.int(), 1505 + p90Latency: z.int(), 1506 + p95Latency: z.int(), 1507 + p99Latency: z.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").default("dns"), 1521 + type: z.literal("dns").prefault("dns"), 1522 1522 id: z.coerce.string().nullable(), 1523 1523 uri: z.string(), 1524 - latency: z.number().int(), 1524 + latency: z.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.number().int(), 1529 - trigger: z.enum(triggers).nullable().default("cron"), 1528 + cronTimestamp: z.int(), 1529 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 1557 - toDate: z.number().int().optional(), 1556 + fromDate: z.int().optional(), 1557 + toDate: z.int().optional(), 1558 1558 }), 1559 1559 data: z.object({ 1560 - type: z.literal("dns").default("dns"), 1560 + type: z.literal("dns").prefault("dns"), 1561 1561 id: z.coerce.string().nullable(), 1562 1562 uri: z.string(), 1563 - latency: z.number().int(), 1563 + latency: z.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.number().int(), 1568 - trigger: z.enum(triggers).nullable().default("cron"), 1567 + cronTimestamp: z.int(), 1568 + trigger: z.enum(triggers).nullable().prefault("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.number().int().optional(), 1590 + interval: z.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().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(), 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(), 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.number().int().optional(), 1614 + interval: z.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().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(), 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(), 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.number().int().optional(), 1638 + interval: z.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().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(), 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(), 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.number().int().optional(), 1666 + interval: z.int().optional(), 1667 1667 }), 1668 1668 data: z.object({ 1669 1669 interval: z.coerce.date(), 1670 - success: z.number().int(), 1671 - degraded: z.number().int(), 1672 - error: z.number().int(), 1670 + success: z.int(), 1671 + degraded: z.int(), 1672 + error: z.int(), 1673 1673 }), 1674 1674 }); 1675 1675 } ··· 1683 1683 toDate: z.string().optional(), 1684 1684 }), 1685 1685 data: z.object({ 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(), 1686 + timestamp: z.int(), 1687 + p50Latency: z.int(), 1688 + p75Latency: z.int(), 1689 + p90Latency: z.int(), 1690 + p95Latency: z.int(), 1691 + p99Latency: z.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.number().int().optional(), 1701 + interval: z.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.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), 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), 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().default(0), 1732 - ok: z.number().default(0), 1733 - degraded: z.number().default(0), 1734 - error: z.number().default(0), 1731 + count: z.number().prefault(0), 1732 + ok: z.number().prefault(0), 1733 + degraded: z.number().prefault(0), 1734 + error: z.number().prefault(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.number().int(), 1750 + timestamp: z.int(), 1751 1751 monitorId: z.coerce.string(), 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(), 1752 + p50Latency: z.int(), 1753 + p75Latency: z.int(), 1754 + p90Latency: z.int(), 1755 + p95Latency: z.int(), 1756 + p99Latency: z.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": "3.25.76" 10 + "zod": "4.1.13" 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": "4.1.3", 25 + "@hookform/resolvers": "5.1.0", 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": "3.25.76" 61 + "zod": "4.1.13" 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().default(45000), 16 + timeout: z.number().prefault(45000), 17 17 degradedAfter: z.number().nullable(), 18 - trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 18 + trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 19 19 otelConfig: z 20 20 .object({ 21 21 endpoint: z.string(), 22 - headers: z.record(z.string()), 22 + headers: z.record(z.string(), z.string()), 23 23 }) 24 24 .optional(), 25 - retry: z.number().default(3), 26 - followRedirects: z.boolean().default(true), 25 + retry: z.number().prefault(3), 26 + followRedirects: z.boolean().prefault(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().default(45000), 38 + timeout: z.number().prefault(45000), 39 39 degradedAfter: z.number().nullable(), 40 - trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 40 + trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 41 41 otelConfig: z 42 42 .object({ 43 43 endpoint: z.string(), 44 - headers: z.record(z.string()), 44 + headers: z.record(z.string(), z.string()), 45 45 }) 46 46 .optional(), 47 - retry: z.number().default(3), 47 + retry: z.number().prefault(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().default(45000), 59 + timeout: z.number().prefault(45000), 60 60 degradedAfter: z.number().nullable(), 61 - trigger: z.enum(["cron", "api"]).optional().nullable().default("cron"), 61 + trigger: z.enum(["cron", "api"]).optional().nullable().prefault("cron"), 62 62 otelConfig: z 63 63 .object({ 64 64 endpoint: z.string(), 65 - headers: z.record(z.string()), 65 + headers: z.record(z.string(), z.string()), 66 66 }) 67 67 .optional(), 68 - retry: z.number().default(3), 68 + retry: z.number().prefault(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": "3.25.76" 11 + "zod": "4.1.13" 12 12 }, 13 13 "devDependencies": { 14 14 "@openstatus/tsconfig": "workspace:*",
+248 -228
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: 4.1.3 73 - version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 72 + specifier: 5.1.0 73 + version: 5.1.0(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(@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) 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) 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(@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) 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) 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(@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) 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) 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(@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) 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) 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: 3.25.76 316 - version: 3.25.76 315 + specifier: 4.1.13 316 + version: 4.1.13 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@3.25.76) 417 + version: 0.2.2(hono@4.5.3)(zod@4.1.13) 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@3.25.76) 426 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 438 - version: 3.25.76 437 + specifier: 4.1.13 438 + version: 4.1.13 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: 0.15.1 454 - version: 0.15.1(hono@4.5.3)(zod@3.25.76) 453 + specifier: 1.1.5 454 + version: 1.1.5(hono@4.5.3)(zod@4.1.13) 455 455 '@hono/zod-validator': 456 456 specifier: 0.2.2 457 - version: 0.2.2(hono@4.5.3)(zod@3.25.76) 457 + version: 0.2.2(hono@4.5.3)(zod@4.1.13) 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@3.25.76) 499 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 520 - version: 3.25.76 519 + specifier: 4.1.13 520 + version: 4.1.13 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: 4.1.3 560 - version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 559 + specifier: 5.1.0 560 + version: 5.1.0(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(@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) 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) 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(@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) 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) 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(@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) 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) 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(@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) 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) 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(@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) 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) 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: 3.25.76 755 - version: 3.25.76 754 + specifier: 4.1.13 755 + version: 4.1.13 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: 4.1.3 804 - version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 803 + specifier: 5.1.0 804 + version: 5.1.0(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(@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) 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) 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(@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) 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) 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@3.25.76) 891 + version: 0.7.0(typescript@5.9.3)(zod@4.1.13) 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(@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) 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) 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(@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) 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) 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(@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) 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) 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: 3.25.76 1035 - version: 3.25.76 1034 + specifier: 4.1.13 1035 + version: 4.1.13 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: 3.25.76 1159 - version: 3.25.76 1158 + specifier: 4.1.13 1159 + version: 4.1.13 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@3.25.76) 1178 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1179 1179 zod: 1180 - specifier: 3.25.76 1181 - version: 3.25.76 1180 + specifier: 4.1.13 1181 + version: 4.1.13 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@3.25.76) 1233 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 1269 - version: 3.25.76 1268 + specifier: 4.1.13 1269 + version: 4.1.13 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: 3.25.76 1301 - version: 3.25.76 1300 + specifier: 4.1.13 1301 + version: 4.1.13 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@3.25.76) 1319 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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.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) 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) 1326 1326 zod: 1327 - specifier: 3.25.76 1328 - version: 3.25.76 1327 + specifier: 4.1.13 1328 + version: 4.1.13 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@3.25.76) 1368 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 1377 - version: 3.25.76 1376 + specifier: 4.1.13 1377 + version: 4.1.13 1378 1378 devDependencies: 1379 1379 '@openstatus/tsconfig': 1380 1380 specifier: workspace:* ··· 1398 1398 packages/error: 1399 1399 dependencies: 1400 1400 zod: 1401 - specifier: 3.25.76 1402 - version: 3.25.76 1401 + specifier: 4.1.13 1402 + version: 4.1.13 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: 3.25.76 1449 - version: 3.25.76 1448 + specifier: 4.1.13 1449 + version: 4.1.13 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@3.25.76) 1489 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 1498 - version: 3.25.76 1497 + specifier: 4.1.13 1498 + version: 4.1.13 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: 3.25.76 1545 - version: 3.25.76 1544 + specifier: 4.1.13 1545 + version: 4.1.13 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@3.25.76) 1567 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 1576 - version: 3.25.76 1575 + specifier: 4.1.13 1576 + version: 4.1.13 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@3.25.76) 1604 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 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: 3.25.76 1613 - version: 3.25.76 1612 + specifier: 4.1.13 1613 + version: 4.1.13 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: 3.25.76 1641 - version: 3.25.76 1640 + specifier: 4.1.13 1641 + version: 4.1.13 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@3.25.76) 1685 + version: 0.7.1(typescript@5.9.3)(zod@4.1.13) 1686 1686 validator: 1687 1687 specifier: 13.12.0 1688 1688 version: 13.12.0 1689 1689 zod: 1690 - specifier: 3.25.76 1691 - version: 3.25.76 1690 + specifier: 4.1.13 1691 + version: 4.1.13 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: 3.25.76 1750 - version: 3.25.76 1749 + specifier: 4.1.13 1750 + version: 4.1.13 1751 1751 devDependencies: 1752 1752 '@openstatus/tsconfig': 1753 1753 specifier: workspace:* ··· 1799 1799 packages/regions: 1800 1800 dependencies: 1801 1801 zod: 1802 - specifier: 3.25.76 1803 - version: 3.25.76 1802 + specifier: 4.1.13 1803 + version: 4.1.13 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: 0.3.6 1825 - version: 0.3.6 1824 + specifier: 1.0.0 1825 + version: 1.0.0(zod@4.1.13) 1826 1826 zod: 1827 - specifier: 3.25.76 1828 - version: 3.25.76 1827 + specifier: 4.1.13 1828 + version: 4.1.13 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: 3.25.76 1853 - version: 3.25.76 1852 + specifier: 4.1.13 1853 + version: 4.1.13 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: 4.1.3 1880 - version: 4.1.3(react-hook-form@7.68.0(react@19.2.2)) 1879 + specifier: 5.1.0 1880 + version: 5.1.0(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: 3.25.76 1994 - version: 3.25.76 1993 + specifier: 4.1.13 1994 + version: 4.1.13 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: 3.25.76 2062 - version: 3.25.76 2061 + specifier: 4.1.13 2062 + version: 4.1.13 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@7.3.4': 2098 - resolution: {integrity: sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA==} 2097 + '@asteasolutions/zod-to-openapi@8.2.0': 2098 + resolution: {integrity: sha512-u05zNUirlukJAf9oEHmxSF31L1XQhz9XdpVILt7+xhrz65oQqBpiOWFkGvRWL0IpjOUJ878idKoNmYPxrFnkeg==} 2099 2099 peerDependencies: 2100 - zod: ^3.20.2 2100 + zod: ^4.0.0 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@0.3.6': 2660 - resolution: {integrity: sha512-hE8kCGLJK5ncH8F7uPaqPiOOqo68vUI66nusg7HO5X9BcyN8lXfeQliu6Ou1kOSq95OYshf9nB2fk2+LEvF4ng==} 2659 + '@chronark/zod-bird@1.0.0': 2660 + resolution: {integrity: sha512-OWdZt5EULFgDaHTbkxkxN130ohapRxSMaYdaW/fZTcQP3z1c4cYk4izJwbbTPOP4GdQeys18Prls0xz4NpFV0A==} 2661 + peerDependencies: 2662 + zod: ^4.0.0 2661 2663 2662 2664 '@cspotcode/source-map-support@0.8.1': 2663 2665 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} ··· 3142 3144 peerDependencies: 3143 3145 hono: '>=3.*' 3144 3146 3145 - '@hono/zod-openapi@0.15.1': 3146 - resolution: {integrity: sha512-2Un3D5xD1j4tIvUwzQ/XkB6xwrEA0Ne23TRjB8UVw0PgUWzsB3xiB8Hl/y2ZEMfcIfrA15/ga4P6Bkct8uYaLg==} 3147 + '@hono/zod-openapi@1.1.5': 3148 + resolution: {integrity: sha512-EAnY6ad4yt/MUKHx716BEGGOXSl5d0/FOLozOYB/pmSEFq07qrzefKFtBEMAgd3hlpJXjH+4lwgTtlAo+BGBgQ==} 3147 3149 engines: {node: '>=16.0.0'} 3148 3150 peerDependencies: 3149 3151 hono: '>=4.3.6' 3150 - zod: 3.* 3152 + zod: ^4.0.0 3151 3153 3152 3154 '@hono/zod-validator@0.2.2': 3153 3155 resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==} ··· 3155 3157 hono: '>=3.9.0' 3156 3158 zod: ^3.19.1 3157 3159 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 + 3158 3166 '@hookform/devtools@4.4.0': 3159 3167 resolution: {integrity: sha512-Mtlic+uigoYBPXlfvPBfiYYUZuyMrD3pTjDpVIhL6eCZTvQkHsKBSKeZCvXWUZr8fqrkzDg27N+ZuazLKq6Vmg==} 3160 3168 peerDependencies: 3161 3169 react: ^16.8.0 || ^17 || ^18 || ^19 3162 3170 react-dom: ^16.8.0 || ^17 || ^18 || ^19 3163 3171 3164 - '@hookform/resolvers@4.1.3': 3165 - resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} 3172 + '@hookform/resolvers@5.1.0': 3173 + resolution: {integrity: sha512-A5tY8gxqvvR0lFfropqpy/gUDOxjwT7LZCxJ8lNA9puK7nFNRl/O0egGKxzdF4JSz/pnnT1O8g76P/YMyTBEFw==} 3166 3174 peerDependencies: 3167 - react-hook-form: ^7.0.0 3175 + react-hook-form: ^7.55.0 3168 3176 3169 3177 '@iconify-json/lucide@1.2.26': 3170 3178 resolution: {integrity: sha512-arD/8mK0lRxFY2LgLf345NhWVWiOtV8sOxJuLnq4QRz3frMiOwVwGxEgp5Xe/bRGzxO2CxxCBok0bPRpCkYZQQ==} ··· 3594 3602 resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} 3595 3603 engines: {node: '>=18'} 3596 3604 3597 - '@napi-rs/wasm-runtime@1.1.0': 3598 - resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} 3605 + '@napi-rs/wasm-runtime@1.1.1': 3606 + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} 3599 3607 3600 3608 '@neon-rs/load@0.0.4': 3601 3609 resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} ··· 3877 3885 '@oslojs/encoding@1.1.0': 3878 3886 resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 3879 3887 3880 - '@oxc-resolver/binding-android-arm-eabi@11.15.0': 3881 - resolution: {integrity: sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw==} 3888 + '@oxc-resolver/binding-android-arm-eabi@11.16.2': 3889 + resolution: {integrity: sha512-lVJbvydLQIDZHKUb6Zs9Rq80QVTQ9xdCQE30eC9/cjg4wsMoEOg65QZPymUAIVJotpUAWJD0XYcwE7ugfxx5kQ==} 3882 3890 cpu: [arm] 3883 3891 os: [android] 3884 3892 3885 - '@oxc-resolver/binding-android-arm64@11.15.0': 3886 - resolution: {integrity: sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw==} 3893 + '@oxc-resolver/binding-android-arm64@11.16.2': 3894 + resolution: {integrity: sha512-fEk+g/g2rJ6LnBVPqeLcx+/alWZ/Db1UlXG+ZVivip0NdrnOzRL48PAmnxTMGOrLwsH1UDJkwY3wOjrrQltCqg==} 3887 3895 cpu: [arm64] 3888 3896 os: [android] 3889 3897 3890 - '@oxc-resolver/binding-darwin-arm64@11.15.0': 3891 - resolution: {integrity: sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA==} 3898 + '@oxc-resolver/binding-darwin-arm64@11.16.2': 3899 + resolution: {integrity: sha512-Pkbp1qi7kdUX6k3Fk1PvAg6p7ruwaWKg1AhOlDgrg2vLXjtv9ZHo7IAQN6kLj0W771dPJZWqNxoqTPacp2oYWA==} 3892 3900 cpu: [arm64] 3893 3901 os: [darwin] 3894 3902 3895 - '@oxc-resolver/binding-darwin-x64@11.15.0': 3896 - resolution: {integrity: sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ==} 3903 + '@oxc-resolver/binding-darwin-x64@11.16.2': 3904 + resolution: {integrity: sha512-FYCGcU1iSoPkADGLfQbuj0HWzS+0ItjDCt9PKtu2Hzy6T0dxO4Y1enKeCOxCweOlmLEkSxUlW5UPT4wvT3LnAg==} 3897 3905 cpu: [x64] 3898 3906 os: [darwin] 3899 3907 3900 - '@oxc-resolver/binding-freebsd-x64@11.15.0': 3901 - resolution: {integrity: sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw==} 3908 + '@oxc-resolver/binding-freebsd-x64@11.16.2': 3909 + resolution: {integrity: sha512-1zHCoK6fMcBjE54P2EG/z70rTjcRxvyKfvk4E/QVrWLxNahuGDFZIxoEoo4kGnnEcmPj41F0c2PkrQbqlpja5g==} 3902 3910 cpu: [x64] 3903 3911 os: [freebsd] 3904 3912 3905 - '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': 3906 - resolution: {integrity: sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ==} 3913 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': 3914 + resolution: {integrity: sha512-+ucLYz8EO5FDp6kZ4o1uDmhoP+M98ysqiUW4hI3NmfiOJQWLrAzQjqaTdPfIOzlCXBU9IHp5Cgxu6wPjVb8dbA==} 3907 3915 cpu: [arm] 3908 3916 os: [linux] 3909 3917 3910 - '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': 3911 - resolution: {integrity: sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw==} 3918 + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': 3919 + resolution: {integrity: sha512-qq+TpNXyw1odDgoONRpMLzH4hzhwnEw55398dL8rhKGvvYbio71WrJ00jE+hGlEi7H1Gkl11KoPJRaPlRAVGPw==} 3912 3920 cpu: [arm] 3913 3921 os: [linux] 3914 3922 3915 - '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': 3916 - resolution: {integrity: sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg==} 3923 + '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': 3924 + resolution: {integrity: sha512-xlMh4gNtplNQEwuF5icm69udC7un0WyzT5ywOeHrPMEsghKnLjXok2wZgAA7ocTm9+JsI+nVXIQa5XO1x+HPQg==} 3917 3925 cpu: [arm64] 3918 3926 os: [linux] 3919 3927 3920 - '@oxc-resolver/binding-linux-arm64-musl@11.15.0': 3921 - resolution: {integrity: sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g==} 3928 + '@oxc-resolver/binding-linux-arm64-musl@11.16.2': 3929 + resolution: {integrity: sha512-OZs33QTMi0xmHv/4P0+RAKXJTBk7UcMH5tpTaCytWRXls/DGaJ48jOHmriQGK2YwUqXl+oneuNyPOUO0obJ+Hg==} 3922 3930 cpu: [arm64] 3923 3931 os: [linux] 3924 3932 3925 - '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': 3926 - resolution: {integrity: sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg==} 3933 + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': 3934 + resolution: {integrity: sha512-UVyuhaV32dJGtF6fDofOcBstg9JwB2Jfnjfb8jGlu3xcG+TsubHRhuTwQ6JZ1sColNT1nMxBiu7zdKUEZi1kwg==} 3927 3935 cpu: [ppc64] 3928 3936 os: [linux] 3929 3937 3930 - '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': 3931 - resolution: {integrity: sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg==} 3938 + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': 3939 + resolution: {integrity: sha512-YZZS0yv2q5nE1uL/Fk4Y7m9018DSEmDNSG8oJzy1TJjA1jx5HL52hEPxi98XhU6OYhSO/vC1jdkJeE8TIHugug==} 3932 3940 cpu: [riscv64] 3933 3941 os: [linux] 3934 3942 3935 - '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': 3936 - resolution: {integrity: sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg==} 3943 + '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': 3944 + resolution: {integrity: sha512-9VYuypwtx4kt1lUcwJAH4dPmgJySh4/KxtAPdRoX2BTaZxVm/yEXHq0mnl/8SEarjzMvXKbf7Cm6UBgptm3DZw==} 3937 3945 cpu: [riscv64] 3938 3946 os: [linux] 3939 3947 3940 - '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': 3941 - resolution: {integrity: sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q==} 3948 + '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': 3949 + resolution: {integrity: sha512-3gbwQ+xlL5gpyzgSDdC8B4qIM4mZaPDLaFOi3c/GV7CqIdVJc5EZXW4V3T6xwtPBOpXPXfqQLbhTnUD4SqwJtA==} 3942 3950 cpu: [s390x] 3943 3951 os: [linux] 3944 3952 3945 - '@oxc-resolver/binding-linux-x64-gnu@11.15.0': 3946 - resolution: {integrity: sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg==} 3953 + '@oxc-resolver/binding-linux-x64-gnu@11.16.2': 3954 + resolution: {integrity: sha512-m0WcK0j54tSwWa+hQaJMScZdWneqE7xixp/vpFqlkbhuKW9dRHykPAFvSYg1YJ3MJgu9ZzVNpYHhPKJiEQq57Q==} 3947 3955 cpu: [x64] 3948 3956 os: [linux] 3949 3957 3950 - '@oxc-resolver/binding-linux-x64-musl@11.15.0': 3951 - resolution: {integrity: sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg==} 3958 + '@oxc-resolver/binding-linux-x64-musl@11.16.2': 3959 + resolution: {integrity: sha512-ZjUm3w96P2t47nWywGwj1A2mAVBI/8IoS7XHhcogWCfXnEI3M6NPIRQPYAZW4s5/u3u6w1uPtgOwffj2XIOb/g==} 3952 3960 cpu: [x64] 3953 3961 os: [linux] 3954 3962 3955 - '@oxc-resolver/binding-openharmony-arm64@11.15.0': 3956 - resolution: {integrity: sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw==} 3963 + '@oxc-resolver/binding-openharmony-arm64@11.16.2': 3964 + resolution: {integrity: sha512-OFVQ2x3VenTp13nIl6HcQ/7dmhFmM9dg2EjKfHcOtYfrVLQdNR6THFU7GkMdmc8DdY1zLUeilHwBIsyxv5hkwQ==} 3957 3965 cpu: [arm64] 3958 3966 os: [openharmony] 3959 3967 3960 - '@oxc-resolver/binding-wasm32-wasi@11.15.0': 3961 - resolution: {integrity: sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg==} 3968 + '@oxc-resolver/binding-wasm32-wasi@11.16.2': 3969 + resolution: {integrity: sha512-+O1sY3RrGyA2AqDnd3yaDCsqZqCblSTEpY7TbbaOaw0X7iIbGjjRLdrQk9StG3QSiZuBy9FdFwotIiSXtwvbAQ==} 3962 3970 engines: {node: '>=14.0.0'} 3963 3971 cpu: [wasm32] 3964 3972 3965 - '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': 3966 - resolution: {integrity: sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w==} 3973 + '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': 3974 + resolution: {integrity: sha512-jMrMJL+fkx6xoSMFPOeyQ1ctTFjavWPOSZEKUY5PebDwQmC9cqEr4LhdTnGsOtFrWYLXlEU4xWeMdBoc/XKkOA==} 3967 3975 cpu: [arm64] 3968 3976 os: [win32] 3969 3977 3970 - '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': 3971 - resolution: {integrity: sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA==} 3978 + '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': 3979 + resolution: {integrity: sha512-tl0xDA5dcQplG2yg2ZhgVT578dhRFafaCfyqMEAXq8KNpor85nJ53C3PLpfxD2NKzPioFgWEexNsjqRi+kW2Mg==} 3972 3980 cpu: [ia32] 3973 3981 os: [win32] 3974 3982 3975 - '@oxc-resolver/binding-win32-x64-msvc@11.15.0': 3976 - resolution: {integrity: sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ==} 3983 + '@oxc-resolver/binding-win32-x64-msvc@11.16.2': 3984 + resolution: {integrity: sha512-M7z0xjYQq1HdJk2DxTSLMvRMyBSI4wn4FXGcVQBsbAihgXevAReqwMdb593nmCK/OiFwSNcOaGIzUvzyzQ+95w==} 3977 3985 cpu: [x64] 3978 3986 os: [win32] 3979 3987 ··· 7568 7576 sqlite3: 7569 7577 optional: true 7570 7578 7571 - drizzle-zod@0.5.1: 7572 - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} 7579 + drizzle-zod@0.8.3: 7580 + resolution: {integrity: sha512-66yVOuvGhKJnTdiqj1/Xaaz9/qzOdRJADpDa68enqS6g3t0kpNkwNYjUuaeXgZfO/UWuIM9HIhSlJ6C5ZraMww==} 7573 7581 peerDependencies: 7574 - drizzle-orm: '>=0.23.13' 7575 - zod: '*' 7582 + drizzle-orm: '>=0.36.0' 7583 + zod: ^3.25.0 || ^4.0.0 7576 7584 7577 7585 dset@3.1.4: 7578 7586 resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} ··· 8256 8264 resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 8257 8265 engines: {node: '>=6'} 8258 8266 8259 - import-in-the-middle@2.0.0: 8260 - resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==} 8267 + import-in-the-middle@2.0.1: 8268 + resolution: {integrity: sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==} 8261 8269 8262 8270 import-meta-resolve@4.2.0: 8263 8271 resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} ··· 9315 9323 outvariant@1.4.3: 9316 9324 resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} 9317 9325 9318 - oxc-resolver@11.15.0: 9319 - resolution: {integrity: sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw==} 9326 + oxc-resolver@11.16.2: 9327 + resolution: {integrity: sha512-Uy76u47vwhhF7VAmVY61Srn+ouiOobf45MU9vGct9GD2ARy6hKoqEElyHDB0L+4JOM6VLuZ431KiLwyjI/A21g==} 9320 9328 9321 9329 oxfmt@0.18.0: 9322 9330 resolution: {integrity: sha512-XqVS+LQi7ARsFlIftB69+jGN2qQaJNBjQU2b9ZQYt+iaUV9digh+dBIsU0isQIZhaQ1ihxGFfsTYQXE/Oak8Qw==} ··· 11305 11313 zod@3.25.76: 11306 11314 resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 11307 11315 11308 - zod@4.2.1: 11309 - resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} 11316 + zod@4.1.13: 11317 + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} 11310 11318 11311 11319 zwitch@2.0.4: 11312 11320 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} ··· 11339 11347 transitivePeerDependencies: 11340 11348 - supports-color 11341 11349 11342 - '@asteasolutions/zod-to-openapi@7.3.4(zod@3.25.76)': 11350 + '@asteasolutions/zod-to-openapi@8.2.0(zod@4.1.13)': 11343 11351 dependencies: 11344 11352 openapi3-ts: 4.5.0 11345 - zod: 3.25.76 11353 + zod: 4.1.13 11346 11354 11347 11355 '@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))': 11348 11356 dependencies: ··· 12370 12378 transitivePeerDependencies: 12371 12379 - encoding 12372 12380 12373 - '@chronark/zod-bird@0.3.6': 12381 + '@chronark/zod-bird@1.0.0(zod@4.1.13)': 12374 12382 dependencies: 12375 - zod: 3.25.76 12383 + zod: 4.1.13 12376 12384 12377 12385 '@cspotcode/source-map-support@0.8.1': 12378 12386 dependencies: ··· 12771 12779 hono: 4.5.3 12772 12780 toucan-js: 4.1.1 12773 12781 12774 - '@hono/zod-openapi@0.15.1(hono@4.5.3)(zod@3.25.76)': 12782 + '@hono/zod-openapi@1.1.5(hono@4.5.3)(zod@4.1.13)': 12783 + 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) 12786 + 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)': 12775 12791 dependencies: 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) 12778 12792 hono: 4.5.3 12779 - zod: 3.25.76 12793 + zod: 4.1.13 12780 12794 12781 - '@hono/zod-validator@0.2.2(hono@4.5.3)(zod@3.25.76)': 12795 + '@hono/zod-validator@0.7.6(hono@4.5.3)(zod@4.1.13)': 12782 12796 dependencies: 12783 12797 hono: 4.5.3 12784 - zod: 3.25.76 12798 + zod: 4.1.13 12785 12799 12786 12800 '@hookform/devtools@4.4.0(@types/react@19.2.2)(react-dom@19.2.2(react@19.2.2))(react@19.2.2)': 12787 12801 dependencies: ··· 12799 12813 - '@types/react' 12800 12814 - supports-color 12801 12815 12802 - '@hookform/resolvers@4.1.3(react-hook-form@7.68.0(react@19.2.2))': 12816 + '@hookform/resolvers@5.1.0(react-hook-form@7.68.0(react@19.2.2))': 12803 12817 dependencies: 12804 12818 '@standard-schema/utils': 0.3.0 12805 12819 react-hook-form: 7.68.0(react@19.2.2) ··· 13212 13226 outvariant: 1.4.3 13213 13227 strict-event-emitter: 0.5.1 13214 13228 13215 - '@napi-rs/wasm-runtime@1.1.0': 13229 + '@napi-rs/wasm-runtime@1.1.1': 13216 13230 dependencies: 13217 13231 '@emnapi/core': 1.7.1 13218 13232 '@emnapi/runtime': 1.7.1 ··· 13273 13287 '@openpanel/web': 1.0.1 13274 13288 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) 13275 13289 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)': 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)': 13277 13291 dependencies: 13278 13292 '@openpanel/web': 1.0.1 13279 13293 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) ··· 13490 13504 dependencies: 13491 13505 '@opentelemetry/api': 1.9.0 13492 13506 '@opentelemetry/api-logs': 0.208.0 13493 - import-in-the-middle: 2.0.0 13507 + import-in-the-middle: 2.0.1 13494 13508 require-in-the-middle: 8.0.1 13495 13509 transitivePeerDependencies: 13496 13510 - supports-color ··· 13519 13533 13520 13534 '@oslojs/encoding@1.1.0': {} 13521 13535 13522 - '@oxc-resolver/binding-android-arm-eabi@11.15.0': 13536 + '@oxc-resolver/binding-android-arm-eabi@11.16.2': 13523 13537 optional: true 13524 13538 13525 - '@oxc-resolver/binding-android-arm64@11.15.0': 13539 + '@oxc-resolver/binding-android-arm64@11.16.2': 13526 13540 optional: true 13527 13541 13528 - '@oxc-resolver/binding-darwin-arm64@11.15.0': 13542 + '@oxc-resolver/binding-darwin-arm64@11.16.2': 13529 13543 optional: true 13530 13544 13531 - '@oxc-resolver/binding-darwin-x64@11.15.0': 13545 + '@oxc-resolver/binding-darwin-x64@11.16.2': 13532 13546 optional: true 13533 13547 13534 - '@oxc-resolver/binding-freebsd-x64@11.15.0': 13548 + '@oxc-resolver/binding-freebsd-x64@11.16.2': 13535 13549 optional: true 13536 13550 13537 - '@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0': 13551 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': 13538 13552 optional: true 13539 13553 13540 - '@oxc-resolver/binding-linux-arm-musleabihf@11.15.0': 13554 + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': 13541 13555 optional: true 13542 13556 13543 - '@oxc-resolver/binding-linux-arm64-gnu@11.15.0': 13557 + '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': 13544 13558 optional: true 13545 13559 13546 - '@oxc-resolver/binding-linux-arm64-musl@11.15.0': 13560 + '@oxc-resolver/binding-linux-arm64-musl@11.16.2': 13547 13561 optional: true 13548 13562 13549 - '@oxc-resolver/binding-linux-ppc64-gnu@11.15.0': 13563 + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': 13550 13564 optional: true 13551 13565 13552 - '@oxc-resolver/binding-linux-riscv64-gnu@11.15.0': 13566 + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': 13553 13567 optional: true 13554 13568 13555 - '@oxc-resolver/binding-linux-riscv64-musl@11.15.0': 13569 + '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': 13556 13570 optional: true 13557 13571 13558 - '@oxc-resolver/binding-linux-s390x-gnu@11.15.0': 13572 + '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': 13559 13573 optional: true 13560 13574 13561 - '@oxc-resolver/binding-linux-x64-gnu@11.15.0': 13575 + '@oxc-resolver/binding-linux-x64-gnu@11.16.2': 13562 13576 optional: true 13563 13577 13564 - '@oxc-resolver/binding-linux-x64-musl@11.15.0': 13578 + '@oxc-resolver/binding-linux-x64-musl@11.16.2': 13565 13579 optional: true 13566 13580 13567 - '@oxc-resolver/binding-openharmony-arm64@11.15.0': 13581 + '@oxc-resolver/binding-openharmony-arm64@11.16.2': 13568 13582 optional: true 13569 13583 13570 - '@oxc-resolver/binding-wasm32-wasi@11.15.0': 13584 + '@oxc-resolver/binding-wasm32-wasi@11.16.2': 13571 13585 dependencies: 13572 - '@napi-rs/wasm-runtime': 1.1.0 13586 + '@napi-rs/wasm-runtime': 1.1.1 13573 13587 optional: true 13574 13588 13575 - '@oxc-resolver/binding-win32-arm64-msvc@11.15.0': 13589 + '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': 13576 13590 optional: true 13577 13591 13578 - '@oxc-resolver/binding-win32-ia32-msvc@11.15.0': 13592 + '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': 13579 13593 optional: true 13580 13594 13581 - '@oxc-resolver/binding-win32-x64-msvc@11.15.0': 13595 + '@oxc-resolver/binding-win32-x64-msvc@11.16.2': 13582 13596 optional: true 13583 13597 13584 13598 '@oxfmt/darwin-arm64@0.18.0': ··· 15219 15233 15220 15234 '@sentry/core@9.47.1': {} 15221 15235 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)': 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)': 15223 15237 dependencies: 15224 15238 '@opentelemetry/api': 1.9.0 15225 15239 '@opentelemetry/semantic-conventions': 1.38.0 ··· 15257 15271 '@opentelemetry/semantic-conventions': 1.38.0 15258 15272 '@sentry/core': 10.31.0 15259 15273 '@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) 15260 - import-in-the-middle: 2.0.0 15274 + import-in-the-middle: 2.0.1 15261 15275 transitivePeerDependencies: 15262 15276 - supports-color 15263 15277 ··· 15296 15310 '@sentry/core': 10.31.0 15297 15311 '@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) 15298 15312 '@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) 15299 - import-in-the-middle: 2.0.0 15313 + import-in-the-middle: 2.0.1 15300 15314 minimatch: 9.0.5 15301 15315 transitivePeerDependencies: 15302 15316 - supports-color ··· 15706 15720 dependencies: 15707 15721 tslib: 2.8.1 15708 15722 15709 - '@t3-oss/env-core@0.7.0(typescript@5.9.3)(zod@3.25.76)': 15723 + '@t3-oss/env-core@0.7.0(typescript@5.9.3)(zod@4.1.13)': 15710 15724 dependencies: 15711 - zod: 3.25.76 15725 + zod: 4.1.13 15712 15726 optionalDependencies: 15713 15727 typescript: 5.9.3 15714 15728 ··· 15718 15732 optionalDependencies: 15719 15733 typescript: 5.9.3 15720 15734 15721 - '@t3-oss/env-nextjs@0.7.0(typescript@5.9.3)(zod@3.25.76)': 15735 + '@t3-oss/env-core@0.7.1(typescript@5.9.3)(zod@4.1.13)': 15736 + 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)': 15722 15742 dependencies: 15723 - '@t3-oss/env-core': 0.7.0(typescript@5.9.3)(zod@3.25.76) 15724 - zod: 3.25.76 15743 + '@t3-oss/env-core': 0.7.0(typescript@5.9.3)(zod@4.1.13) 15744 + zod: 4.1.13 15725 15745 optionalDependencies: 15726 15746 typescript: 5.9.3 15727 15747 ··· 15922 15942 '@trpc/server': 11.4.4(typescript@5.9.3) 15923 15943 typescript: 5.9.3 15924 15944 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)': 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)': 15926 15946 dependencies: 15927 15947 '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.3))(typescript@5.9.3) 15928 15948 '@trpc/server': 11.4.4(typescript@5.9.3) ··· 16246 16266 16247 16267 '@unkey/api@2.2.0': 16248 16268 dependencies: 16249 - zod: 3.25.76 16269 + zod: 4.1.13 16250 16270 16251 16271 '@upstash/core-analytics@0.0.6': 16252 16272 dependencies: ··· 17306 17326 '@types/pg': 8.15.6 17307 17327 bun-types: 1.3.5 17308 17328 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): 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): 17310 17330 dependencies: 17311 17331 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) 17312 - zod: 3.25.76 17332 + zod: 4.1.13 17313 17333 17314 17334 dset@3.1.4: {} 17315 17335 ··· 18327 18347 parent-module: 1.0.1 18328 18348 resolve-from: 4.0.0 18329 18349 18330 - import-in-the-middle@2.0.0: 18350 + import-in-the-middle@2.0.1: 18331 18351 dependencies: 18332 18352 acorn: 8.15.0 18333 18353 acorn-import-attributes: 1.9.5(acorn@8.15.0) ··· 18581 18601 jiti: 2.6.1 18582 18602 js-yaml: 4.1.1 18583 18603 minimist: 1.2.8 18584 - oxc-resolver: 11.15.0 18604 + oxc-resolver: 11.16.2 18585 18605 picocolors: 1.1.1 18586 18606 picomatch: 4.0.3 18587 18607 smol-toml: 1.5.2 18588 18608 strip-json-comments: 5.0.3 18589 18609 typescript: 5.9.3 18590 - zod: 4.2.1 18610 + zod: 4.1.13 18591 18611 18592 18612 kolorist@1.8.0: {} 18593 18613 ··· 19388 19408 - '@types/react' 19389 19409 - supports-color 19390 19410 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): 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): 19392 19412 dependencies: 19393 19413 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) 19394 19414 react: 19.2.2 ··· 19485 19505 dependencies: 19486 19506 boolbase: 1.0.0 19487 19507 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): 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): 19489 19509 dependencies: 19490 19510 '@standard-schema/spec': 1.0.0 19491 19511 react: 19.2.2 ··· 19599 19619 19600 19620 outvariant@1.4.3: {} 19601 19621 19602 - oxc-resolver@11.15.0: 19622 + oxc-resolver@11.16.2: 19603 19623 optionalDependencies: 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 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 19624 19644 19625 19645 oxfmt@0.18.0: 19626 19646 dependencies: ··· 21947 21967 21948 21968 zod@3.25.76: {} 21949 21969 21950 - zod@4.2.1: {} 21970 + zod@4.1.13: {} 21951 21971 21952 21972 zwitch@2.0.4: {}