Skip to content

Commit 3b531d0

Browse files
committed
implemented to build variable schema
1 parent 5ed53b5 commit 3b531d0

File tree

4 files changed

+185
-70
lines changed

4 files changed

+185
-70
lines changed

src/myzod/index.ts

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -73,37 +73,66 @@ export const MyZodSchemaVisitor = (schema: GraphQLSchema, config: ValidationSche
7373
const name = visitor.convertName(node.name.value);
7474
importTypes.push(name);
7575

76+
// Building schema for field arguments.
77+
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
78+
importTypes.push(typeName);
79+
const args = field.arguments ?? [];
80+
const shape = args.map(field => generateFieldMyZodSchema(config, visitor, field, 2)).join(',\n');
81+
switch (config.validationSchemaExportType) {
82+
case 'const':
83+
return new DeclarationBlock({})
84+
.export()
85+
.asKind('const')
86+
.withName(`${typeName}Schema: myzod.Type<${typeName}>`)
87+
.withContent([`myzod.object({`, shape, '})'].join('\n')).string;
88+
89+
case 'function':
90+
default:
91+
return new DeclarationBlock({})
92+
.export()
93+
.asKind('function')
94+
.withName(`${typeName}Schema(): myzod.Type<${typeName}>`)
95+
.withBlock([indent(`return myzod.object({`), shape, indent('})')].join('\n')).string;
96+
}
97+
});
98+
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
99+
100+
// Building schema for fields.
76101
const shape = node.fields?.map(field => generateFieldMyZodSchema(config, visitor, field, 2)).join(',\n');
77102

78103
switch (config.validationSchemaExportType) {
79104
case 'const':
80-
return new DeclarationBlock({})
81-
.export()
82-
.asKind('const')
83-
.withName(`${name}Schema: myzod.Type<${name}>`)
84-
.withContent(
85-
[
86-
`myzod.object({`,
87-
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
88-
shape,
89-
'})',
90-
].join('\n')
91-
).string;
105+
return (
106+
new DeclarationBlock({})
107+
.export()
108+
.asKind('const')
109+
.withName(`${name}Schema: myzod.Type<${name}>`)
110+
.withContent(
111+
[
112+
`myzod.object({`,
113+
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
114+
shape,
115+
'})',
116+
].join('\n')
117+
).string + appendArguments
118+
);
92119

93120
case 'function':
94121
default:
95-
return new DeclarationBlock({})
96-
.export()
97-
.asKind('function')
98-
.withName(`${name}Schema(): myzod.Type<${name}>`)
99-
.withBlock(
100-
[
101-
indent(`return myzod.object({`),
102-
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
103-
shape,
104-
indent('})'),
105-
].join('\n')
106-
).string;
122+
return (
123+
new DeclarationBlock({})
124+
.export()
125+
.asKind('function')
126+
.withName(`${name}Schema(): myzod.Type<${name}>`)
127+
.withBlock(
128+
[
129+
indent(`return myzod.object({`),
130+
indent(`__typename: myzod.literal('${node.name.value}').optional(),`, 2),
131+
shape,
132+
indent('})'),
133+
].join('\n')
134+
).string + appendArguments
135+
);
107136
}
108137
}),
109138
},

src/visitor.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { TsVisitor } from '@graphql-codegen/typescript';
2-
import { GraphQLSchema, NameNode, specifiedScalarTypes } from 'graphql';
2+
import { FieldDefinitionNode, GraphQLSchema, NameNode, ObjectTypeDefinitionNode, specifiedScalarTypes } from 'graphql';
33

44
import { ValidationSchemaPluginConfig } from './config';
55

@@ -50,4 +50,28 @@ export class Visitor extends TsVisitor {
5050
const tsType = this.getScalarType(name);
5151
return tsType === 'string';
5252
}
53+
54+
public buildArgumentsSchemaBlock(
55+
node: ObjectTypeDefinitionNode,
56+
callback: (typeName: string, field: FieldDefinitionNode) => string
57+
) {
58+
const fieldsWithArguments = node.fields?.filter(field => field.arguments && field.arguments.length > 0) ?? [];
59+
if (fieldsWithArguments.length === 0) {
60+
return undefined;
61+
}
62+
return fieldsWithArguments
63+
.map(field => {
64+
const name =
65+
node.name.value +
66+
(this.config.addUnderscoreToArgsType ? '_' : '') +
67+
this.convertName(field, {
68+
useTypesPrefix: false,
69+
useTypesSuffix: false,
70+
}) +
71+
'Args';
72+
73+
return callback(name, field);
74+
})
75+
.join('\n');
76+
}
5377
}

src/yup/index.ts

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,32 @@ export const YupSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchema
8888
const name = visitor.convertName(node.name.value);
8989
importTypes.push(name);
9090

