@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 +51 -17
- package/dist/apiContracts.d.ts +56 -0
- package/dist/apiContracts.js +56 -0
- package/dist/apiContracts.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rest/restContractBuilder.d.ts +94 -0
- package/dist/rest/restContractBuilder.js +45 -0
- package/dist/rest/restContractBuilder.js.map +1 -0
- package/dist/sse/dualModeContracts.d.ts +1 -1
- package/dist/sse/sseContractBuilders.d.ts +4 -4
- package/package.json +4 -4
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 {
|
|
24
|
+
import { buildRestContract } from '@lokalise/api-contracts'
|
|
15
25
|
|
|
16
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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 {
|
|
109
|
+
import { buildRestContract } from '@lokalise/api-contracts'
|
|
76
110
|
import { z } from 'zod'
|
|
77
111
|
|
|
78
|
-
const contract =
|
|
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 {
|
|
132
|
+
import { buildRestContract } from '@lokalise/api-contracts'
|
|
99
133
|
import { z } from 'zod'
|
|
100
134
|
|
|
101
|
-
const contract =
|
|
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 =
|
|
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,
|
|
176
|
+
import { mapRouteToPath, buildRestContract } from '@lokalise/api-contracts'
|
|
143
177
|
|
|
144
|
-
const userContract =
|
|
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,
|
|
200
|
+
import { describeContract, buildRestContract } from '@lokalise/api-contracts'
|
|
167
201
|
|
|
168
|
-
const getContract =
|
|
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 =
|
|
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,
|
package/dist/apiContracts.d.ts
CHANGED
|
@@ -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'
|
package/dist/apiContracts.js
CHANGED
|
@@ -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,
|
package/dist/apiContracts.js.map
CHANGED
|
@@ -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
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
|
|
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 {
|
|
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,
|
|
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.
|
|
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.
|
|
52
|
-
"rimraf": "^6.
|
|
51
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
52
|
+
"rimraf": "^6.1.2",
|
|
53
53
|
"typescript": "5.9.3",
|
|
54
|
-
"vitest": "^4.0.
|
|
54
|
+
"vitest": "^4.0.18",
|
|
55
55
|
"zod": "^4.3.6"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {}
|