From deec474ea85b78f039c7ade7ee882c969b5d7fdd Mon Sep 17 00:00:00 2001 From: Laurin Quast Date: Mon, 3 Aug 2026 15:32:55 +0200 Subject: [PATCH] chore: use zod v4 --- integration-tests/package.json | 2 +- packages/internal/postgres/package.json | 2 +- packages/libraries/cli/package.json | 2 +- .../libraries/cli/src/commands/app/create.ts | 2 +- packages/libraries/laboratory/package.json | 4 +- packages/migrations/package.json | 2 +- packages/migrations/src/environment.ts | 2 +- .../migrations/src/scripts/environment.ts | 2 +- packages/services/api/package.json | 4 +- .../resolvers/Mutation/addAlertChannel.ts | 7 +- .../modules/auth/providers/auth-manager.ts | 5 +- .../auth/providers/email-verification.ts | 4 +- .../providers/collection.provider.ts | 6 +- .../resolvers/Mutation/addSlackIntegration.ts | 5 +- .../providers/preflight-script.provider.ts | 6 +- .../providers/organization-manager.ts | 17 +- .../Mutation/updateOrganizationSlug.ts | 6 +- .../src/modules/organization/validation.ts | 6 +- .../project/providers/project-manager.ts | 7 +- .../api/src/modules/project/validation.ts | 2 +- .../providers/saved-filters.provider.ts | 6 +- .../schema/providers/schema-manager.ts | 5 +- .../schema/providers/schema-publisher.ts | 3 +- .../resolvers/Mutation/updateBaseSchema.ts | 3 +- .../target/providers/target-manager.ts | 23 +-- .../api/src/modules/target/validation.ts | 2 +- .../token/resolvers/Mutation/createToken.ts | 3 +- packages/services/broker-worker/package.json | 2 +- packages/services/broker-worker/src/models.ts | 4 +- packages/services/cdn-worker/package.json | 2 +- packages/services/commerce/package.json | 2 +- packages/services/commerce/src/environment.ts | 2 +- .../federation-2/package.json | 2 +- .../federation-2/src/environment.ts | 2 +- packages/services/policy/package.json | 4 +- packages/services/policy/src/environment.ts | 2 +- packages/services/policy/src/policy.ts | 10 +- packages/services/schema/package.json | 2 +- packages/services/schema/src/environment.ts | 2 +- packages/services/server/package.json | 2 +- packages/services/server/src/environment.ts | 2 +- .../server/src/supertokens-at-home.ts | 2 +- packages/services/service-common/package.json | 2 +- packages/services/storage/package.json | 2 +- packages/services/storage/src/environment.ts | 2 +- packages/services/storage/src/index.ts | 5 +- packages/services/usage-ingestor/package.json | 2 +- .../usage-ingestor/src/environment.ts | 2 +- packages/services/usage/package.json | 2 +- packages/services/usage/src/environment.ts | 2 +- packages/services/workflows/package.json | 2 +- .../services/workflows/src/environment.ts | 4 +- packages/services/workflows/src/kit.ts | 4 +- packages/web/app/package.json | 2 +- .../src/components/layouts/organization.tsx | 8 +- .../app/src/components/layouts/project.tsx | 6 +- .../organization/members/invitations.tsx | 10 +- .../components/organization/members/roles.tsx | 4 +- .../connect-single-sign-on-provider-sheet.tsx | 14 +- .../project/settings/external-composition.tsx | 6 +- .../laboratory/create-collection-modal.tsx | 6 +- .../laboratory/create-operation-modal.tsx | 8 +- .../laboratory/edit-operation-modal.tsx | 8 +- .../target/settings/registry-access-token.tsx | 2 +- packages/web/app/src/env/backend.ts | 10 +- packages/web/app/src/env/frontend.ts | 10 +- .../src/lib/hooks/use-local-storage-json.ts | 2 +- packages/web/app/src/lib/kit/json.ts | 4 +- .../web/app/src/pages/auth-reset-password.tsx | 8 +- packages/web/app/src/pages/auth-sign-in.tsx | 8 +- packages/web/app/src/pages/auth-sign-up.tsx | 24 ++- packages/web/app/src/pages/auth-sso.tsx | 2 +- .../web/app/src/pages/organization-new.tsx | 2 +- .../app/src/pages/organization-settings.tsx | 2 +- .../app/src/pages/organization-support.tsx | 6 +- .../web/app/src/pages/project-settings.tsx | 2 +- .../web/app/src/pages/target-settings.tsx | 2 +- packages/web/app/src/router.tsx | 6 +- packages/web/app/src/server/github.ts | 22 ++- packages/web/app/src/server/lab.ts | 22 ++- packages/web/app/src/server/slack.ts | 8 +- pnpm-lock.yaml | 172 +++++++++--------- 82 files changed, 300 insertions(+), 295 deletions(-) diff --git a/integration-tests/package.json b/integration-tests/package.json index d1248974c56..f31403be9ac 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -49,6 +49,6 @@ "strip-ansi": "7.1.2", "tslib": "2.8.1", "vitest": "4.1.3", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/internal/postgres/package.json b/packages/internal/postgres/package.json index fb1453c1441..c2af2ec7b36 100644 --- a/packages/internal/postgres/package.json +++ b/packages/internal/postgres/package.json @@ -11,7 +11,7 @@ "slonik": "48.13.2", "slonik-interceptor-query-logging": "48.13.2", "slonik-sql-tag-raw": "48.13.2", - "zod": "3.25.76" + "zod": "4.4.3" }, "devDependencies": { "@hive/service-common": "workspace:*", diff --git a/packages/libraries/cli/package.json b/packages/libraries/cli/package.json index 3385b4dcc34..61f669e5388 100644 --- a/packages/libraries/cli/package.json +++ b/packages/libraries/cli/package.json @@ -67,7 +67,7 @@ "graphql": "^16.8.1", "graphql-tag": "2.12.6", "tslib": "2.8.1", - "zod": "3.25.76" + "zod": "4.4.3" }, "devDependencies": { "@types/env-ci": "3.1.4", diff --git a/packages/libraries/cli/src/commands/app/create.ts b/packages/libraries/cli/src/commands/app/create.ts index 2392993d1fa..4ac1e316694 100644 --- a/packages/libraries/cli/src/commands/app/create.ts +++ b/packages/libraries/cli/src/commands/app/create.ts @@ -310,7 +310,7 @@ export default class AppCreate extends Command { } } -const ManifestModel = z.record(z.string()); +const ManifestModel = z.record(z.string(), z.string()); const CreateAppDeploymentMutation = graphql(/* GraphQL */ ` mutation CreateAppDeployment($input: CreateAppDeploymentInput!) { diff --git a/packages/libraries/laboratory/package.json b/packages/libraries/laboratory/package.json index 43604abf191..96c5807591d 100644 --- a/packages/libraries/laboratory/package.json +++ b/packages/libraries/laboratory/package.json @@ -39,7 +39,7 @@ "react-dom": "^18.0.0 || ^19.0.0", "subscriptions-transport-ws": "^0.11.0", "tslib": "^2.8.1", - "zod": "^4.1.12" + "zod": "^4.4.3" }, "dependencies": { "@base-ui/react": "^1.1.0", @@ -135,7 +135,7 @@ "vite-plugin-commonjs": "^0.10.4", "vite-plugin-dts": "^4.5.4", "vite-plugin-monaco-editor": "^1.1.0", - "zod": "^4.3.6" + "zod": "4.4.3" }, "publishConfig": { "access": "public" diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 9af8c72021b..204e47b31b0 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -35,7 +35,7 @@ "tslib": "2.8.1", "tsx": "4.19.2", "typescript": "5.7.3", - "zod": "3.25.76" + "zod": "4.4.3" }, "buildOptions": { "external": [ diff --git a/packages/migrations/src/environment.ts b/packages/migrations/src/environment.ts index 3e1fa8f72c4..2331930c0a3 100644 --- a/packages/migrations/src/environment.ts +++ b/packages/migrations/src/environment.ts @@ -82,7 +82,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/migrations/src/scripts/environment.ts b/packages/migrations/src/scripts/environment.ts index 2481f6a4a16..6f2814bb8ad 100644 --- a/packages/migrations/src/scripts/environment.ts +++ b/packages/migrations/src/scripts/environment.ts @@ -59,7 +59,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 8cb9bc3e7bf..dfc873df6e1 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -82,7 +82,7 @@ "redlock": "5.0.0-beta.2", "stripe": "17.5.0", "vitest": "4.1.3", - "zod": "3.25.76", - "zod-validation-error": "3.4.0" + "zod": "4.4.3", + "zod-validation-error": "5.0.0" } } diff --git a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts index 3694161d1bb..4d6e2496d97 100644 --- a/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts +++ b/packages/services/api/src/modules/alerts/resolvers/Mutation/addAlertChannel.ts @@ -22,13 +22,14 @@ export const addAlertChannel: NonNullable const result = AddAlertChannelModel.safeParse(input); if (!result.success) { + const errors = z.treeifyError(result.error); return { error: { message: 'Please check your input.', inputErrors: { - slackChannel: result.error.formErrors.fieldErrors.slack?.[0], - webhookEndpoint: result.error.formErrors.fieldErrors.webhook?.[0], - name: result.error.formErrors.fieldErrors.name?.[0], + slackChannel: errors.properties?.slack?.errors.at(0), + webhookEndpoint: errors.properties?.webhook?.errors.at(0), + name: errors.properties?.name?.errors.at(0), }, }, }; diff --git a/packages/services/api/src/modules/auth/providers/auth-manager.ts b/packages/services/api/src/modules/auth/providers/auth-manager.ts index 4a6da5d9abd..a68dc5544ab 100644 --- a/packages/services/api/src/modules/auth/providers/auth-manager.ts +++ b/packages/services/api/src/modules/auth/providers/auth-manager.ts @@ -104,13 +104,14 @@ export class AuthManager { const result = InputModel.safeParse(input); if (!result.success) { + const errors = z.treeifyError(result.error); return { type: 'error' as const, error: { message: 'Please check your input.', inputErrors: { - displayName: result.error.formErrors.fieldErrors.displayName?.[0], - fullName: result.error.formErrors.fieldErrors.fullName?.[0], + displayName: errors.properties?.displayName?.errors?.at(0), + fullName: errors.properties?.fullName?.errors?.at(0), }, }, }; diff --git a/packages/services/api/src/modules/auth/providers/email-verification.ts b/packages/services/api/src/modules/auth/providers/email-verification.ts index 5ed74407654..e3fffb77f33 100644 --- a/packages/services/api/src/modules/auth/providers/email-verification.ts +++ b/packages/services/api/src/modules/auth/providers/email-verification.ts @@ -12,7 +12,7 @@ import { WEB_APP_URL } from '../../shared/providers/tokens'; const EmailVerificationModelBase = zod.object({ id: zod.string().uuid(), userIdentityId: zod.string(), - email: zod.string().email(), + email: zod.email(), createdAt: zod.number().transform(v => new Date(v)), }); @@ -132,7 +132,7 @@ export class EmailVerification { WHERE "saaru"."user_id" = ${input.userIdentityId} `, ) - .then(v => zod.object({ email: zod.string().email() }).nullable().parse(v)); + .then(v => zod.object({ email: zod.email() }).nullable().parse(v)); if (!superTokensUser) { throw new HiveError('User identity not found.'); diff --git a/packages/services/api/src/modules/collection/providers/collection.provider.ts b/packages/services/api/src/modules/collection/providers/collection.provider.ts index 5c872416561..de28d08c289 100644 --- a/packages/services/api/src/modules/collection/providers/collection.provider.ts +++ b/packages/services/api/src/modules/collection/providers/collection.provider.ts @@ -359,9 +359,10 @@ export class CollectionProvider { }); if (validationResult.error) { + const errors = zod.treeifyError(validationResult.error); return { type: 'error' as const, - message: validationResult.error.errors[0].message, + message: errors.errors[0], }; } @@ -467,9 +468,10 @@ export class CollectionProvider { }); if (validationResult.error) { + const errors = zod.treeifyError(validationResult.error); return { type: 'error' as const, - message: validationResult.error.errors[0].message, + message: errors.errors[0], }; } diff --git a/packages/services/api/src/modules/integrations/resolvers/Mutation/addSlackIntegration.ts b/packages/services/api/src/modules/integrations/resolvers/Mutation/addSlackIntegration.ts index 82cad3cc2b1..9c753aa1b8a 100644 --- a/packages/services/api/src/modules/integrations/resolvers/Mutation/addSlackIntegration.ts +++ b/packages/services/api/src/modules/integrations/resolvers/Mutation/addSlackIntegration.ts @@ -24,9 +24,8 @@ export const addSlackIntegration: NonNullable (issue.input === undefined ? 'Organization slug is required' : issue.message), }) .min(1, 'Organization slug is required') .max(50, 'Slug must be less than 50 characters') @@ -16,7 +16,7 @@ export const OrganizationSlugModel = z export const CreateOrUpdateMemberRoleModel = z.object({ name: z .string({ - required_error: 'Please enter role name', + error: issue => (issue.input === undefined ? 'Please enter role name' : issue.message), }) .trim() .min(2, 'Role name must be at least 2 characters long') @@ -28,7 +28,7 @@ export const CreateOrUpdateMemberRoleModel = z.object({ .refine(val => val !== 'Viewer' && val !== 'Admin', 'Viewer and Admin are reserved'), description: z .string({ - required_error: 'Please enter role description', + error: issue => (issue.input === undefined ? 'Please enter role description' : issue.message), }) .trim() .min(2, 'Role description must be at least 2 characters long') diff --git a/packages/services/api/src/modules/project/providers/project-manager.ts b/packages/services/api/src/modules/project/providers/project-manager.ts index 6f5539c4b93..b90b693369b 100644 --- a/packages/services/api/src/modules/project/providers/project-manager.ts +++ b/packages/services/api/src/modules/project/providers/project-manager.ts @@ -56,11 +56,12 @@ export class ProjectManager { const inputParseResult = CreateProjectModel.safeParse(input); if (!inputParseResult.success) { + const errors = z.treeifyError(inputParseResult.error); return { ok: false as const, message: 'Please check your input.', inputErrors: { - slug: inputParseResult.error.formErrors.fieldErrors.slug?.[0], + slug: errors?.properties?.slug?.errors?.at(0), }, }; } @@ -307,10 +308,10 @@ export class ProjectManager { const inputParseResult = UpdateProjectSlugModel.safeParse(input); if (!inputParseResult.success) { + const errors = z.treeifyError(inputParseResult.error); return { ok: false, - message: - inputParseResult.error.formErrors.fieldErrors.slug?.[0] ?? 'Please check your input.', + message: errors?.errors.at(0) ?? 'Please check your input.', }; } diff --git a/packages/services/api/src/modules/project/validation.ts b/packages/services/api/src/modules/project/validation.ts index 3ae90ed1b4e..6c9c4325170 100644 --- a/packages/services/api/src/modules/project/validation.ts +++ b/packages/services/api/src/modules/project/validation.ts @@ -4,7 +4,7 @@ import { NameModel } from '../../shared/entities'; export const ProjectNameModel = NameModel.min(2).max(40); export const ProjectSlugModel = z .string({ - required_error: 'Project slug is required', + error: issue => (issue.input === undefined ? 'Project slug is required' : issue.message), }) .min(1, 'Project slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/services/api/src/modules/saved-filters/providers/saved-filters.provider.ts b/packages/services/api/src/modules/saved-filters/providers/saved-filters.provider.ts index 4ff46388c86..03c9ee24ea8 100644 --- a/packages/services/api/src/modules/saved-filters/providers/saved-filters.provider.ts +++ b/packages/services/api/src/modules/saved-filters/providers/saved-filters.provider.ts @@ -185,9 +185,10 @@ export class SavedFiltersProvider { const validationResult = CreateSavedFilterInputModel.safeParse(input); if (!validationResult.success) { + const errors = zod.treeifyError(validationResult.error); return { type: 'error', - message: validationResult.error.errors[0].message, + message: errors.errors?.at(0) ?? 'Something went wrong.', }; } @@ -306,9 +307,10 @@ export class SavedFiltersProvider { const validationResult = UpdateSavedFilterInputModel.safeParse(input); if (!validationResult.success) { + const errors = zod.treeifyError(validationResult.error); return { type: 'error', - message: validationResult.error.errors[0].message, + message: errors.errors?.at(0) ?? 'Something went wrong.', }; } diff --git a/packages/services/api/src/modules/schema/providers/schema-manager.ts b/packages/services/api/src/modules/schema/providers/schema-manager.ts index 6fe6cf088ff..8d9e31ea2e4 100644 --- a/packages/services/api/src/modules/schema/providers/schema-manager.ts +++ b/packages/services/api/src/modules/schema/providers/schema-manager.ts @@ -737,13 +737,14 @@ export class SchemaManager { }); if (!parseResult.success) { + const errors = z.treeifyError(parseResult.error); return { error: { __typename: 'UpdateSchemaCompositionExternalError' as const, message: parseResult.error.message, inputErrors: { - endpoint: parseResult.error.formErrors.fieldErrors.endpoint?.[0], - secret: parseResult.error.formErrors.fieldErrors.secret?.[0], + endpoint: errors?.properties?.endpoint?.errors.at(0), + secret: errors?.properties?.secret?.errors.at(0), }, }, }; diff --git a/packages/services/api/src/modules/schema/providers/schema-publisher.ts b/packages/services/api/src/modules/schema/providers/schema-publisher.ts index 8696ce671c5..92714e2478d 100644 --- a/packages/services/api/src/modules/schema/providers/schema-publisher.ts +++ b/packages/services/api/src/modules/schema/providers/schema-publisher.ts @@ -554,6 +554,7 @@ export class SchemaPublisher { if (input.contextId !== undefined) { const result = SchemaCheckContextIdModel.safeParse(input.contextId); if (!result.success) { + const errors = z.treeifyError(result.error); return { __typename: 'SchemaCheckError', valid: false, @@ -561,7 +562,7 @@ export class SchemaPublisher { warnings: [], errors: [ { - message: result.error.errors[0].message, + message: errors.errors?.at(0) ?? 'Something went wrong.', }, ], } as const; diff --git a/packages/services/api/src/modules/schema/resolvers/Mutation/updateBaseSchema.ts b/packages/services/api/src/modules/schema/resolvers/Mutation/updateBaseSchema.ts index 7a421ed207a..2ed569ad34d 100644 --- a/packages/services/api/src/modules/schema/resolvers/Mutation/updateBaseSchema.ts +++ b/packages/services/api/src/modules/schema/resolvers/Mutation/updateBaseSchema.ts @@ -19,9 +19,10 @@ export const updateBaseSchema: NonNullable (issue.input === undefined ? 'Target slug is required' : issue.message), }) .min(1, 'Target slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts b/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts index 9eaad373648..2ebffb5bc46 100644 --- a/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts +++ b/packages/services/api/src/modules/token/resolvers/Mutation/createToken.ts @@ -17,9 +17,10 @@ export const createToken: NonNullable = async const result = CreateTokenInputModel.safeParse(input); if (!result.success) { + const errors = z.treeifyError(result.error); return { error: { - message: result.error.formErrors.fieldErrors.name?.[0] ?? 'Please check your input.', + message: errors.errors.at(0) ?? 'Please check your input.', }, }; } diff --git a/packages/services/broker-worker/package.json b/packages/services/broker-worker/package.json index ccfa7a3cdd0..46e8af10001 100644 --- a/packages/services/broker-worker/package.json +++ b/packages/services/broker-worker/package.json @@ -18,6 +18,6 @@ "undici": "7.28.0", "vitest": "4.1.3", "workers-loki-logger": "0.1.15", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/broker-worker/src/models.ts b/packages/services/broker-worker/src/models.ts index 0f4618d60dc..11aa619206c 100644 --- a/packages/services/broker-worker/src/models.ts +++ b/packages/services/broker-worker/src/models.ts @@ -9,12 +9,12 @@ const RequestModelSchema = z.union([ z.object({ method: z.literal('GET'), url: z.string().min(1), - headers: z.record(z.string()).optional(), + headers: z.record(z.string(), z.string()).optional(), }), z.object({ method: z.literal('POST'), url: z.string().min(1), - headers: z.record(z.string()).optional(), + headers: z.record(z.string(), z.string()).optional(), body: z.string().optional(), resolveResponseBody: z.boolean().optional().default(true), }), diff --git a/packages/services/cdn-worker/package.json b/packages/services/cdn-worker/package.json index 60aab42cf02..dde1d5f14a9 100644 --- a/packages/services/cdn-worker/package.json +++ b/packages/services/cdn-worker/package.json @@ -30,6 +30,6 @@ "itty-router-extras": "0.4.6", "toucan-js": "4.1.0", "undici": "7.28.0", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/commerce/package.json b/packages/services/commerce/package.json index 29b9f656723..30562b8a950 100644 --- a/packages/services/commerce/package.json +++ b/packages/services/commerce/package.json @@ -22,7 +22,7 @@ "pino-pretty": "11.3.0", "reflect-metadata": "0.2.2", "stripe": "17.5.0", - "zod": "3.25.76" + "zod": "4.4.3" }, "buildOptions": { "external": [ diff --git a/packages/services/commerce/src/environment.ts b/packages/services/commerce/src/environment.ts index 47433dc5907..83b4da78c84 100644 --- a/packages/services/commerce/src/environment.ts +++ b/packages/services/commerce/src/environment.ts @@ -128,7 +128,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/external-composition/federation-2/package.json b/packages/services/external-composition/federation-2/package.json index 2e4e0d80022..24bab7ea010 100644 --- a/packages/services/external-composition/federation-2/package.json +++ b/packages/services/external-composition/federation-2/package.json @@ -16,6 +16,6 @@ "dotenv": "16.4.7", "graphql": "16.9.0", "lru-cache": "^7.17.0", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/external-composition/federation-2/src/environment.ts b/packages/services/external-composition/federation-2/src/environment.ts index 7136460d57c..ec39b915fbd 100644 --- a/packages/services/external-composition/federation-2/src/environment.ts +++ b/packages/services/external-composition/federation-2/src/environment.ts @@ -1,7 +1,7 @@ import zod from 'zod'; import { resolveServerListenOptions } from '@hive/service-common'; -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/policy/package.json b/packages/services/policy/package.json index 574c684a3c3..5dd0869cc5e 100644 --- a/packages/services/policy/package.json +++ b/packages/services/policy/package.json @@ -20,8 +20,8 @@ "fastify": "5.10.0", "graphql": "16.9.0", "pino-pretty": "11.3.0", - "zod": "3.25.76", - "zod-validation-error": "3.4.0" + "zod": "4.4.3", + "zod-validation-error": "5.0.0" }, "buildOptions": { "runify": true, diff --git a/packages/services/policy/src/environment.ts b/packages/services/policy/src/environment.ts index efaa1eb91f1..e03d4062dfa 100644 --- a/packages/services/policy/src/environment.ts +++ b/packages/services/policy/src/environment.ts @@ -87,7 +87,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/policy/src/policy.ts b/packages/services/policy/src/policy.ts index 5136707974b..3ffcfc2baa0 100644 --- a/packages/services/policy/src/policy.ts +++ b/packages/services/policy/src/policy.ts @@ -45,7 +45,7 @@ export function normalizeAjvSchema( export function createInputValidationSchema() { return z - .object( + .strictObject( RELEVANT_RULES.reduce((acc, [name, rule]) => { const schema = normalizeAjvSchema(rule.meta.schema); const validate = schema ? ajv.compile(schema) : null; @@ -77,11 +77,13 @@ export function createInputValidationSchema() { ), ]), }; - }, {} as RulemapValidationType), + }, {}), + { + error: 'Unknown rule name passed', + }, ) - .required() .partial() - .strict('Unknown rule name passed'); + .required(); } export type PolicyConfigurationObject = z.infer>; diff --git a/packages/services/schema/package.json b/packages/services/schema/package.json index d5b32847961..3bf9f1bc074 100644 --- a/packages/services/schema/package.json +++ b/packages/services/schema/package.json @@ -29,6 +29,6 @@ "ioredis-mock": "8.9.0", "pino-pretty": "11.3.0", "reflect-metadata": "0.2.2", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/schema/src/environment.ts b/packages/services/schema/src/environment.ts index 5e2f01c5cf3..cbed7e19aa5 100644 --- a/packages/services/schema/src/environment.ts +++ b/packages/services/schema/src/environment.ts @@ -136,7 +136,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/server/package.json b/packages/services/server/package.json index d2204d8899e..f9edb8f830c 100644 --- a/packages/services/server/package.json +++ b/packages/services/server/package.json @@ -50,7 +50,7 @@ "pino-pretty": "11.3.0", "prom-client": "15.1.3", "reflect-metadata": "0.2.2", - "zod": "3.25.76" + "zod": "4.4.3" }, "buildOptions": { "external": [ diff --git a/packages/services/server/src/environment.ts b/packages/services/server/src/environment.ts index 4260b5460d9..cc417f76e17 100644 --- a/packages/services/server/src/environment.ts +++ b/packages/services/server/src/environment.ts @@ -493,7 +493,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/server/src/supertokens-at-home.ts b/packages/services/server/src/supertokens-at-home.ts index 292beb78889..8f148ed9d2b 100644 --- a/packages/services/server/src/supertokens-at-home.ts +++ b/packages/services/server/src/supertokens-at-home.ts @@ -211,7 +211,7 @@ export async function registerSupertokensAtHome( const password = parsedBody.data.formFields.find(field => field.id === 'password')?.value ?? ''; - const emailResult = z.string().email().toLowerCase().safeParse(rawEmail); + const emailResult = z.email().toLowerCase().safeParse(rawEmail); // Verify email if (!emailResult.success) { diff --git a/packages/services/service-common/package.json b/packages/services/service-common/package.json index 1f8bbe4ec65..58d19351c29 100644 --- a/packages/services/service-common/package.json +++ b/packages/services/service-common/package.json @@ -44,6 +44,6 @@ "p-retry": "6.2.1", "prom-client": "15.1.3", "vitest": "4.1.3", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/storage/package.json b/packages/services/storage/package.json index 5d7822c0731..19b295cbbd4 100644 --- a/packages/services/storage/package.json +++ b/packages/services/storage/package.json @@ -27,7 +27,7 @@ "graphql": "^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "pg-promise": "11.10.2", "typescript": "5.7.3", - "zod": "3.25.76" + "zod": "4.4.3" }, "buildOptions": { "external": [ diff --git a/packages/services/storage/src/environment.ts b/packages/services/storage/src/environment.ts index f8bfc96cbed..d74499de4f6 100644 --- a/packages/services/storage/src/environment.ts +++ b/packages/services/storage/src/environment.ts @@ -72,7 +72,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index 4956e6ca750..1ecf9a3380e 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -1033,7 +1033,7 @@ export async function createStorage( .then( z.object({ roleId: z.string(), - assignedResources: z.record(z.any()).nullable(), + assignedResources: z.record(z.string(), z.any()).nullable(), }).parse, ); @@ -4131,7 +4131,6 @@ const FeatureFlagsModel = z }) .optional() .nullable() - .default({}) .transform( val => val ?? { @@ -4368,7 +4367,7 @@ const OrganizationInvitationModel = z .object({ organizationId: z.string(), code: z.string(), - email: z.string().email(), + email: z.email(), createdAt: z.string().transform(v => new Date(v).toISOString()), expiresAt: z.string().transform(v => new Date(v).toISOString()), roleId: z.string(), diff --git a/packages/services/usage-ingestor/package.json b/packages/services/usage-ingestor/package.json index b785179e14d..8d3d5dd8560 100644 --- a/packages/services/usage-ingestor/package.json +++ b/packages/services/usage-ingestor/package.json @@ -20,6 +20,6 @@ "kafkajs": "2.2.4", "pino-pretty": "11.3.0", "tiny-lru": "11.4.7", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/usage-ingestor/src/environment.ts b/packages/services/usage-ingestor/src/environment.ts index 17709962815..e096ca641fc 100644 --- a/packages/services/usage-ingestor/src/environment.ts +++ b/packages/services/usage-ingestor/src/environment.ts @@ -172,7 +172,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/usage/package.json b/packages/services/usage/package.json index 0d3f92e0f3f..adfd7062a9f 100644 --- a/packages/services/usage/package.json +++ b/packages/services/usage/package.json @@ -25,6 +25,6 @@ "p-limit": "6.2.0", "pino-pretty": "11.3.0", "reflect-metadata": "0.2.2", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/usage/src/environment.ts b/packages/services/usage/src/environment.ts index 197b8c84b32..feedd17b516 100644 --- a/packages/services/usage/src/environment.ts +++ b/packages/services/usage/src/environment.ts @@ -157,7 +157,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index 63ea639edf6..64fd74cdbc9 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -38,6 +38,6 @@ "nodemailer": "9.0.1", "p-limit": "6.2.0", "sendmail": "1.6.1", - "zod": "3.25.76" + "zod": "4.4.3" } } diff --git a/packages/services/workflows/src/environment.ts b/packages/services/workflows/src/environment.ts index f3bd408147c..0bb0a327530 100644 --- a/packages/services/workflows/src/environment.ts +++ b/packages/services/workflows/src/environment.ts @@ -35,7 +35,7 @@ const EnvironmentModel = zod.object({ ENVIRONMENT: emptyString(zod.string().optional()), RELEASE: emptyString(zod.string().optional()), HEARTBEAT_ENDPOINT: emptyString(zod.string().url().optional()), - EMAIL_FROM: zod.string().email(), + EMAIL_FROM: zod.email(), SCHEMA_ENDPOINT: zod.string().url(), // Base URL of the Hive Console, used to link alert notifications back to the // rule that fired. Optional so an existing self-hosted deployment keeps @@ -192,7 +192,7 @@ if (environmentErrors.length) { process.exit(1); } -function extractConfig(config: zod.SafeParseReturnType): Output { +function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/services/workflows/src/kit.ts b/packages/services/workflows/src/kit.ts index 213933ed233..302a45ab310 100644 --- a/packages/services/workflows/src/kit.ts +++ b/packages/services/workflows/src/kit.ts @@ -9,7 +9,7 @@ import type { Context } from './context'; export type TaskDefinition = { name: TName; - schema: z.ZodTypeAny & { _output: TModel }; + schema: z.ZodType & { _output: TModel }; }; type TaskImplementationArgs = { @@ -50,7 +50,7 @@ export function implementTask( function (unsafePayload, helpers) { const payload = schema.parse(unsafePayload); return implementation({ - input: payload.input, + input: payload.input as TPayload, context, helpers, logger: context.logger.child({ diff --git a/packages/web/app/package.json b/packages/web/app/package.json index e540285bc7d..33aacb6db77 100644 --- a/packages/web/app/package.json +++ b/packages/web/app/package.json @@ -154,7 +154,7 @@ "vite-tsconfig-paths": "5.1.4", "wonka": "6.3.4", "yup": "1.6.1", - "zod": "3.25.76" + "zod": "4.4.3" }, "buildOptions": { "external": [ diff --git a/packages/web/app/src/components/layouts/organization.tsx b/packages/web/app/src/components/layouts/organization.tsx index 3d6d78ee7a6..4d547a6495c 100644 --- a/packages/web/app/src/components/layouts/organization.tsx +++ b/packages/web/app/src/components/layouts/organization.tsx @@ -245,16 +245,16 @@ export const CreateProjectMutation = graphql(` const createProjectFormSchema = z.object({ projectSlug: z .string({ - required_error: 'Project slug is required', + error: issue => (issue.input == null ? 'Project slug is required' : issue.message), }) .min(2, { - message: 'Project slug must be at least 2 characters long', + error: 'Project slug must be at least 2 characters long', }) .max(50, { - message: 'Project slug must be at most 50 characters long', + error: 'Project slug must be at most 50 characters long', }), projectType: z.nativeEnum(ProjectType, { - required_error: 'Project type is required', + error: issue => (issue.input == null ? 'Project type is required' : issue.message), }), }); diff --git a/packages/web/app/src/components/layouts/project.tsx b/packages/web/app/src/components/layouts/project.tsx index 39b53640bd2..e0d823eae55 100644 --- a/packages/web/app/src/components/layouts/project.tsx +++ b/packages/web/app/src/components/layouts/project.tsx @@ -197,13 +197,13 @@ export const CreateTarget_CreateTargetMutation = graphql(` const createTargetFormSchema = z.object({ targetSlug: z .string({ - required_error: 'Target slug is required', + error: issue => (issue == null ? 'Target slug is required' : issue.message), }) .min(2, { - message: 'Target slug must be at least 2 characters long', + error: 'Target slug must be at least 2 characters long', }) .max(50, { - message: 'Target slug must be at most 50 characters long', + error: 'Target slug must be at most 50 characters long', }), }); diff --git a/packages/web/app/src/components/organization/members/invitations.tsx b/packages/web/app/src/components/organization/members/invitations.tsx index 84fcc0894f4..9f5460760c7 100644 --- a/packages/web/app/src/components/organization/members/invitations.tsx +++ b/packages/web/app/src/components/organization/members/invitations.tsx @@ -86,14 +86,14 @@ const MemberInvitationForm_OrganizationFragment = graphql(` const memberInvitationFormSchema = z.object({ email: z - .string({ - required_error: 'Please enter email address', + .email({ + error: issue => + issue.input == null ? 'Please enter email address' : 'Please enter valid email address', }) - .max(128, 'Email address is too long') - .email('Please enter valid email address'), + .max(128, 'Email address is too long'), role: z .string({ - required_error: 'Please select a role', + error: issue => (issue.input == null ? 'Please select a role' : issue.message), }) .min(1, 'Please select a role'), }); diff --git a/packages/web/app/src/components/organization/members/roles.tsx b/packages/web/app/src/components/organization/members/roles.tsx index e873e173815..a5ec3610f23 100644 --- a/packages/web/app/src/components/organization/members/roles.tsx +++ b/packages/web/app/src/components/organization/members/roles.tsx @@ -53,7 +53,7 @@ import { SelectedPermissionOverview } from './selected-permission-overview'; export const roleFormSchema = z.object({ name: z .string({ - required_error: 'Required', + error: issue => (issue.input == null ? 'Required' : issue.message), }) .trim() .min(2, 'Too short') @@ -65,7 +65,7 @@ export const roleFormSchema = z.object({ .refine(val => val !== 'Viewer' && val !== 'Admin', 'Viewer and Admin are reserved'), description: z .string({ - required_error: 'Please enter role description', + error: issue => (issue.input == null ? 'Please enter role description' : issue.message), }) .trim() .min(2, 'Too short') diff --git a/packages/web/app/src/components/organization/settings/single-sign-on/connect-single-sign-on-provider-sheet.tsx b/packages/web/app/src/components/organization/settings/single-sign-on/connect-single-sign-on-provider-sheet.tsx index 52da1e9f63a..ccb0bbd6fac 100644 --- a/packages/web/app/src/components/organization/settings/single-sign-on/connect-single-sign-on-provider-sheet.tsx +++ b/packages/web/app/src/components/organization/settings/single-sign-on/connect-single-sign-on-provider-sheet.tsx @@ -357,15 +357,13 @@ function OIDCMetadataFetcher(props: { const metadataResult = OIDCMetadataSchema.safeParse(data.metadata); if (!metadataResult.success) { + const errors = z.treeifyError(metadataResult.error); toast({ title: 'Failed to parse OIDC metadata', description: ( <> - {[ - metadataResult.error.formErrors.fieldErrors.authorization_endpoint?.[0], - metadataResult.error.formErrors.fieldErrors.token_endpoint?.[0], - metadataResult.error.formErrors.fieldErrors.userinfo_endpoint?.[0], - ] + {Object.values(errors.properties ?? {}) + .map(v => v.errors.at(0)) .filter(Boolean) .map((msg, i) => (

{msg}

@@ -477,17 +475,17 @@ async function fetchOIDCMetadata(url: string) { const OIDCMetadataSchema = z.object({ token_endpoint: z .string({ - required_error: 'Token endpoint not found', + error: issue => (issue.input == null ? 'Token endpoint not found' : issue.message), }) .url('Token endpoint must be a valid URL'), userinfo_endpoint: z .string({ - required_error: 'Userinfo endpoint not found', + error: issue => (issue.input == null ? 'Userinfo endpoint not found' : issue.message), }) .url('Userinfo endpoint must be a valid URL'), authorization_endpoint: z .string({ - required_error: 'Authorization endpoint not found', + error: issue => (issue.input == null ? 'Authorization endpoint not found' : issue.message), }) .url('Authorization endpoint must be a valid URL'), }); diff --git a/packages/web/app/src/components/project/settings/external-composition.tsx b/packages/web/app/src/components/project/settings/external-composition.tsx index cb268bb535a..bc49864732b 100644 --- a/packages/web/app/src/components/project/settings/external-composition.tsx +++ b/packages/web/app/src/components/project/settings/external-composition.tsx @@ -188,14 +188,14 @@ const ExternalCompositionStatus = ({ const formSchema = z.object({ endpoint: z .string({ - required_error: 'Please provide an endpoint', + error: issue => (issue.input == null ? 'Please provide an endpoint' : issue.message), }) .url({ - message: 'Invalid URL', + error: 'Invalid URL', }), secret: z .string({ - required_error: 'Please provide a secret', + error: issue => (issue.input == null ? 'Please provide a secret' : issue.message), }) .min(2, 'Too short') .max(256, 'Max 256 characters long'), diff --git a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx index 5d9b84bcdab..d18a047c172 100644 --- a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx @@ -123,13 +123,13 @@ const UpdateCollectionMutation = graphql(` const createCollectionModalFormSchema = z.object({ name: z .string({ - required_error: 'Collection name is required', + error: issue => (issue.input == null ? 'Collection name is required' : issue.message), }) .min(2, { - message: 'Collection name must be at least 2 characters long', + error: 'Collection name must be at least 2 characters long', }) .max(50, { - message: 'Collection name must be at most 50 characters long', + error: 'Collection name must be at most 50 characters long', }), description: z.string().optional(), }); diff --git a/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx index bed9e6fd6a9..3ad9da8fdd4 100644 --- a/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/create-operation-modal.tsx @@ -73,16 +73,16 @@ export type CreateOperationMutationType = typeof CreateOperationMutation; const createOperationModalFormSchema = z.object({ name: z .string({ - required_error: 'Operation name is required', + error: issue => (issue.input == null ? 'Operation name is required' : issue.message), }) .min(3, { - message: 'Operation name must be at least 3 characters long', + error: 'Operation name must be at least 3 characters long', }) .max(50, { - message: 'Operation name must be less than 50 characters long', + error: 'Operation name must be less than 50 characters long', }), collectionId: z.string({ - required_error: 'Collection is required', + error: issue => (issue.input == null ? 'Collection is required' : issue.message), }), }); diff --git a/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx b/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx index 27b081a591b..6fadf5e4773 100644 --- a/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/edit-operation-modal.tsx @@ -51,16 +51,16 @@ const UpdateOperationNameMutation = graphql(` const editOperationModalFormSchema = z.object({ name: z .string({ - required_error: 'Operation name is required', + error: issue => (issue.input == null ? 'Operation name is required' : issue.message), }) .min(3, { - message: 'Operation name must be at least 3 characters long', + error: 'Operation name must be at least 3 characters long', }) .max(50, { - message: 'Operation name must be less than 50 characters long', + error: 'Operation name must be less than 50 characters long', }), collectionId: z.string({ - required_error: 'Collection is required', + error: issue => (issue.input == null ? 'Collection is required' : issue.message), }), }); diff --git a/packages/web/app/src/components/target/settings/registry-access-token.tsx b/packages/web/app/src/components/target/settings/registry-access-token.tsx index 56673cff606..5bd0d92a714 100644 --- a/packages/web/app/src/components/target/settings/registry-access-token.tsx +++ b/packages/web/app/src/components/target/settings/registry-access-token.tsx @@ -84,7 +84,7 @@ function getFinalTargetAccessScopes( const createRegistryTokenFormSchema = z.object({ tokenDescription: z .string({ - required_error: 'Token description is required', + error: issue => (issue.input == null ? 'Token description is required' : issue.message), }) .min(2, { message: 'Token description must be at least 2 characters long', diff --git a/packages/web/app/src/env/backend.ts b/packages/web/app/src/env/backend.ts index 1c2dcdf93ca..72ecf605426 100644 --- a/packages/web/app/src/env/backend.ts +++ b/packages/web/app/src/env/backend.ts @@ -101,13 +101,7 @@ const SentryConfigSchema = zod.union([ ]); const MigrationsSchema = zod.object({ - MEMBER_ROLES_DEADLINE: emptyString( - zod - .date({ - coerce: true, - }) - .optional(), - ), + MEMBER_ROLES_DEADLINE: emptyString(zod.coerce.date().optional()), }); const LogModel = zod.object({ @@ -156,7 +150,7 @@ function buildConfig() { process.exit(1); } - function extractConfig(config: zod.SafeParseReturnType): Output { + function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/web/app/src/env/frontend.ts b/packages/web/app/src/env/frontend.ts index 5da57ff6188..a8d7e207252 100644 --- a/packages/web/app/src/env/frontend.ts +++ b/packages/web/app/src/env/frontend.ts @@ -87,13 +87,7 @@ const SentryConfigSchema = zod.union([ ]); const MigrationsSchema = protectedObject({ - MEMBER_ROLES_DEADLINE: emptyString( - zod - .date({ - coerce: true, - }) - .optional(), - ), + MEMBER_ROLES_DEADLINE: emptyString(zod.coerce.date().optional()), }); const envValues = getAllEnv(); @@ -124,7 +118,7 @@ function buildConfig() { throw new Error('Invalid environment variables.'); } - function extractConfig(config: zod.SafeParseReturnType): Output { + function extractConfig(config: zod.ZodSafeParseResult): Output { if (!config.success) { throw new Error('Something went wrong.'); } diff --git a/packages/web/app/src/lib/hooks/use-local-storage-json.ts b/packages/web/app/src/lib/hooks/use-local-storage-json.ts index 97bd5a4465f..03db59c03b9 100644 --- a/packages/web/app/src/lib/hooks/use-local-storage-json.ts +++ b/packages/web/app/src/lib/hooks/use-local-storage-json.ts @@ -15,7 +15,7 @@ export function useLocalStorageJson<$Schema extends z.ZodType>(...args: ArgsInpu manualDefaultValue !== undefined ? manualDefaultValue : Kit.ZodHelpers.isDefaultType(schema) - ? (schema._def.defaultValue() as z.infer<$Schema>) + ? (schema.def.defaultValue as z.infer<$Schema>) : Kit.never(); const [value, setValue] = useState>(() => { diff --git a/packages/web/app/src/lib/kit/json.ts b/packages/web/app/src/lib/kit/json.ts index 108012f2db4..df87b3f2749 100644 --- a/packages/web/app/src/lib/kit/json.ts +++ b/packages/web/app/src/lib/kit/json.ts @@ -8,12 +8,12 @@ export namespace Json { export const isPrimitive = ZodHelpers.createTypeGuard(Primitive); export const Value: z.ZodType = z.lazy(() => - z.union([Primitive, z.array(Value), z.record(Value)]), + z.union([Primitive, z.array(Value), z.record(z.string(), Value)]), ); export type Value = Primitive | { [key: string]: Value } | Value[]; export const isValue = ZodHelpers.createTypeGuard(Value); - export const Object: z.ZodType = z.record(Value); + export const Object: z.ZodType = z.record(z.string(), Value); export type Object = { [key: string]: Value }; export const isObject = ZodHelpers.createTypeGuard(Object); } diff --git a/packages/web/app/src/pages/auth-reset-password.tsx b/packages/web/app/src/pages/auth-reset-password.tsx index be3a74002f6..32616d972a4 100644 --- a/packages/web/app/src/pages/auth-reset-password.tsx +++ b/packages/web/app/src/pages/auth-reset-password.tsx @@ -26,11 +26,9 @@ import { Link, Navigate } from '@tanstack/react-router'; import { PasswordStringModel } from './auth-sign-up'; const ResetPasswordFormSchema = z.object({ - email: z - .string({ - required_error: 'Email is required', - }) - .email('Invalid email address'), + email: z.email({ + error: issue => (issue.input == null ? 'Email is required' : 'Invalid email address'), + }), }); type ResetPasswordFormValues = z.infer; diff --git a/packages/web/app/src/pages/auth-sign-in.tsx b/packages/web/app/src/pages/auth-sign-in.tsx index b0d31f3dd09..8b2da52dbc3 100644 --- a/packages/web/app/src/pages/auth-sign-in.tsx +++ b/packages/web/app/src/pages/auth-sign-in.tsx @@ -68,11 +68,9 @@ export function SignInButton(props: { } const SignInFormSchema = z.object({ - email: z - .string({ - required_error: 'Email is required', - }) - .email('Invalid email address'), + email: z.email({ + error: issue => (issue.input == null ? 'Email is required' : 'Invalid email address'), + }), password: z.string(), }); diff --git a/packages/web/app/src/pages/auth-sign-up.tsx b/packages/web/app/src/pages/auth-sign-up.tsx index 19d162cb9b4..886461ccfba 100644 --- a/packages/web/app/src/pages/auth-sign-up.tsx +++ b/packages/web/app/src/pages/auth-sign-up.tsx @@ -38,32 +38,30 @@ import { SignInButton } from './auth-sign-in'; export const PasswordStringModel = z .string({ - required_error: 'Password is required', + error: issue => (issue.input == null ? 'Password is required' : issue.message), }) - .min(10, { message: 'Password must be at least 10 characters long.' }) + .min(10, { error: 'Password must be at least 10 characters long.' }) // Check 2: At least one uppercase letter - .regex(/[A-Z]/, { message: 'Password must contain at least one uppercase letter.' }) + .regex(/[A-Z]/, { error: 'Password must contain at least one uppercase letter.' }) // Check 3: At least one special character .regex(/[!@#$%^&*(),.?":{}|<>]/, { - message: 'Password must contain at least one special character.', + error: 'Password must contain at least one special character.', }) // Check 4: At least one digit - .regex(/[0-9]/, { message: 'Password must contain at least one digit.' }) + .regex(/[0-9]/, { error: 'Password must contain at least one digit.' }) // Check 5: At least one lowercase letter - .regex(/[a-z]/, { message: 'Password must contain at least one lowercase letter.' }); + .regex(/[a-z]/, { error: 'Password must contain at least one lowercase letter.' }); const SignUpFormSchema = z.object({ firstName: z.string({ - required_error: 'First name is required', + error: issue => (issue.input == null ? 'First name is required' : issue.message), }), lastName: z.string({ - required_error: 'Last name is required', + error: issue => (issue.input == null ? 'Last name is required' : issue.message), + }), + email: z.email({ + error: issue => (issue.input == null ? 'Email is required' : 'Invalid email address'), }), - email: z - .string({ - required_error: 'Email is required', - }) - .email('Invalid email address'), password: PasswordStringModel, }); diff --git a/packages/web/app/src/pages/auth-sso.tsx b/packages/web/app/src/pages/auth-sso.tsx index 98a67567234..63df50bd240 100644 --- a/packages/web/app/src/pages/auth-sso.tsx +++ b/packages/web/app/src/pages/auth-sso.tsx @@ -26,7 +26,7 @@ import { Link, Navigate, useRouter } from '@tanstack/react-router'; const SSOFormSchema = z.object({ slug: z .string({ - required_error: 'Slug is required', + error: issue => (issue.input == null ? 'Slug is required' : issue.message), }) .toLowerCase(), }); diff --git a/packages/web/app/src/pages/organization-new.tsx b/packages/web/app/src/pages/organization-new.tsx index aacfa12bd3d..2cc6505586b 100644 --- a/packages/web/app/src/pages/organization-new.tsx +++ b/packages/web/app/src/pages/organization-new.tsx @@ -78,7 +78,7 @@ export const CreateOrganizationMutation = graphql(` const formSchema = z.object({ slug: z .string({ - required_error: 'Organization slug is required', + error: issue => (issue.input == null ? 'Organization slug is required' : issue.message), }) .min(1, 'Organization slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/web/app/src/pages/organization-settings.tsx b/packages/web/app/src/pages/organization-settings.tsx index b529bf8cc83..ba593f23cc1 100644 --- a/packages/web/app/src/pages/organization-settings.tsx +++ b/packages/web/app/src/pages/organization-settings.tsx @@ -195,7 +195,7 @@ const SettingsPageRenderer_OrganizationFragment = graphql(` const SlugFormSchema = z.object({ slug: z .string({ - required_error: 'Organization slug is required', + error: issue => (issue.input == null ? 'Organization slug is required' : issue.message), }) .min(1, 'Organization slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/web/app/src/pages/organization-support.tsx b/packages/web/app/src/pages/organization-support.tsx index 19e873428fe..f2c08a82555 100644 --- a/packages/web/app/src/pages/organization-support.tsx +++ b/packages/web/app/src/pages/organization-support.tsx @@ -48,13 +48,13 @@ import { Link } from '@tanstack/react-router'; const newTicketFormSchema = z.object({ subject: z.string().min(2, { - message: 'Subject must be at least 2 characters.', + error: 'Subject must be at least 2 characters.', }), priority: z.nativeEnum(SupportTicketPriority, { - required_error: 'A priority is required.', + error: issue => (issue.input == null ? 'A priority is required.' : issue.message), }), description: z.string().min(5, { - message: 'Description must be at least 5 characters.', + error: 'Description must be at least 5 characters.', }), }); diff --git a/packages/web/app/src/pages/project-settings.tsx b/packages/web/app/src/pages/project-settings.tsx index ce51dbaa6f8..89988df90aa 100644 --- a/packages/web/app/src/pages/project-settings.tsx +++ b/packages/web/app/src/pages/project-settings.tsx @@ -185,7 +185,7 @@ const ProjectSettingsPage_UpdateProjectSlugMutation = graphql(` const SlugFormSchema = z.object({ slug: z .string({ - required_error: 'Project slug is required', + error: issue => (issue.input == null ? 'Project slug is required' : issue.message), }) .min(1, 'Project slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/web/app/src/pages/target-settings.tsx b/packages/web/app/src/pages/target-settings.tsx index fc95d4fc2a6..dda5dbc04d0 100644 --- a/packages/web/app/src/pages/target-settings.tsx +++ b/packages/web/app/src/pages/target-settings.tsx @@ -1420,7 +1420,7 @@ const AppDeploymentProtection = (props: { const SlugFormSchema = z.object({ slug: z .string({ - required_error: 'Target slug is required', + error: issue => (issue.input == null ? 'Target slug is required' : issue.message), }) .min(1, 'Target slug is required') .max(50, 'Slug must be less than 50 characters') diff --git a/packages/web/app/src/router.tsx b/packages/web/app/src/router.tsx index 65fed41ca88..38522c2bf07 100644 --- a/packages/web/app/src/router.tsx +++ b/packages/web/app/src/router.tsx @@ -271,9 +271,7 @@ const authSSORoute = createRoute({ const AuthOIDCRouteSearch = AuthSharedSearch.extend({ id: z - .string({ - required_error: 'OIDC ID is required', - }) + .string({ error: issue => (issue.input == null ? 'OIDC ID is required' : issue.message) }) .optional(), }); const authOIDCRoute = createRoute({ @@ -403,7 +401,7 @@ const organizationRoute = createRoute({ }); const OrganizationOIDCRequestRouteSearch = z.object({ - id: z.string({ required_error: 'OIDC ID is required' }), + id: z.string({ error: issue => (issue.input == null ? 'OIDC ID is required' : issue.message) }), redirectToPath: z.string().optional().default('/'), }); const organizationOIDCRequestRoute = createRoute({ diff --git a/packages/web/app/src/server/github.ts b/packages/web/app/src/server/github.ts index 5272a7aaf0c..7cb58048dd3 100644 --- a/packages/web/app/src/server/github.ts +++ b/packages/web/app/src/server/github.ts @@ -20,27 +20,25 @@ const GithubIntegration_addGitHubIntegration = graphql(/* GraphQL */ ` const CallbackQuery = z.object({ installation_id: z.string({ - required_error: 'Invalid installation_id', + error: issue => (issue.input == null ? 'Invalid installation_id' : issue.message), }), state: z.string({ - required_error: 'Invalid state', + error: issue => (issue.input == null ? 'Invalid state' : issue.message), }), }); const SetupCallbackQuery = z.object({ installation_id: z.string({ - required_error: 'Invalid installation_id', + error: issue => (issue.input == null ? 'Invalid installation_id' : issue.message), }), state: z - .string({ - required_error: 'Invalid state', - }) + .string({ error: issue => (issue.input == null ? 'Invalid state' : issue.message) }) .optional(), }); const ConnectParams = z.object({ organizationSlug: z.string({ - required_error: 'Invalid organizationSlug', + error: issue => (issue.input == null ? 'Invalid organizationSlug' : issue.message), }), }); @@ -49,7 +47,15 @@ export function connectGithub(server: FastifyInstance) { const queryResult = CallbackQuery.safeParse(req.query); if (!queryResult.success) { - void res.status(400).send(queryResult.error.flatten().fieldErrors); + void res + .status(400) + .send( + Object.fromEntries( + Object.entries(z.treeifyError(queryResult.error).properties ?? {}).map( + ([key, value]) => [key, value.errors], + ), + ), + ); return; } diff --git a/packages/web/app/src/server/lab.ts b/packages/web/app/src/server/lab.ts index 5381a726d93..588b37f868d 100644 --- a/packages/web/app/src/server/lab.ts +++ b/packages/web/app/src/server/lab.ts @@ -17,24 +17,30 @@ const LabEndpoint_GetLab = graphql(/* GraphQL */ ` const LabParams = z.object({ organizationSlug: z.string({ - required_error: - 'Missing organizationSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', + error: issue => + issue.input == null + ? 'Missing organizationSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)' + : issue.message, }), projectSlug: z.string({ - required_error: - 'Missing projectSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', + error: issue => + issue.input == null + ? 'Missing projectSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)' + : issue.message, }), targetSlug: z.string({ - required_error: - 'Missing targetSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)', + error: issue => + issue.input == null + ? 'Missing targetSlug (format /api/lab/:organizationSlug/:projectSlug/:targetSlug)' + : issue.message, }), }); const LabBody = z.object({ query: z.string({ - required_error: 'Missing query', + error: issue => (issue.input == null ? 'Missing query' : issue.message), }), - variables: z.record(z.unknown()).optional(), + variables: z.record(z.string(), z.unknown()).optional(), operationName: z.string().optional(), }); diff --git a/packages/web/app/src/server/slack.ts b/packages/web/app/src/server/slack.ts index f76f4a7581f..3d666a861e0 100644 --- a/packages/web/app/src/server/slack.ts +++ b/packages/web/app/src/server/slack.ts @@ -13,16 +13,14 @@ const SlackIntegration_addSlackIntegration = graphql(/* GraphQL */ ` const CallBackQuery = z.object({ code: z.string({ - required_error: 'Invalid code', - }), - state: z.string({ - required_error: 'Invalid state', + error: issue => (issue.input == null ? 'Invalid code' : issue.message), }), + state: z.string({ error: issue => (issue.input == null ? 'Invalid state' : issue.message) }), }); const ConnectParams = z.object({ organizationSlug: z.string({ - required_error: 'Invalid organizationSlug', + error: issue => (issue.input == null ? 'Invalid organizationSlug' : issue.message), }), }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf253136ce2..0955f0ad4b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -292,7 +292,7 @@ importers: devDependencies: '@graphql-hive/gateway': specifier: 2.10.4 - version: 2.10.4(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/ioredis-mock@8.2.5)(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(ioredis@5.10.1)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(pino@10.3.0)(prom-client@15.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(zod@4.3.6) + version: 2.10.4(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/ioredis-mock@8.2.5)(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(ioredis@5.10.1)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(pino@10.3.0)(prom-client@15.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(zod@4.4.3) '@types/js-yaml': specifier: 4.0.9 version: 4.0.9 @@ -423,8 +423,8 @@ importers: specifier: 4.1.3 version: 4.1.3(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.10.6)(msw@2.12.7(@types/node@25.5.0)(typescript@5.7.3))(vite@7.3.6(@types/node@25.5.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.3)) zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 load-tests/otel-traces: devDependencies: @@ -449,8 +449,8 @@ importers: specifier: 48.13.2 version: 48.13.2(slonik@48.13.2(patch_hash=f3bf6d4d34249f6f9a4647d24fa4af00163597e4c8a5e94e20eca7959f1f2caa)) zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 devDependencies: '@hive/service-common': specifier: workspace:* @@ -563,8 +563,8 @@ importers: specifier: 2.8.1 version: 2.8.1 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 devDependencies: '@types/env-ci': specifier: 3.1.4 @@ -974,8 +974,8 @@ importers: specifier: ^1.1.0 version: 1.1.0(monaco-editor@0.52.2) zod: - specifier: ^4.3.6 - version: 4.3.6 + specifier: 4.4.3 + version: 4.4.3 packages/libraries/pubsub: dependencies: @@ -1114,8 +1114,8 @@ importers: specifier: 5.7.3 version: 5.7.3 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/api: dependencies: @@ -1301,11 +1301,11 @@ importers: specifier: 4.1.3 version: 4.1.3(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.10.6)(msw@2.12.7(@types/node@25.5.0)(typescript@5.7.3))(vite@7.3.6(@types/node@25.5.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.3)) zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 zod-validation-error: - specifier: 3.4.0 - version: 3.4.0(zod@3.25.76) + specifier: 5.0.0 + version: 5.0.0(zod@4.4.3) packages/services/broker-worker: devDependencies: @@ -1340,8 +1340,8 @@ importers: specifier: 0.1.15 version: 0.1.15 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/cdn-worker: devDependencies: @@ -1385,8 +1385,8 @@ importers: specifier: 7.28.0 version: 7.28.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/commerce: devDependencies: @@ -1430,8 +1430,8 @@ importers: specifier: 17.5.0 version: 17.5.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/demo/federation: dependencies: @@ -1479,8 +1479,8 @@ importers: specifier: ^7.17.0 version: 7.18.3 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/policy: devDependencies: @@ -1518,11 +1518,11 @@ importers: specifier: 11.3.0 version: 11.3.0 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 zod-validation-error: - specifier: 3.4.0 - version: 3.4.0(zod@3.25.76) + specifier: 5.0.0 + version: 5.0.0(zod@4.4.3) packages/services/schema: devDependencies: @@ -1587,8 +1587,8 @@ importers: specifier: 0.2.2 version: 0.2.2 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/server: devDependencies: @@ -1707,8 +1707,8 @@ importers: specifier: 0.2.2 version: 0.2.2 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/service-common: dependencies: @@ -1810,8 +1810,8 @@ importers: specifier: 4.1.3 version: 4.1.3(@opentelemetry/api@1.9.1)(@types/node@25.5.0)(happy-dom@20.10.6)(msw@2.12.7(@types/node@25.5.0)(typescript@5.7.3))(vite@7.3.6(@types/node@25.5.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.8.3)) zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/storage: devDependencies: @@ -1852,8 +1852,8 @@ importers: specifier: 5.7.3 version: 5.7.3 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/usage: devDependencies: @@ -1906,8 +1906,8 @@ importers: specifier: 0.2.2 version: 0.2.2 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/usage-common: devDependencies: @@ -1951,8 +1951,8 @@ importers: specifier: 11.4.7 version: 11.4.7 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/services/workflows: devDependencies: @@ -2029,8 +2029,8 @@ importers: specifier: 1.6.1 version: 1.6.1 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 packages/web/app: devDependencies: @@ -2228,7 +2228,7 @@ importers: version: 1.34.9(@tanstack/react-router@1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/zod-adapter': specifier: 1.120.5 - version: 1.120.5(@tanstack/react-router@1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@3.25.76) + version: 1.120.5(@tanstack/react-router@1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@4.4.3) '@theguild/editor': specifier: 1.2.5 version: 1.2.5(patch_hash=a401455daa519af0fe686b4f970a02582f9e406c520aad19273a8eeef8f4adf7)(@monaco-editor/react@4.8.0-rc.2(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@25.5.0)(cosmiconfig-toml-loader@1.0.0)(encoding@0.1.13)(graphql@16.9.0)(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2464,8 +2464,8 @@ importers: specifier: 1.6.1 version: 1.6.1 zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: 4.4.3 + version: 4.4.3 rules: devDependencies: @@ -19492,11 +19492,11 @@ packages: yup@1.6.1: resolution: {integrity: sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==} - zod-validation-error@3.4.0: - resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} + zod-validation-error@5.0.0: + resolution: {integrity: sha512-hmk+pkyKq7Q71PiWVSDUc3VfpzpvcRHZ3QPw9yEMVvmtCekaMeOHnbr3WbxfrgEnQTv6haGP4cmv0Ojmihzsxw==} engines: {node: '>=18.0.0'} peerDependencies: - zod: ^3.18.0 + zod: ^3.25.0 || ^4.0.0 zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} @@ -19504,8 +19504,8 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zone.js@0.15.1: resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} @@ -22650,7 +22650,7 @@ snapshots: - winston - ws - '@graphql-hive/gateway@2.10.4(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/ioredis-mock@8.2.5)(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(ioredis@5.10.1)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(pino@10.3.0)(prom-client@15.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(zod@4.3.6)': + '@graphql-hive/gateway@2.10.4(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/ioredis-mock@8.2.5)(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(ioredis@5.10.1)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(pino@10.3.0)(prom-client@15.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(zod@4.4.3)': dependencies: '@commander-js/extra-typings': 14.0.0(commander@14.0.2) '@envelop/core': 5.5.1 @@ -22664,7 +22664,7 @@ snapshots: '@graphql-hive/plugin-aws-sigv4': 2.0.53(@types/node@24.13.3)(graphql@16.14.2)(ioredis@5.10.1)(pino@10.3.0) '@graphql-hive/plugin-opentelemetry': 1.4.35(graphql@16.14.2)(ioredis@5.10.1)(pino@10.3.0)(ws@8.21.0) '@graphql-hive/pubsub': 2.1.1(ioredis@5.10.1) - '@graphql-hive/render-laboratory': 0.1.10(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql-yoga@5.21.1(graphql@16.14.2))(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.3.6) + '@graphql-hive/render-laboratory': 0.1.10(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql-yoga@5.21.1(graphql@16.14.2))(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.4.3) '@graphql-hive/signal': 2.0.0 '@graphql-mesh/cache-cfw-kv': 0.105.36(graphql@16.14.2)(ioredis@5.10.1) '@graphql-mesh/cache-localforage': 0.105.37(graphql@16.14.2)(ioredis@5.10.1) @@ -22738,7 +22738,7 @@ snapshots: '@graphql-hive/importer@2.0.0': {} - '@graphql-hive/laboratory@0.1.9(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.3.6)': + '@graphql-hive/laboratory@0.1.9(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.4.3)': dependencies: '@base-ui/react': 1.1.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@graphql-tools/url-loader': 9.1.0(@types/node@24.13.3)(graphql@16.14.2) @@ -22753,7 +22753,7 @@ snapshots: subscriptions-transport-ws: 0.11.0(graphql@16.14.2) tslib: 2.8.1 uuid: 14.0.0 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' @@ -22874,9 +22874,9 @@ snapshots: optionalDependencies: ioredis: 5.10.1 - '@graphql-hive/render-laboratory@0.1.10(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql-yoga@5.21.1(graphql@16.14.2))(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.3.6)': + '@graphql-hive/render-laboratory@0.1.10(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql-yoga@5.21.1(graphql@16.14.2))(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.4.3)': dependencies: - '@graphql-hive/laboratory': 0.1.9(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.3.6) + '@graphql-hive/laboratory': 0.1.9(@tanstack/react-form@1.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/node@24.13.3)(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(date-fns@4.1.0)(graphql@16.14.2)(lucide-react@0.548.0(react@18.3.1))(lz-string@1.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.14.2))(tslib@2.8.1)(zod@4.4.3) graphql-yoga: 5.21.1(graphql@16.14.2) transitivePeerDependencies: - '@fastify/websocket' @@ -30392,54 +30392,54 @@ snapshots: - debug - supports-color - '@slonik/driver@48.13.2(zod@4.3.6)': + '@slonik/driver@48.13.2(zod@4.4.3)': dependencies: - '@slonik/types': 48.13.2(zod@4.3.6) - '@slonik/utilities': 48.13.2(zod@4.3.6) + '@slonik/types': 48.13.2(zod@4.4.3) + '@slonik/utilities': 48.13.2(zod@4.4.3) roarr: 7.21.4 serialize-error: 12.0.0 strict-event-emitter-types: 2.0.0 - zod: 4.3.6 + zod: 4.4.3 - '@slonik/errors@48.13.2(zod@4.3.6)': + '@slonik/errors@48.13.2(zod@4.4.3)': dependencies: - '@slonik/types': 48.13.2(zod@4.3.6) + '@slonik/types': 48.13.2(zod@4.4.3) transitivePeerDependencies: - zod - '@slonik/pg-driver@48.13.2(patch_hash=c9e1450b7d73280ac4a32ed554a05495054e82c2d65086f19d80c90bbf80d488)(zod@4.3.6)': + '@slonik/pg-driver@48.13.2(patch_hash=c9e1450b7d73280ac4a32ed554a05495054e82c2d65086f19d80c90bbf80d488)(zod@4.4.3)': dependencies: - '@slonik/driver': 48.13.2(zod@4.3.6) - '@slonik/errors': 48.13.2(zod@4.3.6) + '@slonik/driver': 48.13.2(zod@4.4.3) + '@slonik/errors': 48.13.2(zod@4.4.3) '@slonik/sql-tag': 48.13.2 - '@slonik/types': 48.13.2(zod@4.3.6) - '@slonik/utilities': 48.13.2(zod@4.3.6) + '@slonik/types': 48.13.2(zod@4.4.3) + '@slonik/utilities': 48.13.2(zod@4.4.3) pg: 8.20.0 pg-query-stream: 4.14.0(pg@8.20.0) pg-types: 4.1.0 postgres-array: 3.0.4 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - pg-native '@slonik/sql-tag@48.13.2': dependencies: - '@slonik/errors': 48.13.2(zod@4.3.6) - '@slonik/types': 48.13.2(zod@4.3.6) + '@slonik/errors': 48.13.2(zod@4.4.3) + '@slonik/types': 48.13.2(zod@4.4.3) roarr: 7.21.4 safe-stable-stringify: 2.5.0 serialize-error: 12.0.0 - zod: 4.3.6 + zod: 4.4.3 - '@slonik/types@48.13.2(zod@4.3.6)': + '@slonik/types@48.13.2(zod@4.4.3)': dependencies: - zod: 4.3.6 + zod: 4.4.3 - '@slonik/utilities@48.13.2(zod@4.3.6)': + '@slonik/utilities@48.13.2(zod@4.4.3)': dependencies: - '@slonik/errors': 48.13.2(zod@4.3.6) - '@slonik/types': 48.13.2(zod@4.3.6) - zod: 4.3.6 + '@slonik/errors': 48.13.2(zod@4.4.3) + '@slonik/types': 48.13.2(zod@4.4.3) + zod: 4.4.3 '@smithy/abort-controller@4.2.8': dependencies: @@ -31539,10 +31539,10 @@ snapshots: '@tanstack/virtual-file-routes@1.154.7': {} - '@tanstack/zod-adapter@1.120.5(@tanstack/react-router@1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@3.25.76)': + '@tanstack/zod-adapter@1.120.5(@tanstack/react-router@1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(zod@4.4.3)': dependencies: '@tanstack/react-router': 1.34.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zod: 3.25.76 + zod: 4.4.3 '@testing-library/dom@10.4.1': dependencies: @@ -40706,11 +40706,11 @@ snapshots: slonik@48.13.2(patch_hash=f3bf6d4d34249f6f9a4647d24fa4af00163597e4c8a5e94e20eca7959f1f2caa): dependencies: '@opentelemetry/api': 1.9.0 - '@slonik/driver': 48.13.2(zod@4.3.6) - '@slonik/errors': 48.13.2(zod@4.3.6) - '@slonik/pg-driver': 48.13.2(patch_hash=c9e1450b7d73280ac4a32ed554a05495054e82c2d65086f19d80c90bbf80d488)(zod@4.3.6) + '@slonik/driver': 48.13.2(zod@4.4.3) + '@slonik/errors': 48.13.2(zod@4.4.3) + '@slonik/pg-driver': 48.13.2(patch_hash=c9e1450b7d73280ac4a32ed554a05495054e82c2d65086f19d80c90bbf80d488)(zod@4.4.3) '@slonik/sql-tag': 48.13.2 - '@slonik/utilities': 48.13.2(zod@4.3.6) + '@slonik/utilities': 48.13.2(zod@4.4.3) '@standard-schema/spec': 1.0.0 iso8601-duration: 2.1.3 p-limit: 6.2.0 @@ -40718,7 +40718,7 @@ snapshots: roarr: 7.21.4 serialize-error: 12.0.0 strict-event-emitter-types: 2.0.0 - zod: 4.3.6 + zod: 4.4.3 transitivePeerDependencies: - pg-native @@ -42410,15 +42410,15 @@ snapshots: toposort: 2.0.2 type-fest: 2.19.0 - zod-validation-error@3.4.0(zod@3.25.76): + zod-validation-error@5.0.0(zod@4.4.3): dependencies: - zod: 3.25.76 + zod: 4.4.3 zod@3.22.3: {} zod@3.25.76: {} - zod@4.3.6: {} + zod@4.4.3: {} zone.js@0.15.1: {}