91+
// Building schema for field arguments.
92+
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
93+
importTypes.push(typeName);
94+
const args = field.arguments ?? [];
95+
const shape = args.map(field => generateFieldYupSchema(config, visitor, field, 2)).join(',\n');
96+
switch (config.validationSchemaExportType) {
97+
case 'const':
98+
return new DeclarationBlock({})
99+
.export()
100+
.asKind('const')
101+
.withName(`${typeName}Schema: yup.ObjectSchema<${typeName}>`)
102+
.withContent([`yup.object({`, shape, '})'].join('\n')).string;
103+
104+
case 'function':
105+
default:
106+
return new DeclarationBlock({})
107+
.export()
108+
.asKind('function')
109+
.withName(`${typeName}Schema(): yup.ObjectSchema<${typeName}>`)
110+
.withBlock([indent(`return yup.object({`), shape, indent('})')].join('\n')).string;
111+
}
112+
});
113+
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
114+
115+
// Building schema for fields.
116+
91117
const shape = node.fields
92118
?.map(field => {
93119
const fieldSchema = generateFieldYupSchema(config, visitor, field, 2);
@@ -97,33 +123,37 @@ export const YupSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchema
97123

98124
switch (config.validationSchemaExportType) {
99125
case 'const':
100-
return new DeclarationBlock({})
101-
.export()
102-
.asKind('const')
103-
.withName(`${name}Schema: yup.ObjectSchema<${name}>`)
104-
.withContent(
105-
[
106-
`yup.object({`,
107-
indent(`__typename: yup.string<'${node.name.value}'>().optional(),`, 2),
108-
shape,
109-
'})',
110-
].join('\n')
111-
).string;
126+
return (
127+
new DeclarationBlock({})
128+
.export()
129+
.asKind('const')
130+
.withName(`${name}Schema: yup.ObjectSchema<${name}>`)
131+
.withContent(
132+
[
133+
`yup.object({`,
134+
indent(`__typename: yup.string<'${node.name.value}'>().optional(),`, 2),
135+
shape,
136+
'})',
137+
].join('\n')
138+
).string + appendArguments
139+
);
112140

113141
case 'function':
114142
default:
115-
return new DeclarationBlock({})
116-
.export()
117-
.asKind('function')
118-
.withName(`${name}Schema(): yup.ObjectSchema<${name}>`)
119-
.withBlock(
120-
[
121-
indent(`return yup.object({`),
122-
indent(`__typename: yup.string<'${node.name.value}'>().optional(),`, 2),
123-
shape,
124-
indent('})'),
125-
].join('\n')
126-
).string;
143+
return (
144+
new DeclarationBlock({})
145+
.export()
146+
.asKind('function')
147+
.withName(`${name}Schema(): yup.ObjectSchema<${name}>`)
148+
.withBlock(
149+
[
150+
indent(`return yup.object({`),
151+
indent(`__typename: yup.string<'${node.name.value}'>().optional(),`, 2),
152+
shape,
153+
indent('})'),
154+
].join('\n')
155+
).string + appendArguments
156+
);
127157
}
128158
}),
129159
},

src/zod/index.ts

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -89,34 +89,66 @@ export const ZodSchemaVisitor = (schema: GraphQLSchema, config: ValidationSchema
8989
const name = visitor.convertName(node.name.value);
9090
importTypes.push(name);
9191

92+
// Building schema for field arguments.
93+
const argumentBlocks = visitor.buildArgumentsSchemaBlock(node, (typeName, field) => {
94+
importTypes.push(typeName);
95+
const args = field.arguments ?? [];
96+
const shape = args.map(field => generateFieldZodSchema(config, visitor, field, 2)).join(',\n');
97+
switch (config.validationSchemaExportType) {
98+
case 'const':
99+
return new DeclarationBlock({})
100+
.export()
101+
.asKind('const')
102+
.withName(`${typeName}Schema: z.ZodObject<Properties<${typeName}>>`)
103+
.withContent([`z.object({`, shape, '})'].join('\n')).string;
104+
105+
case 'function':
106+
default:
107+
return new DeclarationBlock({})
108+
.export()
109+
.asKind('function')
110+
.withName(`${typeName}Schema(): z.ZodObject<Properties<${typeName}>>`)
111+
.withBlock([indent(`return z.object({`), shape, indent('})')].join('\n')).string;
112+
}
113+
});
114+
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
115+
116+
// Building schema for fields.
92117
const shape = node.fields?.map(field => generateFieldZodSchema(config, visitor, field, 2)).join(',\n');
93118

94119
switch (config.validationSchemaExportType) {
95120
case 'const':
96-
return new DeclarationBlock({})
97-
.export()
98-
.asKind('const')
99-
.withName(`${name}Schema: z.ZodObject<Properties<${name}>>`)
100-
.withContent(
101-
[`z.object({`, indent(`__typename: z.literal('${node.name.value}').optional(),`, 2), shape, '})'].join(
102-
'\n'
103-
)
104-
).string;
121+
return (
122+
new DeclarationBlock({})
123+
.export()
124+
.asKind('const')
125+
.withName(`${name}Schema: z.ZodObject<Properties<${name}>>`)
126+
.withContent(
127+
[
128+
`z.object({`,
129+
indent(`__typename: z.literal('${node.name.value}').optional(),`, 2),
130+
shape,
131+
'})',
132+
].join('\n')
133+
).string + appendArguments
134+
);
105135

106136
case 'function':
107137
default:
108-
return new DeclarationBlock({})
109-
.export()
110-
.asKind('function')
111-
.withName(`${name}Schema(): z.ZodObject<Properties<${name}>>`)
112-
.withBlock(
113-
[
114-
indent(`return z.object({`),
115-
indent(`__typename: z.literal('${node.name.value}').optional(),`, 2),
116-
shape,
117-
indent('})'),
118-
].join('\n')
119-
).string;
138+
return (
139+
new DeclarationBlock({})
140+
.export()
141+
.asKind('function')
142+
.withName(`${name}Schema(): z.ZodObject<Properties<${name}>>`)
143+
.withBlock(
144+
[
145+
indent(`return z.object({`),
146+
indent(`__typename: z.literal('${node.name.value}').optional(),`, 2),
147+
shape,
148+
indent('})'),
149+
].join('\n')
150+
).string + appendArguments
151+
);
120152
}
121153
}),
122154
},

0 commit comments

Comments
 (0)