Skip to content

Commit f9a4bb0

Browse files
authored
feat(fetch,zod,hono,mcp): changed naming convention of zod schema name to pascal-case (orval-labs#2661)
* feat(zod,hono,mcp): hanged `zod` schema name to `pascal-case` * chore: update sample apps * docs: update migration guide * chore: update swr sample app * chore: fix failed test
1 parent 8d6c24a commit f9a4bb0

File tree

13 files changed

+181
-138
lines changed

13 files changed

+181
-138
lines changed

docs/src/pages/guides/migration-v8.mdx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,20 @@ export default {
204204
},
205205
};
206206
```
207+
208+
## 8. Zod Schema Naming Convention Changed to PascalCase
209+
210+
All Zod schema exports now use PascalCase naming convention to align with TypeScript type definition standards.
211+
212+
### What Changed
213+
214+
```diff
215+
- export const createPetsBody = zod.object({
216+
+ export const CreatePetsBody = zod.object({
217+
name: zod.string(),
218+
tag: zod.string()
219+
})
220+
221+
- export type CreatePetsBody = zod.infer<typeof createPetsBody>
222+
+ export type CreatePetsBody = zod.infer<typeof CreatePetsBody>
223+
```

packages/hono/src/index.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,19 @@ const getHonoHandlers = (
183183
let currentValidator = '';
184184

185185
if (validator) {
186+
const pascalOperationName = pascal(verbOption.operationName);
187+
186188
if (verbOption.headers) {
187-
currentValidator += `zValidator('header', ${verbOption.operationName}Header),\n`;
189+
currentValidator += `zValidator('header', ${pascalOperationName}Header),\n`;
188190
}
189191
if (verbOption.params.length > 0) {
190-
currentValidator += `zValidator('param', ${verbOption.operationName}Params),\n`;
192+
currentValidator += `zValidator('param', ${pascalOperationName}Params),\n`;
191193
}
192194
if (verbOption.queryParams) {
193-
currentValidator += `zValidator('query', ${verbOption.operationName}QueryParams),\n`;
195+
currentValidator += `zValidator('query', ${pascalOperationName}QueryParams),\n`;
194196
}
195197
if (verbOption.body.definition) {
196-
currentValidator += `zValidator('json', ${verbOption.operationName}Body),\n`;
198+
currentValidator += `zValidator('json', ${pascalOperationName}Body),\n`;
197199
}
198200
if (
199201
validator !== 'hono' &&
@@ -202,7 +204,7 @@ const getHonoHandlers = (
202204
'application/json'
203205
]
204206
) {
205-
currentValidator += `zValidator('response', ${verbOption.operationName}Response),\n`;
207+
currentValidator += `zValidator('response', ${pascalOperationName}Response),\n`;
206208
}
207209
}
208210

@@ -234,20 +236,22 @@ const getZvalidatorImports = (
234236
body,
235237
response,
236238
} of verbOptions) {
239+
const pascalOperationName = pascal(operationName);
240+
237241
if (headers) {
238-
specifiers.push(`${operationName}Header`);
242+
specifiers.push(`${pascalOperationName}Header`);
239243
}
240244

241245
if (params.length > 0) {
242-
specifiers.push(`${operationName}Params`);
246+
specifiers.push(`${pascalOperationName}Params`);
243247
}
244248

245249
if (queryParams) {
246-
specifiers.push(`${operationName}QueryParams`);
250+
specifiers.push(`${pascalOperationName}QueryParams`);
247251
}
248252

249253
if (body.definition) {
250-
specifiers.push(`${operationName}Body`);
254+
specifiers.push(`${pascalOperationName}Body`);
251255
}
252256

253257
if (
@@ -256,7 +260,7 @@ const getZvalidatorImports = (
256260
response.originalSchema?.['200']?.content?.['application/json'] !=
257261
undefined
258262
) {
259-
specifiers.push(`${operationName}Response`);
263+
specifiers.push(`${pascalOperationName}Response`);
260264
}
261265
}
262266

packages/mcp/src/index.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -169,17 +169,16 @@ export const generateServer = (
169169

170170
const toolImplementations = Object.values(verbOptions)
171171
.map((verbOption) => {
172+
const pascalOperationName = pascal(verbOption.operationName);
172173
const inputSchemaTypes = [];
173174
if (verbOption.params.length > 0)
174-
inputSchemaTypes.push(
175-
` pathParams: ${verbOption.operationName}Params`,
176-
);
175+
inputSchemaTypes.push(` pathParams: ${pascalOperationName}Params`);
177176
if (verbOption.queryParams)
178177
inputSchemaTypes.push(
179-
` queryParams: ${verbOption.operationName}QueryParams`,
178+
` queryParams: ${pascalOperationName}QueryParams`,
180179
);
181180
if (verbOption.body.definition)
182-
inputSchemaTypes.push(` bodyParams: ${verbOption.operationName}Body`);
181+
inputSchemaTypes.push(` bodyParams: ${pascalOperationName}Body`);
183182

184183
const inputSchemaImplementation =
185184
inputSchemaTypes.length > 0
@@ -203,14 +202,15 @@ server.tool(
203202
.flatMap((verbOption) => {
204203
const imports = [];
205204

206-
if (verbOption.headers)
207-
imports.push(` ${verbOption.operationName}Header`);
205+
const pascalOperationName = pascal(verbOption.operationName);
206+
207+
if (verbOption.headers) imports.push(` ${pascalOperationName}Header`);
208208
if (verbOption.params.length > 0)
209-
imports.push(` ${verbOption.operationName}Params`);
209+
imports.push(` ${pascalOperationName}Params`);
210210
if (verbOption.queryParams)
211-
imports.push(` ${verbOption.operationName}QueryParams`);
211+
imports.push(` ${pascalOperationName}QueryParams`);
212212
if (verbOption.body.definition)
213-
imports.push(` ${verbOption.operationName}Body`);
213+
imports.push(` ${pascalOperationName}Body`);
214214

215215
return imports;
216216
})

packages/zod/src/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ const parseBodyAndResponse = ({
11701170
};
11711171
};
11721172

1173-
const parseParameters = ({
1173+
export const parseParameters = ({
11741174
data,
11751175
context,
11761176
operationName,
@@ -1506,35 +1506,39 @@ const generateZodRoute = async (
15061506
};
15071507
}
15081508

1509+
const pascalOperationName = pascal(operationName);
1510+
15091511
return {
15101512
implementation: [
15111513
...(inputParams.consts ? [inputParams.consts] : []),
15121514
...(inputParams.zod
1513-
? [`export const ${operationName}Params = ${inputParams.zod}`]
1515+
? [`export const ${pascalOperationName}Params = ${inputParams.zod}`]
15141516
: []),
15151517
...(inputQueryParams.consts ? [inputQueryParams.consts] : []),
15161518
...(inputQueryParams.zod
1517-
? [`export const ${operationName}QueryParams = ${inputQueryParams.zod}`]
1519+
? [
1520+
`export const ${pascalOperationName}QueryParams = ${inputQueryParams.zod}`,
1521+
]
15181522
: []),
15191523
...(inputHeaders.consts ? [inputHeaders.consts] : []),
15201524
...(inputHeaders.zod
1521-
? [`export const ${operationName}Header = ${inputHeaders.zod}`]
1525+
? [`export const ${pascalOperationName}Header = ${inputHeaders.zod}`]
15221526
: []),
15231527
...(inputBody.consts ? [inputBody.consts] : []),
15241528
...(inputBody.zod
15251529
? [
15261530
parsedBody.isArray
1527-
? `export const ${operationName}BodyItem = ${inputBody.zod}
1528-
export const ${operationName}Body = zod.array(${operationName}BodyItem)${
1531+
? `export const ${pascalOperationName}BodyItem = ${inputBody.zod}
1532+
export const ${pascalOperationName}Body = zod.array(${pascalOperationName}BodyItem)${
15291533
parsedBody.rules?.min ? `.min(${parsedBody.rules.min})` : ''
15301534
}${
15311535
parsedBody.rules?.max ? `.max(${parsedBody.rules.max})` : ''
15321536
}`
1533-
: `export const ${operationName}Body = ${inputBody.zod}`,
1537+
: `export const ${pascalOperationName}Body = ${inputBody.zod}`,
15341538
]
15351539
: []),
15361540
...inputResponses.flatMap((inputResponse, index) => {
1537-
const operationResponse = camel(
1541+
const operationResponse = pascal(
15381542
`${operationName}-${responses[index][0]}-response`,
15391543
);
15401544
return [

packages/zod/src/zod.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,7 +2061,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
20612061
);
20622062

20632063
expect(result.implementation).toBe(
2064-
'export const testParams = zod.object({\n "id": zod.string()\n})\n\nexport const testQueryParams = zod.object({\n "page": zod.number().optional()\n})\n\nexport const testHeader = zod.object({\n "x-header": zod.string()\n})\n\nexport const testBody = zod.object({\n "name": zod.string().optional()\n})\n\nexport const testResponse = zod.object({\n "name": zod.string().optional()\n})\n\n',
2064+
'export const TestParams = zod.object({\n "id": zod.string()\n})\n\nexport const TestQueryParams = zod.object({\n "page": zod.number().optional()\n})\n\nexport const TestHeader = zod.object({\n "x-header": zod.string()\n})\n\nexport const TestBody = zod.object({\n "name": zod.string().optional()\n})\n\nexport const TestResponse = zod.object({\n "name": zod.string().optional()\n})\n\n',
20652065
);
20662066
});
20672067

@@ -2101,7 +2101,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
21012101
{},
21022102
);
21032103
expect(result.implementation).toBe(
2104-
'export const testResponse = zod.object({\n "name": zod.string().optional()\n})\n\n',
2104+
'export const TestResponse = zod.object({\n "name": zod.string().optional()\n})\n\n',
21052105
);
21062106
});
21072107

