@lokalise/api-contracts 6.11.0 → 6.12.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 +42 -7
- package/dist/new/contractResponse.d.ts +18 -5
- package/dist/new/contractResponse.js +14 -5
- package/dist/new/contractResponse.js.map +1 -1
- package/dist/new/defineApiContract.d.ts +2 -0
- package/dist/new/defineApiContract.js +5 -2
- package/dist/new/defineApiContract.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ This eliminates assumptions across the boundary and keeps documentation, validat
|
|
|
12
12
|
### REST routes
|
|
13
13
|
|
|
14
14
|
```ts
|
|
15
|
-
import { defineApiContract,
|
|
15
|
+
import { defineApiContract, noBodyResponse } from '@lokalise/api-contracts'
|
|
16
16
|
import { z } from 'zod/v4'
|
|
17
17
|
|
|
18
18
|
// GET with path params
|
|
@@ -41,7 +41,7 @@ const deleteUser = defineApiContract({
|
|
|
41
41
|
requestPathParamsSchema: z.object({ userId: z.uuid() }),
|
|
42
42
|
pathResolver: ({ userId }) => `/users/${userId}`,
|
|
43
43
|
responsesByStatusCode: {
|
|
44
|
-
204:
|
|
44
|
+
204: noBodyResponse(),
|
|
45
45
|
},
|
|
46
46
|
})
|
|
47
47
|
```
|
|
@@ -121,6 +121,41 @@ const chatCompletion = defineApiContract({
|
|
|
121
121
|
})
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
+
### OpenAPI response descriptions
|
|
125
|
+
|
|
126
|
+
All response factories accept an optional `ResponseOptions` object as their last argument.
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
import {
|
|
130
|
+
defineApiContract,
|
|
131
|
+
noBodyResponse,
|
|
132
|
+
textResponse,
|
|
133
|
+
blobResponse,
|
|
134
|
+
sseResponse,
|
|
135
|
+
anyOfResponses,
|
|
136
|
+
} from '@lokalise/api-contracts'
|
|
137
|
+
import { z } from 'zod/v4'
|
|
138
|
+
|
|
139
|
+
const contract = defineApiContract({
|
|
140
|
+
method: 'post',
|
|
141
|
+
pathResolver: () => '/files',
|
|
142
|
+
requestBodySchema: z.object({ name: z.string() }),
|
|
143
|
+
responsesByStatusCode: {
|
|
144
|
+
201: z.object({ id: z.string() }).describe('Created resource'),
|
|
145
|
+
204: noBodyResponse({ description: 'Deleted — no content returned' }),
|
|
146
|
+
200: anyOfResponses(
|
|
147
|
+
[
|
|
148
|
+
z.object({ id: z.string() }).describe('JSON representation'),
|
|
149
|
+
textResponse('text/csv', { description: 'CSV export' }),
|
|
150
|
+
blobResponse('application/pdf', { description: 'PDF report' }),
|
|
151
|
+
sseResponse({ update: z.object({ id: z.string() }) }, { description: 'Live update stream' }),
|
|
152
|
+
],
|
|
153
|
+
{ description: 'Multiple response formats available' },
|
|
154
|
+
),
|
|
155
|
+
},
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
124
159
|
`getSseSchemaByEventName(contract)` extracts SSE event schemas from a contract:
|
|
125
160
|
|
|
126
161
|
```ts
|
|
@@ -141,7 +176,7 @@ defineApiContract({
|
|
|
141
176
|
method: 'get' | 'post' | 'put' | 'patch' | 'delete',
|
|
142
177
|
pathResolver: (pathParams) => string,
|
|
143
178
|
responsesByStatusCode: {
|
|
144
|
-
[statusCode]: z.ZodType |
|
|
179
|
+
[statusCode]: z.ZodType | NoBodyResponse | TypedTextResponse | TypedBlobResponse | TypedSseResponse | AnyOfResponses
|
|
145
180
|
},
|
|
146
181
|
|
|
147
182
|
// Path params — links pathResolver parameter type to the schema
|
|
@@ -185,7 +220,7 @@ const contract = defineApiContract({
|
|
|
185
220
|
|
|
186
221
|
### Type utilities
|
|
187
222
|
|
|
188
|
-
**`InferNonSseSuccessResponses<T>`** — TypeScript output type of all non-SSE 2xx responses. JSON schemas → `z.output<T>`, `textResponse` → `string`, `blobResponse` → `Blob`, `ContractNoBody` → `undefined`, `sseResponse` → `never` (excluded). `anyOfResponses` entries are unpacked before mapping.
|
|
223
|
+
**`InferNonSseSuccessResponses<T>`** — TypeScript output type of all non-SSE 2xx responses. JSON schemas → `z.output<T>`, `textResponse` → `string`, `blobResponse` → `Blob`, `ContractNoBody`/`NoBodyResponse` → `undefined`, `sseResponse` → `never` (excluded). `anyOfResponses` entries are unpacked before mapping.
|
|
189
224
|
|
|
190
225
|
```ts
|
|
191
226
|
import type { InferNonSseSuccessResponses } from '@lokalise/api-contracts'
|
|
@@ -207,7 +242,7 @@ type CsvResponse = InferNonSseSuccessResponses<typeof exportCsv['responsesByStat
|
|
|
207
242
|
|
|
208
243
|
**`HasAnyNonSseSuccessResponse<T>`** — `true` if any 2xx entry is a non-SSE response (JSON, text, blob, or no-body).
|
|
209
244
|
|
|
210
|
-
**`IsNoBodySuccessResponse<T>`** — `true` when all 2xx entries are `ContractNoBody` or no 2xx status codes are defined.
|
|
245
|
+
**`IsNoBodySuccessResponse<T>`** — `true` when all 2xx entries are `ContractNoBody`/`NoBodyResponse` or no 2xx status codes are defined.
|
|
211
246
|
|
|
212
247
|
**`ContractResponseMode<T>`** — classifies a contract into `'dual'` (SSE + non-SSE), `'sse'` (SSE-only), or `'non-sse'` (JSON/text/blob/no-body).
|
|
213
248
|
|
|
@@ -271,7 +306,7 @@ import { describeApiContract } from '@lokalise/api-contracts'
|
|
|
271
306
|
describeApiContract(getUser) // "GET /users/:userId"
|
|
272
307
|
```
|
|
273
308
|
|
|
274
|
-
**`getSuccessResponseSchema`** — merged Zod schema from all 2xx JSON entries. `ContractNoBody` and non-JSON entries are excluded. Returns `null` when no schema is present.
|
|
309
|
+
**`getSuccessResponseSchema`** *(deprecated — no known consumers, will be removed in a future release)* — merged Zod schema from all 2xx JSON entries. `ContractNoBody`/`NoBodyResponse` and non-JSON entries are excluded. Returns `null` when no schema is present.
|
|
275
310
|
|
|
276
311
|
```ts
|
|
277
312
|
import { getSuccessResponseSchema } from '@lokalise/api-contracts'
|
|
@@ -280,7 +315,7 @@ getSuccessResponseSchema(getUser) // ZodObject
|
|
|
280
315
|
getSuccessResponseSchema(deleteUser) // null
|
|
281
316
|
```
|
|
282
317
|
|
|
283
|
-
**`getIsEmptyResponseExpected`** — `true` when no Zod schema exists among 2xx entries.
|
|
318
|
+
**`getIsEmptyResponseExpected`** *(deprecated — no known consumers, will be removed in a future release)* — `true` when no Zod schema exists among 2xx entries.
|
|
284
319
|
|
|
285
320
|
```ts
|
|
286
321
|
import { getIsEmptyResponseExpected } from '@lokalise/api-contracts'
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import type { z } from 'zod/v4';
|
|
2
2
|
import type { HttpStatusCode } from '../HttpStatusCodes.ts';
|
|
3
3
|
import { ContractNoBody } from './constants.ts';
|
|
4
|
+
export type ResponseOptions = {
|
|
5
|
+
readonly description?: string;
|
|
6
|
+
};
|
|
4
7
|
export type TypedTextResponse = {
|
|
5
8
|
readonly _tag: 'TextResponse';
|
|
6
9
|
readonly contentType: string;
|
|
10
|
+
readonly description?: string;
|
|
7
11
|
};
|
|
8
|
-
export declare const textResponse: (contentType: string) => TypedTextResponse;
|
|
12
|
+
export declare const textResponse: (contentType: string, options?: ResponseOptions) => TypedTextResponse;
|
|
9
13
|
export declare const isTextResponse: (value: ApiContractResponse) => value is TypedTextResponse;
|
|
10
14
|
export type TypedBlobResponse = {
|
|
11
15
|
readonly _tag: 'BlobResponse';
|
|
12
16
|
readonly contentType: string;
|
|
17
|
+
readonly description?: string;
|
|
13
18
|
};
|
|
14
|
-
export declare const blobResponse: (contentType: string) => TypedBlobResponse;
|
|
19
|
+
export declare const blobResponse: (contentType: string, options?: ResponseOptions) => TypedBlobResponse;
|
|
15
20
|
export declare const isBlobResponse: (value: ApiContractResponse) => value is TypedBlobResponse;
|
|
16
21
|
export type SseSchemaByEventName = Record<string, z.ZodType>;
|
|
17
22
|
export type TypedSseResponse<T extends SseSchemaByEventName = SseSchemaByEventName> = {
|
|
18
23
|
readonly _tag: 'SseResponse';
|
|
19
24
|
readonly schemaByEventName: T;
|
|
25
|
+
readonly description?: string;
|
|
20
26
|
};
|
|
21
|
-
export declare const sseResponse: <T extends SseSchemaByEventName>(schemaByEventName: T) => TypedSseResponse<T>;
|
|
27
|
+
export declare const sseResponse: <T extends SseSchemaByEventName>(schemaByEventName: T, options?: ResponseOptions) => TypedSseResponse<T>;
|
|
22
28
|
export declare const isSseResponse: (value: ApiContractResponse) => value is TypedSseResponse;
|
|
23
29
|
export type TypedJsonResponse = z.ZodType;
|
|
24
30
|
export declare const isJsonResponse: (value: ApiContractResponse) => value is TypedJsonResponse;
|
|
@@ -26,10 +32,17 @@ export type TypedApiContractResponse = TypedJsonResponse | TypedTextResponse | T
|
|
|
26
32
|
export type AnyOfResponses<T extends TypedApiContractResponse = TypedApiContractResponse> = {
|
|
27
33
|
readonly _tag: 'AnyOfResponses';
|
|
28
34
|
readonly responses: T[];
|
|
35
|
+
readonly description?: string;
|
|
29
36
|
};
|
|
30
|
-
export declare const anyOfResponses: <T extends TypedApiContractResponse>(responses: T[]) => AnyOfResponses<T>;
|
|
37
|
+
export declare const anyOfResponses: <T extends TypedApiContractResponse>(responses: T[], options?: ResponseOptions) => AnyOfResponses<T>;
|
|
31
38
|
export declare const isAnyOfResponses: (value: ApiContractResponse) => value is AnyOfResponses;
|
|
32
|
-
export type
|
|
39
|
+
export type NoBodyResponse = {
|
|
40
|
+
readonly _tag: 'NoBodyResponse';
|
|
41
|
+
readonly description?: string;
|
|
42
|
+
};
|
|
43
|
+
export declare const noBodyResponse: (options?: ResponseOptions) => NoBodyResponse;
|
|
44
|
+
export declare const isNoBodyResponse: (value: ApiContractResponse) => value is NoBodyResponse;
|
|
45
|
+
export type ApiContractResponse = typeof ContractNoBody | NoBodyResponse | TypedApiContractResponse | AnyOfResponses;
|
|
33
46
|
export type ResponsesByStatusCode = Partial<Record<HttpStatusCode, ApiContractResponse>>;
|
|
34
47
|
export type ResponseKind = {
|
|
35
48
|
kind: 'noContent';
|
|
@@ -1,25 +1,34 @@
|
|
|
1
1
|
import { ContractNoBody } from "./constants.js";
|
|
2
|
-
export const textResponse = (contentType) => ({
|
|
2
|
+
export const textResponse = (contentType, options) => ({
|
|
3
3
|
_tag: 'TextResponse',
|
|
4
4
|
contentType,
|
|
5
|
+
...(options?.description !== undefined && { description: options.description }),
|
|
5
6
|
});
|
|
6
7
|
export const isTextResponse = (value) => typeof value === 'object' && value !== null && '_tag' in value && value._tag === 'TextResponse';
|
|
7
|
-
export const blobResponse = (contentType) => ({
|
|
8
|
+
export const blobResponse = (contentType, options) => ({
|
|
8
9
|
_tag: 'BlobResponse',
|
|
9
10
|
contentType,
|
|
11
|
+
...(options?.description !== undefined && { description: options.description }),
|
|
10
12
|
});
|
|
11
13
|
export const isBlobResponse = (value) => typeof value === 'object' && value !== null && '_tag' in value && value._tag === 'BlobResponse';
|
|
12
|
-
export const sseResponse = (schemaByEventName) => ({
|
|
14
|
+
export const sseResponse = (schemaByEventName, options) => ({
|
|
13
15
|
_tag: 'SseResponse',
|
|
14
16
|
schemaByEventName,
|
|
17
|
+
...(options?.description !== undefined && { description: options.description }),
|
|
15
18
|
});
|
|
16
19
|
export const isSseResponse = (value) => typeof value === 'object' && value !== null && '_tag' in value && value._tag === 'SseResponse';
|
|
17
20
|
export const isJsonResponse = (value) => typeof value === 'object' && value !== null && !('_tag' in value);
|
|
18
|
-
export const anyOfResponses = (responses) => ({
|
|
21
|
+
export const anyOfResponses = (responses, options) => ({
|
|
19
22
|
_tag: 'AnyOfResponses',
|
|
20
23
|
responses,
|
|
24
|
+
...(options?.description !== undefined && { description: options.description }),
|
|
21
25
|
});
|
|
22
26
|
export const isAnyOfResponses = (value) => typeof value === 'object' && value !== null && '_tag' in value && value._tag === 'AnyOfResponses';
|
|
27
|
+
export const noBodyResponse = (options) => ({
|
|
28
|
+
_tag: 'NoBodyResponse',
|
|
29
|
+
...(options?.description !== undefined && { description: options.description }),
|
|
30
|
+
});
|
|
31
|
+
export const isNoBodyResponse = (value) => typeof value === 'object' && value !== null && '_tag' in value && value._tag === 'NoBodyResponse';
|
|
23
32
|
const matchTypedResponse = (entry, contentType) => {
|
|
24
33
|
if (isTextResponse(entry)) {
|
|
25
34
|
return contentType.includes(entry.contentType) ? { kind: 'text' } : null;
|
|
@@ -66,7 +75,7 @@ const resolveByKind = (entry) => {
|
|
|
66
75
|
* content-type to disambiguate regardless of this flag.
|
|
67
76
|
*/
|
|
68
77
|
export const resolveContractResponse = (schemaEntry, contentType, strict = true) => {
|
|
69
|
-
if (schemaEntry === ContractNoBody) {
|
|
78
|
+
if (schemaEntry === ContractNoBody || isNoBodyResponse(schemaEntry)) {
|
|
70
79
|
return { kind: 'noContent' };
|
|
71
80
|
}
|
|
72
81
|
if (isAnyOfResponses(schemaEntry)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractResponse.js","sourceRoot":"","sources":["../../src/new/contractResponse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"contractResponse.js","sourceRoot":"","sources":["../../src/new/contractResponse.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,6 +43,8 @@ export declare const mapApiContractToPath: (routeConfig: ApiContract) => string;
|
|
|
43
43
|
export declare const describeApiContract: (routeConfig: ApiContract) => string;
|
|
44
44
|
export declare const getSseSchemaByEventName: (routeConfig: ApiContract) => SseSchemaByEventName | null;
|
|
45
45
|
export declare const hasAnySuccessSseResponse: (apiContract: ApiContract) => boolean;
|
|
46
|
+
/** @deprecated No known consumers — will be removed in a future release. */
|
|
46
47
|
export declare const getSuccessResponseSchema: (routeConfig: ApiContract) => z.ZodType | null;
|
|
48
|
+
/** @deprecated No known consumers — will be removed in a future release. */
|
|
47
49
|
export declare const getIsEmptyResponseExpected: (routeConfig: ApiContract) => boolean;
|
|
48
50
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod/v4';
|
|
2
2
|
import { SUCCESSFUL_HTTP_STATUS_CODES } from "../HttpStatusCodes.js";
|
|
3
3
|
import { ContractNoBody } from "./constants.js";
|
|
4
|
-
import { isAnyOfResponses, isBlobResponse, isSseResponse, isTextResponse, } from "./contractResponse.js";
|
|
4
|
+
import { isAnyOfResponses, isBlobResponse, isNoBodyResponse, isSseResponse, isTextResponse, } from "./contractResponse.js";
|
|
5
5
|
export const defineApiContract = (contract) => contract;
|
|
6
6
|
export const mapApiContractToPath = (routeConfig) => {
|
|
7
7
|
if (!routeConfig.requestPathParamsSchema) {
|
|
@@ -51,6 +51,7 @@ export const hasAnySuccessSseResponse = (apiContract) => {
|
|
|
51
51
|
}
|
|
52
52
|
return false;
|
|
53
53
|
};
|
|
54
|
+
/** @deprecated No known consumers — will be removed in a future release. */
|
|
54
55
|
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: it is acceptable
|
|
55
56
|
export const getSuccessResponseSchema = (routeConfig) => {
|
|
56
57
|
const schemas = [];
|
|
@@ -68,6 +69,7 @@ export const getSuccessResponseSchema = (routeConfig) => {
|
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
else if (value === ContractNoBody ||
|
|
72
|
+
isNoBodyResponse(value) ||
|
|
71
73
|
isSseResponse(value) ||
|
|
72
74
|
isTextResponse(value) ||
|
|
73
75
|
isBlobResponse(value)) {
|
|
@@ -86,11 +88,12 @@ export const getSuccessResponseSchema = (routeConfig) => {
|
|
|
86
88
|
}
|
|
87
89
|
return hasDirectNonJsonEntry ? z.never() : null;
|
|
88
90
|
};
|
|
91
|
+
/** @deprecated No known consumers — will be removed in a future release. */
|
|
89
92
|
export const getIsEmptyResponseExpected = (routeConfig) => {
|
|
90
93
|
let isEmptyResponseExpected = true;
|
|
91
94
|
for (const code of SUCCESSFUL_HTTP_STATUS_CODES) {
|
|
92
95
|
const value = routeConfig.responsesByStatusCode[code];
|
|
93
|
-
if (value && value !== ContractNoBody) {
|
|
96
|
+
if (value && value !== ContractNoBody && !isNoBodyResponse(value)) {
|
|
94
97
|
isEmptyResponseExpected = false;
|
|
95
98
|
break;
|
|
96
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineApiContract.js","sourceRoot":"","sources":["../../src/new/defineApiContract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAM1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,GAGf,MAAM,uBAAuB,CAAA;AA+C9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAI/B,QAEC,EACS,EAAE,CAAC,QAAQ,CAAA;AAEvB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAwB,EAAU,EAAE;IACvE,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,MAAM,CAElF,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACb,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAA;QAEpB,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAwB,EAAU,EAAE;IACtE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAA;AACnF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,WAAwB,EAA+B,EAAE;IAC/F,MAAM,MAAM,GAAyB,EAAE,CAAA;IAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACrE,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAChD,CAAC;aAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,WAAwB,EAAW,EAAE;IAC5E,KAAK,MAAM,IAAI,IAAI,4BAA4B,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAErD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAQ;QACV,CAAC;QAED,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAA;QACb,CAAC;aAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,WAAwB,EAAoB,EAAE;IACrF,MAAM,OAAO,GAAgB,EAAE,CAAA;IAC/B,IAAI,qBAAqB,GAAG,KAAK,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,4BAA4B,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAErD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAQ;QACV,CAAC;QAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IACL,KAAK,KAAK,cAAc;YACxB,aAAa,CAAC,KAAK,CAAC;YACpB,cAAc,CAAC,KAAK,CAAC;YACrB,cAAc,CAAC,KAAK,CAAC,EACrB,CAAC;YACD,qBAAqB,GAAG,IAAI,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACjC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,WAAwB,EAAW,EAAE;IAC9E,IAAI,uBAAuB,GAAG,IAAI,CAAA;IAElC,KAAK,MAAM,IAAI,IAAI,4BAA4B,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAErD,IAAI,KAAK,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"defineApiContract.js","sourceRoot":"","sources":["../../src/new/defineApiContract.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokalise/api-contracts",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.12.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"homepage": "https://github.com/lokalise/shared-ts-libs",
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
14
|
-
"url": "git://github.com/lokalise/shared-ts-libs.git"
|
|
14
|
+
"url": "git://github.com/lokalise/shared-ts-libs.git",
|
|
15
|
+
"directory": "packages/app/api-contracts"
|
|
15
16
|
},
|
|
16
17
|
"exports": {
|
|
17
18
|
".": "./dist/index.js",
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
"@biomejs/biome": "^2.4.7",
|
|
39
40
|
"@lokalise/biome-config": "^3.1.0",
|
|
40
41
|
"@lokalise/tsconfig": "^4.0.0",
|
|
41
|
-
"@types/node": "^25.0
|
|
42
|
+
"@types/node": "^25.9.0",
|
|
42
43
|
"@vitest/coverage-v8": "^4.0.18",
|
|
43
44
|
"rimraf": "^6.1.2",
|
|
44
45
|
"typescript": "6.0.3",
|