@@ -18,6 +18,7 @@ import {
18
18
jsDoc ,
19
19
generateMutatorImports ,
20
20
GeneratorMutator ,
21
+ NormalizedMutator ,
21
22
} from '@orval/core' ;
22
23
import { getRoute } from './route' ;
23
24
import fs from 'fs-extra' ;
@@ -54,7 +55,7 @@ export const getHonoHeader: ClientHeaderBuilder = ({
54
55
55
56
let handlers = '' ;
56
57
57
- if ( output . override . hono ? .handlers ) {
58
+ if ( output . override . hono . handlers ) {
58
59
const handlerFileInfo = getFileInfo ( output . override . hono . handlers ) ;
59
60
handlers = Object . values ( verbOptions )
60
61
. filter ( ( verbOption ) =>
@@ -117,40 +118,48 @@ const getHonoHandlers = ({
117
118
handlerName,
118
119
contextTypeName,
119
120
verbOption,
121
+ validator,
120
122
} : {
121
123
handlerName : string ;
122
124
contextTypeName : string ;
123
125
verbOption : GeneratorVerbOptions ;
126
+ validator : boolean | 'hono' | NormalizedMutator ;
124
127
} ) => {
128
+ let currentValidator = '' ;
129
+
130
+ if ( validator ) {
131
+ if ( verbOption . headers ) {
132
+ currentValidator += `zValidator('header', ${ verbOption . operationName } Header),\n` ;
133
+ }
134
+ if ( verbOption . params . length ) {
135
+ currentValidator += `zValidator('param', ${ verbOption . operationName } Params),\n` ;
136
+ }
137
+ if ( verbOption . queryParams ) {
138
+ currentValidator += `zValidator('query', ${ verbOption . operationName } QueryParams),\n` ;
139
+ }
140
+ if ( verbOption . body . definition ) {
141
+ currentValidator += `zValidator('json', ${ verbOption . operationName } Body),\n` ;
142
+ }
143
+ if (
144
+ validator !== 'hono' &&
145
+ verbOption . response . originalSchema ?. [ '200' ] ?. content ?. [ 'application/json' ]
146
+ ) {
147
+ currentValidator += `zValidator('response', ${ verbOption . operationName } Response),\n` ;
148
+ }
149
+ }
150
+
125
151
return `
126
152
export const ${ handlerName } = factory.createHandlers(
127
- ${
128
- verbOption . headers
129
- ? `zValidator('header', ${ verbOption . operationName } Header),\n`
130
- : ''
131
- } ${
132
- verbOption . params . length
133
- ? `zValidator('param', ${ verbOption . operationName } Params),\n`
134
- : ''
135
- } ${
136
- verbOption . queryParams
137
- ? `zValidator('query', ${ verbOption . operationName } QueryParams),\n`
138
- : ''
139
- } ${
140
- verbOption . body . definition
141
- ? `zValidator('json', ${ verbOption . operationName } Body),\n`
142
- : ''
143
- } ${
144
- ! ! verbOption . response . originalSchema ?. [ '200' ] ?. content ?. [ 'application/json' ]
145
- ? `zValidator('response', ${ verbOption . operationName } Response),\n`
146
- : ''
147
- } async (c: ${ contextTypeName } ) => {
153
+ ${ currentValidator } async (c: ${ contextTypeName } ) => {
148
154
149
155
},
150
156
);` ;
151
157
} ;
152
158
153
- const getZvalidatorImports = ( verbOption : GeneratorVerbOptions ) => {
159
+ const getZvalidatorImports = (
160
+ verbOption : GeneratorVerbOptions ,
161
+ isHonoValidator : boolean ,
162
+ ) => {
154
163
let imports = [ ] ;
155
164
156
165
if ( verbOption . headers ) {
@@ -170,6 +179,7 @@ const getZvalidatorImports = (verbOption: GeneratorVerbOptions) => {
170
179
}
171
180
172
181
if (
182
+ ! isHonoValidator &&
173
183
! ! verbOption . response . originalSchema ?. [ '200' ] ?. content ?. [ 'application/json' ]
174
184
) {
175
185
imports . push ( `${ verbOption . operationName } Response` ) ;
@@ -238,6 +248,7 @@ const generateHandlers = async (
238
248
handlerName,
239
249
contextTypeName,
240
250
verbOption,
251
+ validator : output . override . hono . validator ,
241
252
} ) ;
242
253
}
243
254
@@ -247,20 +258,34 @@ const generateHandlers = async (
247
258
} ;
248
259
}
249
260
250
- const content = `import { createFactory } from 'hono/factory';${
251
- hasZValidator
252
- ? `\nimport { zValidator } from '${ outputPath } .validator';`
253
- : ''
261
+ let validatorImport = '' ;
262
+
263
+ if ( hasZValidator ) {
264
+ if ( output . override . hono . validator === true ) {
265
+ validatorImport = `\nimport { zValidator } from '${ outputPath } .validator';` ;
266
+ } else if ( output . override . hono . validator === 'hono' ) {
267
+ validatorImport = `\nimport { zValidator } from '@hono/zod-validator';` ;
268
+ }
254
269
}
270
+
271
+ const zodImports = output . override . hono . validator
272
+ ? `import { ${ getZvalidatorImports (
273
+ verbOption ,
274
+ output . override . hono . validator === 'hono' ,
275
+ ) } } from '${ outputPath } .zod';`
276
+ : '' ;
277
+
278
+ const content = `import { createFactory } from 'hono/factory';${ validatorImport }
255
279
import { ${ contextTypeName } } from '${ outputPath } .context';
256
- import { ${ getZvalidatorImports ( verbOption ) } } from ' ${ outputPath } .zod';
280
+ ${ zodImports }
257
281
258
282
const factory = createFactory();
259
283
260
284
${ getHonoHandlers ( {
261
285
handlerName,
262
286
contextTypeName,
263
287
verbOption,
288
+ validator : output . override . hono . validator ,
264
289
} ) }
265
290
` ;
266
291
@@ -307,6 +332,7 @@ ${getHonoHandlers({
307
332
handlerName,
308
333
contextTypeName,
309
334
verbOption,
335
+ validator : output . override . hono . validator ,
310
336
} ) ;
311
337
}
312
338
@@ -321,17 +347,32 @@ ${getHonoHandlers({
321
347
322
348
const outputRelativePath = `./${ kebab ( tag ) } ` ;
323
349
324
- let content = `import { createFactory } from 'hono/factory';${
325
- hasZValidator
326
- ? `\nimport { zValidator } from '${ outputRelativePath } .validator';`
327
- : ''
350
+ let validatorImport = '' ;
351
+
352
+ if ( hasZValidator ) {
353
+ if ( output . override . hono . validator === true ) {
354
+ validatorImport = `\nimport { zValidator } from '${ outputRelativePath } .validator';` ;
355
+ } else if ( output . override . hono . validator === 'hono' ) {
356
+ validatorImport = `\nimport { zValidator } from '@hono/zod-validator';` ;
357
+ }
328
358
}
359
+
360
+ const zodImports = output . override . hono . validator
361
+ ? `import { ${ Object . values ( verbs )
362
+ . map ( ( verb ) =>
363
+ getZvalidatorImports (
364
+ verb ,
365
+ output . override . hono . validator === 'hono' ,
366
+ ) ,
367
+ )
368
+ . join ( ',\n' ) } } from '${ outputRelativePath } .zod'`
369
+ : '' ;
370
+
371
+ let content = `import { createFactory } from 'hono/factory';${ validatorImport }
329
372
import { ${ Object . values ( verbs )
330
373
. map ( ( verb ) => `${ pascal ( verb . operationName ) } Context` )
331
374
. join ( ',\n' ) } } from '${ outputRelativePath } .context';
332
- import { ${ Object . values ( verbs )
333
- . map ( ( verb ) => getZvalidatorImports ( verb ) )
334
- . join ( ',\n' ) } } from '${ outputRelativePath } .zod';
375
+ ${ zodImports } ;
335
376
336
377
const factory = createFactory();` ;
337
378
@@ -343,6 +384,7 @@ const factory = createFactory();`;
343
384
handlerName,
344
385
contextTypeName,
345
386
verbOption,
387
+ validator : output . override . hono . validator ,
346
388
} ) ;
347
389
348
390
return acc ;
@@ -383,6 +425,7 @@ const factory = createFactory();`;
383
425
handlerName,
384
426
contextTypeName,
385
427
verbOption,
428
+ validator : output . override . hono . validator ,
386
429
} ) ;
387
430
}
388
431
@@ -399,17 +442,29 @@ const factory = createFactory();`;
399
442
400
443
const outputRelativePath = `./${ filename } ` ;
401
444
402
- let content = `import { createFactory } from 'hono/factory';${
403
- hasZValidator
404
- ? `\nimport { zValidator } from '${ outputRelativePath } .validator';`
405
- : ''
445
+ let validatorImport = '' ;
446
+
447
+ if ( hasZValidator ) {
448
+ if ( output . override . hono . validator === true ) {
449
+ validatorImport = `\nimport { zValidator } from '${ outputRelativePath } .validator';` ;
450
+ } else if ( output . override . hono . validator === 'hono' ) {
451
+ validatorImport = `\nimport { zValidator } from '@hono/zod-validator';` ;
452
+ }
406
453
}
454
+
455
+ const zodImports = output . override . hono . validator
456
+ ? `import { ${ Object . values ( verbOptions )
457
+ . map ( ( verb ) =>
458
+ getZvalidatorImports ( verb , output . override . hono . validator === 'hono' ) ,
459
+ )
460
+ . join ( ',\n' ) } } from '${ outputRelativePath } .zod';`
461
+ : '' ;
462
+
463
+ let content = `import { createFactory } from 'hono/factory';${ validatorImport }
407
464
import { ${ Object . values ( verbOptions )
408
465
. map ( ( verb ) => `${ pascal ( verb . operationName ) } Context` )
409
466
. join ( ',\n' ) } } from '${ outputRelativePath } .context';
410
- import { ${ Object . values ( verbOptions )
411
- . map ( ( verb ) => getZvalidatorImports ( verb ) )
412
- . join ( ',\n' ) } } from '${ outputRelativePath } .zod';
467
+ ${ zodImports }
413
468
414
469
const factory = createFactory();` ;
415
470
@@ -421,6 +476,7 @@ const factory = createFactory();`;
421
476
handlerName,
422
477
contextTypeName,
423
478
verbOption,
479
+ validator : output . override . hono . validator ,
424
480
} ) ;
425
481
426
482
return acc ;
@@ -805,6 +861,13 @@ export const zValidator =
805
861
}
806
862
} else {
807
863
await next();
864
+
865
+ if (
866
+ c.res.status !== 200 ||
867
+ c.res.headers.get('Content-Type') !== 'application/json'
868
+ ) {
869
+ return;
870
+ }
808
871
809
872
const clonedResponse = c.res.clone();
810
873
@@ -814,6 +877,8 @@ export const zValidator =
814
877
} catch {
815
878
const message = 'Malformed JSON in response';
816
879
c.res = new Response(message, { status: 400 });
880
+
881
+ return;
817
882
}
818
883
819
884
const result = await schema.safeParseAsync(value);
@@ -874,7 +939,15 @@ export const generateExtraFiles: ClientExtraFilesBuilder = async (
874
939
generateZvalidator ( output , context ) ,
875
940
] ) ;
876
941
877
- return [ ...handlers , ...contexts , ...zods , validator ] ;
942
+ return [
943
+ ...handlers ,
944
+ ...contexts ,
945
+ ...zods ,
946
+ ...( output . override . hono . validator &&
947
+ output . override . hono . validator !== 'hono'
948
+ ? [ validator ]
949
+ : [ ] ) ,
950
+ ] ;
878
951
} ;
879
952
880
953
const honoClientBuilder : ClientGeneratorsBuilder = {
0 commit comments