@lokalise/api-contracts 6.5.2 → 6.6.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 CHANGED
@@ -12,8 +12,8 @@ type-safe way).
12
12
 
13
13
  Use `buildContract` as a single entry point for creating any type of API contract. It automatically delegates to the appropriate specialized builder based on the configuration:
14
14
 
15
- | `sseEvents` | Contract Type |
16
- |-------------|---------------|
15
+ | `serverSentEventSchemas` | Contract Type |
16
+ |--------------------------|---------------|
17
17
  | ❌ | REST contract (GET, POST, PUT, PATCH, DELETE) |
18
18
  | ✅ | SSE or Dual-mode contract |
19
19
 
@@ -44,11 +44,9 @@ const deleteUser = buildContract({
44
44
 
45
45
  // SSE-only streaming endpoint
46
46
  const notifications = buildContract({
47
+ method: 'get',
47
48
  pathResolver: () => '/api/notifications/stream',
48
- params: z.object({}),
49
- query: z.object({}),
50
- requestHeaders: z.object({}),
51
- sseEvents: {
49
+ serverSentEventSchemas: {
52
50
  notification: z.object({ id: z.string(), message: z.string() }),
53
51
  },
54
52
  })
@@ -57,12 +55,9 @@ const notifications = buildContract({
57
55
  const chatCompletion = buildContract({
58
56
  method: 'post',
59
57
  pathResolver: () => '/api/chat/completions',
60
- params: z.object({}),
61
- query: z.object({}),
62
- requestHeaders: z.object({}),
63
- requestBody: z.object({ message: z.string() }),
64
- syncResponseBody: z.object({ reply: z.string() }),
65
- sseEvents: {
58
+ requestBodySchema: z.object({ message: z.string() }),
59
+ successResponseBodySchema: z.object({ reply: z.string() }),
60
+ serverSentEventSchemas: {
66
61
  chunk: z.object({ delta: z.string() }),
67
62
  done: z.object({ usage: z.object({ tokens: z.number() }) }),
68
63
  },
@@ -302,12 +297,12 @@ import { buildSseContract } from '@lokalise/api-contracts'
302
297
  import { z } from 'zod'
303
298
 
304
299
  // GET SSE endpoint for live notifications
300
+ // requestPathParamsSchema, requestQuerySchema, requestHeaderSchema are optional
305
301
  const notificationsStream = buildSseContract({
302
+ method: 'get',
306
303
  pathResolver: () => '/api/notifications/stream',
307
- params: z.object({}),
308
- query: z.object({ userId: z.string().optional() }),
309
- requestHeaders: z.object({}),
310
- sseEvents: {
304
+ requestQuerySchema: z.object({ userId: z.string().optional() }),
305
+ serverSentEventSchemas: {
311
306
  notification: z.object({ id: z.string(), message: z.string() }),
312
307
  },
313
308
  })
@@ -317,11 +312,8 @@ const notificationsStream = buildSseContract({
317
312
  const processStream = buildSseContract({
318
313
  method: 'post',
319
314
  pathResolver: () => '/api/process/stream',
320
- params: z.object({}),
321
- query: z.object({}),
322
- requestHeaders: z.object({}),
323
- requestBody: z.object({ fileId: z.string() }),
324
- sseEvents: {
315
+ requestBodySchema: z.object({ fileId: z.string() }),
316
+ serverSentEventSchemas: {
325
317
  progress: z.object({ percent: z.number() }),
326
318
  done: z.object({ result: z.string() }),
327
319
  },
@@ -330,15 +322,15 @@ const processStream = buildSseContract({
330
322
 
331
323
  // SSE endpoint with error schemas (for errors before streaming starts)
332
324
  const channelStream = buildSseContract({
325
+ method: 'get',
333
326
  pathResolver: (params) => `/api/channels/${params.channelId}/stream`,
334
- params: z.object({ channelId: z.string() }),
335
- query: z.object({}),
336
- requestHeaders: z.object({ authorization: z.string() }),
337
- sseEvents: {
327
+ requestPathParamsSchema: z.object({ channelId: z.string() }),
328
+ requestHeaderSchema: z.object({ authorization: z.string() }),
329
+ serverSentEventSchemas: {
338
330
  message: z.object({ text: z.string() }),
339
331
  },
340
332
  // Errors returned before streaming begins
341
- responseSchemasByStatusCode: {
333
+ responseBodySchemasByStatusCode: {
342
334
  401: z.object({ error: z.literal('Unauthorized') }),
343
335
  404: z.object({ error: z.literal('Channel not found') }),
344
336
  },
@@ -363,16 +355,13 @@ import { z } from 'zod'
363
355
  const chatCompletion = buildSseContract({
364
356
  method: 'post',
365
357
  pathResolver: () => '/api/chat/completions',
366
- params: z.object({}),
367
- query: z.object({}),
368
- requestHeaders: z.object({}),
369
- requestBody: z.object({ message: z.string() }),
370
- // Adding syncResponseBody makes it dual-mode
371
- syncResponseBody: z.object({
358
+ requestBodySchema: z.object({ message: z.string() }),
359
+ // Adding successResponseBodySchema makes it dual-mode
360
+ successResponseBodySchema: z.object({
372
361
  reply: z.string(),
373
362
  usage: z.object({ tokens: z.number() }),
374
363
  }),
375
- sseEvents: {
364
+ serverSentEventSchemas: {
376
365
  chunk: z.object({ delta: z.string() }),
377
366
  done: z.object({ usage: z.object({ totalTokens: z.number() }) }),
378
367
  },
@@ -381,15 +370,15 @@ const chatCompletion = buildSseContract({
381
370
 
382
371
  // GET dual-mode endpoint for job status (poll or stream)
383
372
  const jobStatus = buildSseContract({
373
+ method: 'get',
384
374
  pathResolver: (params) => `/api/jobs/${params.jobId}/status`,
385
- params: z.object({ jobId: z.string().uuid() }),
386
- query: z.object({ verbose: z.string().optional() }),
387
- requestHeaders: z.object({}),
388
- syncResponseBody: z.object({
375
+ requestPathParamsSchema: z.object({ jobId: z.string().uuid() }),
376
+ requestQuerySchema: z.object({ verbose: z.string().optional() }),
377
+ successResponseBodySchema: z.object({
389
378
  status: z.enum(['pending', 'running', 'completed', 'failed']),
390
379
  progress: z.number(),
391
380
  }),
392
- sseEvents: {
381
+ serverSentEventSchemas: {
393
382
  progress: z.object({ percent: z.number() }),
394
383
  done: z.object({ result: z.string() }),
395
384
  },
@@ -399,21 +388,19 @@ const jobStatus = buildSseContract({
399
388
 
400
389
  ### Response Schemas by Status Code
401
390
 
402
- Both SSE-only and dual-mode contracts support `responseSchemasByStatusCode` for defining different response shapes for errors that occur **before streaming starts** (e.g., authentication failures, validation errors, resource not found):
391
+ Both SSE-only and dual-mode contracts support `responseBodySchemasByStatusCode` for defining different response shapes for errors that occur **before streaming starts** (e.g., authentication failures, validation errors, resource not found):
403
392
 
404
393
  ```ts
405
394
  const chatCompletion = buildSseContract({
406
395
  method: 'post',
407
396
  pathResolver: () => '/api/chat/completions',
408
- params: z.object({}),
409
- query: z.object({}),
410
- requestHeaders: z.object({ authorization: z.string() }),
411
- requestBody: z.object({ message: z.string() }),
412
- syncResponseBody: z.object({ reply: z.string() }),
413
- sseEvents: {
397
+ requestHeaderSchema: z.object({ authorization: z.string() }),
398
+ requestBodySchema: z.object({ message: z.string() }),
399
+ successResponseBodySchema: z.object({ reply: z.string() }),
400
+ serverSentEventSchemas: {
414
401
  chunk: z.object({ delta: z.string() }),
415
402
  },
416
- responseSchemasByStatusCode: {
403
+ responseBodySchemasByStatusCode: {
417
404
  400: z.object({ error: z.string(), details: z.array(z.string()) }),
418
405
  401: z.object({ error: z.literal('Unauthorized') }),
419
406
  429: z.object({ error: z.string(), retryAfter: z.number() }),
@@ -423,10 +410,10 @@ const chatCompletion = buildSseContract({
423
410
 
424
411
  ### Contract Type Detection
425
412
 
426
- `buildSseContract` automatically determines the contract type based on the presence of `syncResponseBody`:
413
+ `buildSseContract` automatically determines the contract type based on the presence of `successResponseBodySchema`:
427
414
 
428
- | `syncResponseBody` | `requestBody` | Result |
429
- |-------------------|---------------|--------|
415
+ | `successResponseBodySchema` | `requestBodySchema` | Result |
416
+ |----------------------------|---------------------|--------|
430
417
  | ❌ | ❌ | SSE-only GET |
431
418
  | ❌ | ✅ | SSE-only POST/PUT/PATCH |
432
419
  | ✅ | ❌ | Dual-mode GET |
@@ -1,5 +1,5 @@
1
1
  import type { z } from 'zod/v4';
2
- import type { RoutePathResolver } from '../apiContracts.ts';
2
+ import type { CommonRouteDefinitionMetadata, RoutePathResolver } from '../apiContracts.ts';
3
3
  import type { HttpStatusCode } from '../HttpStatusCodes.ts';
4
4
  import type { SSEMethod } from './sseContracts.ts';
5
5
  import type { SSEEventSchemas } from './sseTypes.ts';
@@ -20,9 +20,9 @@ import type { SSEEventSchemas } from './sseTypes.ts';
20
20
  export type DualModeContractDefinition<Method extends SSEMethod = SSEMethod, Params extends z.ZodTypeAny = z.ZodTypeAny, Query extends z.ZodTypeAny = z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny = z.ZodTypeAny, Body extends z.ZodTypeAny | undefined = undefined, SyncResponse extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
21
21
  method: Method;
22
22
  pathResolver: RoutePathResolver<z.infer<Params>>;
23
- requestPathParamsSchema: Params;
24
- requestQuerySchema: Query;
25
- requestHeaderSchema: RequestHeaders;
23
+ requestPathParamsSchema?: Params;
24
+ requestQuerySchema?: Query;
25
+ requestHeaderSchema?: RequestHeaders;
26
26
  requestBodySchema: Body;
27
27
  /** Sync response schema - use with `sync` handler */
28
28
  successResponseBodySchema: SyncResponse;
@@ -42,6 +42,10 @@ export type DualModeContractDefinition<Method extends SSEMethod = SSEMethod, Par
42
42
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
43
43
  serverSentEventSchemas: Events;
44
44
  isDualMode: true;
45
+ metadata?: CommonRouteDefinitionMetadata;
46
+ description?: string;
47
+ summary?: string;
48
+ tags?: readonly string[];
45
49
  };
46
50
  /**
47
51
  * Type representing any dual-mode route definition (for use in generic constraints).
@@ -50,9 +54,9 @@ export type DualModeContractDefinition<Method extends SSEMethod = SSEMethod, Par
50
54
  export type AnyDualModeContractDefinition = {
51
55
  method: SSEMethod;
52
56
  pathResolver: RoutePathResolver<any>;
53
- requestPathParamsSchema: z.ZodTypeAny;
54
- requestQuerySchema: z.ZodTypeAny;
55
- requestHeaderSchema: z.ZodTypeAny;
57
+ requestPathParamsSchema?: z.ZodTypeAny;
58
+ requestQuerySchema?: z.ZodTypeAny;
59
+ requestHeaderSchema?: z.ZodTypeAny;
56
60
  requestBodySchema: z.ZodTypeAny | undefined;
57
61
  /** Sync response schema - use with `sync` handler */
58
62
  successResponseBodySchema: z.ZodTypeAny;
@@ -60,4 +64,8 @@ export type AnyDualModeContractDefinition = {
60
64
  responseBodySchemasByStatusCode?: Partial<Record<HttpStatusCode, z.ZodTypeAny>>;
61
65
  serverSentEventSchemas: SSEEventSchemas;
62
66
  isDualMode: true;
67
+ metadata?: CommonRouteDefinitionMetadata;
68
+ description?: string;
69
+ summary?: string;
70
+ tags?: readonly string[];
63
71
  };
@@ -1,5 +1,5 @@
1
1
  import type { z } from 'zod/v4';
2
- import type { RoutePathResolver } from '../apiContracts.ts';
2
+ import type { CommonRouteDefinitionMetadata, RoutePathResolver } from '../apiContracts.ts';
3
3
  import type { HttpStatusCode } from '../HttpStatusCodes.ts';
4
4
  import type { DualModeContractDefinition } from './dualModeContracts.ts';
5
5
  import type { SSEContractDefinition } from './sseContracts.ts';
@@ -11,9 +11,9 @@ import type { SSEEventSchemas } from './sseTypes.ts';
11
11
  export type SSEGetContractConfig<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
12
12
  method: 'get';
13
13
  pathResolver: RoutePathResolver<z.infer<Params>>;
14
- requestPathParamsSchema: Params;
15
- requestQuerySchema: Query;
16
- requestHeaderSchema: RequestHeaders;
14
+ requestPathParamsSchema?: Params;
15
+ requestQuerySchema?: Query;
16
+ requestHeaderSchema?: RequestHeaders;
17
17
  serverSentEventSchemas: Events;
18
18
  /**
19
19
  * Error response schemas by HTTP status code.
@@ -31,6 +31,10 @@ export type SSEGetContractConfig<Params extends z.ZodTypeAny, Query extends z.Zo
31
31
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
32
32
  requestBodySchema?: never;
33
33
  successResponseBodySchema?: never;
34
+ metadata?: CommonRouteDefinitionMetadata;
35
+ description?: string;
36
+ summary?: string;
37
+ tags?: readonly string[];
34
38
  };
35
39
  /**
36
40
  * Configuration for building a POST/PUT/PATCH SSE route with request body.
@@ -39,9 +43,9 @@ export type SSEGetContractConfig<Params extends z.ZodTypeAny, Query extends z.Zo
39
43
  export type SSEPayloadContractConfig<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, Body extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
40
44
  method: 'post' | 'put' | 'patch';
41
45
  pathResolver: RoutePathResolver<z.infer<Params>>;
42
- requestPathParamsSchema: Params;
43
- requestQuerySchema: Query;
44
- requestHeaderSchema: RequestHeaders;
46
+ requestPathParamsSchema?: Params;
47
+ requestQuerySchema?: Query;
48
+ requestHeaderSchema?: RequestHeaders;
45
49
  requestBodySchema: Body;
46
50
  serverSentEventSchemas: Events;
47
51
  /**
@@ -59,6 +63,10 @@ export type SSEPayloadContractConfig<Params extends z.ZodTypeAny, Query extends
59
63
  */
60
64
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
61
65
  successResponseBodySchema?: never;
66
+ metadata?: CommonRouteDefinitionMetadata;
67
+ description?: string;
68
+ summary?: string;
69
+ tags?: readonly string[];
62
70
  };
63
71
  /**
64
72
  * Configuration for building a GET dual-mode route.
@@ -67,9 +75,9 @@ export type SSEPayloadContractConfig<Params extends z.ZodTypeAny, Query extends
67
75
  export type DualModeGetContractConfig<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, JsonResponse extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
68
76
  method: 'get';
69
77
  pathResolver: RoutePathResolver<z.infer<Params>>;
70
- requestPathParamsSchema: Params;
71
- requestQuerySchema: Query;
72
- requestHeaderSchema: RequestHeaders;
78
+ requestPathParamsSchema?: Params;
79
+ requestQuerySchema?: Query;
80
+ requestHeaderSchema?: RequestHeaders;
73
81
  /** Single sync response schema */
74
82
  successResponseBodySchema: JsonResponse;
75
83
  /**
@@ -100,6 +108,10 @@ export type DualModeGetContractConfig<Params extends z.ZodTypeAny, Query extends
100
108
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
101
109
  serverSentEventSchemas: Events;
102
110
  requestBodySchema?: never;
111
+ metadata?: CommonRouteDefinitionMetadata;
112
+ description?: string;
113
+ summary?: string;
114
+ tags?: readonly string[];
103
115
  };
104
116
  /**
105
117
  * Configuration for building a POST/PUT/PATCH dual-mode route with request body.
@@ -108,9 +120,9 @@ export type DualModeGetContractConfig<Params extends z.ZodTypeAny, Query extends
108
120
  export type DualModePayloadContractConfig<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, Body extends z.ZodTypeAny, JsonResponse extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
109
121
  method: 'post' | 'put' | 'patch';
110
122
  pathResolver: RoutePathResolver<z.infer<Params>>;
111
- requestPathParamsSchema: Params;
112
- requestQuerySchema: Query;
113
- requestHeaderSchema: RequestHeaders;
123
+ requestPathParamsSchema?: Params;
124
+ requestQuerySchema?: Query;
125
+ requestHeaderSchema?: RequestHeaders;
114
126
  requestBodySchema: Body;
115
127
  /** Single sync response schema */
116
128
  successResponseBodySchema: JsonResponse;
@@ -141,6 +153,10 @@ export type DualModePayloadContractConfig<Params extends z.ZodTypeAny, Query ext
141
153
  */
142
154
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
143
155
  serverSentEventSchemas: Events;
156
+ metadata?: CommonRouteDefinitionMetadata;
157
+ description?: string;
158
+ summary?: string;
159
+ tags?: readonly string[];
144
160
  };
145
161
  export declare function buildSseContract<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, JsonResponse extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: DualModeGetContractConfig<Params, Query, RequestHeaders, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>): DualModeContractDefinition<'get', Params, Query, RequestHeaders, undefined, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
146
162
  export declare function buildSseContract<Params extends z.ZodTypeAny, Query extends z.ZodTypeAny, RequestHeaders extends z.ZodTypeAny, Events extends SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: SSEGetContractConfig<Params, Query, RequestHeaders, Events, ResponseSchemasByStatusCode>): SSEContractDefinition<'get', Params, Query, RequestHeaders, undefined, Events, ResponseSchemasByStatusCode>;
@@ -62,6 +62,10 @@ function buildBaseFields(config, hasBody) {
62
62
  requestHeaderSchema: config.requestHeaderSchema,
63
63
  requestBodySchema: hasBody ? config.requestBodySchema : undefined,
64
64
  serverSentEventSchemas: config.serverSentEventSchemas,
65
+ metadata: config.metadata,
66
+ description: config.description,
67
+ summary: config.summary,
68
+ tags: config.tags,
65
69
  };
66
70
  }
67
71
  // Helper to determine method
@@ -1 +1 @@
1
- {"version":3,"file":"sseContractBuilders.js","sourceRoot":"","sources":["../../src/sse/sseContractBuilders.ts"],"names":[],"mappings":"AA2LA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,uCAAuC;AACvC,gEAAgE;AAChE,SAAS,eAAe,CAAC,MAAW,EAAE,OAAgB;IACpD,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;QACjE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;KACtD,CAAA;AACH,CAAC;AAED,6BAA6B;AAC7B,SAAS,eAAe,CAAC,MAA0B;IACjD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAwHD,iBAAiB;AACjB,MAAM,UAAU,gBAAgB,CAC9B,MAOiD;IAGjD,MAAM,mBAAmB,GACvB,2BAA2B,IAAI,MAAM,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS,CAAA;IACzF,MAAM,OAAO,GAAG,mBAAmB,IAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAA;IACvF,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE7C,IAAI,mBAAmB,EAAE,CAAC;QACxB,qBAAqB;QACrB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,eAAe,CAAC,MAA4B,CAAC;YACrD,yBAAyB,EAAG,MAAiD;iBAC1E,yBAAyB;YAC5B,oBAAoB,EAAG,MAA6C,CAAC,oBAAoB;YACzF,+BAA+B,EAAG,MAAwD;iBACvF,+BAA+B;YAClC,UAAU,EAAE,IAAI;SACjB,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,eAAe,CAAC,MAA4B,CAAC;QACrD,+BAA+B,EAAG,MAAwD;aACvF,+BAA+B;QAClC,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"sseContractBuilders.js","sourceRoot":"","sources":["../../src/sse/sseContractBuilders.ts"],"names":[],"mappings":"AA2MA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,uCAAuC;AACvC,gEAAgE;AAChE,SAAS,eAAe,CAAC,MAAW,EAAE,OAAgB;IACpD,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;QACjE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAA;AACH,CAAC;AAED,6BAA6B;AAC7B,SAAS,eAAe,CAAC,MAA0B;IACjD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAwHD,iBAAiB;AACjB,MAAM,UAAU,gBAAgB,CAC9B,MAOiD;IAGjD,MAAM,mBAAmB,GACvB,2BAA2B,IAAI,MAAM,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS,CAAA;IACzF,MAAM,OAAO,GAAG,mBAAmB,IAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAA;IACvF,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE7C,IAAI,mBAAmB,EAAE,CAAC;QACxB,qBAAqB;QACrB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,eAAe,CAAC,MAA4B,CAAC;YACrD,yBAAyB,EAAG,MAAiD;iBAC1E,yBAAyB;YAC5B,oBAAoB,EAAG,MAA6C,CAAC,oBAAoB;YACzF,+BAA+B,EAAG,MAAwD;iBACvF,+BAA+B;YAClC,UAAU,EAAE,IAAI;SACjB,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,eAAe,CAAC,MAA4B,CAAC;QACrD,+BAA+B,EAAG,MAAwD;aACvF,+BAA+B;QAClC,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { z } from 'zod/v4';
2
- import type { RoutePathResolver } from '../apiContracts.ts';
2
+ import type { CommonRouteDefinitionMetadata, RoutePathResolver } from '../apiContracts.ts';
3
3
  import type { HttpStatusCode } from '../HttpStatusCodes.ts';
4
4
  import type { SSEEventSchemas } from './sseTypes.ts';
5
5
  /**
@@ -26,9 +26,9 @@ export type SSEContractDefinition<Method extends SSEMethod = SSEMethod, Params e
26
26
  * Receives typed params and returns the URL path string.
27
27
  */
28
28
  pathResolver: RoutePathResolver<z.infer<Params>>;
29
- requestPathParamsSchema: Params;
30
- requestQuerySchema: Query;
31
- requestHeaderSchema: RequestHeaders;
29
+ requestPathParamsSchema?: Params;
30
+ requestQuerySchema?: Query;
31
+ requestHeaderSchema?: RequestHeaders;
32
32
  requestBodySchema: Body;
33
33
  serverSentEventSchemas: Events;
34
34
  /**
@@ -46,6 +46,10 @@ export type SSEContractDefinition<Method extends SSEMethod = SSEMethod, Params e
46
46
  */
47
47
  responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
48
48
  isSSE: true;
49
+ metadata?: CommonRouteDefinitionMetadata;
50
+ description?: string;
51
+ summary?: string;
52
+ tags?: readonly string[];
49
53
  };
50
54
  /**
51
55
  * Type representing any SSE route definition (for use in generic constraints).
@@ -54,11 +58,15 @@ export type SSEContractDefinition<Method extends SSEMethod = SSEMethod, Params e
54
58
  export type AnySSEContractDefinition = {
55
59
  method: SSEMethod;
56
60
  pathResolver: RoutePathResolver<any>;
57
- requestPathParamsSchema: z.ZodTypeAny;
58
- requestQuerySchema: z.ZodTypeAny;
59
- requestHeaderSchema: z.ZodTypeAny;
61
+ requestPathParamsSchema?: z.ZodTypeAny;
62
+ requestQuerySchema?: z.ZodTypeAny;
63
+ requestHeaderSchema?: z.ZodTypeAny;
60
64
  requestBodySchema: z.ZodTypeAny | undefined;
61
65
  serverSentEventSchemas: SSEEventSchemas;
62
66
  responseBodySchemasByStatusCode?: Partial<Record<HttpStatusCode, z.ZodTypeAny>>;
63
67
  isSSE: true;
68
+ metadata?: CommonRouteDefinitionMetadata;
69
+ description?: string;
70
+ summary?: string;
71
+ tags?: readonly string[];
64
72
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokalise/api-contracts",
3
- "version": "6.5.2",
3
+ "version": "6.6.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],