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.
Files changed (51) hide show
  1. package/dist/HttpException.d.ts +7 -0
  2. package/dist/HttpException.js +15 -0
  3. package/dist/JSONLinesResponse.d.ts +14 -0
  4. package/dist/JSONLinesResponse.js +59 -0
  5. package/dist/VovkApp.d.ts +29 -0
  6. package/dist/VovkApp.js +189 -0
  7. package/dist/client/index.d.ts +3 -0
  8. package/dist/client/index.js +7 -0
  9. package/dist/client/types.d.ts +102 -0
  10. package/dist/client/types.js +2 -0
  11. package/dist/createDecorator.d.ts +6 -0
  12. package/dist/createDecorator.js +43 -0
  13. package/dist/createVovkApp.d.ts +62 -0
  14. package/dist/createVovkApp.js +129 -0
  15. package/dist/internal.d.ts +1 -1
  16. package/dist/internal.js +1 -0
  17. package/dist/tools/createTool.d.ts +32 -32
  18. package/dist/tools/createToolFactory.d.ts +33 -33
  19. package/dist/tools/deriveTools.d.ts +5 -5
  20. package/dist/tools/deriveTools.js +5 -6
  21. package/dist/tsconfig.tsbuildinfo +1 -1
  22. package/dist/types/standard-tool.d.ts +17 -0
  23. package/dist/types/standard-tool.js +1 -0
  24. package/dist/types/tools.d.ts +20 -16
  25. package/dist/types.d.ts +239 -0
  26. package/dist/types.js +66 -0
  27. package/dist/utils/generateStaticAPI.d.ts +4 -0
  28. package/dist/utils/generateStaticAPI.js +30 -0
  29. package/dist/utils/getSchema.d.ts +20 -0
  30. package/dist/utils/getSchema.js +33 -0
  31. package/dist/utils/parseQuery.d.ts +25 -0
  32. package/dist/utils/parseQuery.js +156 -0
  33. package/dist/utils/reqForm.d.ts +2 -0
  34. package/dist/utils/reqForm.js +32 -0
  35. package/dist/utils/reqMeta.d.ts +2 -0
  36. package/dist/utils/reqMeta.js +13 -0
  37. package/dist/utils/reqQuery.d.ts +2 -0
  38. package/dist/utils/reqQuery.js +10 -0
  39. package/dist/utils/serializeQuery.d.ts +13 -0
  40. package/dist/utils/serializeQuery.js +65 -0
  41. package/dist/utils/setHandlerSchema.d.ts +4 -0
  42. package/dist/utils/setHandlerSchema.js +15 -0
  43. package/dist/utils/withValidation.d.ts +21 -0
  44. package/dist/utils/withValidation.js +88 -0
  45. package/dist/validation/createStandardValidation.d.ts +32 -32
  46. package/dist/validation/procedure.d.ts +32 -32
  47. package/dist/validation/validationSchemasObjectToSingleValidationSchema.d.ts +17 -0
  48. package/dist/validation/validationSchemasObjectToSingleValidationSchema.js +92 -0
  49. package/package.json +1 -1
  50. package/dist/core/compose.d.ts +0 -38
  51. 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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
152
+ execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
153
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>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
167
+ execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
168
168
  toModelOutput?: undefined;
169
- }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
182
+ execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
183
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>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
197
+ execute: (input: TInput, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
198
198
  toModelOutput?: undefined;
199
- }): import("../internal.js").VovkToolNonDerived<TInput, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
212
+ execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
213
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>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
227
+ execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
228
228
  toModelOutput?: undefined;
229
- }): import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
242
+ execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
243
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>;
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("../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;
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?: unknown) => TOutput | Promise<TOutput>;
257
+ execute: (input: null, processingMeta?: import("../types/utils.js").KnownAny) => TOutput | Promise<TOutput>;
258
258
  toModelOutput?: undefined;
259
- }): import("../internal.js").VovkToolNonDerived<null, TOutput, import("../tools/toModelOutputDefault.js").DefaultModelOutput<TOutput>>;
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
@@ -7,7 +7,7 @@
7
7
  ],
8
8
  "main": "./dist/index.js",
9
9
  "types": "./dist/index.d.ts",
10
- "version": "3.2.2",
10
+ "version": "3.4.0",
11
11
  "bin": {
12
12
  "vovk-cli-npx": "./bin/index.mjs"
13
13
  },
@@ -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;
@@ -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
- }