vovk 3.0.0-draft.98 → 3.0.0

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 (167) hide show
  1. package/README.md +22 -13
  2. package/bin/index.mjs +10 -0
  3. package/dist/client/createRPC.d.ts +13 -3
  4. package/dist/client/createRPC.js +112 -50
  5. package/dist/client/defaultHandler.d.ts +5 -1
  6. package/dist/client/defaultHandler.js +12 -9
  7. package/dist/client/defaultStreamHandler.d.ts +16 -4
  8. package/dist/client/defaultStreamHandler.js +259 -62
  9. package/dist/client/fetcher.d.ts +41 -3
  10. package/dist/client/fetcher.js +125 -60
  11. package/dist/client/progressive.d.ts +15 -0
  12. package/dist/client/progressive.js +56 -0
  13. package/dist/{utils → client}/serializeQuery.d.ts +2 -2
  14. package/dist/{utils → client}/serializeQuery.js +1 -4
  15. package/dist/core/HttpException.d.ts +16 -0
  16. package/dist/core/HttpException.js +26 -0
  17. package/dist/core/JSONLinesResponder.d.ts +42 -0
  18. package/dist/core/JSONLinesResponder.js +92 -0
  19. package/dist/core/controllersToStaticParams.d.ts +13 -0
  20. package/dist/core/controllersToStaticParams.js +36 -0
  21. package/dist/core/createDecorator.d.ts +12 -0
  22. package/dist/{createDecorator.js → core/createDecorator.js} +18 -12
  23. package/dist/core/decorators.d.ts +59 -0
  24. package/dist/core/decorators.js +132 -0
  25. package/dist/core/getSchema.d.ts +21 -0
  26. package/dist/core/getSchema.js +31 -0
  27. package/dist/core/initSegment.d.ts +33 -0
  28. package/dist/core/initSegment.js +35 -0
  29. package/dist/core/multitenant.d.ts +33 -0
  30. package/dist/core/multitenant.js +132 -0
  31. package/dist/core/resolveGeneratorConfigValues.d.ts +19 -0
  32. package/dist/core/resolveGeneratorConfigValues.js +59 -0
  33. package/dist/{utils → core}/setHandlerSchema.d.ts +2 -2
  34. package/dist/{utils → core}/setHandlerSchema.js +1 -4
  35. package/dist/core/toDownloadResponse.d.ts +11 -0
  36. package/dist/core/toDownloadResponse.js +25 -0
  37. package/dist/core/vovkApp.d.ts +36 -0
  38. package/dist/core/vovkApp.js +316 -0
  39. package/dist/index.d.ts +25 -59
  40. package/dist/index.js +23 -23
  41. package/dist/internal.d.ts +17 -0
  42. package/dist/internal.js +10 -0
  43. package/dist/openapi/error.d.ts +2 -0
  44. package/dist/openapi/error.js +97 -0
  45. package/dist/openapi/openAPIToVovkSchema/applyComponentsSchemas.d.ts +3 -0
  46. package/dist/openapi/openAPIToVovkSchema/applyComponentsSchemas.js +65 -0
  47. package/dist/openapi/openAPIToVovkSchema/index.d.ts +5 -0
  48. package/dist/openapi/openAPIToVovkSchema/index.js +153 -0
  49. package/dist/openapi/openAPIToVovkSchema/inlineRefs.d.ts +9 -0
  50. package/dist/openapi/openAPIToVovkSchema/inlineRefs.js +99 -0
  51. package/dist/openapi/operation.d.ts +10 -0
  52. package/dist/openapi/operation.js +19 -0
  53. package/dist/openapi/tool.d.ts +2 -0
  54. package/dist/openapi/tool.js +12 -0
  55. package/dist/openapi/vovkSchemaToOpenAPI.d.ts +21 -0
  56. package/dist/openapi/vovkSchemaToOpenAPI.js +250 -0
  57. package/dist/req/bufferBody.d.ts +1 -0
  58. package/dist/req/bufferBody.js +30 -0
  59. package/dist/req/parseBody.d.ts +4 -0
  60. package/dist/req/parseBody.js +49 -0
  61. package/dist/req/parseForm.d.ts +1 -0
  62. package/dist/req/parseForm.js +24 -0
  63. package/dist/{utils → req}/parseQuery.d.ts +1 -2
  64. package/dist/{utils → req}/parseQuery.js +2 -5
  65. package/dist/req/reqMeta.d.ts +2 -0
  66. package/dist/{utils → req}/reqMeta.js +1 -4
  67. package/dist/req/reqQuery.d.ts +2 -0
  68. package/dist/req/reqQuery.js +4 -0
  69. package/dist/req/validateContentType.d.ts +1 -0
  70. package/dist/req/validateContentType.js +32 -0
  71. package/dist/samples/createCodeSamples.d.ts +20 -0
  72. package/dist/samples/createCodeSamples.js +293 -0
  73. package/dist/samples/objectToCode.d.ts +8 -0
  74. package/dist/samples/objectToCode.js +38 -0
  75. package/dist/samples/schemaToCode.d.ts +11 -0
  76. package/dist/samples/schemaToCode.js +264 -0
  77. package/dist/samples/schemaToObject.d.ts +2 -0
  78. package/dist/samples/schemaToObject.js +164 -0
  79. package/dist/samples/schemaToTsType.d.ts +2 -0
  80. package/dist/samples/schemaToTsType.js +114 -0
  81. package/dist/tools/ToModelOutput.d.ts +8 -0
  82. package/dist/tools/ToModelOutput.js +10 -0
  83. package/dist/tools/createTool.d.ts +126 -0
  84. package/dist/tools/createTool.js +6 -0
  85. package/dist/tools/createToolFactory.d.ts +135 -0
  86. package/dist/tools/createToolFactory.js +61 -0
  87. package/dist/tools/deriveTools.d.ts +46 -0
  88. package/dist/tools/deriveTools.js +134 -0
  89. package/dist/tools/toModelOutputDefault.d.ts +7 -0
  90. package/dist/tools/toModelOutputDefault.js +7 -0
  91. package/dist/tools/toModelOutputMCP.d.ts +30 -0
  92. package/dist/tools/toModelOutputMCP.js +54 -0
  93. package/dist/tsconfig.tsbuildinfo +1 -0
  94. package/dist/types/client.d.ts +140 -0
  95. package/dist/types/client.js +1 -0
  96. package/dist/types/config.d.ts +151 -0
  97. package/dist/types/config.js +1 -0
  98. package/dist/types/core.d.ts +115 -0
  99. package/dist/types/core.js +1 -0
  100. package/dist/types/enums.d.ts +75 -0
  101. package/dist/{types.js → types/enums.js} +21 -9
  102. package/dist/types/inference.d.ts +117 -0
  103. package/dist/types/inference.js +1 -0
  104. package/dist/types/json-schema.d.ts +51 -0
  105. package/dist/types/json-schema.js +1 -0
  106. package/dist/types/operation.d.ts +5 -0
  107. package/dist/types/operation.js +1 -0
  108. package/dist/types/package.d.ts +544 -0
  109. package/dist/types/package.js +5 -0
  110. package/dist/types/request.d.ts +48 -0
  111. package/dist/types/request.js +1 -0
  112. package/dist/types/standard-schema.d.ts +117 -0
  113. package/dist/types/standard-schema.js +6 -0
  114. package/dist/types/tools.d.ts +43 -0
  115. package/dist/types/tools.js +1 -0
  116. package/dist/types/utils.d.ts +9 -0
  117. package/dist/types/utils.js +1 -0
  118. package/dist/types/validation.d.ts +48 -0
  119. package/dist/types/validation.js +1 -0
  120. package/dist/utils/camelCase.d.ts +6 -0
  121. package/dist/utils/camelCase.js +34 -0
  122. package/dist/utils/deepExtend.d.ts +53 -0
  123. package/dist/utils/deepExtend.js +128 -0
  124. package/dist/utils/fileNameToDisposition.d.ts +1 -0
  125. package/dist/utils/fileNameToDisposition.js +3 -0
  126. package/dist/utils/shim.d.ts +1 -0
  127. package/dist/utils/shim.js +1 -1
  128. package/dist/utils/toKebabCase.d.ts +1 -0
  129. package/dist/utils/toKebabCase.js +5 -0
  130. package/dist/utils/trimPath.d.ts +1 -0
  131. package/dist/utils/trimPath.js +1 -0
  132. package/dist/utils/upperFirst.d.ts +1 -0
  133. package/dist/utils/upperFirst.js +3 -0
  134. package/dist/validation/createStandardValidation.d.ts +268 -0
  135. package/dist/validation/createStandardValidation.js +45 -0
  136. package/dist/validation/createValidateOnClient.d.ts +14 -0
  137. package/dist/validation/createValidateOnClient.js +23 -0
  138. package/dist/validation/procedure.d.ts +261 -0
  139. package/dist/validation/procedure.js +8 -0
  140. package/dist/validation/withValidationLibrary.d.ts +119 -0
  141. package/dist/validation/withValidationLibrary.js +174 -0
  142. package/package.json +44 -10
  143. package/dist/HttpException.d.ts +0 -7
  144. package/dist/HttpException.js +0 -15
  145. package/dist/StreamJSONResponse.d.ts +0 -14
  146. package/dist/StreamJSONResponse.js +0 -57
  147. package/dist/VovkApp.d.ts +0 -29
  148. package/dist/VovkApp.js +0 -188
  149. package/dist/client/index.d.ts +0 -3
  150. package/dist/client/index.js +0 -7
  151. package/dist/client/types.d.ts +0 -104
  152. package/dist/client/types.js +0 -2
  153. package/dist/createDecorator.d.ts +0 -6
  154. package/dist/createVovkApp.d.ts +0 -62
  155. package/dist/createVovkApp.js +0 -118
  156. package/dist/types.d.ts +0 -220
  157. package/dist/utils/generateStaticAPI.d.ts +0 -4
  158. package/dist/utils/generateStaticAPI.js +0 -18
  159. package/dist/utils/getSchema.d.ts +0 -20
  160. package/dist/utils/getSchema.js +0 -33
  161. package/dist/utils/reqForm.d.ts +0 -2
  162. package/dist/utils/reqForm.js +0 -13
  163. package/dist/utils/reqMeta.d.ts +0 -2
  164. package/dist/utils/reqQuery.d.ts +0 -2
  165. package/dist/utils/reqQuery.js +0 -10
  166. package/dist/utils/withValidation.d.ts +0 -20
  167. package/dist/utils/withValidation.js +0 -72
