From 7769b641d8bdf622c84380a5bb8c3dbfa6504f56 Mon Sep 17 00:00:00 2001 From: Nubami SQReder Date: Wed, 4 Sep 2024 08:38:15 +0300 Subject: [PATCH] fix/zod contracts lose branding (#513) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: #511 use type inference from zod in zodContract * fix zodContracts output type inference * fix: Import missing type * Update quick-adults-punch.md * Format --------- Co-authored-by: Igor Kamyşev --- .changeset/quick-adults-punch.md | 5 +++++ packages/zod/src/__tests__/contract.test-d.ts | 13 +++++++++++++ packages/zod/src/zod_contract.ts | 8 +++++--- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 .changeset/quick-adults-punch.md diff --git a/.changeset/quick-adults-punch.md b/.changeset/quick-adults-punch.md new file mode 100644 index 000000000..7a175d1a4 --- /dev/null +++ b/.changeset/quick-adults-punch.md @@ -0,0 +1,5 @@ +--- +"@farfetched/zod": patch +--- + +Fix `zodContracts` type inference for branded types diff --git a/packages/zod/src/__tests__/contract.test-d.ts b/packages/zod/src/__tests__/contract.test-d.ts index 813e9f937..c9d3b854e 100644 --- a/packages/zod/src/__tests__/contract.test-d.ts +++ b/packages/zod/src/__tests__/contract.test-d.ts @@ -58,4 +58,17 @@ describe('zodContract', () => { >(); } }); + + test('branded type', () => { + const BrandedContainer = zod.object({ + branded: zod.string().brand<'Branded'>(), + }); + const brandedContract = zodContract(BrandedContainer); + + const smth: unknown = { branded: 'branded' }; + + if (brandedContract.isData(smth)) { + expectTypeOf(smth).toEqualTypeOf>(); + } + }); }); diff --git a/packages/zod/src/zod_contract.ts b/packages/zod/src/zod_contract.ts index 4006555f3..7e69a9956 100644 --- a/packages/zod/src/zod_contract.ts +++ b/packages/zod/src/zod_contract.ts @@ -1,4 +1,4 @@ -import { type ZodType } from 'zod'; +import { type ZodType, type TypeOf } from 'zod'; import { type Contract } from '@farfetched/core'; /** @@ -7,8 +7,10 @@ import { type Contract } from '@farfetched/core'; * * @param {ZodType} data Zod Contract for valid data */ -function zodContract(data: ZodType): Contract { - function isData(prepared: unknown): prepared is D { +function zodContract>( + data: T +): Contract> { + function isData(prepared: unknown): prepared is T { return data.safeParse(prepared).success; }