vovk 3.2.2 → 3.4.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/dist/HttpException.d.ts +7 -0
- package/dist/HttpException.js +15 -0
- package/dist/JSONLinesResponse.d.ts +14 -0
- package/dist/JSONLinesResponse.js +59 -0
- package/dist/VovkApp.d.ts +29 -0
- package/dist/VovkApp.js +189 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +7 -0
- package/dist/client/types.d.ts +102 -0
- package/dist/client/types.js +2 -0
- package/dist/createDecorator.d.ts +6 -0
- package/dist/createDecorator.js +43 -0
- package/dist/createVovkApp.d.ts +62 -0
- package/dist/createVovkApp.js +129 -0
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +1 -0
- package/dist/tools/createTool.d.ts +32 -32
- package/dist/tools/createToolFactory.d.ts +33 -33
- package/dist/tools/deriveTools.d.ts +5 -5
- package/dist/tools/deriveTools.js +5 -6
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/standard-tool.d.ts +17 -0
- package/dist/types/standard-tool.js +1 -0
- package/dist/types/tools.d.ts +20 -16
- package/dist/types.d.ts +239 -0
- package/dist/types.js +66 -0
- package/dist/utils/generateStaticAPI.d.ts +4 -0
- package/dist/utils/generateStaticAPI.js +30 -0
- package/dist/utils/getSchema.d.ts +20 -0
- package/dist/utils/getSchema.js +33 -0
- package/dist/utils/parseQuery.d.ts +25 -0
- package/dist/utils/parseQuery.js +156 -0
- package/dist/utils/reqForm.d.ts +2 -0
- package/dist/utils/reqForm.js +32 -0
- package/dist/utils/reqMeta.d.ts +2 -0
- package/dist/utils/reqMeta.js +13 -0
- package/dist/utils/reqQuery.d.ts +2 -0
- package/dist/utils/reqQuery.js +10 -0
- package/dist/utils/serializeQuery.d.ts +13 -0
- package/dist/utils/serializeQuery.js +65 -0
- package/dist/utils/setHandlerSchema.d.ts +4 -0
- package/dist/utils/setHandlerSchema.js +15 -0
- package/dist/utils/withValidation.d.ts +21 -0
- package/dist/utils/withValidation.js +88 -0
- package/dist/validation/createStandardValidation.d.ts +32 -32
- package/dist/validation/procedure.d.ts +32 -32
- package/dist/validation/validationSchemasObjectToSingleValidationSchema.d.ts +17 -0
- package/dist/validation/validationSchemasObjectToSingleValidationSchema.js +92 -0
- package/package.json +1 -1
- package/dist/core/compose.d.ts +0 -38
- package/dist/core/compose.js +0 -31
|
@@ -141,121 +141,121 @@ export declare const procedure: (<TBody extends CombinedSpec, TQuery extends Com
|
|
|
141
141
|
name: string;
|
|
142
142
|
title?: string;
|
|
143
143
|
description: string;
|
|
144
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
145
|
-
onError?: ((error: Error, tool: import("../
|
|
144
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<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("../index.js").VovkTool<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
146
|
target?: CombinedSpec.Target;
|
|
147
147
|
} & {
|
|
148
148
|
inputSchema: CombinedSpec<TInput, TInput>;
|
|
149
149
|
} & {
|
|
150
150
|
outputSchema: CombinedSpec<TOutput, TOutput>;
|
|
151
151
|
} & {
|
|
152
|
-
execute: (input: TInput, processingMeta?:
|
|
152
|
+
execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
153
153
|
toModelOutput: TToModelOutput;
|
|
154
|
-
}): import("../
|
|
154
|
+
}): import("../index.js").VovkTool<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
155
|
<TInput, TOutput>(options: {
|
|
156
156
|
name: string;
|
|
157
157
|
title?: string;
|
|
158
158
|
description: string;
|
|
159
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
160
|
-
onError?: ((error: Error, tool: import("../
|
|
159
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
160
|
+
onError?: ((error: Error, tool: import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
161
161
|
target?: CombinedSpec.Target;
|
|
162
162
|
} & {
|
|
163
163
|
inputSchema: CombinedSpec<TInput, TInput>;
|
|
164
164
|
} & {
|
|
165
165
|
outputSchema: CombinedSpec<TOutput, TOutput>;
|
|
166
166
|
} & {
|
|
167
|
-
execute: (input: TInput, processingMeta?:
|
|
167
|
+
execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
168
168
|
toModelOutput?: undefined;
|
|
169
|
-
}): import("../
|
|
169
|
+
}): import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
|
|
170
170
|
<TInput, TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
|
|
171
171
|
name: string;
|
|
172
172
|
title?: string;
|
|
173
173
|
description: string;
|
|
174
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
175
|
-
onError?: ((error: Error, tool: import("../
|
|
174
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<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("../index.js").VovkTool<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
176
|
target?: CombinedSpec.Target;
|
|
177
177
|
} & {
|
|
178
178
|
inputSchema: CombinedSpec<TInput, TInput>;
|
|
179
179
|
} & {
|
|
180
180
|
outputSchema?: undefined;
|
|
181
181
|
} & {
|
|
182
|
-
execute: (input: TInput, processingMeta?:
|
|
182
|
+
execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
183
183
|
toModelOutput: TToModelOutput;
|
|
184
|
-
}): import("../
|
|
184
|
+
}): import("../index.js").VovkTool<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
185
|
<TInput, TOutput>(options: {
|
|
186
186
|
name: string;
|
|
187
187
|
title?: string;
|
|
188
188
|
description: string;
|
|
189
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
190
|
-
onError?: ((error: Error, tool: import("../
|
|
189
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
190
|
+
onError?: ((error: Error, tool: import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
191
191
|
target?: CombinedSpec.Target;
|
|
192
192
|
} & {
|
|
193
193
|
inputSchema: CombinedSpec<TInput, TInput>;
|
|
194
194
|
} & {
|
|
195
195
|
outputSchema?: undefined;
|
|
196
196
|
} & {
|
|
197
|
-
execute: (input: TInput, processingMeta?:
|
|
197
|
+
execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
198
198
|
toModelOutput?: undefined;
|
|
199
|
-
}): import("../
|
|
199
|
+
}): import("../index.js").VovkTool<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
|
|
200
200
|
<TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
|
|
201
201
|
name: string;
|
|
202
202
|
title?: string;
|
|
203
203
|
description: string;
|
|
204
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
205
|
-
onError?: ((error: Error, tool: import("../
|
|
204
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<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("../index.js").VovkTool<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
206
|
target?: CombinedSpec.Target;
|
|
207
207
|
} & {
|
|
208
208
|
inputSchema?: undefined;
|
|
209
209
|
} & {
|
|
210
210
|
outputSchema: CombinedSpec<TOutput, TOutput>;
|
|
211
211
|
} & {
|
|
212
|
-
execute: (input: null, processingMeta?:
|
|
212
|
+
execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
213
213
|
toModelOutput: TToModelOutput;
|
|
214
|
-
}): import("../
|
|
214
|
+
}): import("../index.js").VovkTool<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
215
|
<TOutput>(options: {
|
|
216
216
|
name: string;
|
|
217
217
|
title?: string;
|
|
218
218
|
description: string;
|
|
219
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
220
|
-
onError?: ((error: Error, tool: import("../
|
|
219
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
220
|
+
onError?: ((error: Error, tool: import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
221
221
|
target?: CombinedSpec.Target;
|
|
222
222
|
} & {
|
|
223
223
|
inputSchema?: undefined;
|
|
224
224
|
} & {
|
|
225
225
|
outputSchema: CombinedSpec<TOutput, TOutput>;
|
|
226
226
|
} & {
|
|
227
|
-
execute: (input: null, processingMeta?:
|
|
227
|
+
execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
228
228
|
toModelOutput?: undefined;
|
|
229
|
-
}): import("../
|
|
229
|
+
}): import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
|
|
230
230
|
<TOutput, TToModelOutput extends (...args: import("../types/utils.js").KnownAny[]) => import("../types/utils.js").KnownAny>(options: {
|
|
231
231
|
name: string;
|
|
232
232
|
title?: string;
|
|
233
233
|
description: string;
|
|
234
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
235
|
-
onError?: ((error: Error, tool: import("../
|
|
234
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<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("../index.js").VovkTool<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
236
|
target?: CombinedSpec.Target;
|
|
237
237
|
} & {
|
|
238
238
|
inputSchema?: undefined;
|
|
239
239
|
} & {
|
|
240
240
|
outputSchema?: undefined;
|
|
241
241
|
} & {
|
|
242
|
-
execute: (input: null, processingMeta?:
|
|
242
|
+
execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
243
243
|
toModelOutput: TToModelOutput;
|
|
244
|
-
}): import("../
|
|
244
|
+
}): import("../index.js").VovkTool<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
245
|
<TOutput>(options: {
|
|
246
246
|
name: string;
|
|
247
247
|
title?: string;
|
|
248
248
|
description: string;
|
|
249
|
-
onExecute?: ((result: unknown, tool: import("../
|
|
250
|
-
onError?: ((error: Error, tool: import("../
|
|
249
|
+
onExecute?: ((result: unknown, tool: import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
250
|
+
onError?: ((error: Error, tool: import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>) => void) | undefined;
|
|
251
251
|
target?: CombinedSpec.Target;
|
|
252
252
|
} & {
|
|
253
253
|
inputSchema?: undefined;
|
|
254
254
|
} & {
|
|
255
255
|
outputSchema?: undefined;
|
|
256
256
|
} & {
|
|
257
|
-
execute: (input: null, processingMeta?:
|
|
257
|
+
execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
|
|
258
258
|
toModelOutput?: undefined;
|
|
259
|
-
}): import("../
|
|
259
|
+
}): import("../index.js").VovkTool<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
|
|
260
260
|
};
|
|
261
261
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CombinedSpec } from '../types/validation.js';
|
|
2
|
+
type SchemasObject = {
|
|
3
|
+
body?: CombinedSpec;
|
|
4
|
+
query?: CombinedSpec;
|
|
5
|
+
params?: CombinedSpec;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Combine optional `body` / `query` / `params` Standard Schemas into a single
|
|
9
|
+
* `CombinedSpec` whose `~standard` interface fully conforms to Standard Schema
|
|
10
|
+
* + Standard JSON Schema. Top-level validation (object shape, key presence,
|
|
11
|
+
* rejection of unknown keys) is handled here; per-slot value validation and
|
|
12
|
+
* JSON Schema conversion are delegated to the slot schemas.
|
|
13
|
+
*
|
|
14
|
+
* Internal helper. Not exported from the public `vovk` entrypoint.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validationSchemasObjectToSingleValidationSchema<TSchemas extends SchemasObject>(schemas: TSchemas): CombinedSpec & TSchemas;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const SLOT_KEYS = ['body', 'query', 'params'];
|
|
2
|
+
function isThenable(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && typeof value.then === 'function';
|
|
4
|
+
}
|
|
5
|
+
function prefixIssues(issues, slot) {
|
|
6
|
+
return issues.map((issue) => ({
|
|
7
|
+
message: issue.message,
|
|
8
|
+
path: [{ key: slot }, ...(issue.path ?? [])],
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Combine optional `body` / `query` / `params` Standard Schemas into a single
|
|
13
|
+
* `CombinedSpec` whose `~standard` interface fully conforms to Standard Schema
|
|
14
|
+
* + Standard JSON Schema. Top-level validation (object shape, key presence,
|
|
15
|
+
* rejection of unknown keys) is handled here; per-slot value validation and
|
|
16
|
+
* JSON Schema conversion are delegated to the slot schemas.
|
|
17
|
+
*
|
|
18
|
+
* Internal helper. Not exported from the public `vovk` entrypoint.
|
|
19
|
+
*/
|
|
20
|
+
export function validationSchemasObjectToSingleValidationSchema(schemas) {
|
|
21
|
+
const definedSlots = SLOT_KEYS.filter((key) => schemas[key] !== undefined);
|
|
22
|
+
const definedSlotSet = new Set(definedSlots);
|
|
23
|
+
const validate = (input) => {
|
|
24
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
25
|
+
return { issues: [{ message: 'Expected object', path: [] }] };
|
|
26
|
+
}
|
|
27
|
+
const topLevelIssues = [];
|
|
28
|
+
const inputRecord = input;
|
|
29
|
+
for (const slot of definedSlots) {
|
|
30
|
+
if (!(slot in inputRecord)) {
|
|
31
|
+
topLevelIssues.push({ message: 'Required', path: [{ key: slot }] });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const key of Object.keys(inputRecord)) {
|
|
35
|
+
if (!definedSlotSet.has(key)) {
|
|
36
|
+
topLevelIssues.push({ message: 'Unexpected key', path: [{ key }] });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const pending = [];
|
|
40
|
+
for (const slot of definedSlots) {
|
|
41
|
+
if (slot in inputRecord) {
|
|
42
|
+
pending.push({ slot, result: schemas[slot]['~standard'].validate(inputRecord[slot]) });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const combine = (resolved) => {
|
|
46
|
+
const issues = [...topLevelIssues];
|
|
47
|
+
const value = {};
|
|
48
|
+
for (const { slot, result } of resolved) {
|
|
49
|
+
if (result.issues?.length) {
|
|
50
|
+
issues.push(...prefixIssues(result.issues, slot));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
value[slot] = result.value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return issues.length > 0 ? { issues } : { value };
|
|
57
|
+
};
|
|
58
|
+
if (pending.some(({ result }) => isThenable(result))) {
|
|
59
|
+
return Promise.all(pending.map(async ({ slot, result }) => ({ slot, result: await result }))).then(combine);
|
|
60
|
+
}
|
|
61
|
+
return combine(pending);
|
|
62
|
+
};
|
|
63
|
+
const buildJSONSchema = (options, direction) => {
|
|
64
|
+
const properties = {};
|
|
65
|
+
for (const slot of definedSlots) {
|
|
66
|
+
properties[slot] = schemas[slot]['~standard'].jsonSchema?.[direction](options) ?? {};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties,
|
|
71
|
+
required: [...definedSlots],
|
|
72
|
+
additionalProperties: false,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
const standard = {
|
|
76
|
+
version: 1,
|
|
77
|
+
vendor: 'vovk',
|
|
78
|
+
validate,
|
|
79
|
+
jsonSchema: {
|
|
80
|
+
input: (options) => buildJSONSchema(options, 'input'),
|
|
81
|
+
output: (options) => buildJSONSchema(options, 'output'),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const result = { '~standard': standard };
|
|
85
|
+
if (schemas.body !== undefined)
|
|
86
|
+
result.body = schemas.body;
|
|
87
|
+
if (schemas.query !== undefined)
|
|
88
|
+
result.query = schemas.query;
|
|
89
|
+
if (schemas.params !== undefined)
|
|
90
|
+
result.params = schemas.params;
|
|
91
|
+
return result;
|
|
92
|
+
}
|
package/package.json
CHANGED
package/dist/core/compose.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { KnownAny } from '../types/utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* Metadata stored on a handler by HTTP decorators and custom decorators when used outside decorator context (via compose).
|
|
4
|
-
*/
|
|
5
|
-
export type ComposeMetadata = {
|
|
6
|
-
httpMethod?: string;
|
|
7
|
-
path?: string;
|
|
8
|
-
options?: KnownAny;
|
|
9
|
-
decoratorAppliers?: ((controller: KnownAny, propertyKey: string) => void)[];
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Composes decorators and a handler/class into a single value.
|
|
13
|
-
*
|
|
14
|
-
* For method-level composition, decorators are stored and applied later by initSegment.
|
|
15
|
-
* For class-level composition, decorators like prefix() and cloneControllerMetadata()
|
|
16
|
-
* are applied immediately to the class in reverse order (matching stacked decorator semantics).
|
|
17
|
-
*
|
|
18
|
-
* @example Method-level
|
|
19
|
-
* ```ts
|
|
20
|
-
* static handleParams = compose(
|
|
21
|
-
* put('x/{foo}/{bar}/y'),
|
|
22
|
-
* authGuard(null),
|
|
23
|
-
* procedure({ params: z.object({ foo: z.string(), bar: z.string() }) })
|
|
24
|
-
* .handle(async (req) => req.vovk.params())
|
|
25
|
-
* );
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @example Class-level
|
|
29
|
-
* ```ts
|
|
30
|
-
* const MyController = compose(
|
|
31
|
-
* prefix('users'),
|
|
32
|
-
* cloneControllerMetadata(),
|
|
33
|
-
* class extends ParentController {}
|
|
34
|
-
* );
|
|
35
|
-
* export default MyController;
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export declare function compose<T>(...args: [...unknown[], T]): T;
|
package/dist/core/compose.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export function compose(...args) {
|
|
2
|
-
if (args.length === 0)
|
|
3
|
-
throw new Error('compose() requires at least one argument');
|
|
4
|
-
const last = args[args.length - 1];
|
|
5
|
-
const decoratorFns = args.slice(0, -1);
|
|
6
|
-
if (typeof last !== 'function') {
|
|
7
|
-
throw new Error('The last argument to compose() must be a function, handler, or class');
|
|
8
|
-
}
|
|
9
|
-
for (const decoratorFn of decoratorFns) {
|
|
10
|
-
if (typeof decoratorFn !== 'function') {
|
|
11
|
-
throw new Error('All arguments to compose() except the last must be decorator functions');
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
// Detect class: native ES class constructors' toString() starts with "class"
|
|
15
|
-
if (last.toString().startsWith('class ')) {
|
|
16
|
-
// Apply class decorators in reverse order (bottom-up, matching stacked decorator semantics).
|
|
17
|
-
// Decorators mutate and return the same class, so .name is preserved.
|
|
18
|
-
for (let i = decoratorFns.length - 1; i >= 0; i--) {
|
|
19
|
-
decoratorFns[i](last);
|
|
20
|
-
}
|
|
21
|
-
return last;
|
|
22
|
-
}
|
|
23
|
-
// Method-level compose: store decorator appliers for deferred execution by initSegment
|
|
24
|
-
const handler = last;
|
|
25
|
-
handler._composeMetadata = handler._composeMetadata ?? {};
|
|
26
|
-
handler._composeMetadata.decoratorAppliers = handler._composeMetadata.decoratorAppliers ?? [];
|
|
27
|
-
for (const decoratorFn of decoratorFns) {
|
|
28
|
-
handler._composeMetadata.decoratorAppliers.push(decoratorFn);
|
|
29
|
-
}
|
|
30
|
-
return handler;
|
|
31
|
-
}
|