diff --git a/README.md b/README.md index 9e42eff..f477ec6 100644 --- a/README.md +++ b/README.md @@ -289,13 +289,13 @@ I have attempted to recreate what I have done at work with the help of **ChatGPT } ``` -### Apply Conditional Requirements (needs improvement) +### Make Conditional Schema Transformer -You can apply conditional requirements to a Zod schema using the applyConditionalRequirements function. (Didn't work in improving it, generated by ChatGPT as is) +You can make conditional schema transfer using data early and later use the transformer taking `schema` and `config` with conditionals (`requiredIf`). ```ts import { z } from 'zod'; -import { applyConditionalRequirements } from 'adaptate'; +import { makeConditionalSchemaTransformer } from 'adaptate'; const schema = z.object({ firstName: z.string().optional(), @@ -311,18 +311,25 @@ const schema = z.object({ }); const config = { - age: true, - // explicit firstName: { requiredIf: (data: any) => data.age > 18, }, - // or implicit - secondName: (data) => !!data.firstName, + age: true, + secondName: (data: any) => !!data.firstName, }; -const data = { age: 20 }; +let firstNameRequiredData = { + firstName: 'John', + age: 20, +}; +let secondNameRequiredData = { + firstName: 'Peram', +}; -const updatedSchema = applyConditionalRequirements(schema, config, data); +makeConditionalSchemaTransformer({ + ...firstNameRequiredData, + age: 10, +})(schema, config).run(); ``` ### Converting OpenAPI Schema to Zod Schema (most commonly needed) diff --git a/packages/core/src/__tests__/index.test.ts b/packages/core/src/__tests__/index.test.ts index ed550aa..cdb9b17 100644 --- a/packages/core/src/__tests__/index.test.ts +++ b/packages/core/src/__tests__/index.test.ts @@ -384,6 +384,7 @@ describe('makeConditionalSchemaTransformer', () => { const schema = z.object({ firstName: z.string().optional(), secondName: z.string().optional(), + parentContactNumber: z.number().optional(), age: z.number().optional(), address: z .object({ @@ -395,26 +396,27 @@ describe('makeConditionalSchemaTransformer', () => { }); const config = { - firstName: { - requiredIf: (data: any) => data.age > 18, + parentContactNumber: { + requiredIf: (data: any) => data.age < 18, }, age: true, secondName: (data: any) => !!data.firstName, }; let firstNameRequiredData = { - firstName: 'John', - age: 20, + firstName: 'Mario', + age: 17, }; let secondNameRequiredData = { firstName: 'Peram', + age: 24, }; expect(() => - makeConditionalSchemaTransformer({ - ...firstNameRequiredData, - age: 10, - })(schema, config).run() + makeConditionalSchemaTransformer(firstNameRequiredData)( + schema, + config + ).run() ).toThrowErrorMatchingInlineSnapshot(` [ZodError: [ { @@ -425,6 +427,15 @@ describe('makeConditionalSchemaTransformer', () => { "secondName" ], "message": "Required" + }, + { + "code": "invalid_type", + "expected": "number", + "received": "undefined", + "path": [ + "parentContactNumber" + ], + "message": "Required" } ]] `); @@ -444,15 +455,6 @@ describe('makeConditionalSchemaTransformer', () => { "secondName" ], "message": "Required" - }, - { - "code": "invalid_type", - "expected": "number", - "received": "undefined", - "path": [ - "age" - ], - "message": "Required" } ]] `);