diff --git a/apps/design-system/registry/default/example/calendar-form.tsx b/apps/design-system/registry/default/example/calendar-form.tsx index e598a485034..60d9e3ab5d8 100644 --- a/apps/design-system/registry/default/example/calendar-form.tsx +++ b/apps/design-system/registry/default/example/calendar-form.tsx @@ -5,7 +5,7 @@ import { format } from 'date-fns' import { CalendarIcon } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { cn } from '@/lib/utils' import { @@ -25,8 +25,8 @@ import { const FormSchema = z.object({ dob: z.date({ - required_error: 'A date of birth is required.', - }), + error: (issue) => issue.input === undefined ? 'A date of birth is required.' : undefined +}), }) export default function CalendarForm() { diff --git a/apps/design-system/registry/default/example/calendar-react-hook-form.tsx b/apps/design-system/registry/default/example/calendar-react-hook-form.tsx index 9f889005280..341d636f13c 100644 --- a/apps/design-system/registry/default/example/calendar-react-hook-form.tsx +++ b/apps/design-system/registry/default/example/calendar-react-hook-form.tsx @@ -5,7 +5,7 @@ import { format } from 'date-fns' import { CalendarIcon } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { cn } from '@/lib/utils' import { @@ -25,8 +25,8 @@ import { const FormSchema = z.object({ dob: z.date({ - required_error: 'A date of birth is required.', - }), + error: (issue) => issue.input === undefined ? 'A date of birth is required.' : undefined +}), }) export default function CalendarForm() { diff --git a/apps/design-system/registry/default/example/checkbox-form-multiple.tsx b/apps/design-system/registry/default/example/checkbox-form-multiple.tsx index 3dfe784db0d..4d7348ee57f 100644 --- a/apps/design-system/registry/default/example/checkbox-form-multiple.tsx +++ b/apps/design-system/registry/default/example/checkbox-form-multiple.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -46,8 +46,8 @@ const items = [ const FormSchema = z.object({ items: z.array(z.string()).refine((value) => value.some((item) => item), { - message: 'You have to select at least one item.', - }), + error: 'You have to select at least one item.' +}), }) export default function CheckboxReactHookFormMultiple() { diff --git a/apps/design-system/registry/default/example/checkbox-form-single.tsx b/apps/design-system/registry/default/example/checkbox-form-single.tsx index 68a90d95d63..804eebd8977 100644 --- a/apps/design-system/registry/default/example/checkbox-form-single.tsx +++ b/apps/design-system/registry/default/example/checkbox-form-single.tsx @@ -4,7 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import Link from 'next/link' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -18,7 +18,7 @@ import { } from 'ui' const FormSchema = z.object({ - mobile: z.boolean().default(false).optional(), + mobile: z.boolean().prefault(false).optional(), }) export default function CheckboxReactHookFormSingle() { diff --git a/apps/design-system/registry/default/example/combobox-form.tsx b/apps/design-system/registry/default/example/combobox-form.tsx index 5c4e7d16208..6c839fcd321 100644 --- a/apps/design-system/registry/default/example/combobox-form.tsx +++ b/apps/design-system/registry/default/example/combobox-form.tsx @@ -4,7 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { Check, ChevronsUpDown } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { cn } from '@/lib/utils' import { @@ -43,8 +43,8 @@ const languages = [ const FormSchema = z.object({ language: z.string({ - required_error: 'Please select a language.', - }), + error: (issue) => issue.input === undefined ? 'Please select a language.' : undefined +}), }) export default function ComboboxForm() { diff --git a/apps/design-system/registry/default/example/date-picker-form.tsx b/apps/design-system/registry/default/example/date-picker-form.tsx index dc3270acb69..4b1973e819b 100644 --- a/apps/design-system/registry/default/example/date-picker-form.tsx +++ b/apps/design-system/registry/default/example/date-picker-form.tsx @@ -5,7 +5,7 @@ import { format } from 'date-fns' import { CalendarIcon } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { cn } from '@/lib/utils' import { @@ -25,8 +25,8 @@ import { const FormSchema = z.object({ dob: z.date({ - required_error: 'A date of birth is required.', - }), + error: (issue) => issue.input === undefined ? 'A date of birth is required.' : undefined +}), }) export default function DatePickerForm() { diff --git a/apps/design-system/registry/default/example/form-item-layout-after-label.tsx b/apps/design-system/registry/default/example/form-item-layout-after-label.tsx index 2bd5cae8e89..d923f6b66c2 100644 --- a/apps/design-system/registry/default/example/form-item-layout-after-label.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-after-label.tsx @@ -4,7 +4,7 @@ import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } import { Input } from 'ui-patterns/DataInputs/Input' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ functionName: z.string(), diff --git a/apps/design-system/registry/default/example/form-item-layout-before-label.tsx b/apps/design-system/registry/default/example/form-item-layout-before-label.tsx index 84afb3a31c6..e6a366e28db 100644 --- a/apps/design-system/registry/default/example/form-item-layout-before-label.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-before-label.tsx @@ -4,7 +4,7 @@ import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } import { Input } from 'ui-patterns/DataInputs/Input' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ functionName: z.string(), diff --git a/apps/design-system/registry/default/example/form-item-layout-demo.tsx b/apps/design-system/registry/default/example/form-item-layout-demo.tsx index 4d31cc3df60..ca2c532a59b 100644 --- a/apps/design-system/registry/default/example/form-item-layout-demo.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-demo.tsx @@ -1,14 +1,14 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' -import { z } from 'zod' +import { z } from 'zod/v4' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' const formSchema = z.object({ username: z.string().min(2, { - message: 'Username must be at least 2 characters.', - }), + error: 'Username must be at least 2 characters.' +}), }) export default function FormItemLayoutDemo() { diff --git a/apps/design-system/registry/default/example/form-item-layout-with-checkbox-list.tsx b/apps/design-system/registry/default/example/form-item-layout-with-checkbox-list.tsx index ff215787a11..7d4e7896bf7 100644 --- a/apps/design-system/registry/default/example/form-item-layout-with-checkbox-list.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-with-checkbox-list.tsx @@ -2,12 +2,12 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { Button, Checkbox_Shadcn_, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ items: z.array(z.string()).refine((value) => value.some((item) => item), { - message: 'You have to select at least one item.', - }), + error: 'You have to select at least one item.' +}), }) const items = [ diff --git a/apps/design-system/registry/default/example/form-item-layout-with-checkbox.tsx b/apps/design-system/registry/default/example/form-item-layout-with-checkbox.tsx index a21de035399..075408e66c3 100644 --- a/apps/design-system/registry/default/example/form-item-layout-with-checkbox.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-with-checkbox.tsx @@ -9,10 +9,10 @@ import { FormField_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ - consistent_settings: z.boolean().default(false).optional(), + consistent_settings: z.boolean().prefault(false).optional(), }) export default function FormItemLayoutDemo() { diff --git a/apps/design-system/registry/default/example/form-item-layout-with-horizontal.tsx b/apps/design-system/registry/default/example/form-item-layout-with-horizontal.tsx index 7b0a0a53b54..3e6efb7e55b 100644 --- a/apps/design-system/registry/default/example/form-item-layout-with-horizontal.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-with-horizontal.tsx @@ -1,14 +1,14 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Separator } from 'ui' -import { z } from 'zod' +import { z } from 'zod/v4' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' const formSchema = z.object({ username: z.string().min(2, { - message: 'Username must be at least 2 characters.', - }), + error: 'Username must be at least 2 characters.' +}), }) export default function FormItemLayoutDemo() { diff --git a/apps/design-system/registry/default/example/form-item-layout-with-select.tsx b/apps/design-system/registry/default/example/form-item-layout-with-select.tsx index 22ae206dc46..e3217e21bfb 100644 --- a/apps/design-system/registry/default/example/form-item-layout-with-select.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-with-select.tsx @@ -12,14 +12,12 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ - email: z - .string({ - required_error: 'Please select an email to display.', - }) - .email(), + email: z.email({ + error: (issue) => issue.input === undefined ? 'Please select an email to display.' : undefined + }), }) export default function FormItemLayoutDemo() { diff --git a/apps/design-system/registry/default/example/form-item-layout-with-switch.tsx b/apps/design-system/registry/default/example/form-item-layout-with-switch.tsx index 0e2c373502d..fbadc4a150b 100644 --- a/apps/design-system/registry/default/example/form-item-layout-with-switch.tsx +++ b/apps/design-system/registry/default/example/form-item-layout-with-switch.tsx @@ -2,10 +2,10 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const FormSchema = z.object({ - switch_option: z.boolean().default(false).optional(), + switch_option: z.boolean().prefault(false).optional(), }) export default function FormItemLayoutDemo() { diff --git a/apps/design-system/registry/default/example/input-form.tsx b/apps/design-system/registry/default/example/input-form.tsx index ea9db189256..80054f9a343 100644 --- a/apps/design-system/registry/default/example/input-form.tsx +++ b/apps/design-system/registry/default/example/input-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -19,8 +19,8 @@ import { const FormSchema = z.object({ username: z.string().min(2, { - message: 'Username must be at least 2 characters.', - }), + error: 'Username must be at least 2 characters.' +}), }) export default function InputForm() { diff --git a/apps/design-system/registry/default/example/input-otp-form.tsx b/apps/design-system/registry/default/example/input-otp-form.tsx index bccd4423c69..b760309921a 100644 --- a/apps/design-system/registry/default/example/input-otp-form.tsx +++ b/apps/design-system/registry/default/example/input-otp-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -21,8 +21,8 @@ import { const FormSchema = z.object({ pin: z.string().min(6, { - message: 'Your one-time password must be 6 characters.', - }), + error: 'Your one-time password must be 6 characters.' +}), }) export default function InputOTPForm() { diff --git a/apps/design-system/registry/default/example/radio-group-card-form.tsx b/apps/design-system/registry/default/example/radio-group-card-form.tsx index 447b92a071e..fa8f1300867 100644 --- a/apps/design-system/registry/default/example/radio-group-card-form.tsx +++ b/apps/design-system/registry/default/example/radio-group-card-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -19,8 +19,8 @@ import { const FormSchema = z.object({ type: z.enum(['all', 'mentions', 'none'], { - required_error: 'You need to select a notification type.', - }), + error: (issue) => issue.input === undefined ? 'You need to select a notification type.' : undefined +}), }) export default function RadioGroupForm() { diff --git a/apps/design-system/registry/default/example/radio-group-form.tsx b/apps/design-system/registry/default/example/radio-group-form.tsx index e9315da6141..db9b61c4fb4 100644 --- a/apps/design-system/registry/default/example/radio-group-form.tsx +++ b/apps/design-system/registry/default/example/radio-group-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -19,8 +19,8 @@ import { const FormSchema = z.object({ type: z.enum(['all', 'mentions', 'none'], { - required_error: 'You need to select a notification type.', - }), + error: (issue) => issue.input === undefined ? 'You need to select a notification type.' : undefined +}), }) export default function RadioGroupForm() { diff --git a/apps/design-system/registry/default/example/radio-group-stacked-form.tsx b/apps/design-system/registry/default/example/radio-group-stacked-form.tsx index 54aa17610e8..10bfa31428c 100644 --- a/apps/design-system/registry/default/example/radio-group-stacked-form.tsx +++ b/apps/design-system/registry/default/example/radio-group-stacked-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -19,8 +19,8 @@ import { const FormSchema = z.object({ type: z.enum(['all', 'mentions', 'none'], { - required_error: 'You need to select a notification type.', - }), + error: (issue) => issue.input === undefined ? 'You need to select a notification type.' : undefined +}), }) export default function RadioGroupForm() { diff --git a/apps/design-system/registry/default/example/select-form.tsx b/apps/design-system/registry/default/example/select-form.tsx index 0f4a31e7689..c584cdcf862 100644 --- a/apps/design-system/registry/default/example/select-form.tsx +++ b/apps/design-system/registry/default/example/select-form.tsx @@ -4,7 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import Link from 'next/link' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -23,11 +23,9 @@ import { } from 'ui' const FormSchema = z.object({ - email: z - .string({ - required_error: 'Please select an email to display.', - }) - .email(), + email: z.email({ + error: (issue) => issue.input === undefined ? 'Please select an email to display.' : undefined + }), }) export default function SelectForm() { diff --git a/apps/design-system/registry/default/example/switch-form.tsx b/apps/design-system/registry/default/example/switch-form.tsx index 197c7359157..686caa5ea1c 100644 --- a/apps/design-system/registry/default/example/switch-form.tsx +++ b/apps/design-system/registry/default/example/switch-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -17,7 +17,7 @@ import { } from 'ui' const FormSchema = z.object({ - marketing_emails: z.boolean().default(false).optional(), + marketing_emails: z.boolean().prefault(false).optional(), security_emails: z.boolean(), }) diff --git a/apps/design-system/registry/default/example/textarea-form.tsx b/apps/design-system/registry/default/example/textarea-form.tsx index 1ddb34d5718..07eab9f9803 100644 --- a/apps/design-system/registry/default/example/textarea-form.tsx +++ b/apps/design-system/registry/default/example/textarea-form.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Button, @@ -21,10 +21,10 @@ const FormSchema = z.object({ bio: z .string() .min(10, { - message: 'Bio must be at least 10 characters.', + error: 'Bio must be at least 10 characters.' }) .max(160, { - message: 'Bio must not be longer than 30 characters.', + error: 'Bio must not be longer than 30 characters.' }), }) diff --git a/apps/design-system/registry/schema.ts b/apps/design-system/registry/schema.ts index 8dff42b77a5..3e36f176500 100644 --- a/apps/design-system/registry/schema.ts +++ b/apps/design-system/registry/schema.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' export const blockChunkSchema = z.object({ name: z.string(), diff --git a/apps/docs/app/api/graphql/route.ts b/apps/docs/app/api/graphql/route.ts index d2f14f34c4b..1570be67aa2 100644 --- a/apps/docs/app/api/graphql/route.ts +++ b/apps/docs/app/api/graphql/route.ts @@ -2,7 +2,7 @@ import * as Sentry from '@sentry/nextjs' import { type DocumentNode, graphql, GraphQLError, parse, specifiedRules, validate } from 'graphql' import { createComplexityLimitRule } from 'graphql-validation-complexity' import { NextResponse } from 'next/server' -import { z } from 'zod' +import { z } from 'zod/v4' import { ApiError, convertZodToInvalidRequestError, InvalidRequestError } from '~/app/api/utils' import { BASE_PATH, IS_DEV } from '~/lib/constants' import { sendToLogflare, LOGGING_CODES } from '~/lib/logger' @@ -85,7 +85,7 @@ function isDevGraphiQL(request: Request) { const graphQLRequestSchema = z.object({ query: z.string(), - variables: z.record(z.any()).optional(), + variables: z.record(z.string(), z.any()).optional(), operationName: z.string().optional(), }) diff --git a/apps/docs/app/api/revalidate/route.ts b/apps/docs/app/api/revalidate/route.ts index c1470414469..fe65aeaf8ed 100644 --- a/apps/docs/app/api/revalidate/route.ts +++ b/apps/docs/app/api/revalidate/route.ts @@ -3,7 +3,7 @@ import { type Database } from 'common' import { revalidateTag } from 'next/cache' import { headers } from 'next/headers' import { type NextRequest } from 'next/server' -import { z } from 'zod' +import { z } from 'zod/v4' import { VALID_REVALIDATION_TAGS } from '~/features/helpers.fetch' enum AuthorizationLevel { diff --git a/apps/docs/app/api/utils.ts b/apps/docs/app/api/utils.ts index 652ea444e59..b9f49d235c1 100644 --- a/apps/docs/app/api/utils.ts +++ b/apps/docs/app/api/utils.ts @@ -1,5 +1,5 @@ import { type PostgrestError } from '@supabase/supabase-js' -import { type ZodError } from 'zod' +import { type ZodError } from 'zod/v4' import { isObject } from '~/features/helpers.misc' type ObjectOrNever = object | never diff --git a/apps/docs/features/directives/CodeSample.ts b/apps/docs/features/directives/CodeSample.ts index 952597c0b9f..06791c16d81 100644 --- a/apps/docs/features/directives/CodeSample.ts +++ b/apps/docs/features/directives/CodeSample.ts @@ -37,7 +37,7 @@ import { readFile } from 'node:fs/promises' import { join } from 'node:path' import { type Parent } from 'unist' import { visitParents } from 'unist-util-visit-parents' -import { z, type SafeParseError } from 'zod' +import { z, type SafeParseError } from 'zod/v4' import { fetchWithNextOptions } from '~/features/helpers.fetch' import { IS_PLATFORM } from '~/lib/constants' @@ -49,16 +49,17 @@ const ALLOW_LISTED_GITHUB_ORGS = ['supabase', 'supabase-community'] as [string, const linesSchema = z.array(z.tuple([z.coerce.number(), z.coerce.number()])) const linesValidator = z .string() - .default('[[1, -1]]') + .prefault('[[1, -1]]') .transform((v, ctx) => { try { const array = JSON.parse(v) return linesSchema.parse(array) } catch (e) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Lines should be an array of [number, number] tuples', - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: 'Lines should be an array of [number, number] tuples', + input: '' + }) return z.NEVER } }) @@ -72,14 +73,14 @@ type AdditionalMeta = { const codeSampleExternalSchema = z.object({ external: z.coerce.boolean().refine((v) => v === true), org: z.enum(ALLOW_LISTED_GITHUB_ORGS, { - errorMap: () => ({ message: 'Org must be one of: ' + ALLOW_LISTED_GITHUB_ORGS.join(', ') }), + error: () => 'Org must be one of: ' + ALLOW_LISTED_GITHUB_ORGS.join(', '), }), repo: z.string(), commit: z.string(), path: z.string().transform((v) => (v.startsWith('/') ? v : `/${v}`)), lines: linesValidator, meta: z.string().optional(), - hideElidedLines: z.coerce.boolean().default(false), + hideElidedLines: z.coerce.boolean().prefault(false), }) type ICodeSampleExternal = z.infer & AdditionalMeta @@ -91,7 +92,7 @@ const codeSampleInternalSchema = z.object({ path: z.string().transform((v) => (v.startsWith('/') ? v : `/${v}`)), lines: linesValidator, meta: z.string().optional(), - hideElidedLines: z.coerce.boolean().default(false), + hideElidedLines: z.coerce.boolean().prefault(false), }) type ICodeSampleInternal = z.infer & AdditionalMeta diff --git a/apps/docs/features/docs/Troubleshooting.utils.ts b/apps/docs/features/docs/Troubleshooting.utils.ts index f789f1101f4..bb611951306 100644 --- a/apps/docs/features/docs/Troubleshooting.utils.ts +++ b/apps/docs/features/docs/Troubleshooting.utils.ts @@ -1,5 +1,5 @@ import { cache } from 'react' -import { z } from 'zod' +import { z } from 'zod/v4' import { cache_fullProcess_withDevCacheBust } from '~/features/helpers.fs' import { IS_PLATFORM } from '~/lib/constants' diff --git a/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx b/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx index 8a837bf9d47..2fea469c289 100644 --- a/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx @@ -18,7 +18,7 @@ import { Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import * as z from 'zod' +import * as z from 'zod/v4' import { useAPIKeyCreateMutation } from 'data/api-keys/api-key-create-mutation' import { useParams } from 'next/navigation' diff --git a/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx b/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx index 73a41e8833e..c7e7cc2467e 100644 --- a/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx @@ -22,7 +22,7 @@ import { AlertTitle_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import * as z from 'zod' +import * as z from 'zod/v4' import { toast } from 'sonner' import { useParams } from 'common' diff --git a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx index 17a976ac4c8..8f02cd59f50 100644 --- a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx +++ b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useState } from 'react' import { type SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useAccessTokenCreateMutation } from 'data/access-tokens/access-tokens-create-mutation' import { diff --git a/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx b/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx index c853e7514c9..4185ddce4c7 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { InlineLink } from 'components/ui/InlineLink' import { useEmailUpdateMutation } from 'data/profile/profile-update-email-mutation' diff --git a/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx b/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx index 91306f2d191..ac2b8a942a6 100644 --- a/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx @@ -3,7 +3,7 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useSendSupportTicketMutation } from 'data/feedback/support-ticket-send' import { useOrganizationsQuery } from 'data/organizations/organizations-query' diff --git a/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx b/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx index e4497165102..36802046d68 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx @@ -10,7 +10,7 @@ import { Form_Shadcn_, Input_Shadcn_, } from 'ui' -import z from 'zod' +import z from 'zod/v4' import { FormActions } from 'components/ui/Forms/FormActions' import Panel from 'components/ui/Panel' diff --git a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx index a9d5f53280f..66f846dd66b 100644 --- a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx +++ b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx @@ -3,7 +3,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useLintRuleCreateMutation } from 'data/lint/create-lint-rule-mutation' diff --git a/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm.tsx index b0bc8294855..abb9f4cdb2c 100644 --- a/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/AdvancedAuthSettingsForm.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx index 9534e48e2de..68c8f16fa21 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx @@ -5,7 +5,7 @@ import { useEffect, useMemo } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import ReactMarkdown from 'react-markdown' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { convertArgumentTypes } from 'components/interfaces/Database/Functions/Functions.utils' @@ -74,34 +74,38 @@ const FormSchema = z .superRefine((data, ctx) => { if (data.selectedType === 'https') { if (!data.httpsValues.url.startsWith('https://')) { - ctx.addIssue({ - path: ['httpsValues', 'url'], - code: z.ZodIssueCode.custom, - message: 'The URL must start with https://', - }) + ctx.issues.push({ + path: ['httpsValues', 'url'], + code: z.ZodIssueCode.custom, + message: 'The URL must start with https://', + input: '' + }) } if (!data.httpsValues.secret) { - ctx.addIssue({ - path: ['httpsValues', 'secret'], - code: z.ZodIssueCode.custom, - message: 'Missing secret value', - }) + ctx.issues.push({ + path: ['httpsValues', 'secret'], + code: z.ZodIssueCode.custom, + message: 'Missing secret value', + input: '' + }) } } if (data.selectedType === 'postgres') { if (!data.postgresValues.schema) { - ctx.addIssue({ - path: ['postgresValues', 'schema'], - code: z.ZodIssueCode.custom, - message: 'You must select a schema', - }) + ctx.issues.push({ + path: ['postgresValues', 'schema'], + code: z.ZodIssueCode.custom, + message: 'You must select a schema', + input: '' + }) } if (!data.postgresValues.functionName) { - ctx.addIssue({ - path: ['postgresValues', 'functionName'], - code: z.ZodIssueCode.custom, - message: 'You must select a Postgres function', - }) + ctx.issues.push({ + path: ['postgresValues', 'functionName'], + code: z.ZodIssueCode.custom, + message: 'You must select a Postgres function', + input: '' + }) } } return true diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx index 1684ca6286d..5a89a2b0eff 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx @@ -7,7 +7,7 @@ import { isEqual } from 'lodash' import { memo, useEffect, useRef, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { IStandaloneCodeEditor } from 'components/interfaces/SQLEditor/SQLEditor.types' diff --git a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx index 30befae90b5..a28473ea42d 100644 --- a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx +++ b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { ScaffoldSection } from 'components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx index 92fdbf8fde1..71e0f2d0d1c 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx @@ -3,7 +3,7 @@ import { Plus, Trash } from 'lucide-react' import { useEffect } from 'react' import { useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' diff --git a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx index 55b4b7a9dac..9b971d876bb 100644 --- a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx index 69010641e6d..df16ced6635 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx @@ -3,7 +3,7 @@ import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx index c27876c6261..6e1f676e6d8 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx @@ -3,7 +3,7 @@ import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx index 50b78761d0d..0412d7f66de 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx @@ -3,7 +3,7 @@ import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' @@ -44,13 +44,14 @@ const FormSchema = z !val.domain.match(/https:\/\/clerk([.][a-z0-9-]+){2,}\/?/) && !val.domain.match(/https:\/\/[a-z0-9-]+[.]clerk[.]accounts[.]dev\/?$/) ) { - ctx.addIssue({ - code: z.ZodIssueCode.invalid_string, - path: ['domain'], - message: - 'Production Clerk domains use HTTPS and start with the clerk subdomain (https://clerk.example.com). Development Clerk domains use HTTPS and end with .clerk.accounts.dev (https://example.clerk.accounts.dev).', - validation: 'regex', - }) + ctx.issues.push({ + code: z.ZodIssueCode.invalid_string, + path: ['domain'], + message: + 'Production Clerk domains use HTTPS and start with the clerk subdomain (https://clerk.example.com). Development Clerk domains use HTTPS and end with .clerk.accounts.dev (https://example.clerk.accounts.dev).', + validation: 'regex', + input: '' + }) } }) diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx index 4c49a1fefc1..e8dacc59cee 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx @@ -3,7 +3,7 @@ import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx index 9a2ee0d3efa..ac55015aa27 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx @@ -3,7 +3,7 @@ import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' diff --git a/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx index 7543072de08..052f22d6398 100644 --- a/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx @@ -3,7 +3,7 @@ import dayjs from 'dayjs' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useUserUpdateMutation } from 'data/auth/user-update-mutation' diff --git a/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx index 63c4b904996..d1be6e8dd39 100644 --- a/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Lock, Mail } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useUserCreateMutation } from 'data/auth/user-create-mutation' diff --git a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx index 266b0a636c4..b43a1e98a66 100644 --- a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx +++ b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/router' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' @@ -155,11 +155,12 @@ export const CreateBranchModal = () => { }) // valid – no issues added } catch (error) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Unable to find branch "${val.gitBranchName}" in ${repoOwner}/${repoName}`, - path: ['gitBranchName'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Unable to find branch "${val.gitBranchName}" in ${repoOwner}/${repoName}`, + path: ['gitBranchName'], + input: '' + }) } } }) diff --git a/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx index bed088dd528..36c4bc813c5 100644 --- a/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx +++ b/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import AlertError from 'components/ui/AlertError' @@ -120,11 +120,12 @@ export const EditBranchModal = ({ branch, visible, onClose }: EditBranchModalPro setIsGitBranchValid(true) } catch (error) { setIsGitBranchValid(false) - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Unable to find branch "${val.gitBranchName}" in ${repoOwner}/${repoName}`, - path: ['gitBranchName'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Unable to find branch "${val.gitBranchName}" in ${repoOwner}/${repoName}`, + path: ['gitBranchName'], + input: '' + }) } } else { // If git branch is empty or removed, it's valid for gitless branching diff --git a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx index db1beed78f5..e8ac415f65f 100644 --- a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx +++ b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx @@ -3,7 +3,7 @@ import { debounce } from 'lodash' import { useRef, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import PasswordStrengthBar from 'components/ui/PasswordStrengthBar' diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx index 3efc7c9a9bb..fc8ccab321e 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx @@ -20,7 +20,7 @@ import { SidePanel, cn, } from 'ui' -import * as z from 'zod' +import * as z from 'zod/v4' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useEnumeratedTypeCreateMutation } from 'data/enumerated-types/enumerated-type-create-mutation' diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx index 02f695e575c..3d5247fd7c0 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx @@ -19,7 +19,7 @@ import { SidePanel, cn, } from 'ui' -import * as z from 'zod' +import * as z from 'zod/v4' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useEnumeratedTypeUpdateMutation } from 'data/enumerated-types/enumerated-type-update-mutation' diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx index d481d68ea27..0eff61b92ae 100644 --- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx +++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx @@ -4,7 +4,7 @@ import { Plus, Trash } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { POSTGRES_DATA_TYPES } from 'components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel.tsx index 21f58cd2d20..aee19c012f9 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel.tsx @@ -35,7 +35,7 @@ import { WarningIcon, Label_Shadcn_ as Label, } from 'ui' -import * as z from 'zod' +import * as z from 'zod/v4' import PublicationsComboBox from './PublicationsComboBox' import NewPublicationPanel from './NewPublicationPanel' import { useState, useMemo, useEffect } from 'react' diff --git a/apps/studio/components/interfaces/Database/Replication/NewPublicationPanel.tsx b/apps/studio/components/interfaces/Database/Replication/NewPublicationPanel.tsx index 384cdf61906..6d4b771ce0d 100644 --- a/apps/studio/components/interfaces/Database/Replication/NewPublicationPanel.tsx +++ b/apps/studio/components/interfaces/Database/Replication/NewPublicationPanel.tsx @@ -23,7 +23,7 @@ import { } from 'ui' import { MultiSelector } from 'ui-patterns/multi-select' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' interface NewPublicationPanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx b/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx index 481d06b26e1..4680e18c328 100644 --- a/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx +++ b/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx @@ -1,7 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { FormActions } from 'components/ui/Forms/FormActions' @@ -25,13 +25,13 @@ interface CreateRolePanelProps { } const FormSchema = z.object({ - name: z.string().trim().min(1, 'You must provide a name').default(''), - isSuperuser: z.boolean().default(false), - canLogin: z.boolean().default(false), - canCreateRole: z.boolean().default(false), - canCreateDb: z.boolean().default(false), - isReplicationRole: z.boolean().default(false), - canBypassRls: z.boolean().default(false), + name: z.string().trim().min(1, 'You must provide a name').prefault(''), + isSuperuser: z.boolean().prefault(false), + canLogin: z.boolean().prefault(false), + canCreateRole: z.boolean().prefault(false), + canCreateDb: z.boolean().prefault(false), + isReplicationRole: z.boolean().prefault(false), + canBypassRls: z.boolean().prefault(false), }) const initialValues = { diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx index 5d381c00588..4e6140d7e00 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx @@ -3,7 +3,7 @@ import { Terminal } from 'lucide-react' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { PostgresTrigger } from '@supabase/postgres-meta' import FormBoxEmpty from 'components/ui/FormBoxEmpty' diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts b/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts index 7df4a3e4f98..9ff4e9fe89a 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { ComputeInstanceAddonVariantId } from './DiskManagement.types' import { calculateDiskSizeRequiredForIopsWithGp3, @@ -13,29 +13,23 @@ import { CloudProvider } from 'shared-data' const baseSchema = z.object({ storageType: z.enum(['io2', 'gp3']).describe('Type of storage: io2 or gp3'), - totalSize: z.number().int('Value must be an integer').describe('Allocated disk size in GB'), + totalSize: z.int().describe('Allocated disk size in GB'), provisionedIOPS: z.number().describe('Provisioned IOPS for storage type'), throughput: z.number().optional().describe('Throughput in MB/s for gp3'), computeSize: z .custom((val): val is ComputeInstanceAddonVariantId => true) .describe('Compute size'), - growthPercent: z - .number() - .int('Value must be an integer') + growthPercent: z.int() .min(10, 'Growth percent must be at least 10%') .max(100, 'Growth percent cannot exceed 100%') .optional() .nullable(), - minIncrementGb: z - .number() - .int('Value must be an integer') + minIncrementGb: z.int() .min(1, 'Minimum increment must be at least 1 GB') .max(200, 'Minimum increment cannot exceed 200 GB') .optional() .nullable(), - maxSizeGb: z - .number() - .int('Value must be an integer') + maxSizeGb: z.int() .max(60000, 'Maximum size cannot exceed 60TB') .optional() .nullable(), @@ -48,84 +42,93 @@ export const CreateDiskStorageSchema = (defaultTotalSize: number, cloudProvider: const { storageType, totalSize, provisionedIOPS, throughput, maxSizeGb } = data if (!isFlyProject && totalSize < 8) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Allocated disk size must be at least 8 GB.', - path: ['totalSize'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: 'Allocated disk size must be at least 8 GB.', + path: ['totalSize'], + input: '' + }) } if (!isFlyProject && totalSize < defaultTotalSize) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Disk size cannot be reduced in size. Reduce your database size and then head to the Infrastructure settings and go through a Postgres version upgrade to right-size your disk.`, - path: ['totalSize'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Disk size cannot be reduced in size. Reduce your database size and then head to the Infrastructure settings and go through a Postgres version upgrade to right-size your disk.`, + path: ['totalSize'], + input: '' + }) } // Validate maxSizeGb cannot be lower than totalSize if (!isFlyProject && !!maxSizeGb && maxSizeGb < totalSize) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Max disk size cannot be lower than the current disk size. Must be at least ${formatNumber(totalSize)} GB.`, - path: ['maxSizeGb'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Max disk size cannot be lower than the current disk size. Must be at least ${formatNumber(totalSize)} GB.`, + path: ['maxSizeGb'], + input: '' + }) } if (!isFlyProject && storageType === 'io2') { // Validation rules for io2 if (provisionedIOPS > DISK_LIMITS[DiskType.IO2].maxIops) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `IOPS can not exceed ${formatNumber(DISK_LIMITS[DiskType.IO2].maxIops)} for io2 Disk type. Please reach out to support if you need higher IOPS than this.`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `IOPS can not exceed ${formatNumber(DISK_LIMITS[DiskType.IO2].maxIops)} for io2 Disk type. Please reach out to support if you need higher IOPS than this.`, + path: ['provisionedIOPS'], + input: '' + }) } const maxIOPSforDiskSizeWithio2 = calculateMaxIopsAllowedForDiskSizeWithio2(totalSize) if (provisionedIOPS < DISK_LIMITS[DiskType.IO2].minIops) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Provisioned IOPS must be at least ${formatNumber(DISK_LIMITS[DiskType.IO2].minIops)}`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Provisioned IOPS must be at least ${formatNumber(DISK_LIMITS[DiskType.IO2].minIops)}`, + path: ['provisionedIOPS'], + input: '' + }) } else if (provisionedIOPS > maxIOPSforDiskSizeWithio2) { if (totalSize >= 8) { const diskSizeRequiredForIopsWithIo2 = calculateDiskSizeRequiredForIopsWithIo2(provisionedIOPS) if (diskSizeRequiredForIopsWithIo2 > totalSize) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Larger Disk size of at least ${formatNumber(diskSizeRequiredForIopsWithIo2)} GB required. Current max is ${formatNumber(maxIOPSforDiskSizeWithio2)} IOPS.`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Larger Disk size of at least ${formatNumber(diskSizeRequiredForIopsWithIo2)} GB required. Current max is ${formatNumber(maxIOPSforDiskSizeWithio2)} IOPS.`, + path: ['provisionedIOPS'], + input: '' + }) } } else { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Invalid IOPS value due to small disk size`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Invalid IOPS value due to small disk size`, + path: ['provisionedIOPS'], + input: '' + }) } } if (throughput !== undefined) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Throughput is not configurable for io2.', - path: ['throughput'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: 'Throughput is not configurable for io2.', + path: ['throughput'], + input: '' + }) } if (totalSize > DISK_LIMITS[DiskType.IO2].maxStorage) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Allocated disksize must not exceed ${formatNumber(DISK_LIMITS[DiskType.IO2].maxStorage)} GB `, - path: ['totalSize'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Allocated disksize must not exceed ${formatNumber(DISK_LIMITS[DiskType.IO2].maxStorage)} GB `, + path: ['totalSize'], + input: '' + }) } } @@ -133,35 +136,39 @@ export const CreateDiskStorageSchema = (defaultTotalSize: number, cloudProvider: const maxIopsAllowedForDiskSizeWithGp3 = calculateMaxIopsAllowedForDiskSizeWithGp3(totalSize) if (provisionedIOPS > DISK_LIMITS[DiskType.GP3].maxIops) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `IOPS can not exceed ${formatNumber(DISK_LIMITS[DiskType.GP3].maxIops)} for GP3 Disk. Change the Disk type to io2 for higher IOPS support.`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `IOPS can not exceed ${formatNumber(DISK_LIMITS[DiskType.GP3].maxIops)} for GP3 Disk. Change the Disk type to io2 for higher IOPS support.`, + path: ['provisionedIOPS'], + input: '' + }) } if (provisionedIOPS < DISK_LIMITS[DiskType.GP3].minIops) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `IOPS must be at least ${formatNumber(DISK_LIMITS[DiskType.GP3].minIops)}`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `IOPS must be at least ${formatNumber(DISK_LIMITS[DiskType.GP3].minIops)}`, + path: ['provisionedIOPS'], + input: '' + }) } else if (provisionedIOPS > maxIopsAllowedForDiskSizeWithGp3) { if (totalSize >= 8) { const diskSizeRequiredForIopsWithGp3 = calculateDiskSizeRequiredForIopsWithGp3(provisionedIOPS) - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Larger Disk size of at least ${formatNumber(diskSizeRequiredForIopsWithGp3)} GB required. Current max is ${formatNumber(maxIopsAllowedForDiskSizeWithGp3)} IOPS.`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Larger Disk size of at least ${formatNumber(diskSizeRequiredForIopsWithGp3)} GB required. Current max is ${formatNumber(maxIopsAllowedForDiskSizeWithGp3)} IOPS.`, + path: ['provisionedIOPS'], + input: '' + }) } else { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Invalid IOPS value due to invalid disk size`, - path: ['provisionedIOPS'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Invalid IOPS value due to invalid disk size`, + path: ['provisionedIOPS'], + input: '' + }) } } @@ -169,35 +176,39 @@ export const CreateDiskStorageSchema = (defaultTotalSize: number, cloudProvider: const maxThroughput = Math.min(0.25 * provisionedIOPS, 1000) if (throughput > DISK_LIMITS['gp3'].maxThroughput) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Throughput can not exceed ${formatNumber(maxThroughput)} MB/s`, - path: ['throughput'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Throughput can not exceed ${formatNumber(maxThroughput)} MB/s`, + path: ['throughput'], + input: '' + }) } if (throughput > maxThroughput) { const iopsRequiredForThroughput = calculateIopsRequiredForThroughput(throughput) - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Need at least ${formatNumber(iopsRequiredForThroughput)} IOPS to support ${formatNumber(throughput)} MB/s.`, - path: ['throughput'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Need at least ${formatNumber(iopsRequiredForThroughput)} IOPS to support ${formatNumber(throughput)} MB/s.`, + path: ['throughput'], + input: '' + }) } if (throughput < DISK_LIMITS[DiskType.GP3].minThroughput) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Throughput must be at least ${formatNumber(DISK_LIMITS[DiskType.GP3].minThroughput)} MB/s`, - path: ['throughput'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Throughput must be at least ${formatNumber(DISK_LIMITS[DiskType.GP3].minThroughput)} MB/s`, + path: ['throughput'], + input: '' + }) } } if (totalSize > DISK_LIMITS[DiskType.GP3].maxStorage) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Allocated disksize must not exceed ${formatNumber(DISK_LIMITS[DiskType.GP3].maxStorage)} GB`, - path: ['totalSize'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Allocated disksize must not exceed ${formatNumber(DISK_LIMITS[DiskType.GP3].maxStorage)} GB`, + path: ['totalSize'], + input: '' + }) } } }) diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx index 6358d77eac5..73867ef5684 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/router' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx index 4e07ccbf571..7adecbb5a8f 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx @@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { Loader2, Plus, Send, X } from 'lucide-react' import { useState } from 'react' import { useFieldArray, useForm } from 'react-hook-form' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { RoleImpersonationPopover } from 'components/interfaces/RoleImpersonationSelector' diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx index ae512e6e275..90dd1d85a94 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx @@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useState } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import Panel from 'components/ui/Panel' @@ -33,7 +33,7 @@ const FormSchema = z.object({ .string() .min(1, 'Please provide a name for your secret') .refine((value) => !value.match(/^(SUPABASE_).*/), { - message: 'Name must not start with the SUPABASE_ prefix', + error: 'Name must not start with the SUPABASE_ prefix' }), value: z.string().min(1, 'Please provide a value for your secret'), }) diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx index 4bc501ffe0b..e20ecfa39cc 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet.tsx @@ -5,7 +5,7 @@ import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useWatch } from '@ui/components/shadcn/ui/form' import { urlRegex } from 'components/interfaces/Auth/Auth.constants' @@ -65,7 +65,7 @@ const edgeFunctionSchema = z.object({ type: z.literal('edge_function'), method: z.enum(['GET', 'POST']), edgeFunctionName: z.string().trim().min(1, 'Please select one of the listed Edge Functions'), - timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), + timeoutMs: z.coerce.number().int().gte(1000).lte(5000).prefault(1000), httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), httpBody: z .string() @@ -93,7 +93,7 @@ const httpRequestSchema = z.object({ .min(1, 'Please provide a URL') .regex(urlRegex(), 'Please provide a valid URL') .refine((value) => value.startsWith('http'), 'Please include HTTP/HTTPs to your URL'), - timeoutMs: z.coerce.number().int().gte(1000).lte(5000).default(1000), + timeoutMs: z.coerce.number().int().gte(1000).lte(5000).prefault(1000), httpHeaders: z.array(z.object({ name: z.string(), value: z.string() })), httpBody: z .string() @@ -155,11 +155,12 @@ const FormSchema = z .superRefine((data, ctx) => { if (!cronPattern.test(data.schedule)) { if (!(data.supportsSeconds && secondsPattern.test(data.schedule))) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Seconds are supported only in pg_cron v1.5.0+. Please use a valid Cron format.', - path: ['schedule'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: 'Seconds are supported only in pg_cron v1.5.0+. Please use a valid Cron format.', + path: ['schedule'], + input: '' + }) } } }) diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet.tsx index bf6e367fe45..9ce667f0b8c 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet.tsx @@ -1,7 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { Markdown } from 'components/interfaces/Markdown' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx index e5ceebe670a..820849cfea9 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { DocsButton } from 'components/ui/DocsButton' import { FormHeader } from 'components/ui/Forms/FormHeader' diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx index af38654151a..1c635beedb3 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx @@ -1,6 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SubmitHandler, useForm } from 'react-hook-form' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' @@ -17,7 +17,7 @@ interface SendMessageModalProps { } const FormSchema = z.object({ - delay: z.coerce.number().int().gte(0).default(5), + delay: z.coerce.number().int().gte(0).prefault(5), payload: z.string().refine( (val) => { try { @@ -27,7 +27,7 @@ const FormSchema = z.object({ } }, { - message: 'The payload should be a JSON object', + error: 'The payload should be a JSON object' } ), }) diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx index 1b5b6d36e9c..ea921c591d1 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx @@ -3,7 +3,7 @@ import { TrashIcon } from 'lucide-react' import { ReactNode, useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useParams } from 'common' import { LogDrainData, useLogDrainsQuery } from 'data/log-drains/log-drains-query' @@ -52,8 +52,12 @@ const formUnion = z.discriminatedUnion('type', [ }), z.object({ type: z.literal('datadog'), - api_key: z.string().min(1, { message: 'API key is required' }), - region: z.string().min(1, { message: 'Region is required' }), + api_key: z.string().min(1, { + error: 'API key is required' + }), + region: z.string().min(1, { + error: 'Region is required' + }), }), z.object({ type: z.literal('elastic'), @@ -66,7 +70,9 @@ const formUnion = z.discriminatedUnion('type', [ }), z.object({ type: z.literal('loki'), - url: z.string().min(1, { message: 'Loki URL is required' }), + url: z.string().min(1, { + error: 'Loki URL is required' + }), headers: z.record(z.string(), z.string()), username: z.string().optional(), password: z.string().optional(), @@ -76,7 +82,7 @@ const formUnion = z.discriminatedUnion('type', [ const formSchema = z .object({ name: z.string().min(1, { - message: 'Destination name is required', + error: 'Destination name is required' }), description: z.string().optional(), }) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm.tsx index 98e84f71649..8ee7929308d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm.tsx @@ -1,6 +1,6 @@ import { Check, ChevronsUpDown, X } from 'lucide-react' import { UseFormReturn } from 'react-hook-form' -import { z } from 'zod' +import { z } from 'zod/v4' import { useMemo, useState } from 'react' import { @@ -53,18 +53,18 @@ export const BillingCustomerDataSchema = z return !hasAnyField || (!!data.country && !!data.line1) }, { - message: 'Country and Address line 1 are required if any other field is provided.', path: ['line1'], + error: 'Country and Address line 1 are required if any other field is provided.' } ) .refine((data) => !(!!data.line1 && !data.country), { - message: 'Please select a country', path: ['country'], - }) + error: 'Please select a country' +}) .refine((data) => !(!!data.country && !data.line1), { - message: 'Please provide an address line 1', path: ['line1'], - }) + error: 'Please provide an address line 1' +}) export type BillingCustomerDataFormValues = z.infer diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx index 778dd9933ed..e32e4c3ea45 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { Form, FormControl, FormField } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' @@ -35,8 +35,8 @@ import { const FORM_ID = 'org-billing-email' const formSchema = z.object({ - billingEmail: z.string().email('Please provide a valid email address').optional(), - additionalBillingEmails: z.string().email({ message: 'invalid_email' }).array().default([]), + billingEmail: z.email().optional(), + additionalBillingEmails: z.email().array().prefault([]), }) const BillingEmail = () => { diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx index 0638818ac92..e52931a4f05 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx @@ -10,7 +10,7 @@ import Link from 'next/link' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useOrganizationCreditTopUpMutation } from 'data/organizations/organization-credit-top-up-mutation' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/NewPaymentMethodElement.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/NewPaymentMethodElement.tsx index 11a41994047..6ae2790383b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/NewPaymentMethodElement.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/NewPaymentMethodElement.tsx @@ -32,7 +32,7 @@ import { PopoverTrigger_Shadcn_ as PopoverTrigger, } from 'ui' import { TAX_IDS, type TaxId } from '../BillingCustomerData/TaxID.constants' -import { z } from 'zod' +import { z } from 'zod/v4' import { useForm } from 'react-hook-form' import { Form } from '@ui/components/shadcn/ui/form' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' @@ -45,8 +45,8 @@ import type { PaymentMethod } from '@stripe/stripe-js' export const BillingCustomerDataSchema = z.object({ tax_id_type: z.string(), tax_id_value: z.string().min(2, { - message: 'Tax ID needs to be set.', - }), + error: 'Tax ID needs to be set.' +}), tax_id_name: z.string(), }) diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx index b264df89b00..b83c683baa4 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx @@ -4,7 +4,7 @@ import { useQueryClient } from '@tanstack/react-query' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import CopyButton from 'components/ui/CopyButton' diff --git a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx index 8128ed29eb4..ffb51452007 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/router' import { parseAsString, useQueryStates } from 'nuqs' import { useEffect, useMemo, useRef, useState } from 'react' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { LOCAL_STORAGE_KEYS } from 'common' import SpendCapModal from 'components/interfaces/Billing/SpendCapModal' diff --git a/apps/studio/components/interfaces/Organization/SecuritySettings/SecuritySettings.tsx b/apps/studio/components/interfaces/Organization/SecuritySettings/SecuritySettings.tsx index 076e8ded568..92363e57506 100644 --- a/apps/studio/components/interfaces/Organization/SecuritySettings/SecuritySettings.tsx +++ b/apps/studio/components/interfaces/Organization/SecuritySettings/SecuritySettings.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useParams } from 'common' import { ScaffoldContainerLegacy } from 'components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx index ddbbc6cac15..c14ba12405c 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' diff --git a/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover/index.tsx b/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover/index.tsx index dccb5840b2f..1b8484d46cf 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover/index.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover/index.tsx @@ -3,7 +3,7 @@ import { useParams } from 'common' import { ChevronDown } from 'lucide-react' import { Dispatch, SetStateAction, useState } from 'react' import { useForm } from 'react-hook-form' -import * as z from 'zod' +import * as z from 'zod/v4' import { DocsButton } from 'components/ui/DocsButton' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' diff --git a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx index 4553a4ee9a1..8239b910d71 100644 --- a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx +++ b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' diff --git a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx index d778df3f660..3a3b99996ae 100644 --- a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx +++ b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx @@ -3,7 +3,7 @@ import { Check, Code, Plus } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { getContentById } from 'data/content/content-id-query' diff --git a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx index a27a8a6096e..e173dae8fd0 100644 --- a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx +++ b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx @@ -6,7 +6,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' @@ -72,8 +72,8 @@ const formSchema = z return true }, { - message: 'Must have at least one schema if Data API is enabled', path: ['dbSchema'], + error: 'Must have at least one schema if Data API is enabled' } ) diff --git a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx index 9f503dd922d..711563930e1 100644 --- a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx +++ b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx @@ -4,7 +4,7 @@ import { capitalize } from 'lodash' import { Fragment, useEffect, useMemo } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx index c3ff46c0ac5..ff292d6dcfa 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert/ProjectUpgradeAlert.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useParams } from 'common' import { PLAN_DETAILS } from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' diff --git a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx index 2d217b8d23d..c40af82ff49 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx @@ -4,7 +4,7 @@ import { ChevronDown, Loader2, PlusIcon } from 'lucide-react' import { useCallback, useEffect, useState, useMemo } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useBranchCreateMutation } from 'data/branches/branch-create-mutation' import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' @@ -155,11 +155,12 @@ const GitHubIntegrationConnectionForm = ({ const selectedRepo = githubRepos.find((repo) => repo.id === repositoryId) const repoName = selectedRepo?.name || connection?.repository.name || 'selected repository' - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Branch "${val.branchName}" not found in ${repoName}`, - path: ['branchName'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Branch "${val.branchName}" not found in ${repoName}`, + path: ['branchName'], + input: '' + }) } } } diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx index 68c21d2ed21..9712b86f382 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx @@ -1,7 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { FormActions } from 'components/ui/Forms/FormActions' import type { diff --git a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx index 27e8df3b0a3..29da75b58fc 100644 --- a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx +++ b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx @@ -4,7 +4,7 @@ import { useRouter } from 'next/router' import { useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useResetPasswordMutation } from 'data/misc/reset-password-mutation' import { BASE_PATH } from 'lib/constants' diff --git a/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx b/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx index 48e513fe0e8..08b60bd27ed 100644 --- a/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx +++ b/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/router' import { useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { auth, getReturnToPath } from 'lib/gotrue' import { diff --git a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx index 75911012462..6a1b8bd69d2 100644 --- a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import { useIcebergWrapperExtension } from 'components/interfaces/Storage/AnalyticBucketDetails/useIcebergWrapper' @@ -60,14 +60,14 @@ const FormSchema = z.object({ (value) => value !== 'public', '"public" is a reserved name. Please choose another name' ), - type: z.enum(['STANDARD', 'ANALYTICS']).default('STANDARD'), - public: z.boolean().default(false), - has_file_size_limit: z.boolean().default(false), + type: z.enum(['STANDARD', 'ANALYTICS']).prefault('STANDARD'), + public: z.boolean().prefault(false), + has_file_size_limit: z.boolean().prefault(false), formatted_size_limit: z.coerce .number() .min(0, 'File size upload limit has to be at least 0') - .default(0), - allowed_mime_types: z.string().trim().default(''), + .prefault(0), + allowed_mime_types: z.string().trim().prefault(''), }) export type CreateBucketForm = z.infer diff --git a/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx b/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx index d7371c08591..667f242182b 100644 --- a/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx +++ b/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx @@ -3,7 +3,7 @@ import { snakeCase, uniq } from 'lodash' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' +import z from 'zod/v4' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' @@ -61,7 +61,7 @@ export const ImportForeignSchemaDialog = ({ return !schemas?.find((s) => s.name === val) }, { - message: 'This schema already exists. Please specify a unique schema name.', + error: 'This schema already exists. Please specify a unique schema name.' } ), }) diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx index 8d331ac886d..3db3da00d59 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx @@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useState } from 'react' import { useForm } from 'react-hook-form' -import { z } from 'zod' +import { z } from 'zod/v4' import { FormField } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' @@ -47,7 +47,7 @@ export const CreateCredentialModal = ({ visible, onOpenChange }: CreateCredentia const FormSchema = z.object({ description: z.string().min(3, { - message: 'Description must be at least 3 characters long', + error: 'Description must be at least 3 characters long' }), }) const form = useForm>({ diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx index 69b2e4d297c..25e841825be 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx index 43868c50c03..164f5ec27d5 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import AlertError from 'components/ui/AlertError' @@ -114,11 +114,12 @@ const StorageSettings = () => { const { value: formattedMaxLimit } = convertFromBytes(maxBytes, unit) if (fileSizeLimit > formattedMaxLimit) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: `Maximum limit is up to ${formattedMaxLimit.toLocaleString()} ${unit}.`, - path: ['fileSizeLimit'], - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + message: `Maximum limit is up to ${formattedMaxLimit.toLocaleString()} ${unit}.`, + path: ['fileSizeLimit'], + input: '' + }) } }) diff --git a/apps/studio/components/interfaces/Support/SupportFormV2.tsx b/apps/studio/components/interfaces/Support/SupportFormV2.tsx index 7571151668c..194be5a187f 100644 --- a/apps/studio/components/interfaces/Support/SupportFormV2.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormV2.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useDocsSearch, useParams, type DocsSearchResult as Page } from 'common' import { CLIENT_LIBRARIES } from 'common/constants' diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts index 0ec4c679a46..250bf8acc8c 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { ARRAY_DELIMITER, @@ -72,7 +72,7 @@ export const timelineChartSchema = z.object({ ...LEVELS.reduce( (acc, level) => ({ ...acc, - [level]: z.number().default(0), + [level]: z.number().prefault(0), }), {} as Record<(typeof LEVELS)[number], z.ZodNumber> ), diff --git a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx index f684b37369e..684d46c46c9 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx @@ -7,7 +7,7 @@ import Link from 'next/link' import { useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { useParams } from 'common' import { PostgresVersionSelector } from 'components/interfaces/ProjectCreation/PostgresVersionSelector' diff --git a/apps/studio/components/ui/Forms/Form.constants.ts b/apps/studio/components/ui/Forms/Form.constants.ts index e3910fabb06..f3f91950b62 100644 --- a/apps/studio/components/ui/Forms/Form.constants.ts +++ b/apps/studio/components/ui/Forms/Form.constants.ts @@ -1,4 +1,4 @@ -import * as z from 'zod' +import * as z from 'zod/v4' export const StringNumberOrNull = z .string() diff --git a/apps/studio/data/database-functions/database-functions-create-mutation.ts b/apps/studio/data/database-functions/database-functions-create-mutation.ts index c70fbb08f3c..59dc76f2cb0 100644 --- a/apps/studio/data/database-functions/database-functions-create-mutation.ts +++ b/apps/studio/data/database-functions/database-functions-create-mutation.ts @@ -1,6 +1,6 @@ import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import pgMeta from '@supabase/pg-meta' import { databaseKeys } from 'data/database/keys' diff --git a/apps/studio/data/database-functions/database-functions-delete-mutation.ts b/apps/studio/data/database-functions/database-functions-delete-mutation.ts index 4610ca899df..bbc3d2b505d 100644 --- a/apps/studio/data/database-functions/database-functions-delete-mutation.ts +++ b/apps/studio/data/database-functions/database-functions-delete-mutation.ts @@ -1,6 +1,6 @@ import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import pgMeta from '@supabase/pg-meta' import { databaseKeys } from 'data/database/keys' diff --git a/apps/studio/data/database-functions/database-functions-query.ts b/apps/studio/data/database-functions/database-functions-query.ts index cef5dc7ddb3..318e2ad730e 100644 --- a/apps/studio/data/database-functions/database-functions-query.ts +++ b/apps/studio/data/database-functions/database-functions-query.ts @@ -3,7 +3,7 @@ import { useQuery, UseQueryOptions } from '@tanstack/react-query' import { databaseKeys } from 'data/database/keys' import { executeSql } from 'data/sql/execute-sql-query' import type { ResponseError } from 'types' -import { z } from 'zod' +import { z } from 'zod/v4' export type DatabaseFunctionsVariables = { projectRef?: string diff --git a/apps/studio/data/database-functions/database-functions-update-mutation.ts b/apps/studio/data/database-functions/database-functions-update-mutation.ts index a088e08b08d..0878da43bef 100644 --- a/apps/studio/data/database-functions/database-functions-update-mutation.ts +++ b/apps/studio/data/database-functions/database-functions-update-mutation.ts @@ -1,6 +1,6 @@ import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import pgMeta from '@supabase/pg-meta' import { databaseKeys } from 'data/database/keys' diff --git a/apps/studio/data/database-roles/database-roles-query.ts b/apps/studio/data/database-roles/database-roles-query.ts index 6b31844ff51..acc6a4cbe91 100644 --- a/apps/studio/data/database-roles/database-roles-query.ts +++ b/apps/studio/data/database-roles/database-roles-query.ts @@ -1,6 +1,6 @@ import pgMeta from '@supabase/pg-meta' import { QueryClient, useQuery, UseQueryOptions } from '@tanstack/react-query' -import { z } from 'zod' +import { z } from 'zod/v4' import { executeSql, ExecuteSqlError } from 'data/sql/execute-sql-query' import { databaseRoleKeys } from './keys' diff --git a/apps/studio/data/database/schemas-query.ts b/apps/studio/data/database/schemas-query.ts index 5bbc44ae461..426f4c96675 100644 --- a/apps/studio/data/database/schemas-query.ts +++ b/apps/studio/data/database/schemas-query.ts @@ -1,6 +1,6 @@ import pgMeta from '@supabase/pg-meta' import { QueryClient, useQuery, UseQueryOptions } from '@tanstack/react-query' -import { z } from 'zod' +import { z } from 'zod/v4' import { executeSql, ExecuteSqlError } from 'data/sql/execute-sql-query' import { databaseKeys } from './keys' diff --git a/apps/studio/data/privileges/table-privileges-query.ts b/apps/studio/data/privileges/table-privileges-query.ts index 5d31cb4929c..1f2bea03823 100644 --- a/apps/studio/data/privileges/table-privileges-query.ts +++ b/apps/studio/data/privileges/table-privileges-query.ts @@ -1,6 +1,6 @@ import pgMeta from '@supabase/pg-meta' import { QueryClient, UseQueryOptions, useQuery } from '@tanstack/react-query' -import { z } from 'zod' +import { z } from 'zod/v4' import { executeSql, ExecuteSqlError } from 'data/sql/execute-sql-query' import { privilegeKeys } from './keys' diff --git a/apps/studio/hooks/forms/useAIOptInForm.ts b/apps/studio/hooks/forms/useAIOptInForm.ts index d81da03076f..add5b50effb 100644 --- a/apps/studio/hooks/forms/useAIOptInForm.ts +++ b/apps/studio/hooks/forms/useAIOptInForm.ts @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { LOCAL_STORAGE_KEYS } from 'common' import { useOrganizationUpdateMutation } from 'data/organizations/organization-update-mutation' diff --git a/apps/studio/hooks/misc/useOrgOptedIntoAi.ts b/apps/studio/hooks/misc/useOrgOptedIntoAi.ts index d60a69b4d8b..80df98fa0c3 100644 --- a/apps/studio/hooks/misc/useOrgOptedIntoAi.ts +++ b/apps/studio/hooks/misc/useOrgOptedIntoAi.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { subscriptionHasHipaaAddon } from 'components/interfaces/Billing/Subscription/Subscription.utils' import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' diff --git a/apps/studio/lib/ai/tool-filter.test.ts b/apps/studio/lib/ai/tool-filter.test.ts index 4ad47d1cf06..1ec54fcbf8f 100644 --- a/apps/studio/lib/ai/tool-filter.test.ts +++ b/apps/studio/lib/ai/tool-filter.test.ts @@ -1,6 +1,6 @@ import { Tool, ToolSet, ToolExecutionOptions } from 'ai' import { describe, expect, it, vitest } from 'vitest' -import { z } from 'zod' +import { z } from 'zod/v4' import { TOOL_CATEGORIES, diff --git a/apps/studio/lib/ai/tool-filter.ts b/apps/studio/lib/ai/tool-filter.ts index ac07b32bb10..17e2ae30bf2 100644 --- a/apps/studio/lib/ai/tool-filter.ts +++ b/apps/studio/lib/ai/tool-filter.ts @@ -1,5 +1,5 @@ import { Tool, ToolSet, ToolExecutionOptions } from 'ai' -import { z } from 'zod' +import { z } from 'zod/v4' import { AiOptInLevel } from 'hooks/misc/useOrgOptedIntoAi' // Add the DatabaseExtension type import @@ -16,7 +16,7 @@ const basicToolSchema = z.custom((value) => typeof value === 'object') /** * Schema for validating that a tool set only contains known tools. */ -export const toolSetValidationSchema = z.record( +export const toolSetValidationSchema = z.partialRecord( z.enum([ // MCP tools 'list_tables', diff --git a/apps/studio/pages/api/ai/onboarding/design.ts b/apps/studio/pages/api/ai/onboarding/design.ts index d0769ffc538..52d30bacbe7 100644 --- a/apps/studio/pages/api/ai/onboarding/design.ts +++ b/apps/studio/pages/api/ai/onboarding/design.ts @@ -1,7 +1,7 @@ import { streamText, tool } from 'ai' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' -import { z } from 'zod' +import { z } from 'zod/v4' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' diff --git a/apps/studio/pages/api/ai/sql/cron-v2.ts b/apps/studio/pages/api/ai/sql/cron-v2.ts index 1ed03dccc60..70c91f26c16 100644 --- a/apps/studio/pages/api/ai/sql/cron-v2.ts +++ b/apps/studio/pages/api/ai/sql/cron-v2.ts @@ -1,7 +1,7 @@ import { generateObject } from 'ai' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' -import { z } from 'zod' +import { z } from 'zod/v4' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' diff --git a/apps/studio/pages/api/ai/sql/title-v2.ts b/apps/studio/pages/api/ai/sql/title-v2.ts index b96cf00f35a..1ec716b7f6f 100644 --- a/apps/studio/pages/api/ai/sql/title-v2.ts +++ b/apps/studio/pages/api/ai/sql/title-v2.ts @@ -1,7 +1,7 @@ import { generateObject } from 'ai' import { source } from 'common-tags' import { NextApiRequest, NextApiResponse } from 'next' -import { z } from 'zod' +import { z } from 'zod/v4' import { getModel } from 'lib/ai/model' import apiWrapper from 'lib/api/apiWrapper' diff --git a/apps/studio/pages/api/ai/sql/tools.ts b/apps/studio/pages/api/ai/sql/tools.ts index 9b292b35d77..82a098993e2 100644 --- a/apps/studio/pages/api/ai/sql/tools.ts +++ b/apps/studio/pages/api/ai/sql/tools.ts @@ -1,6 +1,6 @@ import { tool } from 'ai' import { stripIndent } from 'common-tags' -import { z } from 'zod' +import { z } from 'zod/v4' // import { processSql, renderSupabaseJs } from '@supabase/sql-to-rest' import { IS_PLATFORM } from 'common' diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index 203dd05d980..6e6ff8fd148 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useMemo, useRef, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' +import { z } from 'zod/v4' import { PopoverSeparator } from '@ui/components/shadcn/ui/popover' import { components } from 'api-types' @@ -107,8 +107,8 @@ const sizesWithNoCostConfirmationRequired: DesiredInstanceSize[] = ['micro', 'sm const FormSchema = z.object({ organization: z.string({ - required_error: 'Please select an organization', - }), + error: (issue) => issue.input === undefined ? 'Please select an organization' : undefined +}), projectName: z .string() .trim() @@ -116,17 +116,19 @@ const FormSchema = z.object({ .min(3, 'Project name must be at least 3 characters long.') // Minimum length check .max(64, 'Project name must be no longer than 64 characters.'), // Maximum length check postgresVersion: z.string({ - required_error: 'Please enter a Postgres version.', - }), + error: (issue) => issue.input === undefined ? 'Please enter a Postgres version.' : undefined +}), dbRegion: z.string({ - required_error: 'Please select a region.', - }), + error: (issue) => issue.input === undefined ? 'Please select a region.' : undefined +}), cloudProvider: z.string({ - required_error: 'Please select a cloud provider.', - }), + error: (issue) => issue.input === undefined ? 'Please select a cloud provider.' : undefined +}), dbPassStrength: z.number(), dbPass: z - .string({ required_error: 'Please enter a database password.' }) + .string({ + error: (issue) => issue.input === undefined ? 'Please enter a database password.' : undefined + }) .min(1, 'Password is required.'), instanceSize: z.string(), dataApi: z.boolean(), @@ -279,11 +281,12 @@ const Wizard: NextPageWithLayout = () => { FormSchema.superRefine(({ dbPassStrength }, refinementContext) => { if (dbPassStrength < DEFAULT_MINIMUM_PASSWORD_STRENGTH) { - refinementContext.addIssue({ - code: z.ZodIssueCode.custom, - path: ['dbPass'], - message: passwordStrengthWarning || 'Password not secure enough', - }) + refinementContext.issues.push({ + code: z.ZodIssueCode.custom, + path: ['dbPass'], + message: passwordStrengthWarning || 'Password not secure enough', + input: '' + }) } }) diff --git a/apps/studio/pages/project/[ref]/functions/new.tsx b/apps/studio/pages/project/[ref]/functions/new.tsx index 3d469049680..cfb9dad30c6 100644 --- a/apps/studio/pages/project/[ref]/functions/new.tsx +++ b/apps/studio/pages/project/[ref]/functions/new.tsx @@ -4,7 +4,7 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' +import * as z from 'zod/v4' import { useParams } from 'common' import { EDGE_FUNCTION_TEMPLATES } from 'components/interfaces/Functions/Functions.templates' diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/dynamic-form.tsx b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/dynamic-form.tsx index 0a2a2abd6f3..7015fdd28b3 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/dynamic-form.tsx +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/dynamic-form.tsx @@ -2,7 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' -import type { z, ZodTypeAny } from 'zod' +import type { z, ZodTypeAny } from 'zod/v4' import { Button } from '@/registry/default/components/ui/button' import { Form, diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/auth.tsx b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/auth.tsx index 3b8d7adc1da..320dd34b2dc 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/auth.tsx +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/auth.tsx @@ -15,7 +15,7 @@ import { } from '../../lib/schemas/auth' import { AlertTriangle, ChevronRight, Mail, Phone, User } from 'lucide-react' import { useCallback, useMemo } from 'react' -import { z } from 'zod' +import { z } from 'zod/v4' import { useSheetNavigation } from '@/registry/default/platform/platform-kit-nextjs/contexts/SheetNavigationContext' import { Skeleton } from '@/registry/default/components/ui/skeleton' import { Button } from '@/registry/default/components/ui/button' diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/database.tsx b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/database.tsx index 7b736c004c6..f1c31e0ef87 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/database.tsx +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/database.tsx @@ -1,7 +1,7 @@ 'use client' import { useState, useMemo, useCallback } from 'react' -import { z, type ZodTypeAny } from 'zod' +import { z, type ZodTypeAny } from 'zod/v4' import { useListTables } from '@/registry/default/platform/platform-kit-nextjs/hooks/use-tables' import { useRunQuery } from '@/registry/default/platform/platform-kit-nextjs/hooks/use-run-query' import { SqlEditor } from '@/registry/default/platform/platform-kit-nextjs/components/sql-editor' diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/secrets.tsx b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/secrets.tsx index 51f72a26b40..bcce765483e 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/secrets.tsx +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/components/supabase-manager/secrets.tsx @@ -20,7 +20,7 @@ import { secretsSchema } from '../../lib/schemas/secrets' import { zodResolver } from '@hookform/resolvers/zod' import { AlertTriangle, Minus, PlusIcon, Key } from 'lucide-react' import { useFieldArray, useForm } from 'react-hook-form' -import { z } from 'zod' +import { z } from 'zod/v4' import { Alert, AlertDescription, AlertTitle } from '@/registry/default/components/ui/alert' export function SecretsManager({ projectRef }: { projectRef: string }) { diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/pg-meta/types.ts b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/pg-meta/types.ts index ea78edf9795..fbc52aa2706 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/pg-meta/types.ts +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/pg-meta/types.ts @@ -1,14 +1,14 @@ -import { z } from 'zod' +import { z } from 'zod/v4' export const postgresPrimaryKeySchema = z.object({ schema: z.string(), table_name: z.string(), name: z.string(), - table_id: z.number().int(), + table_id: z.int(), }) export const postgresRelationshipSchema = z.object({ - id: z.number().int(), + id: z.int(), constraint_name: z.string(), source_schema: z.string(), source_table_name: z.string(), @@ -19,11 +19,11 @@ export const postgresRelationshipSchema = z.object({ }) export const postgresColumnSchema = z.object({ - table_id: z.number().int(), + table_id: z.int(), schema: z.string(), table: z.string(), id: z.string().regex(/^(\d+)\.(\d+)$/), - ordinal_position: z.number().int(), + ordinal_position: z.int(), name: z.string(), default_value: z.any(), data_type: z.string(), @@ -40,7 +40,7 @@ export const postgresColumnSchema = z.object({ }) export const postgresTableSchema = z.object({ - id: z.number().int(), + id: z.int(), schema: z.string(), name: z.string(), rls_enabled: z.boolean(), @@ -51,10 +51,10 @@ export const postgresTableSchema = z.object({ z.literal('FULL'), z.literal('NOTHING'), ]), - bytes: z.number().int(), + bytes: z.int(), size: z.string(), - live_rows_estimate: z.number().int(), - dead_rows_estimate: z.number().int(), + live_rows_estimate: z.int(), + dead_rows_estimate: z.int(), comment: z.string().nullable(), columns: z.array(postgresColumnSchema).optional(), primary_keys: z.array(postgresPrimaryKeySchema), diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/auth.ts b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/auth.ts index 8e18f032fab..ff9c215a154 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/auth.ts +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/auth.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' // Field labels mapping for form generation export const authFieldLabels: Record< @@ -118,9 +118,7 @@ export const authEmailProviderSchema = z .describe( 'Rejects the use of known or easy to guess passwords on sign up or password change. Powered by the HaveIBeenPwned.org Pwned Passwords API.' ), - password_min_length: z - .number() - .int() + password_min_length: z.int() .min(6, 'Must be greater or equal to 6.') .describe( 'Passwords shorter than this value will be rejected as weak. Minimum 6, recommended 8 or more.' @@ -138,15 +136,11 @@ export const authEmailProviderSchema = z .optional() .transform((val) => (val === NO_REQUIRED_CHARACTERS ? '' : val)) .describe('Passwords that do not have at least one of each will be rejected as weak.'), - mailer_otp_exp: z - .number() - .int() + mailer_otp_exp: z.int() .min(0, 'Must be more than 0') .max(86400, 'Must be no more than 86400') .describe('Duration before an email otp / link expires in seconds.'), - mailer_otp_length: z - .number() - .int() + mailer_otp_length: z.int() .min(6, 'Must be at least 6') .max(10, 'Must be no more than 10') .optional() @@ -192,12 +186,10 @@ export const authPhoneProviderSchema = z .boolean() .optional() .describe('Users will need to confirm their phone number before signing in.'), - sms_otp_exp: z - .number() - .int() + sms_otp_exp: z.int() .optional() .describe('Duration before an SMS OTP expires in seconds.'), - sms_otp_length: z.number().int().optional().describe('Number of digits in OTP.'), + sms_otp_length: z.int().optional().describe('Number of digits in OTP.'), sms_template: z.string().optional().describe('To format the OTP code use `{{ .Code }}`'), sms_test_otp: z .string() @@ -205,9 +197,7 @@ export const authPhoneProviderSchema = z .describe( 'Register phone number and OTP combinations for testing as a comma separated list of = pairs. Example: `18005550123=789012`' ), - sms_test_otp_valid_until: z - .string() - .datetime({ message: 'Invalid datetime string.' }) + sms_test_otp_valid_until: z.iso.datetime() .optional() .describe( "Test phone number and OTP combinations won't be active past this date and time (local time zone)." @@ -241,18 +231,20 @@ export const authGoogleProviderObject = z.object({ export const authGoogleProviderSchema = authGoogleProviderObject .superRefine((data, ctx) => { if (data.external_google_enabled && !data.external_google_client_id) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: ['external_google_client_id'], - message: 'At least one Client ID is required when Google sign-in is enabled.', - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + path: ['external_google_client_id'], + message: 'At least one Client ID is required when Google sign-in is enabled.', + input: '' + }) } if (data.external_google_client_id && data.external_google_client_id.includes(' ')) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: ['external_google_client_id'], - message: 'Client IDs should not contain spaces.', - }) + ctx.issues.push({ + code: z.ZodIssueCode.custom, + path: ['external_google_client_id'], + message: 'Client IDs should not contain spaces.', + input: '' + }) } }) .describe('Google provider settings.') diff --git a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/secrets.ts b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/secrets.ts index 9093f3f1bb9..98da57310d3 100644 --- a/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/secrets.ts +++ b/apps/ui-library/registry/default/platform/platform-kit-nextjs/lib/schemas/secrets.ts @@ -1,4 +1,4 @@ -import z from 'zod' +import z from 'zod/v4' export const secretsSchema = z .object({ diff --git a/apps/www/pages/careers.tsx b/apps/www/pages/careers.tsx index 6feac83d2bf..065c927f19d 100644 --- a/apps/www/pages/careers.tsx +++ b/apps/www/pages/careers.tsx @@ -7,7 +7,7 @@ import Link from 'next/link' import { useRouter } from 'next/router' import ReactMarkdown from 'react-markdown' import { Badge, Button, buttonVariants, cn, Separator } from 'ui' -import { z } from 'zod' +import { z } from 'zod/v4' import Styles from '~/styles/career.module.css' import Globe from '~/components/Globe' diff --git a/apps/www/pages/opt-out/[ref].tsx b/apps/www/pages/opt-out/[ref].tsx index 0b5b45c7ce5..88a34202770 100644 --- a/apps/www/pages/opt-out/[ref].tsx +++ b/apps/www/pages/opt-out/[ref].tsx @@ -21,7 +21,7 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { z } from 'zod' +import { z } from 'zod/v4' const formSchema = z.object({ ref: z.string(), diff --git a/packages/ai-commands/src/sql/classify-feedback.ts b/packages/ai-commands/src/sql/classify-feedback.ts index 68ecd255533..45961f932c4 100644 --- a/packages/ai-commands/src/sql/classify-feedback.ts +++ b/packages/ai-commands/src/sql/classify-feedback.ts @@ -1,6 +1,6 @@ import { generateObject } from 'ai' import { openai as openaiProvider } from '@ai-sdk/openai' -import { z } from 'zod' +import { z } from 'zod/v4' import { ContextLengthError } from '../errors' // Given a prompt from the feedback widget, classify it as support, feedback, or unknown. diff --git a/packages/pg-meta/src/pg-meta-column-privileges.ts b/packages/pg-meta/src/pg-meta-column-privileges.ts index d3e79b885be..353c8991c84 100644 --- a/packages/pg-meta/src/pg-meta-column-privileges.ts +++ b/packages/pg-meta/src/pg-meta-column-privileges.ts @@ -1,5 +1,5 @@ import { ident, literal } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { COLUMN_PRIVILEGES_SQL } from './sql/column-privileges' import { filterByList } from './helpers' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' diff --git a/packages/pg-meta/src/pg-meta-columns.ts b/packages/pg-meta/src/pg-meta-columns.ts index b1c7ca2c1f1..7e76866d501 100644 --- a/packages/pg-meta/src/pg-meta-columns.ts +++ b/packages/pg-meta/src/pg-meta-columns.ts @@ -2,7 +2,7 @@ import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { ident, literal } from './pg-format' import { COLUMNS_SQL } from './sql/columns' -import { z } from 'zod' +import { z } from 'zod/v4' const pgColumnZod = z.object({ id: z.string(), diff --git a/packages/pg-meta/src/pg-meta-config.ts b/packages/pg-meta/src/pg-meta-config.ts index ca31198b843..3e5d14cedfb 100644 --- a/packages/pg-meta/src/pg-meta-config.ts +++ b/packages/pg-meta/src/pg-meta-config.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { CONFIG_SQL } from './sql/config' const pgConfigZod = z.object({ diff --git a/packages/pg-meta/src/pg-meta-extensions.ts b/packages/pg-meta/src/pg-meta-extensions.ts index d3482019068..c802c4866d4 100644 --- a/packages/pg-meta/src/pg-meta-extensions.ts +++ b/packages/pg-meta/src/pg-meta-extensions.ts @@ -1,6 +1,6 @@ import { ident, literal } from './pg-format' import { EXTENSIONS_SQL } from './sql/extensions' -import { z } from 'zod' +import { z } from 'zod/v4' const pgExtensionZod = z.object({ name: z.string(), diff --git a/packages/pg-meta/src/pg-meta-foreign-tables.ts b/packages/pg-meta/src/pg-meta-foreign-tables.ts index e8093fa6a14..f2bde91a01c 100644 --- a/packages/pg-meta/src/pg-meta-foreign-tables.ts +++ b/packages/pg-meta/src/pg-meta-foreign-tables.ts @@ -1,5 +1,5 @@ import { literal, ident } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList, coalesceRowsToArray } from './helpers' import { FOREIGN_TABLES_SQL } from './sql/foreign-tables' diff --git a/packages/pg-meta/src/pg-meta-functions.ts b/packages/pg-meta/src/pg-meta-functions.ts index db65046f5c5..2f55011abad 100644 --- a/packages/pg-meta/src/pg-meta-functions.ts +++ b/packages/pg-meta/src/pg-meta-functions.ts @@ -1,5 +1,5 @@ import { ident, literal } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { FUNCTIONS_SQL } from './sql/functions' @@ -318,7 +318,7 @@ export function update(currentFunc: PGFunction, { name, schema, definition }: PG } export const pgFunctionDeleteZod = z.object({ - cascade: z.boolean().default(false).optional(), + cascade: z.boolean().prefault(false).optional(), }) export type PGFunctionDelete = z.infer diff --git a/packages/pg-meta/src/pg-meta-indexes.ts b/packages/pg-meta/src/pg-meta-indexes.ts index 1a2b854c7c5..6cbfec65a7d 100644 --- a/packages/pg-meta/src/pg-meta-indexes.ts +++ b/packages/pg-meta/src/pg-meta-indexes.ts @@ -2,7 +2,7 @@ import { literal } from './pg-format' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { INDEXES_SQL } from './sql/indexes' -import { z } from 'zod' +import { z } from 'zod/v4' const pgIndexZod = z.object({ id: z.number(), diff --git a/packages/pg-meta/src/pg-meta-materialized-views.ts b/packages/pg-meta/src/pg-meta-materialized-views.ts index 2fd2f4fed6c..f6da004da1d 100644 --- a/packages/pg-meta/src/pg-meta-materialized-views.ts +++ b/packages/pg-meta/src/pg-meta-materialized-views.ts @@ -1,5 +1,5 @@ import { literal, ident } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList, coalesceRowsToArray } from './helpers' import { MATERIALIZED_VIEWS_SQL } from './sql/materialized-views' diff --git a/packages/pg-meta/src/pg-meta-policies.ts b/packages/pg-meta/src/pg-meta-policies.ts index 1951c37f0cd..e9b561808f6 100644 --- a/packages/pg-meta/src/pg-meta-policies.ts +++ b/packages/pg-meta/src/pg-meta-policies.ts @@ -2,7 +2,7 @@ import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { ident, literal } from './pg-format' import { POLICIES_SQL } from './sql/policies' -import { z } from 'zod' +import { z } from 'zod/v4' const pgPolicyZod = z.object({ id: z.number(), diff --git a/packages/pg-meta/src/pg-meta-publications.ts b/packages/pg-meta/src/pg-meta-publications.ts index 91915ffe018..1247af09185 100644 --- a/packages/pg-meta/src/pg-meta-publications.ts +++ b/packages/pg-meta/src/pg-meta-publications.ts @@ -1,6 +1,6 @@ import { ident, literal } from './pg-format' import { PUBLICATIONS_SQL } from './sql/publications' -import { z } from 'zod' +import { z } from 'zod/v4' const pgPublicationTableZod = z.object({ id: z.number().optional(), diff --git a/packages/pg-meta/src/pg-meta-roles.ts b/packages/pg-meta/src/pg-meta-roles.ts index 8e1936f7054..3398cf70471 100644 --- a/packages/pg-meta/src/pg-meta-roles.ts +++ b/packages/pg-meta/src/pg-meta-roles.ts @@ -1,6 +1,6 @@ import { ident, literal } from './pg-format' import { ROLES_SQL } from './sql/roles' -import { z } from 'zod' +import { z } from 'zod/v4' const pgRoleZod = z.object({ id: z.number(), diff --git a/packages/pg-meta/src/pg-meta-schemas.ts b/packages/pg-meta/src/pg-meta-schemas.ts index 5c2452bacd3..8c90df25da6 100644 --- a/packages/pg-meta/src/pg-meta-schemas.ts +++ b/packages/pg-meta/src/pg-meta-schemas.ts @@ -1,7 +1,7 @@ import { ident, literal } from './pg-format' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { SCHEMAS_SQL } from './sql/schemas' -import { z } from 'zod' +import { z } from 'zod/v4' const pgSchemaZod = z.object({ id: z.number(), diff --git a/packages/pg-meta/src/pg-meta-table-privileges.ts b/packages/pg-meta/src/pg-meta-table-privileges.ts index 8b08178618d..d2648aa420f 100644 --- a/packages/pg-meta/src/pg-meta-table-privileges.ts +++ b/packages/pg-meta/src/pg-meta-table-privileges.ts @@ -1,7 +1,7 @@ import { ident, literal } from './pg-format' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { TABLE_PRIVILEGES_SQL } from './sql/table-privileges' -import { z } from 'zod' +import { z } from 'zod/v4' import { filterByList } from './helpers' const pgTablePrivilegesZod = z.object({ diff --git a/packages/pg-meta/src/pg-meta-tables.ts b/packages/pg-meta/src/pg-meta-tables.ts index 8c0759302bf..419d613f537 100644 --- a/packages/pg-meta/src/pg-meta-tables.ts +++ b/packages/pg-meta/src/pg-meta-tables.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { coalesceRowsToArray, filterByList } from './helpers' import { TABLES_SQL } from './sql/tables' import { COLUMNS_SQL } from './sql/columns' diff --git a/packages/pg-meta/src/pg-meta-triggers.ts b/packages/pg-meta/src/pg-meta-triggers.ts index a6042a32f50..2fbf5e41573 100644 --- a/packages/pg-meta/src/pg-meta-triggers.ts +++ b/packages/pg-meta/src/pg-meta-triggers.ts @@ -1,5 +1,5 @@ import { ident, literal } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { TRIGGERS_SQL } from './sql/triggers' @@ -91,9 +91,9 @@ export function retrieve(params: TriggerIdentifier): TriggersRetrieveReturn { export const pgTriggerCreateZod = z.object({ name: z.string(), - schema: z.string().optional().default('public'), + schema: z.string().optional().prefault('public'), table: z.string(), - function_schema: z.string().optional().default('public'), + function_schema: z.string().optional().prefault('public'), function_name: z.string(), function_args: z.array(z.string()).optional(), activation: z.enum(['BEFORE', 'AFTER', 'INSTEAD OF']), diff --git a/packages/pg-meta/src/pg-meta-types.ts b/packages/pg-meta/src/pg-meta-types.ts index 2a3316f902f..788c343f7e7 100644 --- a/packages/pg-meta/src/pg-meta-types.ts +++ b/packages/pg-meta/src/pg-meta-types.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList } from './helpers' import { TYPES_SQL } from './sql/types' diff --git a/packages/pg-meta/src/pg-meta-version.ts b/packages/pg-meta/src/pg-meta-version.ts index 293025a75a5..7b27ead9cef 100644 --- a/packages/pg-meta/src/pg-meta-version.ts +++ b/packages/pg-meta/src/pg-meta-version.ts @@ -1,4 +1,4 @@ -import { z } from 'zod' +import { z } from 'zod/v4' import { VERSION_SQL } from './sql/version' export const pgVersionZod = z.object({ diff --git a/packages/pg-meta/src/pg-meta-views.ts b/packages/pg-meta/src/pg-meta-views.ts index 7db45e321d4..a0fa23c7491 100644 --- a/packages/pg-meta/src/pg-meta-views.ts +++ b/packages/pg-meta/src/pg-meta-views.ts @@ -1,5 +1,5 @@ import { literal, ident } from './pg-format' -import { z } from 'zod' +import { z } from 'zod/v4' import { DEFAULT_SYSTEM_SCHEMAS } from './constants' import { filterByList, coalesceRowsToArray } from './helpers' import { VIEWS_SQL } from './sql/views' diff --git a/packages/ui-patterns/src/Dialogs/TextConfirmModal.tsx b/packages/ui-patterns/src/Dialogs/TextConfirmModal.tsx index 178b1ea7a59..a55a1b0cfb5 100644 --- a/packages/ui-patterns/src/Dialogs/TextConfirmModal.tsx +++ b/packages/ui-patterns/src/Dialogs/TextConfirmModal.tsx @@ -22,7 +22,7 @@ import { cn, } from 'ui' import { DialogHeader } from 'ui/src/components/shadcn/ui/dialog' -import { z } from 'zod' +import { z } from 'zod/v4' import { Admonition } from './../admonition' export interface TextConfirmModalProps { @@ -83,7 +83,7 @@ const TextConfirmModal = forwardRef< confirmValue: z.preprocess( (val) => (typeof val === 'string' ? val.trim() : val), z.literal(confirmString.trim(), { - required_error: 'Value entered does not match.', + error: (issue) => issue.input === undefined ? 'Value entered does not match.' : undefined }) ), }) diff --git a/packages/ui-patterns/src/form/FormLayout2.tsx b/packages/ui-patterns/src/form/FormLayout2.tsx index fb57edb66c1..d2d5802da9a 100644 --- a/packages/ui-patterns/src/form/FormLayout2.tsx +++ b/packages/ui-patterns/src/form/FormLayout2.tsx @@ -26,7 +26,7 @@ import { SidePanel, Switch, } from 'ui' -import { z } from 'zod' +import { z } from 'zod/v4' import { Input } from '../DataInputs/Input' import { InfoTooltip } from '../info-tooltip' import { FormItemLayout } from './FormItemLayout/FormItemLayout' @@ -61,23 +61,21 @@ const items = [ export const Page = () => { const FormSchema = z.object({ username: z.string().min(2, { - message: 'Username must be at least 2 characters.', + error: 'Username must be at least 2 characters.' }), kevins_input: z.string().min(6, { - message: 'Username must be at least 6 characters.', + error: 'Username must be at least 6 characters.' }), - email: z - .string({ - required_error: 'Please select an email to display.', - }) - .email(), - consistent_settings: z.boolean().default(false).optional(), - switch_option: z.boolean().default(false).optional(), + email: z.email({ + error: (issue) => issue.input === undefined ? 'Please select an email to display.' : undefined + }), + consistent_settings: z.boolean().prefault(false).optional(), + switch_option: z.boolean().prefault(false).optional(), items: z.array(z.string()).refine((value) => value.some((item) => item), { - message: 'You have to select at least one item.', + error: 'You have to select at least one item.' }), type: z.enum(['all', 'mentions', 'none'], { - required_error: 'You need to select a notification type.', + error: (issue) => issue.input === undefined ? 'You need to select a notification type.' : undefined }), }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50d0fb6343d..b60c9fd547d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -332,7 +332,7 @@ importers: version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/nextjs': specifier: ^9.15.0 - version: 9.44.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(supports-color@8.1.1)(webpack@5.101.0) + version: 9.44.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@babel/core@7.28.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(supports-color@8.1.1)(webpack@5.101.0) '@supabase/supabase-js': specifier: 'catalog:' version: 2.53.0 @@ -452,7 +452,7 @@ importers: version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nuqs: specifier: ^1.19.1 - version: 1.20.0(next@15.3.3(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2)) + version: 1.20.0(next@15.3.3(@babel/core@7.28.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2)) openai: specifier: ^4.20.1 version: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@4.0.14) @@ -10257,7 +10257,6 @@ packages: resolution: {integrity: sha512-X41YRfKkVCooILai2N0aN0Q5O0imu+MbNt894QWU683A82xJJXIR01dEqxwYJ91M6IdExtyFB3GCOJb4eBMBMQ==} peerDependencies: eslint: '>= 5' - bundledDependencies: [] eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} @@ -17178,8 +17177,8 @@ packages: peerDependencies: zod: ^3.24.1 - zod@3.25.0: - resolution: {integrity: sha512-ficnZKUW0mlNivqeJkosTEkGbJ6NKCtSaOHGx5aXbtfeWMdRyzXLbAIn19my4C/KB7WPY/p9vlGPt+qpOp6c4Q==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} zod@4.0.14: resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} @@ -18400,7 +18399,7 @@ snapshots: ts-pattern: 5.8.0 unified: 11.0.5 yaml: 2.8.0 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - '@effect-ts/otel-node' - acorn @@ -18420,7 +18419,7 @@ snapshots: ts-pattern: 5.8.0 unified: 11.0.5 yaml: 2.8.0 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - '@effect-ts/otel-node' - acorn @@ -19462,7 +19461,7 @@ snapshots: '@graphql-tools/optimize@2.0.0(graphql@16.11.0)': dependencies: graphql: 16.11.0 - tslib: 2.8.1 + tslib: 2.6.3 '@graphql-tools/prisma-loader@8.0.17(@types/node@22.17.0)(crossws@0.3.5)(encoding@0.1.13)(graphql@16.11.0)(supports-color@8.1.1)': dependencies: @@ -19498,7 +19497,7 @@ snapshots: '@ardatan/relay-compiler': 12.0.3(encoding@0.1.13)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 - tslib: 2.8.1 + tslib: 2.6.3 transitivePeerDependencies: - encoding @@ -20215,8 +20214,8 @@ snapshots: express-rate-limit: 7.5.1(express@5.1.0(supports-color@8.1.1)) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.0 - zod-to-json-schema: 3.24.6(zod@3.25.0) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -20366,7 +20365,7 @@ snapshots: unixify: 1.0.0 urlpattern-polyfill: 8.0.2 yargs: 17.7.2 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - encoding - rollup @@ -23258,7 +23257,7 @@ snapshots: - supports-color - webpack - '@sentry/nextjs@9.44.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(supports-color@8.1.1)(webpack@5.101.0)': + '@sentry/nextjs@9.44.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.3(@babel/core@7.28.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2))(react@18.3.1)(supports-color@8.1.1)(webpack@5.101.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.36.0 @@ -23914,15 +23913,15 @@ snapshots: common-tags: 1.8.2 graphql: 16.11.0 openapi-fetch: 0.13.8 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - supports-color '@supabase/mcp-utils@0.2.1(supports-color@8.1.1)': dependencies: '@modelcontextprotocol/sdk': 1.17.1(supports-color@8.1.1) - zod: 3.25.0 - zod-to-json-schema: 3.24.6(zod@3.25.0) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -24176,7 +24175,7 @@ snapshots: '@vitejs/plugin-react': 4.7.0(supports-color@8.1.1)(vite@6.3.5(@types/node@24.1.0)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) pathe: 2.0.3 vite: 6.3.5(@types/node@24.1.0)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -24302,7 +24301,7 @@ snapshots: recast: 0.23.11 source-map: 0.7.6 tsx: 4.20.3 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - supports-color @@ -24321,7 +24320,7 @@ snapshots: babel-dead-code-elimination: 1.0.10(supports-color@8.1.1) chokidar: 3.6.0 unplugin: 2.3.5 - zod: 3.25.0 + zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.130.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) vite: 6.3.5(@types/node@24.1.0)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) @@ -24386,7 +24385,7 @@ snapshots: vite: 6.3.5(@types/node@24.1.0)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vitefu: 1.1.1(vite@6.3.5(@types/node@24.1.0)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) xmlbuilder2: 3.1.1 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -26278,7 +26277,7 @@ snapshots: dependencies: devtools-protocol: 0.0.1464554 mitt: 3.0.1 - zod: 3.25.0 + zod: 3.25.76 ci-info@4.3.0: {} @@ -28621,7 +28620,7 @@ snapshots: graphql-tag@2.12.6(graphql@16.11.0): dependencies: graphql: 16.11.0 - tslib: 2.8.1 + tslib: 2.6.3 graphql-validation-complexity@0.4.2(graphql@16.11.0): dependencies: @@ -31796,7 +31795,7 @@ snapshots: dependencies: esm-env: 1.2.2 - nuqs@1.20.0(next@15.3.3(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2)): + nuqs@1.20.0(next@15.3.3(@babel/core@7.28.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2)): dependencies: mitt: 3.0.1 next: 15.3.3(@babel/core@7.28.0(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.54.2)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.89.2) @@ -34220,7 +34219,7 @@ snapshots: stringify-object: 5.0.0 ts-morph: 18.0.0 tsconfig-paths: 4.2.0 - zod: 3.25.0 + zod: 3.25.76 transitivePeerDependencies: - '@types/node' - supports-color @@ -36435,15 +36434,15 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-to-json-schema@3.24.6(zod@3.25.0): + zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: - zod: 3.25.0 + zod: 3.25.76 zod-to-json-schema@3.24.6(zod@4.0.14): dependencies: zod: 4.0.14 - zod@3.25.0: {} + zod@3.25.76: {} zod@4.0.14: {}