Skip to content

Commit 5723a0e

Browse files
Added yup test and initial implementation for default input values
1 parent 382ab49 commit 5723a0e

File tree

2 files changed

+61
-12
lines changed

2 files changed

+61
-12
lines changed

src/yup/index.ts

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
GraphQLSchema,
66
InputObjectTypeDefinitionNode,
77
InputValueDefinitionNode,
8+
Kind,
89
NameNode,
910
ObjectTypeDefinitionNode,
1011
TypeNode,
@@ -68,12 +69,7 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
6869
const appendArguments = argumentBlocks ? '\n' + argumentBlocks : '';
6970

7071
// Building schema for fields.
71-
const shape = node.fields
72-
?.map(field => {
73-
const fieldSchema = generateFieldYupSchema(this.config, visitor, field, 2);
74-
return isNonNullType(field.type) ? fieldSchema : `${fieldSchema}.optional()`;
75-
})
76-
.join(',\n');
72+
const shape = shapeFields(node.fields, this.config, visitor)
7773

7874
switch (this.config.validationSchemaExportType) {
7975
case 'const':
@@ -203,12 +199,7 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
203199
visitor: Visitor,
204200
name: string
205201
) {
206-
const shape = fields
207-
?.map(field => {
208-
const fieldSchema = generateFieldYupSchema(this.config, visitor, field, 2);
209-
return isNonNullType(field.type) ? fieldSchema : `${fieldSchema}.optional()`;
210-
})
211-
.join(',\n');
202+
const shape = shapeFields(fields, this.config, visitor)
212203

213204
switch (this.config.validationSchemaExportType) {
214205
case 'const':
@@ -229,6 +220,30 @@ export class YupSchemaVisitor extends BaseSchemaVisitor {
229220
}
230221
}
231222

223+
const shapeFields = (fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[] | undefined, config: ValidationSchemaPluginConfig, visitor: Visitor) => {
224+
return fields?.map(field => {
225+
let fieldSchema = generateFieldYupSchema(config, visitor, field, 2);
226+
227+
if (field.kind === Kind.INPUT_VALUE_DEFINITION) {
228+
const { defaultValue } = field;
229+
230+
if (defaultValue?.kind === Kind.INT || defaultValue?.kind === Kind.FLOAT || defaultValue?.kind === Kind.BOOLEAN) {
231+
fieldSchema = `${fieldSchema}.default(${defaultValue.value})`;
232+
}
233+
if ((defaultValue?.kind === Kind.STRING) || (defaultValue?.kind === Kind.ENUM)) {
234+
fieldSchema = `${fieldSchema}.default("${defaultValue.value}")`;
235+
}
236+
}
237+
238+
if(isNonNullType(field.type)) {
239+
return fieldSchema
240+
}
241+
242+
return `${fieldSchema}.optional()`;
243+
})
244+
.join(',\n');
245+
}
246+
232247
const generateFieldYupSchema = (
233248
config: ValidationSchemaPluginConfig,
234249
visitor: Visitor,

tests/yup.spec.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,4 +905,38 @@ describe('yup', () => {
905905
}`;
906906
expect(result.content).toContain(wantContain);
907907
});
908+
909+
it('with default input values', async () => {
910+
const schema = buildSchema(/* GraphQL */ `
911+
enum PageType {
912+
PUBLIC
913+
BASIC_AUTH
914+
}
915+
input PageInput {
916+
pageType: PageType! = PUBLIC
917+
greeting: String = "Hello"
918+
score: Int = 100
919+
ratio: Float = 0.5
920+
isMember: Boolean = true
921+
}
922+
`);
923+
const result = await plugin(
924+
schema,
925+
[],
926+
{
927+
schema: 'yup',
928+
importFrom: './types',
929+
},
930+
{}
931+
);
932+
933+
expect(result.content).toContain('export const PageTypeSchema = yup.string<PageType>().oneOf([PageType.Public, PageType.BasicAuth]).defined()');
934+
expect(result.content).toContain('export function PageInputSchema(): yup.ObjectSchema<PageInput>');
935+
936+
expect(result.content).toContain('pageType: PageTypeSchema.nonNullable().default("PUBLIC")');
937+
expect(result.content).toContain('greeting: yup.string().defined().nullable().default("Hello").optional()');
938+
expect(result.content).toContain('score: yup.number().defined().nullable().default(100).optional()');
939+
expect(result.content).toContain('ratio: yup.number().defined().nullable().default(0.5).optional()');
940+
expect(result.content).toContain('isMember: yup.boolean().defined().nullable().default(true).optional()');
941+
});
908942
});

0 commit comments

Comments
 (0)