Skip to content

Commit 4acebcd

Browse files
committed
feat: implement array
1 parent 50c0036 commit 4acebcd

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/valibot/index.ts

Lines changed: 12 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';
@@ -69,12 +70,23 @@ function generateFieldValibotSchema(config: ValidationSchemaPluginConfig, visito
6970
}
7071

7172
function generateFieldTypeValibotSchema(config: ValidationSchemaPluginConfig, visitor: Visitor, field: InputValueDefinitionNode | FieldDefinitionNode, type: TypeNode, parentType?: TypeNode): string {
73+
if (isListType(type)) {
74+
const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type);
75+
const arrayGen = `v.array(${maybeLazy(type.type, gen)})`;
76+
if (!isNonNullType(parentType)) {
77+
return `v.nullish(${arrayGen})`;
78+
}
79+
return arrayGen;
80+
}
81+
7282
if (isNonNullType(type)) {
7383
const gen = generateFieldTypeValibotSchema(config, visitor, field, type.type, type);
7484
return maybeLazy(type.type, gen);
7585
}
7686
if (isNamedType(type)) {
7787
const gen = generateNameNodeValibotSchema(config, visitor, type.name);
88+
if (isListType(parentType))
89+
return `v.nullable(${gen})`;
7890

7991
if (isNonNullType(parentType))
8092
return gen;

tests/valibot.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,31 @@ describe('valibot', () => {
5656
},
5757
},
5858
],
59+
[
60+
'array',
61+
{
62+
textSchema: /* GraphQL */ `
63+
input ArrayInput {
64+
a: [String]
65+
b: [String!]
66+
c: [String!]!
67+
d: [[String]]
68+
e: [[String]!]
69+
f: [[String]!]!
70+
}
71+
`,
72+
wantContains: [
73+
'export function ArrayInputSchema()',
74+
'a: v.nullish(v.array(v.nullable(v.string()))),',
75+
'b: v.nullish(v.array(v.string())),',
76+
'c: v.array(v.string()),',
77+
'd: v.nullish(v.array(v.nullish(v.array(v.nullable(v.string()))))),',
78+
'e: v.nullish(v.array(v.array(v.nullable(v.string())))),',
79+
'f: v.array(v.array(v.nullable(v.string())))',
80+
],
81+
scalars: undefined,
82+
},
83+
],
5984
])('%s', async (_, { textSchema, wantContains, scalars }) => {
6085
const schema = buildSchema(textSchema);
6186
const result = await plugin(schema, [], { schema: 'valibot', scalars }, {});

0 commit comments

Comments
 (0)