@origins-digital/ts-rest-zod-openapi 1.2.0 → 2.1.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/dist/lib/ts-rest-open-api.spec.d.ts +2 -0
- package/dist/lib/ts-rest-open-api.spec.d.ts.map +1 -0
- package/dist/lib/ts-rest-open-api.spec.js +54 -0
- package/dist/lib/ts-rest-open-api.spec.js.map +1 -0
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.spec.d.ts +2 -0
- package/dist/lib/types.spec.d.ts.map +1 -0
- package/dist/lib/types.spec.js +45 -0
- package/dist/lib/types.spec.js.map +1 -0
- package/package.json +8 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-rest-open-api.spec.d.ts","sourceRoot":"","sources":["../../src/lib/ts-rest-open-api.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@ts-rest/core");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const zod_openapi_utils_1 = require("@origins-digital/zod-openapi-utils");
|
|
6
|
+
const ts_rest_open_api_1 = require("./ts-rest-open-api");
|
|
7
|
+
describe('generateOpenApi (ts-rest-zod-openapi)', () => {
|
|
8
|
+
beforeAll(() => {
|
|
9
|
+
(0, zod_openapi_utils_1.extendZodWithOpenApi)(zod_1.z, true);
|
|
10
|
+
});
|
|
11
|
+
const c = (0, core_1.initContract)();
|
|
12
|
+
const router = c.router({
|
|
13
|
+
getUser: {
|
|
14
|
+
method: 'GET',
|
|
15
|
+
path: '/users/:id',
|
|
16
|
+
pathParams: zod_1.z.object({
|
|
17
|
+
id: zod_1.z.string().openapi({ format: 'uuid' }),
|
|
18
|
+
}),
|
|
19
|
+
responses: {
|
|
20
|
+
200: zod_1.z
|
|
21
|
+
.object({
|
|
22
|
+
id: zod_1.z.uuid(),
|
|
23
|
+
email: zod_1.z.string().openapi({ format: 'email' }),
|
|
24
|
+
})
|
|
25
|
+
.openapi({ title: 'User' }),
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
it('should generate a basic OpenAPI spec from a contract', () => {
|
|
30
|
+
const openapi = (0, ts_rest_open_api_1.generateOpenApi)(router, {
|
|
31
|
+
info: {
|
|
32
|
+
title: 'Test API',
|
|
33
|
+
version: '1.0.0',
|
|
34
|
+
},
|
|
35
|
+
}, {
|
|
36
|
+
setOperationId: 'concatenated-path',
|
|
37
|
+
});
|
|
38
|
+
expect(openapi.openapi).toBe('3.0.2');
|
|
39
|
+
expect(openapi.paths['/users/{id}']).toBeDefined();
|
|
40
|
+
const getOp = openapi.paths['/users/{id}'].get;
|
|
41
|
+
expect(getOp).toBeDefined();
|
|
42
|
+
expect(getOp.operationId).toBe('getUser');
|
|
43
|
+
// path params
|
|
44
|
+
const idParam = getOp.parameters.find((p) => p.name === 'id' && p.in === 'path');
|
|
45
|
+
expect(idParam).toBeDefined();
|
|
46
|
+
expect(idParam.schema).toBeDefined();
|
|
47
|
+
// response schema
|
|
48
|
+
const okResponse = getOp.responses['200'];
|
|
49
|
+
expect(okResponse).toBeDefined();
|
|
50
|
+
const content = okResponse.content['application/json'];
|
|
51
|
+
expect(content.schema).toBeDefined();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=ts-rest-open-api.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-rest-open-api.spec.js","sourceRoot":"","sources":["../../src/lib/ts-rest-open-api.spec.ts"],"names":[],"mappings":";;AAAA,wCAA6C;AAC7C,6BAAwB;AACxB,0EAA0E;AAC1E,yDAAqD;AAErD,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,IAAA,wCAAoB,EAAC,OAAC,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAA,mBAAY,GAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE;YACP,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;gBACnB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC3C,CAAC;YACF,SAAS,EAAE;gBACT,GAAG,EAAE,OAAC;qBACH,MAAM,CAAC;oBACN,EAAE,EAAE,OAAC,CAAC,IAAI,EAAE;oBACZ,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;iBAC/C,CAAC;qBACD,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC9B;SACF;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,OAAO,GAAG,IAAA,kCAAe,EAC7B,MAAM,EACN;YACE,IAAI,EAAE;gBACJ,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,OAAO;aACjB;SACF,EACD;YACE,cAAc,EAAE,mBAAmB;SACpC,CACF,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAEnD,MAAM,KAAK,GAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAS,CAAC,GAAG,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1C,cAAc;QACd,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CACnC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAC/C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAErC,kBAAkB;QAClB,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AppRoute, AppRouter, ContractAnyType, ContractNoBodyType, ContractOtherResponse } from '@ts-rest/core';
|
|
2
2
|
import { ParameterObject, SchemaObject } from 'openapi3-ts';
|
|
3
|
-
import { StandardSchemaV1 } from '
|
|
3
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
4
4
|
type SchemaTransformerArgs = {
|
|
5
5
|
/**
|
|
6
6
|
* The schema to transform.
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,KAAK,qBAAqB,GAAG;IAC3B;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CACzD,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,IAAI,EAAE,qBAAqB,KACxB,YAAY,GAAG,IAAI,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAElC,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,IAAI;IAC1E,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,KAAK,OAAO,CAAC;IAC3C,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,IACjC,OAAO,SAAS,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC,GACf,KAAK,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAClC,OAAO,SAAS,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC,GAChB,KAAK,CAAC;AAEZ;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,QAAQ,GAAG,SAAS,KAAG,GAAG,IAAI,QAE7D,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UACI,eAAe,GACf,kBAAkB,GAClB,qBAAqB,CAAC,eAAe,CAAC,KACzC,QAAQ,IAAI,qBAAqB,CAAC,eAAe,CAMnD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,OAAO,KACd,MAAM,IAAI,gBAYZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.spec.d.ts","sourceRoot":"","sources":["../../src/lib/types.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("./types");
|
|
4
|
+
describe('ts-rest-zod-openapi types helpers', () => {
|
|
5
|
+
it('isAppRoute should detect objects with method and path', () => {
|
|
6
|
+
const route = { method: 'GET', path: '/users', responses: {} };
|
|
7
|
+
const router = { users: route };
|
|
8
|
+
expect((0, types_1.isAppRoute)(route)).toBe(true);
|
|
9
|
+
expect((0, types_1.isAppRoute)(router)).toBe(false);
|
|
10
|
+
});
|
|
11
|
+
it('isAppRouteOtherResponse should detect ContractOtherResponse-like objects', () => {
|
|
12
|
+
const otherResponse = {
|
|
13
|
+
contentType: 'application/json',
|
|
14
|
+
body: { some: 'schema' },
|
|
15
|
+
};
|
|
16
|
+
const normalResponse = { body: { some: 'schema' } };
|
|
17
|
+
expect((0, types_1.isAppRouteOtherResponse)(otherResponse)).toBe(true);
|
|
18
|
+
expect((0, types_1.isAppRouteOtherResponse)(normalResponse)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it('isStandardSchema should detect StandardSchemaV1-like objects', () => {
|
|
21
|
+
const standardLike = {
|
|
22
|
+
['~standard']: {
|
|
23
|
+
version: 1,
|
|
24
|
+
validate: () => ({ value: 1, issues: [] }),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const wrongVersion = {
|
|
28
|
+
['~standard']: {
|
|
29
|
+
version: 2,
|
|
30
|
+
validate: () => ({ value: 1, issues: [] }),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const missingValidate = {
|
|
34
|
+
['~standard']: {
|
|
35
|
+
version: 1,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
expect((0, types_1.isStandardSchema)(standardLike)).toBe(true);
|
|
39
|
+
expect((0, types_1.isStandardSchema)(wrongVersion)).toBe(false);
|
|
40
|
+
expect((0, types_1.isStandardSchema)(missingValidate)).toBe(false);
|
|
41
|
+
expect((0, types_1.isStandardSchema)(null)).toBe(false);
|
|
42
|
+
expect((0, types_1.isStandardSchema)({})).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=types.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.spec.js","sourceRoot":"","sources":["../../src/lib/types.spec.ts"],"names":[],"mappings":";;AAAA,mCAAgF;AAEhF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAS,CAAC;QACtE,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,KAAK,EAAS,CAAC;QAEvC,MAAM,CAAC,IAAA,kBAAU,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,aAAa,GAAG;YACpB,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAClB,CAAC;QAET,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAS,CAAC;QAE3D,MAAM,CAAC,IAAA,+BAAuB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAA,+BAAuB,EAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,YAAY,GAAG;YACnB,CAAC,WAAW,CAAC,EAAE;gBACb,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC3C;SACF,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,CAAC,WAAW,CAAC,EAAE;gBACb,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC3C;SACF,CAAC;QAEF,MAAM,eAAe,GAAG;YACtB,CAAC,WAAW,CAAC,EAAE;gBACb,OAAO,EAAE,CAAC;aACX;SACF,CAAC;QAEF,MAAM,CAAC,IAAA,wBAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,IAAA,wBAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,wBAAgB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,IAAA,wBAAgB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAA,wBAAgB,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@origins-digital/ts-rest-zod-openapi",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Origins Ts Rest Zod OpenAPI",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.d.ts",
|
|
@@ -32,27 +32,29 @@
|
|
|
32
32
|
"prepublish": "yarn build"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@origins-digital/zod-openapi-utils": "
|
|
35
|
+
"@origins-digital/zod-openapi-utils": "2.2.0",
|
|
36
|
+
"@standard-schema/spec": "^1.1.0",
|
|
36
37
|
"openapi3-ts": "^2.0.2"
|
|
37
38
|
},
|
|
38
39
|
"peerDependencies": {
|
|
39
|
-
"@ts-rest/core": "
|
|
40
|
+
"@ts-rest/core": "3.53.0-rc.1"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@commitlint/cli": "^17.6.6",
|
|
43
44
|
"@commitlint/config-conventional": "^17.6.6",
|
|
44
45
|
"@faker-js/faker": "^8.3.1",
|
|
46
|
+
"@standard-schema/spec": "^1.1.0",
|
|
45
47
|
"@types/node": "^20.3.1",
|
|
46
48
|
"commitizen": "^4.3.0",
|
|
47
|
-
"conventional-recommended-bump": "^
|
|
49
|
+
"conventional-recommended-bump": "^11.2.0",
|
|
48
50
|
"cz-conventional-changelog": "^3.3.0",
|
|
49
|
-
"eslint": "^
|
|
51
|
+
"eslint": "^9.0.0",
|
|
50
52
|
"eslint-config-prettier": "^9.0.0",
|
|
51
53
|
"eslint-plugin-prettier": "^5.0.0",
|
|
52
54
|
"jest": "^29.5.0",
|
|
53
55
|
"prettier": "^3.0.0",
|
|
54
56
|
"rimraf": "^5.0.5",
|
|
55
|
-
"supertest": "^
|
|
57
|
+
"supertest": "^7.1.3",
|
|
56
58
|
"ts-jest": "^29.1.0",
|
|
57
59
|
"ts-loader": "^9.4.3",
|
|
58
60
|
"ts-node": "^10.9.1",
|