@lokalise/api-contracts 6.2.0 → 6.3.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
@@ -8,12 +8,23 @@ This reduces amount of assumptions FE needs to make about the behaviour of BE, r
8
8
  written on FE, and makes the code more type-safe (as path parameter setting is handled by logic exposed by BE, in a
9
9
  type-safe way).
10
10
 
11
+ ## REST Contracts
12
+
13
+ Use `buildRestContract` to create REST API contracts. The contract type is automatically determined based on the configuration:
14
+
15
+ | `method` | `requestBodySchema` | Result |
16
+ |----------|---------------------|--------|
17
+ | omitted/undefined | ❌ | GET route |
18
+ | `'delete'` | ❌ | DELETE route |
19
+ | `'post'`/`'put'`/`'patch'` | ✅ | Payload route |
20
+
11
21
  Usage examples:
12
22
 
13
23
  ```ts
14
- import { buildGetRoute, buildDeleteRoute, buildPayloadRoute } from '@lokalise/api-contracts'
24
+ import { buildRestContract } from '@lokalise/api-contracts'
15
25
 
16
- const getContract = buildGetRoute({
26
+ // GET route - method is inferred automatically
27
+ const getContract = buildRestContract({
17
28
  successResponseBodySchema: RESPONSE_BODY_SCHEMA,
18
29
  requestPathParamsSchema: REQUEST_PATH_PARAMS_SCHEMA,
19
30
  requestQuerySchema: REQUEST_QUERY_SCHEMA,
@@ -24,8 +35,9 @@ const getContract = buildGetRoute({
24
35
  metadata: { allowedRoles: ['admin'] },
25
36
  })
26
37
 
27
- const postContract = buildPayloadRoute({
28
- method: 'post', // can also be 'patch' or 'post'
38
+ // POST route - requires method and requestBodySchema
39
+ const postContract = buildRestContract({
40
+ method: 'post', // can also be 'put' or 'patch'
29
41
  successResponseBodySchema: RESPONSE_BODY_SCHEMA,
30
42
  requestBodySchema: REQUEST_BODY_SCHEMA,
31
43
  pathResolver: () => '/',
@@ -33,13 +45,35 @@ const postContract = buildPayloadRoute({
33
45
  metadata: { allowedPermission: ['edit'] },
34
46
  })
35
47
 
36
- const deleteContract = buildDeleteRoute({
48
+ // DELETE route - method is 'delete', no body, defaults isEmptyResponseExpected to true
49
+ const deleteContract = buildRestContract({
50
+ method: 'delete',
37
51
  successResponseBodySchema: RESPONSE_BODY_SCHEMA,
38
52
  requestPathParamsSchema: REQUEST_PATH_PARAMS_SCHEMA,
39
53
  pathResolver: (pathParams) => `/users/${pathParams.userId}`,
40
54
  })
41
55
  ```
42
56
 
57
+ ### Deprecated Builders
58
+
59
+ The individual builders `buildGetRoute`, `buildPayloadRoute`, and `buildDeleteRoute` are deprecated. Use `buildRestContract` instead:
60
+
61
+ ```ts
62
+ // Before (deprecated):
63
+ import { buildGetRoute, buildPayloadRoute, buildDeleteRoute } from '@lokalise/api-contracts'
64
+
65
+ const getContract = buildGetRoute({ ... })
66
+ const postContract = buildPayloadRoute({ method: 'post', ... })
67
+ const deleteContract = buildDeleteRoute({ ... })
68
+
69
+ // After (recommended):
70
+ import { buildRestContract } from '@lokalise/api-contracts'
71
+
72
+ const getContract = buildRestContract({ ... }) // method inferred as 'get'
73
+ const postContract = buildRestContract({ method: 'post', ... })
74
+ const deleteContract = buildRestContract({ method: 'delete', ... })
75
+ ```
76
+
43
77
  In the previous example, the `metadata` property is an optional, free-form field that allows you to store any additional
44
78
  information related to the route. If you require more precise type definitions for the `metadata` field, you can utilize
45
79
  TypeScript's module augmentation mechanism to enforce stricter typing. This allows for more controlled and type-safe