@@ -0,0 +1,261 @@
1
+ import type { CombinedSpec } from '../types/validation.js';
2
+ /**
3
+ * Procedure function for defining validation schemas for API procedures.
4
+ * @see https://vovk.dev/procedure
5
+ */
6
+ export declare const procedure: (<TBody extends CombinedSpec, TQuery extends CombinedSpec, TParams extends CombinedSpec, TOutput extends CombinedSpec, TIteration extends CombinedSpec, TReq extends import("../index.js").VovkRequest<import("../types/utils.js").KnownAny, import("../types/utils.js").KnownAny, import("../types/utils.js").KnownAny> = import("../index.js").VovkRequest<TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined, TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined, TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined>, TContentType extends import("../types/validation.js").ContentType | import("../types/validation.js").ContentType[] = ["application/json"]>(options?: {
7
+ contentType?: TContentType | undefined;
8
+ body?: TBody | undefined;
9
+ query?: TQuery | undefined;
10
+ params?: TParams | undefined;
11
+ output?: TOutput | undefined;
12
+ iteration?: TIteration | undefined;
13
+ disableServerSideValidation?: boolean | import("../internal.js").VovkValidationType[];
14
+ skipSchemaEmission?: boolean | import("../internal.js").VovkValidationType[];
15
+ validateEachIteration?: boolean;
16
+ preferTransformed?: boolean;
17
+ operationObject?: import("../internal.js").VovkOperationObject;
18
+ target?: CombinedSpec.Target;
19
+ }) => {
20
+ (req: TReq, params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : Record<string, string>): import("../types/utils.js").KnownAny;
21
+ __types: {
22
+ body: TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : any;
23
+ query: TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : any;
24
+ params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : any;
25
+ output: unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput>;
26
+ iteration: TIteration extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TIteration> : any;
27
+ contentType: import("../types/validation.js").NormalizeContentType<TContentType>;
28
+ };
29
+ __handleFn: (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny;
30
+ isRPC?: boolean;
31
+ fn: {
32
+ <TTransformed>(input: {
33
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
34
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
35
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
36
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
37
+ disableClientValidation?: boolean;
38
+ transform: (data: any, fakeReq: Pick<TReq, "vovk">) => TTransformed;
39
+ }): Promise<TTransformed>;
40
+ <TReturnType = any>(input?: {
41
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
42
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
43
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
44
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
45
+ disableClientValidation?: boolean;
46
+ } | undefined): TReturnType;
47
+ (input?: {
48
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
49
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
50
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
51
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
52
+ disableClientValidation?: boolean;
53
+ } | undefined): any;
54
+ };
55
+ definition: import("../types/utils.js").KnownAny;
56
+ schema: import("../types/utils.js").KnownAny;
57
+ wrapper?: import("../types/utils.js").KnownAny;
58
+ } & {
59
+ handle: unknown extends CombinedSpec.InferOutput<TOutput> ? <THandleFn extends (req: TReq, params: TParams extends CombinedSpec ? CombinedSpec.InferOutput<TParams> : Record<string, string>) => import("../types/utils.js").KnownAny>(fn: THandleFn) => {
60
+ (req: TReq, params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : Record<string, string>): import("../types/utils.js").KnownAny;
61
+ __types: {
62
+ body: TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : any;
63
+ query: TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : any;
64
+ params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : any;
65
+ output: unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput>;
66
+ iteration: TIteration extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TIteration> : any;
67
+ contentType: import("../types/validation.js").NormalizeContentType<TContentType>;
68
+ };
69
+ __handleFn: THandleFn;
70
+ isRPC?: boolean;
71
+ fn: {
72
+ <TTransformed>(input: {
73
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
74
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
75
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
76
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
77
+ disableClientValidation?: boolean;
78
+ transform: (data: Awaited<ReturnType<THandleFn>>, fakeReq: Pick<TReq, "vovk">) => TTransformed;
79
+ }): Promise<TTransformed>;
80
+ <TReturnType = ReturnType<THandleFn>>(input?: {
81
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
82
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
83
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
84
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
85
+ disableClientValidation?: boolean;
86
+ } | undefined): TReturnType;
87
+ (input?: {
88
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
89
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
90
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
91
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
92
+ disableClientValidation?: boolean;
93
+ } | undefined): ReturnType<THandleFn>;
94
+ };
95
+ definition: import("../types/utils.js").KnownAny;
96
+ schema: import("../types/utils.js").KnownAny;
97
+ wrapper?: import("../types/utils.js").KnownAny;
98
+ } : (fn: (req: TReq, params: TParams extends CombinedSpec ? CombinedSpec.InferOutput<TParams> : Record<string, string>) => unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput> | Promise<CombinedSpec.InferOutput<TOutput>> | (unknown extends CombinedSpec.InferOutput<TIteration> ? never : AsyncGenerator<CombinedSpec.InferOutput<TIteration>, any, any>)) => {
99
+ (req: TReq, params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : Record<string, string>): import("../types/utils.js").KnownAny;
100
+ __types: {
101
+ body: TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : any;
102
+ query: TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : any;
103
+ params: TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : any;
104
+ output: unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput>;
105
+ iteration: TIteration extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TIteration> : any;
106
+ contentType: import("../types/validation.js").NormalizeContentType<TContentType>;
107
+ };
108
+ __handleFn: (req: TReq, params: TParams extends CombinedSpec ? CombinedSpec.InferOutput<TParams> : Record<string, string>) => unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput> | Promise<CombinedSpec.InferOutput<TOutput>> | (unknown extends CombinedSpec.InferOutput<TIteration> ? never : AsyncGenerator<CombinedSpec.InferOutput<TIteration>, any, any>);
109
+ isRPC?: boolean;
110
+ fn: {
111
+ <TTransformed>(input: {
112
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
113
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
114
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
115
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
116
+ disableClientValidation?: boolean;
117
+ transform: (data: Awaited<unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput> | Promise<CombinedSpec.InferOutput<TOutput>> | (unknown extends CombinedSpec.InferOutput<TIteration> ? never : AsyncGenerator<CombinedSpec.InferOutput<TIteration>, any, any>)>, fakeReq: Pick<TReq, "vovk">) => TTransformed;
118
+ }): Promise<TTransformed>;
119
+ <TReturnType = unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput> | Promise<CombinedSpec.InferOutput<TOutput>> | (unknown extends CombinedSpec.InferOutput<TIteration> ? never : AsyncGenerator<CombinedSpec.InferOutput<TIteration>, any, any>)>(input?: {
120
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
121
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
122
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
123
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
124
+ disableClientValidation?: boolean;
125
+ } | undefined): TReturnType;
126
+ (input?: {
127
+ body?: (TBody extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TBody> : undefined) | undefined;
128
+ query?: (TQuery extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TQuery> : undefined) | undefined;
129
+ params?: (TParams extends CombinedSpec<unknown, unknown> ? CombinedSpec.InferOutput<TParams> : undefined) | undefined;
130
+ meta?: Record<string, import("../types/utils.js").KnownAny>;
131
+ disableClientValidation?: boolean;
132
+ } | undefined): unknown extends CombinedSpec.InferOutput<TOutput> ? any : CombinedSpec.InferOutput<TOutput> | Promise<CombinedSpec.InferOutput<TOutput>> | (unknown extends CombinedSpec.InferOutput<TIteration> ? never : AsyncGenerator<CombinedSpec.InferOutput<TIteration>, any, any>);
133
+ };
134
+ definition: import("../types/utils.js").KnownAny;
135
+ schema: import("../types/utils.js").KnownAny;
136
+ wrapper?: import("../types/utils.js").KnownAny;
137
+ };
138
+ }) & {
139
+ createTool: {
140
+ <TInput, TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
141
+ name: string;
142
+ title?: string;
143
+ description: string;
144
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
145
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
146
+ target?: CombinedSpec.Target;
147
+ } & {
148
+ inputSchema: CombinedSpec<TInput, TInput>;
149
+ } & {
150
+ outputSchema: CombinedSpec<TOutput, TOutput>;
151
+ } & {
152
+ execute: (input: TInput, processingMeta?: unknown) => TOutput | Promise<TOutput>;
153
+ toModelOutput: TToModelOutput;
154
+ }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>;
155
+ <TInput, TOutput>(options: {
156
+ name: string;
157
+ title?: string;
158
+ description: string;
159
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
160
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
161
+ target?: CombinedSpec.Target;
162
+ } & {
163
+ inputSchema: CombinedSpec<TInput, TInput>;
164
+ } & {
165
+ outputSchema: CombinedSpec<TOutput, TOutput>;
166
+ } & {
167
+ execute: (input: TInput, processingMeta?: unknown) => TOutput | Promise<TOutput>;
168
+ toModelOutput?: undefined;
169
+ }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
170
+ <TInput, TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
171
+ name: string;
172
+ title?: string;
173
+ description: string;
174
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
175
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
176
+ target?: CombinedSpec.Target;
177
+ } & {
178
+ inputSchema: CombinedSpec<TInput, TInput>;
179
+ } & {
180
+ outputSchema?: undefined;
181
+ } & {
182
+ execute: (input: TInput, processingMeta?: unknown) => TOutput | Promise<TOutput>;
183
+ toModelOutput: TToModelOutput;
184
+ }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>;
185
+ <TInput, TOutput>(options: {
186
+ name: string;
187
+ title?: string;
188
+ description: string;
189
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
190
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
191
+ target?: CombinedSpec.Target;
192
+ } & {
193
+ inputSchema: CombinedSpec<TInput, TInput>;
194
+ } & {
195
+ outputSchema?: undefined;
196
+ } & {
197
+ execute: (input: TInput, processingMeta?: unknown) => TOutput | Promise<TOutput>;
198
+ toModelOutput?: undefined;
199
+ }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
200
+ <TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
201
+ name: string;
202
+ title?: string;
203
+ description: string;
204
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
205
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
206
+ target?: CombinedSpec.Target;
207
+ } & {
208
+ inputSchema?: undefined;
209
+ } & {
210
+ outputSchema: CombinedSpec<TOutput, TOutput>;
211
+ } & {
212
+ execute: (input: null, processingMeta?: unknown) => TOutput | Promise<TOutput>;
213
+ toModelOutput: TToModelOutput;
214
+ }): import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>;
215
+ <TOutput>(options: {
216
+ name: string;
217
+ title?: string;
218
+ description: string;
219
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
220
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
221
+ target?: CombinedSpec.Target;
222
+ } & {
223
+ inputSchema?: undefined;
224
+ } & {
225
+ outputSchema: CombinedSpec<TOutput, TOutput>;
226
+ } & {
227
+ execute: (input: null, processingMeta?: unknown) => TOutput | Promise<TOutput>;
228
+ toModelOutput?: undefined;
229
+ }): import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
230
+ <TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
231
+ name: string;
232
+ title?: string;
233
+ description: string;
234
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
235
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>) => void) | undefined;
236
+ target?: CombinedSpec.Target;
237
+ } & {
238
+ inputSchema?: undefined;
239
+ } & {
240
+ outputSchema?: undefined;
241
+ } & {
242
+ execute: (input: null, processingMeta?: unknown) => TOutput | Promise<TOutput>;
243
+ toModelOutput: TToModelOutput;
244
+ }): import("../internal.js").VovkToolNonDerived<null, TOutput, TToModelOutput extends import("../tools/toModelOutputDefault.js").ToModelOutputDefaultFn ? import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput> : TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => infer R ? R extends Promise<infer U> ? U : R : unknown>;
245
+ <TOutput>(options: {
246
+ name: string;
247
+ title?: string;
248
+ description: string;
249
+ onExecute?: ((result: unknown, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
250
+ onError?: ((error: Error, tool: import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
251
+ target?: CombinedSpec.Target;
252
+ } & {
253
+ inputSchema?: undefined;
254
+ } & {
255
+ outputSchema?: undefined;
256
+ } & {
257
+ execute: (input: null, processingMeta?: unknown) => TOutput | Promise<TOutput>;
258
+ toModelOutput?: undefined;
259
+ }): import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
260
+ };
261
+ };
@@ -0,0 +1,8 @@
1
+ import { createStandardValidation } from './createStandardValidation.js';
2
+ /**
3
+ * Procedure function for defining validation schemas for API procedures.
4
+ * @see https://vovk.dev/procedure
5
+ */
6
+ export const procedure = createStandardValidation({
7
+ toJSONSchema: (schema, options) => schema['~standard']?.jsonSchema?.input({ target: options.target ?? 'draft-2020-12' }) ?? {},
8
+ });
@@ -0,0 +1,119 @@
1
+ import type { VovkHandlerSchema, VovkValidationType } from '../types/core.js';
2
+ import type { VovkRequest } from '../types/request.js';
3
+ import type { ContentType, VovkTypedProcedure } from '../types/validation.js';
4
+ import type { VovkOperationObject } from '../types/operation.js';
5
+ import type { KnownAny } from '../types/utils.js';
6
+ type VovkRequestAny = VovkRequest<KnownAny, KnownAny, KnownAny>;
7
+ type Meta = {
8
+ __disableClientValidation?: boolean;
9
+ [key: string]: KnownAny;
10
+ };
11
+ export declare function withValidationLibrary<THandle extends VovkTypedProcedure<(req: KnownAny, params: KnownAny) => KnownAny, KnownAny, KnownAny, KnownAny, KnownAny, KnownAny, ContentType[]>, TBodyModel, TQueryModel, TParamsModel, TOutputModel, TIterationModel, TContentType extends ContentType[] = ['application/json']>({ contentType, disableServerSideValidation, skipSchemaEmission, validateEachIteration, body, query, params, output, iteration, handle, toJSONSchema, validate, preferTransformed, operationObject, }: {
12
+ contentType: TContentType | undefined;
13
+ disableServerSideValidation: boolean | VovkValidationType[] | undefined;
14
+ skipSchemaEmission: boolean | VovkValidationType[] | undefined;
15
+ validateEachIteration: boolean | undefined;
16
+ body: TBodyModel | undefined;
17
+ query: TQueryModel | undefined;
18
+ params: TParamsModel | undefined;
19
+ output: TOutputModel | undefined;
20
+ iteration: TIterationModel | undefined;
21
+ handle: THandle;
22
+ toJSONSchema: ((model: KnownAny, meta: {
23
+ validationType: VovkValidationType;
24
+ }) => KnownAny) | undefined;
25
+ validate: (data: unknown, model: NonNullable<TBodyModel | TQueryModel | TParamsModel | TOutputModel | TIterationModel>, meta: {
26
+ validationType: VovkValidationType;
27
+ req: VovkRequestAny;
28
+ status?: number;
29
+ i?: number;
30
+ }) => unknown;
31
+ preferTransformed: boolean | undefined;
32
+ operationObject: VovkOperationObject | undefined;
33
+ }): THandle & {
34
+ schema: Omit<VovkHandlerSchema, "httpMethod" | "path"> & Partial<VovkHandlerSchema>;
35
+ wrapper?: (req: VovkRequestAny, params: Parameters<THandle>[1]) => ReturnType<THandle>;
36
+ } & {
37
+ fn: {
38
+ <TTransformed>(input: Omit<{
39
+ disableClientValidation?: boolean;
40
+ transform?: undefined;
41
+ } & (undefined extends TBodyModel | undefined ? {
42
+ body?: THandle["__types"]["body"];
43
+ } : {
44
+ body: THandle["__types"]["body"];
45
+ }) & (undefined extends TQueryModel | undefined ? {
46
+ query?: THandle["__types"]["query"];
47
+ } : {
48
+ query: THandle["__types"]["query"];
49
+ }) & (undefined extends TParamsModel | undefined ? {
50
+ params?: THandle["__types"]["params"];
51
+ } : {
52
+ params: THandle["__types"]["params"];
53
+ }) & {
54
+ meta?: Meta;
55
+ }, "transform"> & {
56
+ transform: (result: Awaited<ReturnType<THandle>>, fakeReq: Pick<VovkRequestAny, "vovk">) => TTransformed;
57
+ }): Promise<TTransformed>;
58
+ <TReturnType = ReturnType<THandle>>(input?: {
59
+ disableClientValidation?: boolean;
60
+ transform?: undefined;
61
+ } & (undefined extends TBodyModel | undefined ? {
62
+ body?: THandle["__types"]["body"];
63
+ } : {
64
+ body: THandle["__types"]["body"];
65
+ }) & (undefined extends TQueryModel | undefined ? {
66
+ query?: THandle["__types"]["query"];
67
+ } : {
68
+ query: THandle["__types"]["query"];
69
+ }) & (undefined extends TParamsModel | undefined ? {
70
+ params?: THandle["__types"]["params"];
71
+ } : {
72
+ params: THandle["__types"]["params"];
73
+ }) & {
74
+ meta?: Meta;
75
+ }): TReturnType;
76
+ <TReturnType = ReturnType<THandle>>(input?: (undefined extends TBodyModel | undefined ? undefined extends TQueryModel | undefined ? undefined extends TParamsModel | undefined ? true : false : false : false) extends true ? {
77
+ disableClientValidation?: boolean;
78
+ transform?: undefined;
79
+ } & (undefined extends TBodyModel | undefined ? {
80
+ body?: THandle["__types"]["body"];
81
+ } : {
82
+ body: THandle["__types"]["body"];
83
+ }) & (undefined extends TQueryModel | undefined ? {
84
+ query?: THandle["__types"]["query"];
85
+ } : {
86
+ query: THandle["__types"]["query"];
87
+ }) & (undefined extends TParamsModel | undefined ? {
88
+ params?: THandle["__types"]["params"];
89
+ } : {
90
+ params: THandle["__types"]["params"];
91
+ }) & {
92
+ meta?: Meta;
93
+ } : never): (undefined extends TBodyModel | undefined ? undefined extends TQueryModel | undefined ? undefined extends TParamsModel | undefined ? true : false : false : false) extends true ? TReturnType : never;
94
+ };
95
+ definition: {
96
+ contentType: TContentType | undefined;
97
+ disableServerSideValidation: boolean | VovkValidationType[] | undefined;
98
+ skipSchemaEmission: boolean | VovkValidationType[] | undefined;
99
+ validateEachIteration: boolean | undefined;
100
+ body: TBodyModel | undefined;
101
+ query: TQueryModel | undefined;
102
+ params: TParamsModel | undefined;
103
+ output: TOutputModel | undefined;
104
+ iteration: TIterationModel | undefined;
105
+ handle: THandle;
106
+ toJSONSchema: ((model: KnownAny, meta: {
107
+ validationType: VovkValidationType;
108
+ }) => KnownAny) | undefined;
109
+ validate: (data: unknown, model: NonNullable<TBodyModel | TQueryModel | TParamsModel | TOutputModel | TIterationModel>, meta: {
110
+ validationType: VovkValidationType;
111
+ req: VovkRequestAny;
112
+ status?: number;
113
+ i?: number;
114
+ }) => unknown;
115
+ preferTransformed: boolean;
116
+ operationObject: VovkOperationObject | undefined;
117
+ };
118
+ };
119
+ export {};
@@ -0,0 +1,174 @@
1
+ import { HttpException } from '../core/HttpException.js';
2
+ import { reqMeta } from '../req/reqMeta.js';
3
+ import { setHandlerSchema } from '../core/setHandlerSchema.js';
4
+ import { JSONLinesResponder } from '../core/JSONLinesResponder.js';
5
+ import { HttpStatus } from '../types/enums.js';
6
+ import { validateContentType } from '../req/validateContentType.js';
7
+ import { bufferBody } from '../req/bufferBody.js';
8
+ const validationTypes = ['body', 'query', 'params', 'output', 'iteration'];
9
+ export function withValidationLibrary({ contentType, disableServerSideValidation, skipSchemaEmission, validateEachIteration, body, query, params, output, iteration, handle, toJSONSchema, validate, preferTransformed, operationObject, }) {
10
+ preferTransformed = preferTransformed ?? true;
11
+ const disableServerSideValidationKeys = disableServerSideValidation === false
12
+ ? []
13
+ : disableServerSideValidation === true
14
+ ? validationTypes
15
+ : (disableServerSideValidation ?? []);
16
+ const skipSchemaEmissionKeys = skipSchemaEmission === false ? [] : skipSchemaEmission === true ? validationTypes : (skipSchemaEmission ?? []);
17
+ const outputHandler = async (req, handlerParams) => {
18
+ const { __disableClientValidation } = req.vovk.meta();
19
+ const data = await handle(req, handlerParams);
20
+ if (__disableClientValidation) {
21
+ return data;
22
+ }
23
+ if (output && iteration) {
24
+ throw new HttpException(HttpStatus.INTERNAL_SERVER_ERROR, "Output and iteration are mutually exclusive. You can't use them together.");
25
+ }
26
+ if (output && !disableServerSideValidationKeys.includes('output')) {
27
+ if (!data) {
28
+ throw new HttpException(HttpStatus.INTERNAL_SERVER_ERROR, 'Output is required. You probably forgot to return something from your handler.');
29
+ }
30
+ const parsed = (await validate(data, output, { validationType: 'output', req })) ?? data;
31
+ return preferTransformed ? parsed : data;
32
+ }
33
+ if (iteration && !disableServerSideValidationKeys.includes('iteration')) {
34
+ // We assume `data` is an async iterable here; you might want to check that:
35
+ if (!data || (typeof data[Symbol.asyncIterator] !== 'function' && !(data instanceof JSONLinesResponder))) {
36
+ throw new HttpException(HttpStatus.INTERNAL_SERVER_ERROR, 'Data is not an async iterable, neither JSONLinesResponder but iteration validation is defined.');
37
+ }
38
+ if (data instanceof JSONLinesResponder) {
39
+ data.onBeforeSend = async (item, i) => {
40
+ let parsed;
41
+ if (validateEachIteration || i === 0) {
42
+ parsed = (await validate(item, iteration, { validationType: 'iteration', req, status: 200, i })) ?? item;
43
+ }
44
+ else {
45
+ parsed = item;
46
+ }
47
+ return preferTransformed ? parsed : item;
48
+ };
49
+ return data;
50
+ }
51
+ // Return a brand-new async generator that yields validated items
52
+ return (async function* () {
53
+ let i = 0;
54
+ for await (const item of data) {
55
+ let parsed;
56
+ if (validateEachIteration || i === 0) {
57
+ parsed = (await validate(item, iteration, { validationType: 'iteration', req, status: 200, i })) ?? item;
58
+ }
59
+ else {
60
+ parsed = item;
61
+ }
62
+ i++;
63
+ yield preferTransformed ? parsed : item;
64
+ }
65
+ })();
66
+ }
67
+ else if (validateEachIteration) {
68
+ throw new HttpException(HttpStatus.INTERNAL_SERVER_ERROR, 'validateEachIteration is set but iteration is not defined.');
69
+ }
70
+ return data;
71
+ };
72
+ const resultHandler = (async (req, handlerParams) => {
73
+ const { __disableClientValidation } = req.vovk.meta();
74
+ if (!__disableClientValidation) {
75
+ if (body && !disableServerSideValidationKeys.includes('body')) {
76
+ if (typeof req.url === 'string')
77
+ await bufferBody(req); // buffer the body to make it replayable for validation and actual parsing
78
+ validateContentType(req, contentType ?? ['application/json']);
79
+ const data = await req.vovk.body();
80
+ const parsed = (await validate(data, body, { validationType: 'body', req })) ?? data;
81
+ const instance = preferTransformed ? parsed : data;
82
+ req.vovk.body = () => Promise.resolve(instance);
83
+ }
84
+ if (query && !disableServerSideValidationKeys.includes('query')) {
85
+ const data = req.vovk.query();
86
+ const parsed = (await validate(data, query, { validationType: 'query', req })) ?? data;
87
+ const instance = preferTransformed ? parsed : data;
88
+ req.vovk.query = () => instance;
89
+ }
90
+ if (params && !disableServerSideValidationKeys.includes('params')) {
91
+ const data = req.vovk.params();
92
+ const parsed = (await validate(data, params, { validationType: 'params', req })) ?? data;
93
+ const instance = preferTransformed ? parsed : data;
94
+ req.vovk.params = () => instance;
95
+ }
96
+ }
97
+ return outputHandler(req, handlerParams);
98
+ });
99
+ function fn(input) {
100
+ const fakeReq = {
101
+ vovk: {
102
+ body: () => Promise.resolve((input?.body ?? {})),
103
+ query: () => (input?.query ?? {}),
104
+ params: () => (input?.params ?? {}),
105
+ meta: (meta) => reqMeta(fakeReq, meta),
106
+ },
107
+ };
108
+ fakeReq.vovk.meta({ __disableClientValidation: input?.disableClientValidation, ...input?.meta });
109
+ const result = (resultHandler.wrapper ?? resultHandler)(fakeReq, (input?.params ?? {}));
110
+ if (input && 'transform' in input && typeof input.transform === 'function') {
111
+ return Promise.resolve(result).then((resolvedResult) => input.transform(resolvedResult, fakeReq));
112
+ }
113
+ return result;
114
+ }
115
+ const definition = {
116
+ contentType,
117
+ disableServerSideValidation,
118
+ skipSchemaEmission,
119
+ validateEachIteration,
120
+ body,
121
+ query,
122
+ params,
123
+ output,
124
+ iteration,
125
+ handle,
126
+ toJSONSchema,
127
+ validate,
128
+ preferTransformed,
129
+ operationObject,
130
+ };
131
+ const resultHandlerEnhanced = Object.assign(resultHandler, { fn, definition });
132
+ const validation = {};
133
+ if (toJSONSchema) {
134
+ const getJSONSchema = (model, validationType) => Object.assign(toJSONSchema(model, { validationType }), validationType === 'body' ? { 'x-contentType': contentType } : {});
135
+ if (body && !skipSchemaEmissionKeys.includes('body')) {
136
+ let bodyJSONSchema;
137
+ Object.defineProperty(validation, 'body', {
138
+ enumerable: true,
139
+ get: () => (bodyJSONSchema ??= getJSONSchema(body, 'body')),
140
+ });
141
+ }
142
+ if (query && !skipSchemaEmissionKeys.includes('query')) {
143
+ let queryJSONSchema;
144
+ Object.defineProperty(validation, 'query', {
145
+ enumerable: true,
146
+ get: () => (queryJSONSchema ??= getJSONSchema(query, 'query')),
147
+ });
148
+ }
149
+ if (params && !skipSchemaEmissionKeys.includes('params')) {
150
+ let paramsJSONSchema;
151
+ Object.defineProperty(validation, 'params', {
152
+ enumerable: true,
153
+ get: () => (paramsJSONSchema ??= getJSONSchema(params, 'params')),
154
+ });
155
+ }
156
+ if (output && !skipSchemaEmissionKeys.includes('output')) {
157
+ let outputJSONSchema;
158
+ Object.defineProperty(validation, 'output', {
159
+ enumerable: true,
160
+ get: () => (outputJSONSchema ??= getJSONSchema(output, 'output')),
161
+ });
162
+ }
163
+ if (iteration && !skipSchemaEmissionKeys.includes('iteration')) {
164
+ let iterationJSONSchema;
165
+ Object.defineProperty(validation, 'iteration', {
166
+ enumerable: true,
167
+ get: () => (iterationJSONSchema ??= getJSONSchema(iteration, 'iteration')),
168
+ });
169
+ }
170
+ }
171
+ resultHandlerEnhanced.schema = { validation, operationObject };
172
+ setHandlerSchema(resultHandlerEnhanced, { validation, operationObject });
173
+ return resultHandlerEnhanced;
174
+ }
package/package.json CHANGED
@@ -1,19 +1,50 @@
1
1
  {
2
2
  "name": "vovk",
3
- "version": "3.0.0-draft.98",
4
- "main": "dist/index.js",
5
- "module": "dist/index.js",
6
- "description": "RESTful RPC for Next.js - Transforms Next.js into a powerful REST API platform with RPC capabilities.",
3
+ "type": "module",
4
+ "files": [
5
+ "dist",
6
+ "bin"
7
+ ],
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "version": "3.0.0",
11
+ "bin": {
12
+ "vovk-cli-npx": "./bin/index.mjs"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "./internal": {
20
+ "types": "./dist/internal.d.ts",
21
+ "default": "./dist/internal.js"
22
+ },
23
+ "./fetcher": {
24
+ "types": "./dist/client/fetcher.d.ts",
25
+ "default": "./dist/client/fetcher.js"
26
+ },
27
+ "./createRPC": {
28
+ "types": "./dist/client/createRPC.d.ts",
29
+ "default": "./dist/client/createRPC.js"
30
+ },
31
+ "./createValidateOnClient": {
32
+ "types": "./dist/validation/createValidateOnClient.d.ts",
33
+ "default": "./dist/validation/createValidateOnClient.js"
34
+ }
35
+ },
36
+ "description": "Back-end Framework for Next.js App Router",
7
37
  "repository": {
8
38
  "type": "git",
9
39
  "url": "git+https://github.com/finom/vovk.git"
10
40
  },
11
41
  "scripts": {
12
- "build": "tsc",
13
- "rm-dist": "shx rm -rf dist",
42
+ "postbuild": "chmod +x ./bin/index.mjs",
43
+ "build": "rm -f *.tsbuildinfo && tsc",
44
+ "rm-dist": "rm -rf mjs cjs",
14
45
  "lint": "eslint . --fix",
15
46
  "tsc": "tsc --noEmit",
16
- "npm-publish": "if [ -z \"$NPM_TAG\" ]; then echo 'Error: NPM_TAG is not set'; exit 1; fi; cd ./dist && npm publish --tag=$NPM_TAG && cd ..",
47
+ "npm-publish": "if [ -z \"$NPM_TAG\" ]; then echo 'Error: NPM_TAG is not set'; exit 1; fi; npm publish --tag=$NPM_TAG",
17
48
  "ncu": "npm-check-updates -u"
18
49
  },
19
50
  "keywords": [
@@ -27,9 +58,12 @@
27
58
  },
28
59
  "homepage": "https://vovk.dev",
29
60
  "peerDependencies": {
30
- "next": "*"
61
+ "openapi3-ts": "^4.5.0",
62
+ "next": ">=15.0.0"
31
63
  },
32
- "optionalDependencies": {
33
- "openapi3-ts": "*"
64
+ "peerDependenciesMeta": {
65
+ "next": {
66
+ "optional": true
67
+ }
34
68
  }
35
69
  }