Skip to content

Commit b57abca

Browse files
committed
added buildInputFields method for commonality
1 parent c939e13 commit b57abca

File tree

5 files changed

+91
-121
lines changed

5 files changed

+91
-121
lines changed

example/yup/schemas.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ export function MyTypeSchema(): yup.ObjectSchema<MyType> {
8989

9090
export function MyTypeFooArgsSchema(): yup.ObjectSchema<MyTypeFooArgs> {
9191
return yup.object({
92-
a: yup.string().defined().nullable(),
92+
a: yup.string().defined().nullable().optional(),
9393
b: yup.number().defined().nonNullable(),
94-
c: yup.boolean().defined().nullable(),
94+
c: yup.boolean().defined().nullable().optional(),
9595
d: yup.number().defined().nonNullable()
9696
})
9797
}

src/myzod/index.ts

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,25 +45,7 @@ export class MyZodSchemaVisitor extends BaseSchemaVisitor {
4545
const visitor = this.createVisitor('input');
4646
const name = visitor.convertName(node.name.value);
4747
this.importTypes.push(name);
48-
49-
const shape = node.fields?.map(field => generateFieldMyZodSchema(this.config, visitor, field, 2)).join(',\n');
50-
51-
switch (this.config.validationSchemaExportType) {
52-
case 'const':
53-
return new DeclarationBlock({})
54-
.export()
55-
.asKind('const')
56-
.withName(`${name}Schema: myzod.Type<${name}>`)
57-
.withContent(['myzod.object({', shape, '})'].join('\n')).string;
58-
59-
case 'function':
60-
default:
61-
return new DeclarationBlock({})
62-
.export()
63-
.asKind('function')
64-
.withName(`${name}Schema(): myzod.Type<${name}>`)
65-
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
66-
}
48+
return this.buildInputFields(node.fields ?? [], visitor, name);
6749
},
6850
};
6951
}
@@ -78,24 +60,7 @@ export class MyZodSchemaVisitor extends BaseSchemaVisitor {
7860
// Building schema for field arguments.
7961
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
8062
this.importTypes.push(typeName);
81-
const args = field.arguments ?? [];
82-
const shape = args.map(field => generateFieldMyZodSchema(this.config, visitor, field, 2)).join(',\n');
83-
switch (this.config.validationSchemaExportType) {
84-
case 'const':
85-
return new DeclarationBlock({})
86-
.export()
87-
.asKind('const')
88-
.withName(`${typeName}Schema: myzod.Type<${typeName}>`)
89-
.withContent([`myzod.object({`, shape, '})'].join('\n')).string;
90-
91-
case 'function':
92-
default:
93-
return new DeclarationBlock({})
94-
.export()
95-
.asKind('function')
96-
.withName(`${typeName}Schema(): myzod.Type<${typeName}>`)
97-
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
98-
}
63+
return this.buildInputFields(field.arguments ?? [], visitor, typeName);
9964
});
10065
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
10166

@@ -210,6 +175,31 @@ export class MyZodSchemaVisitor extends BaseSchemaVisitor {
210175
},
211176
};
212177
}
178+
179+
private buildInputFields(
180+
fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[],
181+
visitor: Visitor,
182+
name: string
183+
) {
184+
const shape = fields.map(field => generateFieldMyZodSchema(this.config, visitor, field, 2)).join(',\n');
185+
186+
switch (this.config.validationSchemaExportType) {
187+
case 'const':
188+
return new DeclarationBlock({})
189+
.export()
190+
.asKind('const')
191+
.withName(`${name}Schema: myzod.Type<${name}>`)
192+
.withContent(['myzod.object({', shape, '})'].join('\n')).string;
193+
194+
case 'function':
195+
default:
196+
return new DeclarationBlock({})
197+
.export()
198+
.asKind('function')
199+
.withName(`${name}Schema(): myzod.Type<${name}>`)
200+
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
201+
}
202+
}
213203
}
214204

215205
const generateFieldMyZodSchema = (

src/yup/index.ts

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -51,30 +51,7 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
5151
const visitor = this.createVisitor('input');
5252
const name = visitor.convertName(node.name.value);
5353
this.importTypes.push(name);
54-
55-
const shape = node.fields
56-
?.map(field => {
57-
const fieldSchema = generateFieldYupSchema(this.config, visitor, field, 2);
58-
return isNonNullType(field.type) ? fieldSchema : `${fieldSchema}.optional()`;
59-
})
60-
.join(',\n');
61-
62-
switch (this.config.validationSchemaExportType) {
63-
case 'const':
64-
return new DeclarationBlock({})
65-
.export()
66-
.asKind('const')
67-
.withName(`${name}Schema: yup.ObjectSchema<${name}>`)
68-
.withContent(['yup.object({', shape, '})'].join('\n')).string;
69-
70-
case 'function':
71-
default:
72-
return new DeclarationBlock({})
73-
.export()
74-
.asKind('function')
75-
.withName(`${name}Schema(): yup.ObjectSchema<${name}>`)
76-
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
77-
}
54+
return this.buildInputFields(node.fields ?? [], visitor, name);
7855
},
7956
};
8057
}
@@ -89,24 +66,7 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
8966
// Building schema for field arguments.
9067
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
9168
this.importTypes.push(typeName);
92-
const args = field.arguments ?? [];
93-
const shape = args.map(field => generateFieldYupSchema(this.config, visitor, field, 2)).join(',\n');
94-
switch (this.config.validationSchemaExportType) {
95-
case 'const':
96-
return new DeclarationBlock({})
97-
.export()
98-
.asKind('const')
99-
.withName(`${typeName}Schema: yup.ObjectSchema<${typeName}>`)
100-
.withContent([`yup.object({`, shape, '})'].join('\n')).string;
101-
102-
case 'function':
103-
default:
104-
return new DeclarationBlock({})
105-
.export()
106-
.asKind('function')
107-
.withName(`${typeName}Schema(): yup.ObjectSchema<${typeName}>`)
108-
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
109-
}
69+
return this.buildInputFields(field.arguments ?? [], visitor, typeName);
11070
});
11171
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
11272

