@kubb/plugin-zod 3.0.0-alpha.9 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +14 -5
  2. package/dist/chunk-5PR4KKK7.js +235 -0
  3. package/dist/chunk-5PR4KKK7.js.map +1 -0
  4. package/dist/chunk-6MMPQJME.cjs +244 -0
  5. package/dist/chunk-6MMPQJME.cjs.map +1 -0
  6. package/dist/chunk-FLFW72FT.cjs +344 -0
  7. package/dist/chunk-FLFW72FT.cjs.map +1 -0
  8. package/dist/chunk-UONLSRDV.js +337 -0
  9. package/dist/chunk-UONLSRDV.js.map +1 -0
  10. package/dist/components.cjs +11 -10
  11. package/dist/components.cjs.map +1 -1
  12. package/dist/components.d.cts +20 -19
  13. package/dist/components.d.ts +20 -19
  14. package/dist/components.js +2 -14
  15. package/dist/components.js.map +1 -1
  16. package/dist/generators.cjs +17 -0
  17. package/dist/generators.cjs.map +1 -0
  18. package/dist/generators.d.cts +10 -0
  19. package/dist/generators.d.ts +10 -0
  20. package/dist/generators.js +4 -0
  21. package/dist/generators.js.map +1 -0
  22. package/dist/index.cjs +12 -8
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +4 -137
  25. package/dist/index.d.ts +4 -137
  26. package/dist/index.js +3 -12
  27. package/dist/index.js.map +1 -1
  28. package/dist/types-ryu2n1NA.d.cts +95 -0
  29. package/dist/types-ryu2n1NA.d.ts +95 -0
  30. package/package.json +19 -21
  31. package/src/components/Operations.tsx +12 -98
  32. package/src/components/Zod.tsx +66 -0
  33. package/src/components/index.ts +1 -2
  34. package/src/generators/__snapshots__/anyof.ts +3 -0
  35. package/src/generators/__snapshots__/createPet.ts +15 -0
  36. package/src/generators/__snapshots__/createPetWithUnknownTypeAny.ts +13 -0
  37. package/src/generators/__snapshots__/createPetWithUnknownTypeUnknown.ts +15 -0
  38. package/src/generators/__snapshots__/deletePet.ts +3 -0
  39. package/src/generators/__snapshots__/discriminator.ts +3 -0
  40. package/src/generators/__snapshots__/enumBooleanLiteral.ts +3 -0
  41. package/src/generators/__snapshots__/enumNamesType.ts +3 -0
  42. package/src/generators/__snapshots__/enumNullable.ts +3 -0
  43. package/src/generators/__snapshots__/enumSingleLiteral.ts +3 -0
  44. package/src/generators/__snapshots__/enumVarNamesType.ts +3 -0
  45. package/src/generators/__snapshots__/example.ts +3 -0
  46. package/src/generators/__snapshots__/getPets.ts +18 -0
  47. package/src/generators/__snapshots__/mixedValueTypeConst.ts +6 -0
  48. package/src/generators/__snapshots__/nullableString.ts +3 -0
  49. package/src/generators/__snapshots__/nullableStringUuid.ts +3 -0
  50. package/src/generators/__snapshots__/nullableStringWithAnyOf.ts +3 -0
  51. package/src/generators/__snapshots__/numberValueConst.ts +6 -0
  52. package/src/generators/__snapshots__/oneof.ts +3 -0
  53. package/src/generators/__snapshots__/operations.ts +46 -0
  54. package/src/generators/__snapshots__/optionalPetInfer.ts +5 -0
  55. package/src/generators/__snapshots__/optionalPetTyped.ts +3 -0
  56. package/src/generators/__snapshots__/order.ts +3 -0
  57. package/src/generators/__snapshots__/orderDateTyeString.ts +10 -0
  58. package/src/generators/__snapshots__/orderDateTypeFalse.ts +3 -0
  59. package/src/generators/__snapshots__/orderDateTypeString.ts +3 -0
  60. package/src/generators/__snapshots__/pet.ts +3 -0
  61. package/src/generators/__snapshots__/petArray.ts +6 -0
  62. package/src/generators/__snapshots__/petCoercion.ts +3 -0
  63. package/src/generators/__snapshots__/petTupleObject.ts +6 -0
  64. package/src/generators/__snapshots__/petWithMapper.ts +3 -0
  65. package/src/generators/__snapshots__/pets.ts +3 -0
  66. package/src/generators/__snapshots__/recursive.ts +3 -0
  67. package/src/generators/__snapshots__/showPetById.ts +18 -0
  68. package/src/generators/__snapshots__/stringValueConst.ts +6 -0
  69. package/src/generators/__snapshots__/uuidSchema.ts +3 -0
  70. package/src/generators/index.ts +2 -0
  71. package/src/generators/operationsGenerator.tsx +39 -0
  72. package/src/generators/zodGenerator.tsx +121 -0
  73. package/src/parser/index.ts +24 -8
  74. package/src/plugin.ts +30 -39
  75. package/src/types.ts +42 -88
  76. package/dist/Operations-BG26e_MW.d.cts +0 -47
  77. package/dist/Operations-BG26e_MW.d.ts +0 -47
  78. package/dist/chunk-57AHBVYK.cjs +0 -3502
  79. package/dist/chunk-57AHBVYK.cjs.map +0 -1
  80. package/dist/chunk-CUPQVLRZ.js +0 -3502
  81. package/dist/chunk-CUPQVLRZ.js.map +0 -1
  82. package/src/SchemaGenerator.tsx +0 -22
  83. package/src/components/OperationSchema.tsx +0 -60
  84. package/src/components/Schema.tsx +0 -166
  85. package/src/components/__snapshots__/operations.ts +0 -53
