Skip to content

Commit df63604

Browse files
committed
feat: support array
1 parent 6cead63 commit df63604

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/valibot/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type { ValidationSchemaPluginConfig } from '../config';
1212
import { BaseSchemaVisitor } from '../schema_visitor';
1313
import type { Visitor } from '../visitor';
1414
import {
15+
isListType,
1516
isNamedType,
1617
isNonNullType,
1718
} from './../graphql';
@@ -64,12 +65,22 @@ function generateFieldValibotSchema(config: ValidationSchemaPluginConfig, visito
6465
}
6566

6667
function generateFieldTypeValibotSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode): string {
68+
if (isListType(type)) {
69+
const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type);
70+
const arrayGen = `v.array(${maybeLazy(type.type, gen)})`;
71+
if (!isNonNullType(parentType)) {
72+
return `v.nullish(${arrayGen})`;
73+
}
74+
return arrayGen;
75+
}
6776
if (isNonNullType(type)) {
6877
const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type);
6978
return maybeLazy(type.type, gen);
7079
}
7180
if (isNamedType(type)) {
7281
const gen = generateNameNodeValibotSchema(config, visitor, type.name);
82+
if (isListType(parentType))
83+
return `v.nullable(${gen})`;
7384

7485
if (isNonNullType(parentType))
7586
return gen;

tests/valibot.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,32 @@ describe('valibot', () => {
6161
"
6262
`);
6363
})
64+
it('array', async () => {
65+
const schema = buildSchema(/* GraphQL */ `
66+
input PrimitiveInput {
67+
a: [String]
68+
b: [String!]
69+
c: [String!]!
70+
d: [[String]]
71+
e: [[String]!]
72+
f: [[String]!]!
73+
}
74+
`);
75+
const scalars = undefined
76+
const result = await plugin(schema, [], { schema: 'valibot', scalars }, {});
77+
expect(result.content).toMatchInlineSnapshot(`
78+
"
79+
export function PrimitiveInputSchema(): v.GenericSchema<PrimitiveInput> {
80+
return v.object({
81+
a: v.nullish(v.array(v.nullable(v.string()))),
82+
b: v.nullish(v.array(v.string())),
83+
c: v.array(v.string()),
84+
d: v.nullish(v.array(v.nullish(v.array(v.nullable(v.string()))))),
85+
e: v.nullish(v.array(v.array(v.nullable(v.string())))),
86+
f: v.array(v.array(v.nullable(v.string())))
87+
})
88+
}
89+
"
90+
`);
91+
})
6492
})

0 commit comments

Comments
 (0)