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.
- package/README.md +22 -13
- package/bin/index.mjs +10 -0
- package/dist/client/createRPC.d.ts +13 -3
- package/dist/client/createRPC.js +112 -50
- package/dist/client/defaultHandler.d.ts +5 -1
- package/dist/client/defaultHandler.js +12 -9
- package/dist/client/defaultStreamHandler.d.ts +16 -4
- package/dist/client/defaultStreamHandler.js +259 -62
- package/dist/client/fetcher.d.ts +41 -3
- package/dist/client/fetcher.js +125 -60
- package/dist/client/progressive.d.ts +15 -0
- package/dist/client/progressive.js +56 -0
- package/dist/{utils → client}/serializeQuery.d.ts +2 -2
- package/dist/{utils → client}/serializeQuery.js +1 -4
- package/dist/core/HttpException.d.ts +16 -0
- package/dist/core/HttpException.js +26 -0
- package/dist/core/JSONLinesResponder.d.ts +42 -0
- package/dist/core/JSONLinesResponder.js +92 -0
- package/dist/core/controllersToStaticParams.d.ts +13 -0
- package/dist/core/controllersToStaticParams.js +36 -0
- package/dist/core/createDecorator.d.ts +12 -0
- package/dist/{createDecorator.js → core/createDecorator.js} +18 -12
- package/dist/core/decorators.d.ts +59 -0
- package/dist/core/decorators.js +132 -0
- package/dist/core/getSchema.d.ts +21 -0
- package/dist/core/getSchema.js +31 -0
- package/dist/core/initSegment.d.ts +33 -0
- package/dist/core/initSegment.js +35 -0
- package/dist/core/multitenant.d.ts +33 -0
- package/dist/core/multitenant.js +132 -0
- package/dist/core/resolveGeneratorConfigValues.d.ts +19 -0
- package/dist/core/resolveGeneratorConfigValues.js +59 -0
- package/dist/{utils → core}/setHandlerSchema.d.ts +2 -2
- package/dist/{utils → core}/setHandlerSchema.js +1 -4
- package/dist/core/toDownloadResponse.d.ts +11 -0
- package/dist/core/toDownloadResponse.js +25 -0
- package/dist/core/vovkApp.d.ts +36 -0
- package/dist/core/vovkApp.js +316 -0
- package/dist/index.d.ts +25 -59
- package/dist/index.js +23 -23
- package/dist/internal.d.ts +17 -0
- package/dist/internal.js +10 -0
- package/dist/openapi/error.d.ts +2 -0
- package/dist/openapi/error.js +97 -0
- package/dist/openapi/openAPIToVovkSchema/applyComponentsSchemas.d.ts +3 -0
- package/dist/openapi/openAPIToVovkSchema/applyComponentsSchemas.js +65 -0
- package/dist/openapi/openAPIToVovkSchema/index.d.ts +5 -0
- package/dist/openapi/openAPIToVovkSchema/index.js +153 -0
- package/dist/openapi/openAPIToVovkSchema/inlineRefs.d.ts +9 -0
- package/dist/openapi/openAPIToVovkSchema/inlineRefs.js +99 -0
- package/dist/openapi/operation.d.ts +10 -0
- package/dist/openapi/operation.js +19 -0
- package/dist/openapi/tool.d.ts +2 -0
- package/dist/openapi/tool.js +12 -0
- package/dist/openapi/vovkSchemaToOpenAPI.d.ts +21 -0
- package/dist/openapi/vovkSchemaToOpenAPI.js +250 -0
- package/dist/req/bufferBody.d.ts +1 -0
- package/dist/req/bufferBody.js +30 -0
- package/dist/req/parseBody.d.ts +4 -0
- package/dist/req/parseBody.js +49 -0
- package/dist/req/parseForm.d.ts +1 -0
- package/dist/req/parseForm.js +24 -0
- package/dist/{utils → req}/parseQuery.d.ts +1 -2
- package/dist/{utils → req}/parseQuery.js +2 -5
- package/dist/req/reqMeta.d.ts +2 -0
- package/dist/{utils → req}/reqMeta.js +1 -4
- package/dist/req/reqQuery.d.ts +2 -0
- package/dist/req/reqQuery.js +4 -0
- package/dist/req/validateContentType.d.ts +1 -0
- package/dist/req/validateContentType.js +32 -0
- package/dist/samples/createCodeSamples.d.ts +20 -0
- package/dist/samples/createCodeSamples.js +293 -0
- package/dist/samples/objectToCode.d.ts +8 -0
- package/dist/samples/objectToCode.js +38 -0
- package/dist/samples/schemaToCode.d.ts +11 -0
- package/dist/samples/schemaToCode.js +264 -0
- package/dist/samples/schemaToObject.d.ts +2 -0
- package/dist/samples/schemaToObject.js +164 -0
- package/dist/samples/schemaToTsType.d.ts +2 -0
- package/dist/samples/schemaToTsType.js +114 -0
- package/dist/tools/ToModelOutput.d.ts +8 -0
- package/dist/tools/ToModelOutput.js +10 -0
- package/dist/tools/createTool.d.ts +126 -0
- package/dist/tools/createTool.js +6 -0
- package/dist/tools/createToolFactory.d.ts +135 -0
- package/dist/tools/createToolFactory.js +61 -0
- package/dist/tools/deriveTools.d.ts +46 -0
- package/dist/tools/deriveTools.js +134 -0
- package/dist/tools/toModelOutputDefault.d.ts +7 -0
- package/dist/tools/toModelOutputDefault.js +7 -0
- package/dist/tools/toModelOutputMCP.d.ts +30 -0
- package/dist/tools/toModelOutputMCP.js +54 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/client.d.ts +140 -0
- package/dist/types/client.js +1 -0
- package/dist/types/config.d.ts +151 -0
- package/dist/types/config.js +1 -0
- package/dist/types/core.d.ts +115 -0
- package/dist/types/core.js +1 -0
- package/dist/types/enums.d.ts +75 -0
- package/dist/{types.js → types/enums.js} +21 -9
- package/dist/types/inference.d.ts +117 -0
- package/dist/types/inference.js +1 -0
- package/dist/types/json-schema.d.ts +51 -0
- package/dist/types/json-schema.js +1 -0
- package/dist/types/operation.d.ts +5 -0
- package/dist/types/operation.js +1 -0
- package/dist/types/package.d.ts +544 -0
- package/dist/types/package.js +5 -0
- package/dist/types/request.d.ts +48 -0
- package/dist/types/request.js +1 -0
- package/dist/types/standard-schema.d.ts +117 -0
- package/dist/types/standard-schema.js +6 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.js +1 -0
- package/dist/types/utils.d.ts +9 -0
- package/dist/types/utils.js +1 -0
- package/dist/types/validation.d.ts +48 -0
- package/dist/types/validation.js +1 -0
- package/dist/utils/camelCase.d.ts +6 -0
- package/dist/utils/camelCase.js +34 -0
- package/dist/utils/deepExtend.d.ts +53 -0
- package/dist/utils/deepExtend.js +128 -0
- package/dist/utils/fileNameToDisposition.d.ts +1 -0
- package/dist/utils/fileNameToDisposition.js +3 -0
- package/dist/utils/shim.d.ts +1 -0
- package/dist/utils/shim.js +1 -1
- package/dist/utils/toKebabCase.d.ts +1 -0
- package/dist/utils/toKebabCase.js +5 -0
- package/dist/utils/trimPath.d.ts +1 -0
- package/dist/utils/trimPath.js +1 -0
- package/dist/utils/upperFirst.d.ts +1 -0
- package/dist/utils/upperFirst.js +3 -0
- package/dist/validation/createStandardValidation.d.ts +268 -0
- package/dist/validation/createStandardValidation.js +45 -0
- package/dist/validation/createValidateOnClient.d.ts +14 -0
- package/dist/validation/createValidateOnClient.js +23 -0
- package/dist/validation/procedure.d.ts +261 -0
- package/dist/validation/procedure.js +8 -0
- package/dist/validation/withValidationLibrary.d.ts +119 -0
- package/dist/validation/withValidationLibrary.js +174 -0
- package/package.json +44 -10
- package/dist/HttpException.d.ts +0 -7
- package/dist/HttpException.js +0 -15
- package/dist/StreamJSONResponse.d.ts +0 -14
- package/dist/StreamJSONResponse.js +0 -57
- package/dist/VovkApp.d.ts +0 -29
- package/dist/VovkApp.js +0 -188
- package/dist/client/index.d.ts +0 -3
- package/dist/client/index.js +0 -7
- package/dist/client/types.d.ts +0 -104
- package/dist/client/types.js +0 -2
- package/dist/createDecorator.d.ts +0 -6
- package/dist/createVovkApp.d.ts +0 -62
- package/dist/createVovkApp.js +0 -118
- package/dist/types.d.ts +0 -220
- package/dist/utils/generateStaticAPI.d.ts +0 -4
- package/dist/utils/generateStaticAPI.js +0 -18
- package/dist/utils/getSchema.d.ts +0 -20
- package/dist/utils/getSchema.js +0 -33
- package/dist/utils/reqForm.d.ts +0 -2
- package/dist/utils/reqForm.js +0 -13
- package/dist/utils/reqMeta.d.ts +0 -2
- package/dist/utils/reqQuery.d.ts +0 -2
- package/dist/utils/reqQuery.js +0 -10
- package/dist/utils/withValidation.d.ts +0 -20
- 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
|
-
"
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
"
|
|
13
|
-
"
|
|
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;
|
|
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
|
-
"
|
|
61
|
+
"openapi3-ts": "^4.5.0",
|
|
62
|
+
"next": ">=15.0.0"
|
|
31
63
|
},
|
|
32
|
-
"
|
|
33
|
-
"
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"next": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
34
68
|
}
|
|
35
69
|
}
|