diff --git a/package.json b/package.json index aba65652..6f91a3ce 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "format": "oxfmt .", "knip": "knip", "lint": "oxlint .", - "prepare": "lefthook install", + "prepare": "lefthook install --reset-hooks-path", "release": "pnpm build && changeset publish", "test": "turbo run test", "test:integration": "turbo run test:integration", diff --git a/packages/worker/src/__tests__/child-wire.inprocess.spec.ts b/packages/worker/src/__tests__/child-wire.inprocess.spec.ts index 60ee491e..5241f6f7 100644 --- a/packages/worker/src/__tests__/child-wire.inprocess.spec.ts +++ b/packages/worker/src/__tests__/child-wire.inprocess.spec.ts @@ -112,8 +112,8 @@ describe("workflow entry point — wire format against a real server", () => { const cause = (result.error as WorkflowFailedError).cause; expect(cause).toBeInstanceOf(ApplicationFailure); expect((cause as ApplicationFailure).type).toBe("WorkflowOutputValidationError"); - expect((cause as ApplicationFailure).message).toBe( - 'Workflow "entryInvalidOutput" output validation failed: at n: Invalid input', + expect((cause as ApplicationFailure).message).toMatch( + /Workflow "entryInvalidOutput" output validation failed: at n: (?:Invalid input|expected number, received string)/, ); }); }); @@ -297,8 +297,8 @@ describe("child-workflow boundary — wire format against a real server", () => // EFFECT 1: the send was rejected client-side with the SAME typed // classification and message `createTypedChildSignals` produces — // naming the child workflow, the signal, and the failing field. - expect(result.sendError).toBe( - 'Child workflow "signalful" signal "note" input validation failed: at text: Invalid input', + expect(result.sendError).toMatch( + /Child workflow "signalful" signal "note" input validation failed: at text: (?:Invalid input|expected string, received number)/, ); // EFFECT 2 (corroborating): the child's OWN completed output shows it // never received a note. diff --git a/packages/worker/src/__tests__/continue-as-new.inprocess.spec.ts b/packages/worker/src/__tests__/continue-as-new.inprocess.spec.ts index 0eeb5ee8..1561deb0 100644 --- a/packages/worker/src/__tests__/continue-as-new.inprocess.spec.ts +++ b/packages/worker/src/__tests__/continue-as-new.inprocess.spec.ts @@ -162,8 +162,8 @@ describe("continue-as-new against a real server", () => { const cause = (result.error as WorkflowFailedError).cause; expect(cause).toBeInstanceOf(ApplicationFailure); expect((cause as ApplicationFailure).type).toBe("WorkflowInputValidationError"); - expect((cause as ApplicationFailure).message).toBe( - 'Workflow "invalidContinuation" input validation failed: at n: Invalid input', + expect((cause as ApplicationFailure).message).toMatch( + /Workflow "invalidContinuation" input validation failed: at n: (?:Invalid input|expected number, received string)/, ); // EFFECT (send-side guard, not just the receive-side echo of it): the @@ -275,8 +275,8 @@ describe("continue-as-new against a real server", () => { const cause = (result.error as WorkflowFailedError).cause; expect(cause).toBeInstanceOf(ApplicationFailure); expect((cause as ApplicationFailure).type).toBe("WorkflowInputValidationError"); - expect((cause as ApplicationFailure).message).toBe( - 'Workflow "archive" input validation failed: at batchId: Invalid input', + expect((cause as ApplicationFailure).message).toMatch( + /Workflow "archive" input validation failed: at batchId: (?:Invalid input|expected string, received number)/, ); // EFFECT (send-side guard, not just the receive-side echo of it): the diff --git a/packages/worker/src/__tests__/handlers.inprocess.spec.ts b/packages/worker/src/__tests__/handlers.inprocess.spec.ts index b9afb2e8..3be29d53 100644 --- a/packages/worker/src/__tests__/handlers.inprocess.spec.ts +++ b/packages/worker/src/__tests__/handlers.inprocess.spec.ts @@ -135,8 +135,8 @@ describe("handler binding against a real server", () => { const dropped = capturedLogs.find( (l) => l.level === "WARN" && l.message.includes('Dropped signal "bump"'), ); - expect(dropped?.message).toBe( - 'Dropped signal "bump": input validation failed: at by: Invalid input', + expect(dropped?.message).toMatch( + /Dropped signal "bump": input validation failed: at by: (?:Invalid input|Too small: expected number to be >0)/, ); } finally { restoreLogger(); @@ -198,8 +198,8 @@ describe("handler binding against a real server", () => { // naming the query) — not some other failure mode (e.g. an // unregistered handler, which would carry a different message). expect(rejected).toBeInstanceOf(ServiceError); - expect((rejected as ServiceError).cause?.message).toContain( - 'Query "describe" input validation failed: Invalid input', + expect((rejected as ServiceError).cause?.message).toMatch( + /Query "describe" input validation failed: (?:Invalid input|Too small: expected string to have >=1 characters)/, ); await handle.signals.finish(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af3e4f83..e30f3e02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,8 +139,8 @@ catalogs: specifier: 4.1.10 version: 4.1.10 zod: - specifier: 4.4.3 - version: 4.4.3 + specifier: 4.5.4 + version: 4.5.4 overrides: fast-uri@<3.1.6: 3.1.6 @@ -263,7 +263,7 @@ importers: version: 5.7.0 zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 devDependencies: '@btravstack/tsconfig': specifier: 'catalog:' @@ -285,7 +285,7 @@ importers: version: link:../../packages/contract zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 devDependencies: '@btravstack/tsconfig': specifier: 'catalog:' @@ -325,7 +325,7 @@ importers: version: 5.7.0 zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 devDependencies: '@btravstack/tsconfig': specifier: 'catalog:' @@ -423,7 +423,7 @@ importers: version: 4.1.10(@types/node@26.4.0)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.13)(yaml@2.9.0) zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 packages/contract: dependencies: @@ -478,7 +478,7 @@ importers: version: 4.1.10(@types/node@26.4.0)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.13)(yaml@2.9.0) zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 packages/testing: devDependencies: @@ -538,7 +538,7 @@ importers: version: 4.1.10(@types/node@26.4.0)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.13)(yaml@2.9.0) zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 packages/worker: dependencies: @@ -614,7 +614,7 @@ importers: version: 4.1.10(@types/node@26.4.0)(@vitest/coverage-v8@4.1.10)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.13)(yaml@2.9.0) zod: specifier: 'catalog:' - version: 4.4.3 + version: 4.5.4 packages: @@ -5716,6 +5716,9 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -10866,4 +10869,6 @@ snapshots: zod@4.4.3: {} + zod@4.5.4: {} + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 939a9b6a..e73f7b98 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -54,7 +54,7 @@ catalog: vitepress: 1.6.4 vitepress-plugin-mermaid: 2.0.17 vitest: 4.1.10 - zod: 4.4.3 + zod: 4.5.4 peerDependencyRules: ignoreMissing: