Skip to content

Commit 7b3771f

Browse files
authored
Merge pull request #3547 from hey-api/feat/valibot-resolvers
feat: add more resolvers to valibot
2 parents 0f79f2b + 854ee1c commit 7b3771f

File tree

14 files changed

+737
-140
lines changed

14 files changed

+737
-140
lines changed

.changeset/common-cougars-pump.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hey-api/openapi-ts": patch
3+
---
4+
5+
**plugin(valibot)**: provide more resolvers

packages/openapi-ts/src/plugins/valibot/resolvers.ts

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@ import type { ValibotFinal, ValibotResult } from './shared/types';
99
import type { ValibotPlugin } from './types';
1010

1111
export type Resolvers = Plugin.Resolvers<{
12+
/**
13+
* Resolver for array schemas.
14+
*
15+
* Allows customization of how array types are rendered.
16+
*
17+
* Returning `undefined` will execute the default resolver logic.
18+
*/
19+
array?: (ctx: ArrayResolverContext) => PipeResult;
20+
/**
21+
* Resolver for boolean schemas.
22+
*
23+
* Allows customization of how boolean types are rendered.
24+
*
25+
* Returning `undefined` will execute the default resolver logic.
26+
*/
27+
boolean?: (ctx: BooleanResolverContext) => PipeResult;
1228
/**
1329
* Resolver for enum schemas.
1430
*
@@ -17,6 +33,30 @@ export type Resolvers = Plugin.Resolvers<{
1733
* Returning `undefined` will execute the default resolver logic.
1834
*/
1935
enum?: (ctx: EnumResolverContext) => PipeResult;
36+
/**
37+
* Resolver for intersection schemas.
38+
*
39+
* Allows customization of how intersection types are rendered.
40+
*
41+
* Returning `undefined` will execute the default resolver logic.
42+
*/
43+
intersection?: (ctx: IntersectionResolverContext) => PipeResult;
44+
/**
45+
* Resolver for never schemas.
46+
*
47+
* Allows customization of how never types are rendered.
48+
*
49+
* Returning `undefined` will execute the default resolver logic.
50+
*/
51+
never?: (ctx: NeverResolverContext) => PipeResult;
52+
/**
53+
* Resolver for null schemas.
54+
*
55+
* Allows customization of how null types are rendered.
56+
*
57+
* Returning `undefined` will execute the default resolver logic.
58+
*/
59+
null?: (ctx: NullResolverContext) => PipeResult;
2060
/**
2161
* Resolver for number schemas.
2262
*
@@ -41,6 +81,38 @@ export type Resolvers = Plugin.Resolvers<{
4181
* Returning `undefined` will execute the default resolver logic.
4282
*/
4383
string?: (ctx: StringResolverContext) => PipeResult;
84+
/**
85+
* Resolver for tuple schemas.
86+
*
87+
* Allows customization of how tuple types are rendered.
88+
*
89+
* Returning `undefined` will execute the default resolver logic.
90+
*/
91+
tuple?: (ctx: TupleResolverContext) => PipeResult;
92+
/**
93+
* Resolver for undefined schemas.
94+
*
95+
* Allows customization of how undefined types are rendered.
96+
*
97+
* Returning `undefined` will execute the default resolver logic.
98+
*/
99+
undefined?: (ctx: UndefinedResolverContext) => PipeResult;
100+
/**
101+
* Resolver for union schemas.
102+
*
103+
* Allows customization of how union types are rendered.
104+
*
105+
* Returning `undefined` will execute the default resolver logic.
106+
*/
107+
union?: (ctx: UnionResolverContext) => PipeResult;
108+
/**
109+
* Resolver for unknown schemas.
110+
*
111+
* Allows customization of how unknown types are rendered.
112+
*
113+
* Returning `undefined` will execute the default resolver logic.
114+
*/
115+
unknown?: (ctx: UnknownResolverContext) => PipeResult;
44116
/**
45117
* Resolvers for request and response validators.
46118
*
@@ -66,6 +138,14 @@ export type Resolvers = Plugin.Resolvers<{
66138
*/
67139
response?: ValidatorResolver;
68140
};
141+
/**
142+
* Resolver for void schemas.
143+
*
144+
* Allows customization of how void types are rendered.
145+
*
146+
* Returning `undefined` will execute the default resolver logic.
147+
*/
148+
void?: (ctx: VoidResolverContext) => PipeResult;
69149
}>;
70150

71151
type ValidatorResolver = (ctx: ValidatorResolverContext) => PipeResult | null | undefined;
@@ -96,6 +176,33 @@ interface BaseContext extends DollarTsDsl {
96176
};
97177
}
98178

179+
export interface ArrayResolverContext extends BaseContext {
180+
applyModifiers: (result: ValibotResult, opts?: { optional?: boolean }) => ValibotFinal;
181+
/**
182+
* Nodes used to build different parts of the result.
183+
*/
184+
nodes: {
185+
base: (ctx: ArrayResolverContext) => PipeResult;
186+
length: (ctx: ArrayResolverContext) => PipeResult;
187+
maxLength: (ctx: ArrayResolverContext) => PipeResult;
188+
minLength: (ctx: ArrayResolverContext) => PipeResult;
189+
};
190+
schema: SchemaWithType<'array'>;
191+
walk: Walker<ValibotResult, ValibotPlugin['Instance']>;
192+
walkerCtx: SchemaVisitorContext<ValibotPlugin['Instance']>;
193+
}
194+
195+
export interface BooleanResolverContext extends BaseContext {
196+
/**
197+
* Nodes used to build different parts of the result.
198+
*/
199+
nodes: {
200+
base: (ctx: BooleanResolverContext) => PipeResult;
201+
const: (ctx: BooleanResolverContext) => PipeResult;
202+
};
203+
schema: SchemaWithType<'boolean'>;
204+
}
205+
99206
export interface EnumResolverContext extends BaseContext {
100207
/**
101208
* Nodes used to build different parts of the result.
@@ -122,6 +229,39 @@ export interface EnumResolverContext extends BaseContext {
122229
schema: SchemaWithType<'enum'>;
123230
}
124231

232+
export interface IntersectionResolverContext extends BaseContext {
233+
applyModifiers: (result: ValibotResult, opts?: { optional?: boolean }) => ValibotFinal;
234+
childResults: Array<ValibotResult>;
235+
/**
236+
* Nodes used to build different parts of the result.
237+
*/
238+
nodes: {
239+
base: (ctx: IntersectionResolverContext) => PipeResult;
240+
};
241+
parentSchema: IR.SchemaObject;
242+
schema: IR.SchemaObject;
243+
}
244+
245+
export interface NeverResolverContext extends BaseContext {
246+
/**
247+
* Nodes used to build different parts of the result.
248+
*/
249+
nodes: {
250+
base: (ctx: NeverResolverContext) => PipeResult;
251+
};
252+
schema: SchemaWithType<'never'>;
253+
}
254+
255+
export interface NullResolverContext extends BaseContext {
256+
/**
257+
* Nodes used to build different parts of the result.
258+
*/
259+
nodes: {
260+
base: (ctx: NullResolverContext) => PipeResult;
261+
};
262+
schema: SchemaWithType<'null'>;
263+
}
264+
125265
export interface NumberResolverContext extends BaseContext {
126266
/**
127267
* Nodes used to build different parts of the result.
@@ -175,6 +315,64 @@ export interface StringResolverContext extends BaseContext {
175315
schema: SchemaWithType<'string'>;
176316
}
177317

318+
export interface TupleResolverContext extends BaseContext {
319+
applyModifiers: (result: ValibotResult, opts?: { optional?: boolean }) => ValibotFinal;
320+
/**
321+
* Nodes used to build different parts of the result.
322+
*/
323+
nodes: {
324+
base: (ctx: TupleResolverContext) => PipeResult;
325+
const: (ctx: TupleResolverContext) => PipeResult;
326+
};
327+
schema: SchemaWithType<'tuple'>;
328+
walk: Walker<ValibotResult, ValibotPlugin['Instance']>;
329+
walkerCtx: SchemaVisitorContext<ValibotPlugin['Instance']>;
330+
}
331+
332+
export interface UndefinedResolverContext extends BaseContext {
333+
/**
334+
* Nodes used to build different parts of the result.
335+
*/
336+
nodes: {
337+
base: (ctx: UndefinedResolverContext) => PipeResult;
338+
};
339+
schema: SchemaWithType<'undefined'>;
340+
}
341+
342+
export interface UnionResolverContext extends BaseContext {
343+
applyModifiers: (result: ValibotResult, opts?: { optional?: boolean }) => ValibotFinal;
344+
childResults: Array<ValibotResult>;
345+
/**
346+
* Nodes used to build different parts of the result.
347+
*/
348+
nodes: {
349+
base: (ctx: UnionResolverContext) => PipeResult;
350+
};
351+
parentSchema: IR.SchemaObject;
352+
schema: IR.SchemaObject;
353+
schemas: ReadonlyArray<IR.SchemaObject>;
354+
}
355+
356+
export interface UnknownResolverContext extends BaseContext {
357+
/**
358+
* Nodes used to build different parts of the result.
359+
*/
360+
nodes: {
361+
base: (ctx: UnknownResolverContext) => PipeResult;
362+
};
363+
schema: SchemaWithType<'unknown'>;
364+
}
365+
366+
export interface VoidResolverContext extends BaseContext {
367+
/**
368+
* Nodes used to build different parts of the result.
369+
*/
370+
nodes: {
371+
base: (ctx: VoidResolverContext) => PipeResult;
372+
};
373+
schema: SchemaWithType<'void'>;
374+
}
375+
178376
export interface ValidatorResolverContext extends BaseContext {
179377
operation: IR.OperationObject;
180378
/**

packages/openapi-ts/src/plugins/valibot/shared/pipes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,6 @@ export const pipes: PipesUtils = {
6161
*
6262
* Re-exported for backward compatibility.
6363
*/
64-
export function pipesToNode(p: Pipes, plugin: ValibotPlugin['Instance']): Pipe {
65-
return toNode(p, plugin);
64+
export function pipesToNode(pipes: Pipes | Pipe, plugin: ValibotPlugin['Instance']): Pipe {
65+
return toNode(pipes, plugin);
6666
}

0 commit comments

Comments
 (0)