@@ -240,6 +200,36 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
240200
},
241201
};
242202
}
203+
204+
private buildInputFields(
205+
fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[],
206+
visitor: Visitor,
207+
name: string
208+
) {
209+
const shape = fields
210+
?.map(field => {
211+
const fieldSchema = generateFieldYupSchema(this.config, visitor, field, 2);
212+
return isNonNullType(field.type) ? fieldSchema : `${fieldSchema}.optional()`;
213+
})
214+
.join(',\n');
215+
216+
switch (this.config.validationSchemaExportType) {
217+
case 'const':
218+
return new DeclarationBlock({})
219+
.export()
220+
.asKind('const')
221+
.withName(`${name}Schema: yup.ObjectSchema<${name}>`)
222+
.withContent(['yup.object({', shape, '})'].join('\n')).string;
223+
224+
case 'function':
225+
default:
226+
return new DeclarationBlock({})
227+
.export()
228+
.asKind('function')
229+
.withName(`${name}Schema(): yup.ObjectSchema<${name}>`)
230+
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
231+
}
232+
}
243233
}
244234

245235
const generateFieldYupSchema = (

src/zod/index.ts

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -61,25 +61,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor {
6161
const visitor = this.createVisitor('input');
6262
const name = visitor.convertName(node.name.value);
6363
this.importTypes.push(name);
64-
65-
const shape = node.fields?.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n');
66-
67-
switch (this.config.validationSchemaExportType) {
68-
case 'const':
69-
return new DeclarationBlock({})
70-
.export()
71-
.asKind('const')
72-
.withName(`${name}Schema: z.ZodObject<Properties<${name}>>`)
73-
.withContent(['z.object({', shape, '})'].join('\n')).string;
74-
75-
case 'function':
76-
default:
77-
return new DeclarationBlock({})
78-
.export()
79-
.asKind('function')
80-
.withName(`${name}Schema(): z.ZodObject<Properties<${name}>>`)
81-
.withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')).string;
82-
}
64+
return this.buildInputFields(node.fields ?? [], visitor, name);
8365
},
8466
};
8567
}
@@ -94,24 +76,7 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor {
9476
// Building schema for field arguments.
9577
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
9678
this.importTypes.push(typeName);
97-
const args = field.arguments ?? [];
98-
const shape = args.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n');
99-
switch (this.config.validationSchemaExportType) {
100-
case 'const':
101-
return new DeclarationBlock({})
102-
.export()
103-
.asKind('const')
104-
.withName(`${typeName}Schema: z.ZodObject<Properties<${typeName}>>`)
105-
.withContent([`z.object({`, shape, '})'].join('\n')).string;
106-
107-
case 'function':
108-
default:
109-
return new DeclarationBlock({})
110-
.export()
111-
.asKind('function')
112-
.withName(`${typeName}Schema(): z.ZodObject<Properties<${typeName}>>`)
113-
.withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')).string;
114-
}
79+
return this.buildInputFields(field.arguments ?? [], visitor, typeName);
11580
});
11681
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
11782

@@ -223,6 +188,31 @@ export class ZodSchemaVisitor extends BaseSchemaVisitor {
223188
},
224189
};
225190
}
191+
192+
private buildInputFields(
193+
fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[],
194+
visitor: Visitor,
195+
name: string
196+
) {
197+
const shape = fields.map(field => generateFieldZodSchema(this.config, visitor, field, 2)).join(',\n');
198+
199+
switch (this.config.validationSchemaExportType) {
200+
case 'const':
201+
return new DeclarationBlock({})
202+
.export()
203+
.asKind('const')
204+
.withName(`${name}Schema: z.ZodObject<Properties<${name}>>`)
205+
.withContent(['z.object({', shape, '})'].join('\n')).string;
206+
207+
case 'function':
208+
default:
209+
return new DeclarationBlock({})
210+
.export()
211+
.asKind('function')
212+
.withName(`${name}Schema(): z.ZodObject<Properties<${name}>>`)
213+
.withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')).string;
214+
}
215+
}
226216
}
227217

228218
const generateFieldZodSchema = (

tests/yup.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,11 @@ describe('yup', () => {
740740
const wantContain = dedent`
741741
export function MyTypeFooArgsSchema(): yup.ObjectSchema<MyTypeFooArgs> {
742742
return yup.object({
743-
a: yup.string().defined().nullable(),
743+
a: yup.string().defined().nullable().optional(),
744744
b: yup.number().defined().nonNullable(),
745-
c: yup.boolean().defined().nullable(),
745+
c: yup.boolean().defined().nullable().optional(),
746746
d: yup.number().defined().nonNullable(),
747-
e: yup.string().defined().nullable()
747+
e: yup.string().defined().nullable().optional()
748748
})
749749
}`;
750750
expect(result.content).toContain(wantContain);

0 commit comments

Comments
 (0)