@@ -72,10 +106,10 @@ In case you are using fastify on the backend, you can also use `@lokalise/fastif
72
106
  Use `requestHeaderSchema` to define and validate headers that the client must send with the request. This is useful for authentication headers, API keys, content negotiation, and other request-specific headers.
73
107
 
74
108
  ```ts
75
- import { buildGetRoute } from '@lokalise/api-contracts'
109
+ import { buildRestContract } from '@lokalise/api-contracts'
76
110
  import { z } from 'zod'
77
111
 
78
- const contract = buildGetRoute({
112
+ const contract = buildRestContract({
79
113
  successResponseBodySchema: DATA_SCHEMA,
80
114
  requestHeaderSchema: z.object({
81
115
  'authorization': z.string(),
@@ -95,10 +129,10 @@ Use `responseHeaderSchema` to define and validate headers that the server will s
95
129
  - Custom API metadata headers
96
130
 
97
131
  ```ts
98
- import { buildGetRoute } from '@lokalise/api-contracts'
132
+ import { buildRestContract } from '@lokalise/api-contracts'
99
133
  import { z } from 'zod'
100
134
 
101
- const contract = buildGetRoute({
135
+ const contract = buildRestContract({
102
136
  successResponseBodySchema: DATA_SCHEMA,
103
137
  responseHeaderSchema: z.object({
104
138
  'x-ratelimit-limit': z.string(),
@@ -113,7 +147,7 @@ const contract = buildGetRoute({
113
147
  Both header schemas can be used together in a single contract:
114
148
 
115
149
  ```ts
116
- const contract = buildGetRoute({
150
+ const contract = buildRestContract({
117
151
  successResponseBodySchema: DATA_SCHEMA,
118
152
  requestHeaderSchema: z.object({
119
153
  'authorization': z.string(),
@@ -139,9 +173,9 @@ These header schemas are primarily used for:
139
173
  Converts a route definition to its corresponding path pattern with parameter placeholders.
140
174
 
141
175
  ```ts
142
- import { mapRouteToPath, buildGetRoute } from '@lokalise/api-contracts'
176
+ import { mapRouteToPath, buildRestContract } from '@lokalise/api-contracts'
143
177
 
144
- const userContract = buildGetRoute({
178
+ const userContract = buildRestContract({
145
179
  requestPathParamsSchema: z.object({ userId: z.string() }),
146
180
  successResponseBodySchema: USER_SCHEMA,
147
181
  pathResolver: (pathParams) => `/users/${pathParams.userId}`,
@@ -163,19 +197,19 @@ The function replaces actual path parameters with placeholder syntax (`:paramNam
163
197
  Generates a human-readable description of a route contract, combining the HTTP method with the route path.
164
198
 
165
199
  ```ts
166
- import { describeContract, buildGetRoute, buildPayloadRoute } from '@lokalise/api-contracts'
200
+ import { describeContract, buildRestContract } from '@lokalise/api-contracts'
167
201
 
168
- const getContract = buildGetRoute({
202
+ const getContract = buildRestContract({
169
203
  requestPathParamsSchema: z.object({ userId: z.string() }),
170
204
  successResponseBodySchema: USER_SCHEMA,
171
205
  pathResolver: (pathParams) => `/users/${pathParams.userId}`,
172
206
  })
173
207
 
174
- const postContract = buildPayloadRoute({
208
+ const postContract = buildRestContract({
175
209
  method: 'post',
176
- requestPathParamsSchema: z.object({
210
+ requestPathParamsSchema: z.object({
177
211
  orgId: z.string(),
178
- userId: z.string()
212
+ userId: z.string()
179
213
  }),
180
214
  requestBodySchema: CREATE_USER_SCHEMA,
181
215
  successResponseBodySchema: USER_SCHEMA,
@@ -58,8 +58,64 @@ export type GetRouteDefinition<SuccessResponseBodySchema extends z.Schema | unde
58
58
  export type DeleteRouteDefinition<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode> & {
59
59
  method: 'delete';
60
60
  };
61
+ /**
62
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
63
+ * @example
64
+ * ```typescript
65
+ * // Before (deprecated):
66
+ * const route = buildPayloadRoute({
67
+ * method: 'post',
68
+ * requestBodySchema: bodySchema,
69
+ * successResponseBodySchema: responseSchema,
70
+ * pathResolver: () => '/api/users',
71
+ * })
72
+ *
73
+ * // After (recommended):
74
+ * const route = buildRestContract({
75
+ * method: 'post',
76
+ * requestBodySchema: bodySchema,
77
+ * successResponseBodySchema: responseSchema,
78
+ * pathResolver: () => '/api/users',
79
+ * })
80
+ * ```
81
+ */
61
82
  export declare function buildPayloadRoute<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>): PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
83
+ /**
84
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
85
+ * @example
86
+ * ```typescript
87
+ * // Before (deprecated):
88
+ * const route = buildGetRoute({
89
+ * successResponseBodySchema: responseSchema,
90
+ * pathResolver: () => '/api/users',
91
+ * })
92
+ *
93
+ * // After (recommended):
94
+ * const route = buildRestContract({
95
+ * successResponseBodySchema: responseSchema,
96
+ * pathResolver: () => '/api/users',
97
+ * })
98
+ * ```
99
+ */
62
100
  export declare function buildGetRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: Omit<GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'>): GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
101
+ /**
102
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
103
+ * @example
104
+ * ```typescript
105
+ * // Before (deprecated):
106
+ * const route = buildDeleteRoute({
107
+ * successResponseBodySchema: responseSchema,
108
+ * pathResolver: () => '/api/users/123',
109
+ * })
110
+ *
111
+ * // After (recommended):
112
+ * const route = buildRestContract({
113
+ * method: 'delete',
114
+ * successResponseBodySchema: responseSchema,
115
+ * pathResolver: () => '/api/users/123',
116
+ * })
117
+ * ```
118
+ */
63
119
  export declare function buildDeleteRoute<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(params: Omit<DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'>): DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
64
120
  /**
65
121
  * This method maps given route definition to a string of the format '/static-path-part/:path-param-value'
@@ -1,4 +1,25 @@
1
1
  const EMPTY_PARAMS = {};
2
+ /**
3
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
4
+ * @example
5
+ * ```typescript
6
+ * // Before (deprecated):
7
+ * const route = buildPayloadRoute({
8
+ * method: 'post',
9
+ * requestBodySchema: bodySchema,
10
+ * successResponseBodySchema: responseSchema,
11
+ * pathResolver: () => '/api/users',
12
+ * })
13
+ *
14
+ * // After (recommended):
15
+ * const route = buildRestContract({
16
+ * method: 'post',
17
+ * requestBodySchema: bodySchema,
18
+ * successResponseBodySchema: responseSchema,
19
+ * pathResolver: () => '/api/users',
20
+ * })
21
+ * ```
22
+ */
2
23
  export function buildPayloadRoute(params) {
3
24
  return {
4
25
  isEmptyResponseExpected: params.isEmptyResponseExpected ?? false,
@@ -18,6 +39,23 @@ export function buildPayloadRoute(params) {
18
39
  tags: params.tags,
19
40
  };
20
41
  }
42
+ /**
43
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
44
+ * @example
45
+ * ```typescript
46
+ * // Before (deprecated):
47
+ * const route = buildGetRoute({
48
+ * successResponseBodySchema: responseSchema,
49
+ * pathResolver: () => '/api/users',
50
+ * })
51
+ *
52
+ * // After (recommended):
53
+ * const route = buildRestContract({
54
+ * successResponseBodySchema: responseSchema,
55
+ * pathResolver: () => '/api/users',
56
+ * })
57
+ * ```
58
+ */
21
59
  export function buildGetRoute(params) {
22
60
  return {
23
61
  isEmptyResponseExpected: params.isEmptyResponseExpected ?? false,
@@ -36,6 +74,24 @@ export function buildGetRoute(params) {
36
74
  tags: params.tags,
37
75
  };
38
76
  }
77
+ /**
78
+ * @deprecated Use `buildRestContract` instead. This function will be removed in a future version.
79
+ * @example
80
+ * ```typescript
81
+ * // Before (deprecated):
82
+ * const route = buildDeleteRoute({
83
+ * successResponseBodySchema: responseSchema,
84
+ * pathResolver: () => '/api/users/123',
85
+ * })
86
+ *
87
+ * // After (recommended):
88
+ * const route = buildRestContract({
89
+ * method: 'delete',
90
+ * successResponseBodySchema: responseSchema,
91
+ * pathResolver: () => '/api/users/123',
92
+ * })
93
+ * ```
94
+ */
39
95
  export function buildDeleteRoute(params) {
40
96
  return {
41
97
  isEmptyResponseExpected: params.isEmptyResponseExpected ?? true,
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.js","sourceRoot":"","sources":["../src/apiContracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apiContracts.js","sourceRoot":"","sources":["../src/apiContracts.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './apiContracts.ts';
2
2
  export * from './HttpStatusCodes.ts';
3
3
  export * from './pathUtils.ts';
4
+ export * from './rest/restContractBuilder.ts';
4
5
  export * from './sse/dualModeContracts.ts';
5
6
  export * from './sse/sseContractBuilders.ts';
6
7
  export * from './sse/sseContracts.ts';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./apiContracts.js";
2
2
  export * from "./HttpStatusCodes.js";
3
3
  export * from "./pathUtils.js";
4
+ export * from "./rest/restContractBuilder.js";
4
5
  // Dual-mode (hybrid) contracts
5
6
  export * from "./sse/dualModeContracts.js";
6
7
  // Contract builders
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,+BAA+B;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,oBAAoB;AACpB,cAAc,8BAA8B,CAAA;AAC5C,gBAAgB;AAChB,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,+BAA+B;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,oBAAoB;AACpB,cAAc,8BAA8B,CAAA;AAC5C,gBAAgB;AAChB,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,94 @@
1
+ import type { z } from 'zod/v4';
2
+ import type { CommonRouteDefinition, DeleteRouteDefinition, GetRouteDefinition, PayloadRouteDefinition } from '../apiContracts.ts';
3
+ import type { HttpStatusCode } from '../HttpStatusCodes.ts';
4
+ /**
5
+ * Configuration for building a GET route.
6
+ * GET routes have no request body and the method is inferred automatically.
7
+ */
8
+ export type GetContractConfig<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = Omit<CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'> & {
9
+ method?: never;
10
+ requestBodySchema?: never;
11
+ };
12
+ /**
13
+ * Configuration for building a DELETE route.
14
+ * DELETE routes have no request body and default to empty response expected.
15
+ */
16
+ export type DeleteContractConfig<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = Omit<CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>, 'method'> & {
17
+ method: 'delete';
18
+ requestBodySchema?: never;
19
+ };
20
+ /**
21
+ * Configuration for building a payload route (POST, PUT, PATCH).
22
+ * Payload routes require a request body and an explicit method.
23
+ */
24
+ export type PayloadContractConfig<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined> = CommonRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode> & {
25
+ method: 'post' | 'put' | 'patch';
26
+ requestBodySchema: RequestBodySchema;
27
+ };
28
+ /**
29
+ * Builds REST API contracts with automatic type inference.
30
+ *
31
+ * This unified builder replaces the individual `buildGetRoute`, `buildPayloadRoute`,
32
+ * and `buildDeleteRoute` functions, providing a single entry point for all REST contracts.
33
+ *
34
+ * The contract type is automatically determined based on the configuration:
35
+ *
36
+ * | `method` | `requestBodySchema` | Result |
37
+ * |----------|---------------------|--------|
38
+ * | omitted/undefined | ❌ | GET route |
39
+ * | `'delete'` | ❌ | DELETE route |
40
+ * | `'post'`/`'put'`/`'patch'` | ✅ | Payload route |
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // GET route - method is inferred automatically
45
+ * const getUsers = buildRestContract({
46
+ * pathResolver: () => '/api/users',
47
+ * successResponseBodySchema: z.array(userSchema),
48
+ * })
49
+ *
50
+ * // GET route with path params
51
+ * const getUser = buildRestContract({
52
+ * pathResolver: (params) => `/api/users/${params.userId}`,
53
+ * requestPathParamsSchema: z.object({ userId: z.string() }),
54
+ * successResponseBodySchema: userSchema,
55
+ * })
56
+ *
57
+ * // POST route - requires method and requestBodySchema
58
+ * const createUser = buildRestContract({
59
+ * method: 'post',
60
+ * pathResolver: () => '/api/users',
61
+ * requestBodySchema: createUserSchema,
62
+ * successResponseBodySchema: userSchema,
63
+ * })
64
+ *
65
+ * // PUT route
66
+ * const updateUser = buildRestContract({
67
+ * method: 'put',
68
+ * pathResolver: (params) => `/api/users/${params.userId}`,
69
+ * requestPathParamsSchema: z.object({ userId: z.string() }),
70
+ * requestBodySchema: updateUserSchema,
71
+ * successResponseBodySchema: userSchema,
72
+ * })
73
+ *
74
+ * // PATCH route
75
+ * const patchUser = buildRestContract({
76
+ * method: 'patch',
77
+ * pathResolver: (params) => `/api/users/${params.userId}`,
78
+ * requestPathParamsSchema: z.object({ userId: z.string() }),
79
+ * requestBodySchema: patchUserSchema,
80
+ * successResponseBodySchema: userSchema,
81
+ * })
82
+ *
83
+ * // DELETE route - method is 'delete', no body
84
+ * const deleteUser = buildRestContract({
85
+ * method: 'delete',
86
+ * pathResolver: (params) => `/api/users/${params.userId}`,
87
+ * requestPathParamsSchema: z.object({ userId: z.string() }),
88
+ * successResponseBodySchema: z.undefined(),
89
+ * })
90
+ * ```
91
+ */
92
+ export declare function buildRestContract<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(config: GetContractConfig<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>): GetRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
93
+ export declare function buildRestContract<SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = true, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(config: DeleteContractConfig<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>): DeleteRouteDefinition<SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
94
+ export declare function buildRestContract<RequestBodySchema extends z.Schema | undefined = undefined, SuccessResponseBodySchema extends z.Schema | undefined = undefined, PathParamsSchema extends z.Schema | undefined = undefined, RequestQuerySchema extends z.Schema | undefined = undefined, RequestHeaderSchema extends z.Schema | undefined = undefined, ResponseHeaderSchema extends z.Schema | undefined = undefined, IsNonJSONResponseExpected extends boolean = false, IsEmptyResponseExpected extends boolean = false, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.Schema>> | undefined = undefined>(config: PayloadContractConfig<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>): PayloadRouteDefinition<RequestBodySchema, SuccessResponseBodySchema, PathParamsSchema, RequestQuerySchema, RequestHeaderSchema, ResponseHeaderSchema, IsNonJSONResponseExpected, IsEmptyResponseExpected, ResponseSchemasByStatusCode>;
@@ -0,0 +1,45 @@
1
+ // Implementation
2
+ export function buildRestContract(config) {
3
+ const method = config.method;
4
+ const hasBody = 'requestBodySchema' in config && config.requestBodySchema !== undefined;
5
+ // Determine default for isEmptyResponseExpected based on route type
6
+ const isDeleteRoute = method === 'delete';
7
+ const defaultIsEmptyResponseExpected = isDeleteRoute;
8
+ const baseFields = {
9
+ isEmptyResponseExpected: config.isEmptyResponseExpected ?? defaultIsEmptyResponseExpected,
10
+ isNonJSONResponseExpected: config.isNonJSONResponseExpected ?? false,
11
+ pathResolver: config.pathResolver,
12
+ requestHeaderSchema: config.requestHeaderSchema,
13
+ responseHeaderSchema: config.responseHeaderSchema,
14
+ requestPathParamsSchema: config.requestPathParamsSchema,
15
+ requestQuerySchema: config.requestQuerySchema,
16
+ successResponseBodySchema: config.successResponseBodySchema,
17
+ description: config.description,
18
+ summary: config.summary,
19
+ responseSchemasByStatusCode: config.responseSchemasByStatusCode,
20
+ metadata: config.metadata,
21
+ tags: config.tags,
22
+ };
23
+ if (hasBody) {
24
+ // Payload route (POST/PUT/PATCH)
25
+ return {
26
+ ...baseFields,
27
+ method: method,
28
+ // biome-ignore lint/suspicious/noExplicitAny: Type assertion needed for config union
29
+ requestBodySchema: config.requestBodySchema,
30
+ };
31
+ }
32
+ if (isDeleteRoute) {
33
+ // DELETE route
34
+ return {
35
+ ...baseFields,
36
+ method: 'delete',
37
+ };
38
+ }
39
+ // GET route (default)
40
+ return {
41
+ ...baseFields,
42
+ method: 'get',
43
+ };
44
+ }
45
+ //# sourceMappingURL=restContractBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restContractBuilder.js","sourceRoot":"","sources":["../../src/rest/restContractBuilder.ts"],"names":[],"mappings":"AAyRA,iBAAiB;AACjB,MAAM,UAAU,iBAAiB,CAC/B,MAKsE;IAGtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,OAAO,GAAG,mBAAmB,IAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAA;IAEvF,oEAAoE;IACpE,MAAM,aAAa,GAAG,MAAM,KAAK,QAAQ,CAAA;IACzC,MAAM,8BAA8B,GAAG,aAAa,CAAA;IAEpD,MAAM,UAAU,GAAG;QACjB,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,8BAA8B;QACzF,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,IAAI,KAAK;QACpE,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;QAC3D,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;QAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAA;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,iCAAiC;QACjC,OAAO;YACL,GAAG,UAAU;YACb,MAAM,EAAE,MAAkC;YAC1C,qFAAqF;YACrF,iBAAiB,EAAG,MAAqC,CAAC,iBAAiB;SAC5E,CAAA;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,eAAe;QACf,OAAO;YACL,GAAG,UAAU;YACb,MAAM,EAAE,QAAiB;SAC1B,CAAA;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO;QACL,GAAG,UAAU;QACb,MAAM,EAAE,KAAc;KACvB,CAAA;AACH,CAAC"}
@@ -17,7 +17,7 @@ import type { SSEEventSchemas } from './sseTypes.ts';
17
17
  * @template ResponseHeaders - Response headers schema (for sync mode)
18
18
  * @template ResponseSchemasByStatusCode - Alternative response schemas by HTTP status code
19
19
  */
20
- export type SimplifiedDualModeContractDefinition<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> = {
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
23
  params: Params;
@@ -1,7 +1,7 @@
1
1
  import type { z } from 'zod/v4';
2
2
  import type { RoutePathResolver } from '../apiContracts.ts';
3
3
  import type { HttpStatusCode } from '../HttpStatusCodes.ts';
4
- import type { SimplifiedDualModeContractDefinition } from './dualModeContracts.ts';
4
+ import type { DualModeContractDefinition } from './dualModeContracts.ts';
5
5
  import type { SSEContractDefinition } from './sseContracts.ts';
6
6
  import type { SSEEventSchemas } from './sseTypes.ts';
7
7
  /**
@@ -140,7 +140,7 @@ export type DualModePayloadContractConfig<Params extends z.ZodTypeAny, Query ext
140
140
  responseSchemasByStatusCode?: ResponseSchemasByStatusCode;
141
141
  sseEvents: Events;
142
142
  };
143
- export declare function buildSseContract<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>(config: DualModePayloadContractConfig<Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>): SimplifiedDualModeContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
144
- 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>): SimplifiedDualModeContractDefinition<'get', Params, Query, RequestHeaders, undefined, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
145
- export declare function buildSseContract<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>(config: SSEPayloadContractConfig<Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>): SSEContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>;
143
+ 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
144
  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>;
145
+ export declare function buildSseContract<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>(config: DualModePayloadContractConfig<Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>): DualModeContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
146
+ export declare function buildSseContract<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>(config: SSEPayloadContractConfig<Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>): SSEContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokalise/api-contracts",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
@@ -48,10 +48,10 @@
48
48
  "@biomejs/biome": "^2.3.7",
49
49
  "@lokalise/biome-config": "^3.1.0",
50
50
  "@lokalise/tsconfig": "^3.1.0",
51
- "@vitest/coverage-v8": "^4.0.15",
52
- "rimraf": "^6.0.1",
51
+ "@vitest/coverage-v8": "^4.0.18",
52
+ "rimraf": "^6.1.2",
53
53
  "typescript": "5.9.3",
54
- "vitest": "^4.0.15",
54
+ "vitest": "^4.0.18",
55
55
  "zod": "^4.3.6"
56
56
  },
57
57
  "dependencies": {}