@@ -2141,7 +2141,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
21412141
{},
21422142
);
21432143
expect(result.implementation).toBe(
2144-
'export const testBody = zod.object({\n "name": zod.string().optional()\n})\n\n',
2144+
'export const TestBody = zod.object({\n "name": zod.string().optional()\n})\n\n',
21452145
);
21462146
});
21472147

@@ -2181,7 +2181,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
21812181
{},
21822182
);
21832183
expect(result.implementation).toBe(
2184-
'export const testQueryParams = zod.object({\n "page": zod.number().optional()\n})\n\n',
2184+
'export const TestQueryParams = zod.object({\n "page": zod.number().optional()\n})\n\n',
21852185
);
21862186
});
21872187

@@ -2221,7 +2221,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
22212221
{},
22222222
);
22232223
expect(result.implementation).toBe(
2224-
'export const testParams = zod.object({\n "id": zod.string()\n})\n\n',
2224+
'export const TestParams = zod.object({\n "id": zod.string()\n})\n\n',
22252225
);
22262226
});
22272227

@@ -2261,7 +2261,7 @@ describe('generatePartOfSchemaGenerateZod', () => {
22612261
{},
22622262
);
22632263
expect(result.implementation).toBe(
2264-
'export const testHeader = zod.object({\n "x-header": zod.string()\n})\n\n',
2264+
'export const TestHeader = zod.object({\n "x-header": zod.string()\n})\n\n',
22652265
);
22662266
});
22672267
});
@@ -2458,7 +2458,7 @@ describe('generateFormData', () => {
24582458
{},
24592459
);
24602460
expect(result.implementation).toBe(
2461-
'export const testBody = zod.object({\n "name": zod.string().optional(),\n "catImage": zod.instanceof(File).optional()\n})\n\n',
2461+
'export const TestBody = zod.object({\n "name": zod.string().optional(),\n "catImage": zod.instanceof(File).optional()\n})\n\n',
24622462
);
24632463
});
24642464
});
@@ -2549,7 +2549,7 @@ describe('generateZodWithEdgeCases', () => {
25492549
);
25502550

25512551
expect(result.implementation).toBe(
2552-
'export const testBody = zod.object({\n "$ref": zod.string().optional()\n})\n\n',
2552+
'export const TestBody = zod.object({\n "$ref": zod.string().optional()\n})\n\n',
25532553
);
25542554
});
25552555
});
@@ -2638,7 +2638,7 @@ describe('generateZodWithLiteralProperty', () => {
26382638
);
26392639

26402640
expect(result.implementation).toBe(
2641-
'export const testBody = zod.object({\n "type": zod.literal("WILD").optional()\n})\n\n',
2641+
'export const TestBody = zod.object({\n "type": zod.literal("WILD").optional()\n})\n\n',
26422642
);
26432643
});
26442644
});
@@ -4445,7 +4445,7 @@ describe('generateZod (content type handling - parity with res-req-types.test.ts
44454445
// base64Field: contentEncoding base64 → stays string
44464446
// metadata: object → object schema
44474447
expect(result.implementation)
4448-
.toBe(`export const uploadFormBody = zod.object({
4448+
.toBe(`export const UploadFormBody = zod.object({
44494449
"encBinary": zod.instanceof(File),
44504450
"encText": zod.instanceof(File).or(zod.string()),
44514451
"cmtBinary": zod.instanceof(File),

samples/hono/composite-routes-with-tags-split/src/endpoints/pets/pets.handlers.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,34 @@ import {
77
ShowPetByIdContext,
88
} from './pets.context';
99
import {
10-
listPetsQueryParams,
11-
listPetsResponse,
12-
createPetsBody,
13-
createPetsResponse,
14-
updatePetsBody,
15-
updatePetsResponse,
16-
showPetByIdParams,
17-
showPetByIdResponse,
10+
ListPetsQueryParams,
11+
ListPetsResponse,
12+
CreatePetsBody,
13+
CreatePetsResponse,
14+
UpdatePetsBody,
15+
UpdatePetsResponse,
16+
ShowPetByIdParams,
17+
ShowPetByIdResponse,
1818
} from './pets.zod';
1919

2020
const factory = createFactory();
2121
export const listPetsHandlers = factory.createHandlers(
22-
zValidator('query', listPetsQueryParams),
23-
zValidator('response', listPetsResponse),
22+
zValidator('query', ListPetsQueryParams),
23+
zValidator('response', ListPetsResponse),
2424
async (c: ListPetsContext) => {},
2525
);
2626
export const createPetsHandlers = factory.createHandlers(
27-
zValidator('json', createPetsBody),
28-
zValidator('response', createPetsResponse),
27+
zValidator('json', CreatePetsBody),
28+
zValidator('response', CreatePetsResponse),
2929
async (c: CreatePetsContext) => {},
3030
);
3131
export const updatePetsHandlers = factory.createHandlers(
32-
zValidator('json', updatePetsBody),
33-
zValidator('response', updatePetsResponse),
32+
zValidator('json', UpdatePetsBody),
33+
zValidator('response', UpdatePetsResponse),
3434
async (c: UpdatePetsContext) => {},
3535
);
3636
export const showPetByIdHandlers = factory.createHandlers(
37-
zValidator('param', showPetByIdParams),
38-
zValidator('response', showPetByIdResponse),
37+
zValidator('param', ShowPetByIdParams),
38+
zValidator('response', ShowPetByIdResponse),
3939
async (c: ShowPetByIdContext) => {},
4040
);

samples/hono/composite-routes-with-tags-split/src/endpoints/pets/pets.zod.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,50 @@
66
*/
77
import { z as zod } from 'zod';
88

9-
export const listPetsQueryParams = zod.object({
9+
export const ListPetsQueryParams = zod.object({
1010
limit: zod
1111
.string()
1212
.optional()
1313
.describe('How many items to return at one time (max 100)'),
1414
});
1515

16-
export const listPetsResponseItem = zod.object({
16+
export const ListPetsResponseItem = zod.object({
1717
id: zod.number(),
1818
name: zod.string(),
1919
tag: zod.string(),
2020
});
21-
export const listPetsResponse = zod.array(listPetsResponseItem);
21+
export const ListPetsResponse = zod.array(ListPetsResponseItem);
2222

23-
export const createPetsBodyItem = zod.object({
23+
export const CreatePetsBodyItem = zod.object({
2424
name: zod.string(),
2525
tag: zod.string(),
2626
});
27-
export const createPetsBody = zod.array(createPetsBodyItem);
27+
export const CreatePetsBody = zod.array(CreatePetsBodyItem);
2828

29-
export const createPetsResponse = zod.object({
29+
export const CreatePetsResponse = zod.object({
3030
id: zod.number(),
3131
name: zod.string(),
3232
tag: zod.string(),
3333
});
3434

35-
export const updatePetsBody = zod.object({
35+
export const UpdatePetsBody = zod.object({
3636
id: zod.number(),
3737
name: zod.string(),
3838
tag: zod.string(),
3939
});
4040

41-
export const updatePetsResponse = zod.object({
41+
export const UpdatePetsResponse = zod.object({
4242
id: zod.number(),
4343
name: zod.string(),
4444
tag: zod.string(),
4545
});
4646

47-
export const showPetByIdParams = zod.object({
47+
export const ShowPetByIdParams = zod.object({
4848
petId: zod.string().describe('The id of the pet to retrieve'),
4949
testId: zod.string().describe('The id of the pet to retrieve'),
5050
});
5151

52-
export const showPetByIdResponse = zod.object({
52+
export const ShowPetByIdResponse = zod.object({
5353
id: zod.number(),
5454
name: zod.string(),
5555
tag: zod.string(),

0 commit comments

Comments
 (0)