Skip to content

Commit 580b91a

Browse files
committed
feat: support enum
1 parent 4acebcd commit 580b91a

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/valibot/index.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
22
import type {
3+
EnumTypeDefinitionNode,
34
FieldDefinitionNode,
45
GraphQLSchema,
56
InputObjectTypeDefinitionNode,
@@ -29,7 +30,11 @@ export class ValibotSchemaVisitor extends BaseSchemaVisitor {
2930
}
3031

3132
initialEmit(): string {
32-
return '';
33+
return (
34+
`\n${[
35+
...this.enumDeclarations,
36+
].join('\n')}`
37+
);
3338
}
3439

3540
get InputObjectTypeDefinition() {
@@ -43,6 +48,25 @@ export class ValibotSchemaVisitor extends BaseSchemaVisitor {
4348
};
4449
}
4550

51+
get EnumTypeDefinition() {
52+
return {
53+
leave: (node: EnumTypeDefinitionNode) => {
54+
const visitor = this.createVisitor('both');
55+
const enumname = visitor.convertName(node.name.value);
56+
this.importTypes.push(enumname);
57+
58+
// hoist enum declarations
59+
this.enumDeclarations.push(
60+
new DeclarationBlock({})
61+
.export()
62+
.asKind('const')
63+
.withName(`${enumname}Schema`)
64+
.withContent(`v.enum_(${enumname})`).string,
65+
);
66+
},
67+
};
68+
}
69+
4670
protected buildInputFields(
4771
fields: readonly (FieldDefinitionNode | InputValueDefinitionNode)[],
4872
visitor: Visitor,
@@ -101,11 +125,12 @@ function generateNameNodeValibotSchema(config: ValidationSchemaPluginConfig, vis
101125
const converter = visitor.getNameNodeConverter(node);
102126

103127
switch (converter?.targetKind) {
128+
case 'EnumTypeDefinition':
129+
return `${converter.convertName()}Schema`;
104130
case 'InterfaceTypeDefinition':
105131
case 'InputObjectTypeDefinition':
106132
case 'ObjectTypeDefinition':
107133
case 'UnionTypeDefinition':
108-
case 'EnumTypeDefinition':
109134
case 'ScalarTypeDefinition':
110135
throw new Error('not implemented');
111136
default:

tests/valibot.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,32 @@ describe('valibot', () => {
8989
for (const wantContain of wantContains)
9090
expect(result.content).toContain(wantContain);
9191
});
92+
93+
it.todo('ref input object')
94+
it.todo('nested input object')
95+
96+
it('enum', async () => {
97+
const schema = buildSchema(/* GraphQL */ `
98+
enum PageType {
99+
PUBLIC
100+
BASIC_AUTH
101+
}
102+
input PageInput {
103+
pageType: PageType!
104+
}
105+
`);
106+
const scalars = undefined
107+
const result = await plugin(schema, [], { schema: 'valibot', scalars }, {});
108+
expect(result.content).toMatchInlineSnapshot(`
109+
"
110+
export const PageTypeSchema = v.enum_(PageType);
111+
112+
export function PageInputSchema() {
113+
return v.object({
114+
pageType: PageTypeSchema
115+
})
116+
}
117+
"
118+
`);
119+
})
92120
})

0 commit comments

Comments
 (0)