@@ -1,29 +1,17 @@
1
- import { useOperationManager, useOperations } from '@kubb/plugin-oas/hooks'
2
- import { Const, File, useApp } from '@kubb/react'
1
+ import type { SchemaNames } from '@kubb/plugin-oas/hooks'
2
+ import { Const, File } from '@kubb/react'
3
3
 
4
4
  import transformers from '@kubb/core/transformers'
5
5
  import type { HttpMethod, Operation } from '@kubb/oas'
6
6
  import type { KubbNode } from '@kubb/react/types'
7
- import type { ComponentProps, ComponentType } from 'react'
8
- import type { FileMeta, PluginZod } from '../types.ts'
9
7
 
10
- type TemplateProps = {
11
- /**
12
- * Name of the function
13
- */
14
- operationsName: string
15
- /**
16
- * Name of the function
17
- */
18
- pathsName: string
19
- operations: Operation[]
8
+ type Props = {
9
+ name: string
10
+ operations: Array<{ operation: Operation; data: SchemaNames }>
20
11
  }
21
12
 
22
- function Template({ operationsName, pathsName, operations }: TemplateProps): KubbNode {
23
- const { groupSchemasByName } = useOperationManager()
24
- const transformedOperations = operations.map((operation) => ({ operation, data: groupSchemasByName(operation, { type: 'function' }) }))
25
-
26
- const operationsJSON = transformedOperations.reduce(
13
+ export function Operations({ name, operations }: Props): KubbNode {
14
+ const operationsJSON = operations.reduce(
27
15
  (prev, acc) => {
28
16
  prev[`"${acc.operation.getOperationId()}"`] = acc.data
29
17
 
@@ -32,7 +20,7 @@ function Template({ operationsName, pathsName, operations }: TemplateProps): Kub
32
20
  {} as Record<string, unknown>,
33
21
  )
34
22
 
35
- const pathsJSON = transformedOperations.reduce(
23
+ const pathsJSON = operations.reduce(
36
24
  (prev, acc) => {
37
25
  prev[`"${acc.operation.path}"`] = {
38
26
  ...(prev[`"${acc.operation.path}"`] || ({} as Record<HttpMethod, string>)),
@@ -46,90 +34,16 @@ function Template({ operationsName, pathsName, operations }: TemplateProps): Kub
46
34
 
47
35
  return (
48
36
  <>
49
- <File.Source name={operationsName} isExportable isIndexable>
50
- <Const export name={operationsName} asConst>
37
+ <File.Source name={name} isExportable isIndexable>
38
+ <Const export name={name} asConst>
51
39
  {`{${transformers.stringifyObject(operationsJSON)}}`}
52
40
  </Const>
53
41
  </File.Source>
54
- <File.Source name={pathsName} isExportable isIndexable>
55
- <Const export name={pathsName} asConst>
42
+ <File.Source name={'paths'} isExportable isIndexable>
43
+ <Const export name={'paths'} asConst>
56
44
  {`{${transformers.stringifyObject(pathsJSON)}}`}
57
45
  </Const>
58
46
  </File.Source>
59
47
  </>
60
48
  )
61
49
  }
62
-
63
- type RootTemplateProps = {
64
- children?: React.ReactNode
65
- }
66
-
67
- function RootTemplate({ children }: RootTemplateProps) {
68
- const {
69
- mode,
70
- pluginManager,
71
- plugin: {
72
- key: pluginKey,
73
- options: { extName },
74
- },
75
- } = useApp<PluginZod>()
76
- const { getFile } = useOperationManager()
77
- const operations = useOperations()
78
- const { groupSchemasByName } = useOperationManager()
79
- const transformedOperations = operations.map((operation) => ({ operation, data: groupSchemasByName(operation, { type: 'function' }) }))
80
-
81
- const file = pluginManager.getFile({ name: 'operations', extName: '.ts', pluginKey })
82
- const imports = Object.entries(transformedOperations)
83
- .map(([key, { data, operation }]) => {
84
- const names = [data.request, ...Object.values(data.responses), ...Object.values(data.parameters)].filter(Boolean)
85
-
86
- return <File.Import key={key} name={names} root={file.path} path={getFile(operation).path} />
87
- })
88
- .filter(Boolean)
89
-
90
- return (
91
- <File<FileMeta> baseName={file.baseName} path={file.path} meta={file.meta}>
92
- {mode === 'split' && imports}
93
- {children}
94
- </File>
95
- )
96
- }
97
-
98
- const defaultTemplates = { default: Template, root: RootTemplate } as const
99
-
100
- type Templates = Partial<typeof defaultTemplates>
101
-
102
- type Props = {
103
- /**
104
- * This will make it possible to override the default behaviour.
105
- */
106
- Template?: ComponentType<ComponentProps<typeof Template>>
107
- }
108
-
109
- export function Operations({ Template = defaultTemplates.default }: Props): KubbNode {
110
- const operations = useOperations()
111
-
112
- return <Template operationsName="operations" pathsName="paths" operations={operations} />
113
- }
114
-
115
- type FileProps = {
116
- /**
117
- * This will make it possible to override the default behaviour.
118
- */
119
- templates?: Templates
120
- }
121
-
122
- Operations.File = function (props: FileProps): KubbNode {
123
- const templates = { ...defaultTemplates, ...props.templates }
124
-
125
- const Template = templates.default
126
- const RootTemplate = templates.root
127
-
128
- return (
129
- <RootTemplate>
130
- <Operations Template={Template} />
131
- </RootTemplate>
132
- )
133
- }
134
-
135
- Operations.templates = defaultTemplates
@@ -0,0 +1,66 @@
1
+ import transformers from '@kubb/core/transformers'
2
+ import { type Schema, schemaKeywords } from '@kubb/plugin-oas'
3
+ import { isKeyword } from '@kubb/plugin-oas'
4
+ import { Const, File, Type } from '@kubb/react'
5
+ import type { KubbNode } from '@kubb/react/types'
6
+ import * as parserZod from '../parser/index.ts'
7
+ import type { PluginZod } from '../types.ts'
8
+
9
+ type Props = {
10
+ name: string
11
+ typeName?: string
12
+ inferTypeName?: string
13
+ tree: Array<Schema>
14
+ description?: string
15
+ coercion: PluginZod['resolvedOptions']['coercion']
16
+ mapper: PluginZod['resolvedOptions']['mapper']
17
+ keysToOmit?: string[]
18
+ }
19
+
20
+ export function Zod({ name, typeName, tree, inferTypeName, mapper, coercion, keysToOmit, description }: Props): KubbNode {
21
+ const hasTuple = tree.some((item) => isKeyword(item, schemaKeywords.tuple))
22
+
23
+ const output = parserZod
24
+ .sort(tree)
25
+ .filter((item) => {
26
+ if (hasTuple && (isKeyword(item, schemaKeywords.min) || isKeyword(item, schemaKeywords.max))) {
27
+ return false
28
+ }
29
+
30
+ return true
31
+ })
32
+ .map((item) => parserZod.parse(undefined, item, { name, keysToOmit, typeName: typeName, description, mapper, coercion }))
33
+ .filter(Boolean)
34
+ .join('')
35
+
36
+ const suffix = output.endsWith('.nullable()') ? '.unwrap().and' : '.and'
37
+
38
+ return (
39
+ <>
40
+ <File.Source name={name} isExportable isIndexable>
41
+ <Const
42
+ export
43
+ name={name}
44
+ JSDoc={{
45
+ comments: [description ? `@description ${transformers.jsStringEscape(description)}` : undefined].filter(Boolean),
46
+ }}
47
+ >
48
+ {[
49
+ output,
50
+ keysToOmit?.length ? `${suffix}(z.object({ ${keysToOmit.map((key) => `${key}: z.never()`).join(',')} }))` : undefined,
51
+ typeName ? ` as z.ZodType<${typeName}>` : '',
52
+ ]
53
+ .filter(Boolean)
54
+ .join('') || ''}
55
+ </Const>
56
+ </File.Source>
57
+ {inferTypeName && (
58
+ <File.Source name={inferTypeName} isExportable isIndexable isTypeOnly>
59
+ <Type export name={inferTypeName}>
60
+ {`z.infer<typeof ${name}>`}
61
+ </Type>
62
+ </File.Source>
63
+ )}
64
+ </>
65
+ )
66
+ }
@@ -1,3 +1,2 @@
1
- export { OperationSchema } from './OperationSchema.tsx'
2
1
  export { Operations } from './Operations.tsx'
3
- export { Schema } from './Schema.tsx'
2
+ export { Zod } from './Zod.tsx'
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const test = z.union([z.object({ "propertyA": z.string() }).strict(), z.object({ "propertyA": z.string(), "propertyB": z.string() }).strict()]);
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description Null response
5
+ */
6
+ export const createPets201 = z.any();
7
+
8
+ /**
9
+ * @description unexpected error
10
+ */
11
+ export const createPetsError = z.lazy(() => error);
12
+
13
+ export const createPetsMutationRequest = z.object({ "name": z.string(), "tag": z.string() });
14
+
15
+ export const createPetsMutationResponse = z.any();
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @description Null response
3
+ */
4
+ export const createPetWithUnknownTypeAny = z.any()
5
+
6
+ /**
7
+ * @description unexpected error
8
+ */
9
+ export const createPetWithUnknownTypeAny = z.lazy(() => createPetWithUnknownTypeAny)
10
+
11
+ export const createPetWithUnknownTypeAny = z.object({ name: z.string(), tag: z.string() })
12
+
13
+ export const createPetWithUnknownTypeAny = z.any()
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description Null response
5
+ */
6
+ export const createPets201 = z.unknown();
7
+
8
+ /**
9
+ * @description unexpected error
10
+ */
11
+ export const createPetsError = z.lazy(() => error);
12
+
13
+ export const createPetsMutationRequest = z.object({ "name": z.string(), "tag": z.string() });
14
+
15
+ export const createPetsMutationResponse = z.unknown();
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const deletePetsPetidMutationResponse = z.any();
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const advanced = z.union([z.lazy(() => enumerationValueSpecificationDto).and(z.object({ "type": z.enum(["enum", "range", "regex", "slider"]) })), z.lazy(() => rangeValueSpecificationDto).and(z.object({ "type": z.enum(["enum", "range", "regex", "slider"]) })), z.lazy(() => regexValueSpecificationDto).and(z.object({ "type": z.enum(["enum", "range", "regex", "slider"]) })), z.lazy(() => sliderValueSpecificationDto).and(z.object({ "type": z.enum(["enum", "range", "regex", "slider"]) }))]);
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const enumBooleanLiteral = z.union([z.literal(true), z.literal(false)]);
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const enumNamesType = z.enum(["0", "1"]);
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const enumNullable = z.enum(["Pending", "Received"]).nullable();
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const enumSingleLiteral = z.literal(0);
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const enumVarNamesType = z.union([z.literal(0), z.literal(1)]);
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const example = z.object({ "nestedExamples": z.lazy(() => example).optional() });
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+
3
+ export const listPetsQueryParams = z.object({ "limit": z.string().describe("How many items to return at one time (max 100)").optional() }).optional();
4
+
5
+ /**
6
+ * @description A paged array of pets
7
+ */
8
+ export const listPets200 = z.lazy(() => pets);
9
+
10
+ /**
11
+ * @description unexpected error
12
+ */
13
+ export const listPetsError = z.lazy(() => error);
14
+
15
+ /**
16
+ * @description A paged array of pets
17
+ */
18
+ export const listPetsQueryResponse = z.lazy(() => pets);
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description This probably should fail miserably
5
+ */
6
+ export const mixedValueTypeConst = z.object({ "foobar": z.literal("foobar") }).describe("This probably should fail miserably");
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const nullableString = z.string().nullable();
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const nullableStringUuid = z.string().uuid().nullable();
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const nullableStringWithAnyOf = z.union([z.string(), z.null()]);
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description its value is equal to the value of the keyword
5
+ */
6
+ export const numberValueConst = z.object({ "foobar": z.literal(42) }).describe("its value is equal to the value of the keyword");
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const test = z.union([z.object({ "propertyA": z.string().optional() }), z.object({ "propertyA": z.string().optional() })]);
@@ -0,0 +1,46 @@
1
+ import { listPetsQueryResponse, listPetsQueryParams, createPetsMutationRequest, createPetsMutationResponse, showPetByIdQueryResponse, showPetByIdPathParams } from "./showPetById";
2
+
3
+ export const operations = { "listPets": {
4
+ request: undefined,
5
+ parameters: {
6
+ path: undefined,
7
+ query: listPetsQueryParams,
8
+ header: undefined
9
+ },
10
+ responses: {
11
+ 200: listPetsQueryResponse,
12
+ default: listPetsQueryResponse
13
+ },
14
+ errors: {}
15
+ }, "createPets": {
16
+ request: createPetsMutationRequest,
17
+ parameters: {
18
+ path: undefined,
19
+ query: undefined,
20
+ header: undefined
21
+ },
22
+ responses: {
23
+ 201: createPetsMutationResponse,
24
+ default: createPetsMutationResponse
25
+ },
26
+ errors: {}
27
+ }, "showPetById": {
28
+ request: undefined,
29
+ parameters: {
30
+ path: showPetByIdPathParams,
31
+ query: undefined,
32
+ header: undefined
33
+ },
34
+ responses: {
35
+ 200: showPetByIdQueryResponse,
36
+ default: showPetByIdQueryResponse
37
+ },
38
+ errors: {}
39
+ } } as const;
40
+
41
+ export const paths = { "/pets": {
42
+ get: operations["listPets"],
43
+ post: operations["createPets"]
44
+ }, "/pets/{petId}": {
45
+ get: operations["showPetById"]
46
+ } } as const;
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+
3
+ export const optionalPet = z.object({ "id": z.number().int().optional(), "name": z.string().optional(), "tag": z.string().optional() });
4
+
5
+ export type OptionalPet = z.infer<typeof optionalPet>;
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const optionalPet = z.object({ "id": z.number().int().optional(), "name": z.string().optional(), "tag": z.string().optional() }) as z.ZodType<OptionalPet>;
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const order = z.object({ "id": z.number().int().optional(), "petId": z.number().int().optional(), "quantity": z.number().int().optional(), "shipDate": z.date().optional(), "status": z.enum(["placed", "approved", "delivered"]).describe("Order Status").optional(), "complete": z.boolean().optional() });
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod'
2
+
3
+ export const order = z.object({
4
+ id: z.number().int().optional(),
5
+ petId: z.number().int().optional(),
6
+ quantity: z.number().int().optional(),
7
+ shipDate: z.string().datetime().optional(),
8
+ status: z.enum(['placed', 'approved', 'delivered']).describe('Order Status').optional(),
9
+ complete: z.boolean().optional(),
10
+ })
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const order = z.object({ "id": z.number().int().optional(), "petId": z.number().int().optional(), "quantity": z.number().int().optional(), "shipDate": z.string().optional(), "status": z.enum(["placed", "approved", "delivered"]).describe("Order Status").optional(), "complete": z.boolean().optional() });
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const order = z.object({ "id": z.number().int().optional(), "petId": z.number().int().optional(), "quantity": z.number().int().optional(), "shipDate": z.string().datetime().optional(), "status": z.enum(["placed", "approved", "delivered"]).describe("Order Status").optional(), "complete": z.boolean().optional() });
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const pet = z.object({ "id": z.number().int(), "name": z.string(), "date": z.date().optional(), "tag": z.string().min(5).max(100).optional() });
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description List of Pet object
5
+ */
6
+ export const petArray = z.array(z.lazy(() => pet)).min(1).max(3).describe("List of Pet object");
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const pet = z.object({ "id": z.coerce.number().int(), "name": z.coerce.string(), "date": z.coerce.date().optional(), "tag": z.coerce.string().min(5).max(100).optional() });
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description Tuple of exact length 2 nested in an object
5
+ */
6
+ export const petTupleObject = z.object({ "tupleProperty": z.tuple([z.string(), z.string()]).optional() }).describe("Tuple of exact length 2 nested in an object");
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const pet = z.object({ "id": z.number().int(), "name": z.string().email(), "date": z.date().optional(), "tag": z.string().min(5).max(100).optional() });
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const pets = z.array(z.object({ "id": z.number().int(), "name": z.string(), "tag": z.string().optional() })) as z.ZodType<Pets>;
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const example = z.object({ "name": z.string(), "children": z.array(z.lazy(() => example)) });
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+
3
+ export const showPetByIdPathParams = z.object({ "petId": z.string().describe("The id of the pet to retrieve"), "testId": z.string().describe("The id of the pet to retrieve") });
4
+
5
+ /**
6
+ * @description Expected response to a valid request
7
+ */
8
+ export const showPetById200 = z.lazy(() => pet);
9
+
10
+ /**
11
+ * @description unexpected error
12
+ */
13
+ export const showPetByIdError = z.lazy(() => error);
14
+
15
+ /**
16
+ * @description Expected response to a valid request
17
+ */
18
+ export const showPetByIdQueryResponse = z.lazy(() => pet);
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * @description its value is equal to the value of the keyword
5
+ */
6
+ export const stringValueConst = z.object({ "foobar": z.literal("foobar") }).describe("its value is equal to the value of the keyword");
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+
3
+ export const uuidSchema = z.string().uuid();
@@ -0,0 +1,2 @@
1
+ export { zodGenerator } from './zodGenerator.tsx'
2
+ export { operationsGenerator } from './operationsGenerator.tsx'
@@ -0,0 +1,39 @@
1
+ import { createReactGenerator } from '@kubb/plugin-oas'
2
+ import { useOperationManager } from '@kubb/plugin-oas/hooks'
3
+ import { File, useApp } from '@kubb/react'
4
+ import { Operations } from '../components/Operations'
5
+ import { pluginZodName } from '../plugin.ts'
6
+ import type { PluginZod } from '../types'
7
+
8
+ export const operationsGenerator = createReactGenerator<PluginZod>({
9
+ name: 'operations',
10
+ Operations({ operations }) {
11
+ const {
12
+ pluginManager,
13
+ plugin: {
14
+ options: { output },
15
+ },
16
+ } = useApp<PluginZod>()
17
+ const { getFile, groupSchemasByName } = useOperationManager()
18
+
19
+ const name = 'operations'
20
+ const file = pluginManager.getFile({ name, extname: '.ts', pluginKey: [pluginZodName] })
21
+
22
+ const transformedOperations = operations.map((operation) => ({ operation, data: groupSchemasByName(operation, { type: 'function' }) }))
23
+
24
+ const imports = Object.entries(transformedOperations)
25
+ .map(([key, { data, operation }]) => {
26
+ const names = [data.request, ...Object.values(data.responses), ...Object.values(data.parameters)].filter(Boolean)
27
+
28
+ return <File.Import key={key} name={names} root={file.path} path={getFile(operation).path} />
29
+ })
30
+ .filter(Boolean)
31
+
32
+ return (
33
+ <File baseName={file.baseName} path={file.path} meta={file.meta} banner={output?.banner} footer={output?.footer}>
34
+ {imports}
35
+ <Operations name={name} operations={transformedOperations} />
36
+ </File>
37
+ )
38
+ },
39
+ })