@trayio/tray-openapi 0.0.1-beta

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.
Files changed (62) hide show
  1. package/LICENSE.txt +22 -0
  2. package/README.md +39 -0
  3. package/dist/OpenApiCodecs.d.ts +5 -0
  4. package/dist/OpenApiCodecs.d.ts.map +1 -0
  5. package/dist/OpenApiCodecs.js +8 -0
  6. package/dist/OpenApiSchemaImporter.d.ts +17 -0
  7. package/dist/OpenApiSchemaImporter.d.ts.map +1 -0
  8. package/dist/OpenApiSchemaImporter.js +138 -0
  9. package/dist/OpenApiSchemaImporter.test.d.ts +2 -0
  10. package/dist/OpenApiSchemaImporter.test.d.ts.map +1 -0
  11. package/dist/OpenApiSchemaImporter.test.js +85 -0
  12. package/dist/OpenApiSchemaTransformer.d.ts +9 -0
  13. package/dist/OpenApiSchemaTransformer.d.ts.map +1 -0
  14. package/dist/OpenApiSchemaTransformer.js +68 -0
  15. package/dist/OpenApiSchemaTransformer.test.d.ts +2 -0
  16. package/dist/OpenApiSchemaTransformer.test.d.ts.map +1 -0
  17. package/dist/OpenApiSchemaTransformer.test.js +118 -0
  18. package/dist/OpenApiTypeDescriptors.d.ts +109 -0
  19. package/dist/OpenApiTypeDescriptors.d.ts.map +1 -0
  20. package/dist/OpenApiTypeDescriptors.js +107 -0
  21. package/dist/file-generators/GenerateHandler.d.ts +15 -0
  22. package/dist/file-generators/GenerateHandler.d.ts.map +1 -0
  23. package/dist/file-generators/GenerateHandler.js +110 -0
  24. package/dist/file-generators/GenerateHandler.test.d.ts +2 -0
  25. package/dist/file-generators/GenerateHandler.test.d.ts.map +1 -0
  26. package/dist/file-generators/GenerateHandler.test.js +427 -0
  27. package/dist/file-generators/GenerateHandlerTest.d.ts +9 -0
  28. package/dist/file-generators/GenerateHandlerTest.d.ts.map +1 -0
  29. package/dist/file-generators/GenerateHandlerTest.js +88 -0
  30. package/dist/file-generators/GenerateHandlerTest.test.d.ts +2 -0
  31. package/dist/file-generators/GenerateHandlerTest.test.d.ts.map +1 -0
  32. package/dist/file-generators/GenerateHandlerTest.test.js +640 -0
  33. package/dist/file-generators/GenerateOperationJson.d.ts +4 -0
  34. package/dist/file-generators/GenerateOperationJson.d.ts.map +1 -0
  35. package/dist/file-generators/GenerateOperationJson.js +44 -0
  36. package/dist/file-generators/GenerateOperationJson.test.d.ts +2 -0
  37. package/dist/file-generators/GenerateOperationJson.test.d.ts.map +1 -0
  38. package/dist/file-generators/GenerateOperationJson.test.js +78 -0
  39. package/dist/file-generators/types/GenerateInputSchema.d.ts +4 -0
  40. package/dist/file-generators/types/GenerateInputSchema.d.ts.map +1 -0
  41. package/dist/file-generators/types/GenerateInputSchema.js +131 -0
  42. package/dist/file-generators/types/GenerateInputSchema.test.d.ts +2 -0
  43. package/dist/file-generators/types/GenerateInputSchema.test.d.ts.map +1 -0
  44. package/dist/file-generators/types/GenerateInputSchema.test.js +260 -0
  45. package/dist/file-generators/types/GenerateInputType.test.d.ts +2 -0
  46. package/dist/file-generators/types/GenerateInputType.test.d.ts.map +1 -0
  47. package/dist/file-generators/types/GenerateInputType.test.js +447 -0
  48. package/dist/file-generators/types/GenerateInputTypes.d.ts +4 -0
  49. package/dist/file-generators/types/GenerateInputTypes.d.ts.map +1 -0
  50. package/dist/file-generators/types/GenerateInputTypes.js +45 -0
  51. package/dist/file-generators/types/GenerateOutput.d.ts +8 -0
  52. package/dist/file-generators/types/GenerateOutput.d.ts.map +1 -0
  53. package/dist/file-generators/types/GenerateOutput.js +81 -0
  54. package/dist/file-generators/types/GenerateOutput.test.d.ts +2 -0
  55. package/dist/file-generators/types/GenerateOutput.test.d.ts.map +1 -0
  56. package/dist/file-generators/types/GenerateOutput.test.js +213 -0
  57. package/dist/file-generators/types/JsonSchemaToTypescriptOptions.d.ts +9 -0
  58. package/dist/file-generators/types/JsonSchemaToTypescriptOptions.d.ts.map +1 -0
  59. package/dist/file-generators/types/JsonSchemaToTypescriptOptions.js +11 -0
  60. package/dist/templates/connector-template.zip +0 -0
  61. package/dist/test-openapi-spec.json +160 -0
  62. package/package.json +30 -0
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ const E = __importStar(require("fp-ts/Either"));
36
+ const TE = __importStar(require("fp-ts/TaskEither"));
37
+ const O = __importStar(require("fp-ts/Option"));
38
+ const GenerateInputSchema_1 = require("./GenerateInputSchema");
39
+ const GenerateInputTypes_1 = require("./GenerateInputTypes");
40
+ describe('GenerateInputType', () => {
41
+ it('it should generate a schema from an endpoint with body parameters', () => __awaiter(void 0, void 0, void 0, function* () {
42
+ const endpoint = {
43
+ operationId: 'createPost',
44
+ description: 'Create a new post',
45
+ tags: O.some([]),
46
+ parameters: O.none,
47
+ requestBody: O.some({
48
+ content: {
49
+ 'application/json': {
50
+ schema: O.some({
51
+ title: O.none,
52
+ type: O.some('object'),
53
+ required: O.some(['id', 'userId', 'title', 'body']),
54
+ properties: O.some({
55
+ id: {
56
+ title: O.none,
57
+ type: O.some('integer'),
58
+ properties: O.none,
59
+ additionalProperties: O.some(false),
60
+ required: O.none,
61
+ allOf: O.none,
62
+ anyOf: O.none,
63
+ oneOf: O.none,
64
+ not: O.none,
65
+ in: O.none,
66
+ },
67
+ userId: {
68
+ title: O.none,
69
+ type: O.some('integer'),
70
+ properties: O.none,
71
+ additionalProperties: O.some(false),
72
+ required: O.none,
73
+ allOf: O.none,
74
+ anyOf: O.none,
75
+ oneOf: O.none,
76
+ not: O.none,
77
+ in: O.none,
78
+ },
79
+ title: {
80
+ title: O.none,
81
+ type: O.some('string'),
82
+ properties: O.none,
83
+ additionalProperties: O.some(false),
84
+ required: O.none,
85
+ allOf: O.none,
86
+ anyOf: O.none,
87
+ oneOf: O.none,
88
+ not: O.none,
89
+ in: O.none,
90
+ },
91
+ body: {
92
+ title: O.none,
93
+ type: O.some('string'),
94
+ properties: O.none,
95
+ additionalProperties: O.some(false),
96
+ required: O.none,
97
+ allOf: O.none,
98
+ anyOf: O.none,
99
+ oneOf: O.none,
100
+ not: O.none,
101
+ in: O.none,
102
+ },
103
+ }),
104
+ additionalProperties: O.some(false),
105
+ allOf: O.none,
106
+ anyOf: O.none,
107
+ oneOf: O.none,
108
+ not: O.none,
109
+ in: O.none,
110
+ }),
111
+ },
112
+ },
113
+ }),
114
+ responses: O.none,
115
+ };
116
+ const inputSchema = E.getOrElse(() => {
117
+ throw new Error('Should have been right');
118
+ })((0, GenerateInputSchema_1.generateInputSchema)(endpoint));
119
+ const expectedInputSchema = {
120
+ title: O.none,
121
+ type: O.some('object'),
122
+ required: O.some(['id', 'userId', 'title', 'body']),
123
+ properties: O.some({
124
+ id: {
125
+ title: O.none,
126
+ type: O.some('integer'),
127
+ properties: O.none,
128
+ additionalProperties: O.some(false),
129
+ required: O.none,
130
+ allOf: O.none,
131
+ anyOf: O.none,
132
+ oneOf: O.none,
133
+ not: O.none,
134
+ in: O.some('body'),
135
+ },
136
+ userId: {
137
+ title: O.none,
138
+ type: O.some('integer'),
139
+ properties: O.none,
140
+ additionalProperties: O.some(false),
141
+ required: O.none,
142
+ allOf: O.none,
143
+ anyOf: O.none,
144
+ oneOf: O.none,
145
+ not: O.none,
146
+ in: O.some('body'),
147
+ },
148
+ title: {
149
+ title: O.none,
150
+ type: O.some('string'),
151
+ properties: O.none,
152
+ additionalProperties: O.some(false),
153
+ required: O.none,
154
+ allOf: O.none,
155
+ anyOf: O.none,
156
+ oneOf: O.none,
157
+ not: O.none,
158
+ in: O.some('body'),
159
+ },
160
+ body: {
161
+ title: O.none,
162
+ type: O.some('string'),
163
+ properties: O.none,
164
+ additionalProperties: O.some(false),
165
+ required: O.none,
166
+ allOf: O.none,
167
+ anyOf: O.none,
168
+ oneOf: O.none,
169
+ not: O.none,
170
+ in: O.some('body'),
171
+ },
172
+ }),
173
+ additionalProperties: O.some(false),
174
+ allOf: O.none,
175
+ anyOf: O.none,
176
+ oneOf: O.none,
177
+ not: O.none,
178
+ in: O.none,
179
+ };
180
+ expect(inputSchema).toEqual(expectedInputSchema);
181
+ }));
182
+ it('it should process an endpoint with path, query string and body parameters and generate input.ts file contents', () => __awaiter(void 0, void 0, void 0, function* () {
183
+ const endpoint = {
184
+ operationId: 'getPost',
185
+ description: '',
186
+ tags: O.some([]),
187
+ parameters: O.some([
188
+ {
189
+ name: 'id',
190
+ in: 'path',
191
+ required: O.some(true),
192
+ description: 'The user id.',
193
+ schema: {
194
+ title: O.none,
195
+ type: O.some('integer'),
196
+ format: O.some('int64'),
197
+ properties: O.none,
198
+ additionalProperties: O.some(false),
199
+ required: O.none,
200
+ allOf: O.none,
201
+ anyOf: O.none,
202
+ oneOf: O.none,
203
+ not: O.none,
204
+ in: O.none,
205
+ },
206
+ },
207
+ {
208
+ name: 'categoryId',
209
+ in: 'path',
210
+ required: O.some(false),
211
+ description: 'The category id.',
212
+ schema: {
213
+ title: O.none,
214
+ type: O.some('integer'),
215
+ format: O.some('int64'),
216
+ properties: O.none,
217
+ additionalProperties: O.some(false),
218
+ required: O.none,
219
+ allOf: O.none,
220
+ anyOf: O.none,
221
+ oneOf: O.none,
222
+ not: O.none,
223
+ in: O.none,
224
+ },
225
+ },
226
+ ]),
227
+ requestBody: O.some({
228
+ content: {
229
+ 'application/json': {
230
+ schema: O.some({
231
+ title: O.none,
232
+ type: O.some('object'),
233
+ required: O.some(['userId', 'body']),
234
+ properties: O.some({
235
+ userId: {
236
+ title: O.none,
237
+ type: O.some('integer'),
238
+ properties: O.none,
239
+ additionalProperties: O.some(false),
240
+ required: O.none,
241
+ allOf: O.none,
242
+ anyOf: O.none,
243
+ oneOf: O.none,
244
+ not: O.none,
245
+ in: O.none,
246
+ },
247
+ title: {
248
+ title: O.none,
249
+ type: O.some('string'),
250
+ properties: O.none,
251
+ required: O.none,
252
+ additionalProperties: O.some(false),
253
+ allOf: O.none,
254
+ anyOf: O.none,
255
+ oneOf: O.none,
256
+ not: O.none,
257
+ in: O.none,
258
+ },
259
+ body: {
260
+ title: O.none,
261
+ type: O.some('string'),
262
+ properties: O.none,
263
+ additionalProperties: O.some(false),
264
+ required: O.none,
265
+ allOf: O.none,
266
+ anyOf: O.none,
267
+ oneOf: O.none,
268
+ not: O.none,
269
+ in: O.none,
270
+ },
271
+ }),
272
+ additionalProperties: O.some(false),
273
+ allOf: O.none,
274
+ anyOf: O.none,
275
+ oneOf: O.none,
276
+ not: O.none,
277
+ in: O.none,
278
+ }),
279
+ },
280
+ },
281
+ }),
282
+ responses: O.none,
283
+ };
284
+ const inputSchema = E.getOrElse(() => {
285
+ throw new Error('Should have been right');
286
+ })((0, GenerateInputSchema_1.generateInputSchema)(endpoint));
287
+ const inputTypes = (0, GenerateInputTypes_1.generateInputTypes)(endpoint.operationId, inputSchema);
288
+ const generatedInputFile = yield TE.getOrElse((error) => {
289
+ throw new Error('Should have been right');
290
+ })(inputTypes)();
291
+ const expectedInputFile = `export interface GetPostInput {
292
+ userId: number;
293
+ title?: string;
294
+ body: string;
295
+ /**
296
+ * @description The user id.
297
+ */
298
+ id: number;
299
+ /**
300
+ * @description The category id.
301
+ */
302
+ categoryId?: number;
303
+ }
304
+ `;
305
+ expect(generatedInputFile).toEqual(expectedInputFile);
306
+ }));
307
+ it('it should process an endpoint with no parameters and generate empty input.ts file contents', () => __awaiter(void 0, void 0, void 0, function* () {
308
+ const endpoint = {
309
+ operationId: 'getPosts',
310
+ description: '',
311
+ tags: O.some([]),
312
+ parameters: O.none,
313
+ requestBody: O.none,
314
+ responses: O.none,
315
+ };
316
+ const inputSchema = E.getOrElse(() => {
317
+ throw new Error('Should have been right');
318
+ })((0, GenerateInputSchema_1.generateInputSchema)(endpoint));
319
+ const inputTypes = (0, GenerateInputTypes_1.generateInputTypes)(endpoint.operationId, inputSchema);
320
+ const generatedInputFile = yield TE.getOrElse((error) => {
321
+ throw new Error('Should have been right');
322
+ })(inputTypes)();
323
+ const expectedInputFile = `export interface GetPostsInput {}
324
+ `;
325
+ expect(generatedInputFile).toEqual(expectedInputFile);
326
+ }));
327
+ it('it should process an endpoint with a body schema with no parameters and additionalProperties: true and generate k: string: unknown input.ts file contents', () => __awaiter(void 0, void 0, void 0, function* () {
328
+ const endpoint = {
329
+ operationId: 'getPosts',
330
+ description: '',
331
+ tags: O.some([]),
332
+ parameters: O.none,
333
+ requestBody: O.some({
334
+ content: {
335
+ 'application/json': {
336
+ schema: O.some({
337
+ title: O.none,
338
+ type: O.some('object'),
339
+ required: O.none,
340
+ properties: O.none,
341
+ additionalProperties: O.some(true),
342
+ allOf: O.none,
343
+ anyOf: O.none,
344
+ oneOf: O.none,
345
+ not: O.none,
346
+ in: O.none,
347
+ }),
348
+ },
349
+ },
350
+ }),
351
+ responses: O.none,
352
+ };
353
+ const inputSchema = E.getOrElse(() => {
354
+ throw new Error('Should have been right');
355
+ })((0, GenerateInputSchema_1.generateInputSchema)(endpoint));
356
+ const inputTypes = (0, GenerateInputTypes_1.generateInputTypes)(endpoint.operationId, inputSchema);
357
+ const generatedInputFile = yield TE.getOrElse((error) => {
358
+ throw new Error('Should have been right');
359
+ })(inputTypes)();
360
+ const expectedInputFile = `export interface GetPostsInput {
361
+ [k: string]: unknown;
362
+ }
363
+ `;
364
+ expect(generatedInputFile).toEqual(expectedInputFile);
365
+ }));
366
+ it('it should throw an exception when finding an unsupported media type', () => __awaiter(void 0, void 0, void 0, function* () {
367
+ const endpoint = {
368
+ operationId: 'createPost',
369
+ description: '',
370
+ tags: O.some([]),
371
+ parameters: O.none,
372
+ requestBody: O.some({
373
+ content: {
374
+ 'unsupported-media-type': {
375
+ schema: O.some({
376
+ title: O.none,
377
+ type: O.some('object'),
378
+ required: O.some(['id', 'userId', 'title', 'body']),
379
+ properties: O.some({
380
+ id: {
381
+ title: O.none,
382
+ type: O.some('integer'),
383
+ properties: O.none,
384
+ required: O.none,
385
+ additionalProperties: O.some(false),
386
+ allOf: O.none,
387
+ anyOf: O.none,
388
+ oneOf: O.none,
389
+ not: O.none,
390
+ in: O.none,
391
+ },
392
+ userId: {
393
+ title: O.none,
394
+ type: O.some('integer'),
395
+ properties: O.none,
396
+ required: O.none,
397
+ additionalProperties: O.some(false),
398
+ allOf: O.none,
399
+ anyOf: O.none,
400
+ oneOf: O.none,
401
+ not: O.none,
402
+ in: O.none,
403
+ },
404
+ title: {
405
+ title: O.none,
406
+ type: O.some('string'),
407
+ properties: O.none,
408
+ required: O.none,
409
+ additionalProperties: O.some(false),
410
+ allOf: O.none,
411
+ anyOf: O.none,
412
+ oneOf: O.none,
413
+ not: O.none,
414
+ in: O.none,
415
+ },
416
+ body: {
417
+ title: O.none,
418
+ type: O.some('string'),
419
+ properties: O.none,
420
+ required: O.none,
421
+ additionalProperties: O.some(false),
422
+ allOf: O.none,
423
+ anyOf: O.none,
424
+ oneOf: O.none,
425
+ not: O.none,
426
+ in: O.none,
427
+ },
428
+ }),
429
+ additionalProperties: O.some(false),
430
+ allOf: O.none,
431
+ anyOf: O.none,
432
+ oneOf: O.none,
433
+ not: O.none,
434
+ in: O.none,
435
+ }),
436
+ },
437
+ },
438
+ }),
439
+ responses: O.none,
440
+ };
441
+ const inputSchema = (0, GenerateInputSchema_1.generateInputSchema)(endpoint);
442
+ if (E.isRight(inputSchema)) {
443
+ throw new Error('Should have been left');
444
+ }
445
+ expect(inputSchema.left.message).toEqual('Unsupported media type: unsupported-media-type');
446
+ }));
447
+ });
@@ -0,0 +1,4 @@
1
+ import * as TE from 'fp-ts/TaskEither';
2
+ import { SchemaObject } from '../../OpenApiTypeDescriptors';
3
+ export declare const generateInputTypes: (operationNameCamelCase: string, parameters: SchemaObject) => TE.TaskEither<Error, string>;
4
+ //# sourceMappingURL=GenerateInputTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateInputTypes.d.ts","sourceRoot":"","sources":["../../../src/file-generators/types/GenerateInputTypes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAKvC,OAAO,EACN,YAAY,EAEZ,MAAM,8BAA8B,CAAC;AAWtC,eAAO,MAAM,kBAAkB,2BACN,MAAM,cAClB,YAAY,KACtB,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAc7B,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateInputTypes = void 0;
27
+ const json_schema_to_typescript_1 = require("json-schema-to-typescript");
28
+ const TE = __importStar(require("fp-ts/TaskEither"));
29
+ const O = __importStar(require("fp-ts/Option"));
30
+ const CompositeCodec_1 = require("@trayio/commons/codec/CompositeCodec");
31
+ const RemoveNullValuesCodec_1 = require("@trayio/commons/codec/RemoveNullValuesCodec");
32
+ const JsonSchemaToTypescriptOptions_1 = require("./JsonSchemaToTypescriptOptions");
33
+ const OpenApiTypeDescriptors_1 = require("../../OpenApiTypeDescriptors");
34
+ const encodeInputSchema = (inputSchema) => {
35
+ const codecWithNullValueRemoval = CompositeCodec_1.CompositeCodec.fromCodecs(OpenApiTypeDescriptors_1.schemaObjectTypeCodec, RemoveNullValuesCodec_1.RemoveNullValuesCodec.instance);
36
+ return codecWithNullValueRemoval.encode(inputSchema);
37
+ };
38
+ const generateInputTypes = (operationNameCamelCase, parameters) => {
39
+ if (O.isSome(parameters.title)) {
40
+ parameters.title = O.none;
41
+ }
42
+ const resolvedInputSchema = encodeInputSchema(parameters);
43
+ return TE.tryCatch(() => (0, json_schema_to_typescript_1.compile)(resolvedInputSchema, `${operationNameCamelCase}Input`, JsonSchemaToTypescriptOptions_1.JsonSchemaToTypescriptOptions), (reason) => new Error(`${reason}`));
44
+ };
45
+ exports.generateInputTypes = generateInputTypes;
@@ -0,0 +1,8 @@
1
+ import * as TE from 'fp-ts/TaskEither';
2
+ import * as E from 'fp-ts/Either';
3
+ import * as O from 'fp-ts/Option';
4
+ import { Responses, MediaTypeObject, SchemaObject } from '../../OpenApiTypeDescriptors';
5
+ export declare const getApplicationJsonMediaType: (content: Record<string, MediaTypeObject>) => E.Either<Error, MediaTypeObject>;
6
+ export declare const generateOutputSchema: (responses: O.Option<Responses>) => TE.TaskEither<Error, SchemaObject>;
7
+ export declare const generateOutputTypes: (operationNameCamelCase: string, outputSchema: SchemaObject) => TE.TaskEither<Error, string>;
8
+ //# sourceMappingURL=GenerateOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateOutput.d.ts","sourceRoot":"","sources":["../../../src/file-generators/types/GenerateOutput.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAKlC,OAAO,EACN,SAAS,EAET,eAAe,EACf,YAAY,EAEZ,MAAM,8BAA8B,CAAC;AAwCtC,eAAO,MAAM,2BAA2B,YAC9B,OAAO,MAAM,EAAE,eAAe,CAAC,KACtC,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,CAWjC,CAAC;AAEF,eAAO,MAAM,oBAAoB,cACrB,EAAE,MAAM,CAAC,SAAS,CAAC,KAC5B,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAelC,CAAC;AAWH,eAAO,MAAM,mBAAmB,2BACP,MAAM,gBAChB,YAAY,KACxB,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAgB7B,CAAC"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateOutputTypes = exports.generateOutputSchema = exports.getApplicationJsonMediaType = void 0;
27
+ const json_schema_to_typescript_1 = require("json-schema-to-typescript");
28
+ const TE = __importStar(require("fp-ts/TaskEither"));
29
+ const E = __importStar(require("fp-ts/Either"));
30
+ const O = __importStar(require("fp-ts/Option"));
31
+ const function_1 = require("fp-ts/function");
32
+ const CompositeCodec_1 = require("@trayio/commons/codec/CompositeCodec");
33
+ const RemoveNullValuesCodec_1 = require("@trayio/commons/codec/RemoveNullValuesCodec");
34
+ const JsonSchemaToTypescriptOptions_1 = require("./JsonSchemaToTypescriptOptions");
35
+ const OpenApiTypeDescriptors_1 = require("../../OpenApiTypeDescriptors");
36
+ const get2XXResponse = (responses) => O.fold(() => TE.left(new Error('No responses found')), (someResponses) => {
37
+ const statusCode2XX = Object.keys(someResponses).find((statusCode) => /^2\d{2}$/.test(statusCode));
38
+ if (statusCode2XX) {
39
+ return TE.right(someResponses[statusCode2XX]);
40
+ }
41
+ const responseCodes = Object.keys(someResponses);
42
+ return TE.left(new Error(`Unsupported success response code: ${responseCodes}`));
43
+ })(responses);
44
+ const blankOutputSchema = () => ({
45
+ title: O.none,
46
+ type: O.none,
47
+ properties: O.none,
48
+ required: O.none,
49
+ additionalProperties: O.some(false),
50
+ allOf: O.none,
51
+ anyOf: O.none,
52
+ oneOf: O.none,
53
+ not: O.none,
54
+ in: O.none,
55
+ });
56
+ const getContent = (response) => O.fold(() => ({ 'application/json': { schema: O.some(blankOutputSchema()) } }), (content) => content)(response.content);
57
+ const getApplicationJsonMediaType = (content) => {
58
+ if (!Object.keys(content).length)
59
+ return E.right({ schema: O.none });
60
+ const mediaTypeApplicationJson = Object.keys(content).find((mediaType) => /^application\/.*json.*$/.test(mediaType));
61
+ if (mediaTypeApplicationJson) {
62
+ return E.right(content[mediaTypeApplicationJson]);
63
+ }
64
+ const mediaTypes = Object.keys(content);
65
+ return E.left(new Error(`Unsupported media type: ${mediaTypes}`));
66
+ };
67
+ exports.getApplicationJsonMediaType = getApplicationJsonMediaType;
68
+ const generateOutputSchema = (responses) => (0, function_1.pipe)(get2XXResponse(responses), TE.chain((successResponse) => TE.fromEither((0, exports.getApplicationJsonMediaType)(getContent(successResponse)))), TE.map((mediaType) => O.fold(() => blankOutputSchema(), (schema) => schema)(mediaType.schema)), TE.mapLeft((error) => new Error(`Failed to generate output schema: ${error}`)));
69
+ exports.generateOutputSchema = generateOutputSchema;
70
+ const encodeOutputSchema = (outputSchema) => {
71
+ const codecWithNullValueRemoval = CompositeCodec_1.CompositeCodec.fromCodecs(OpenApiTypeDescriptors_1.schemaObjectTypeCodec, RemoveNullValuesCodec_1.RemoveNullValuesCodec.instance);
72
+ return codecWithNullValueRemoval.encode(outputSchema);
73
+ };
74
+ const generateOutputTypes = (operationNameCamelCase, outputSchema) => {
75
+ if (O.isSome(outputSchema.title)) {
76
+ outputSchema.title = O.none;
77
+ }
78
+ const resolvedOutputSchema = encodeOutputSchema(outputSchema);
79
+ return TE.tryCatch(() => (0, json_schema_to_typescript_1.compile)(resolvedOutputSchema, `${operationNameCamelCase}Output`, JsonSchemaToTypescriptOptions_1.JsonSchemaToTypescriptOptions), (error) => new Error(`Failed to generate output types: ${error}`));
80
+ };
81
+ exports.generateOutputTypes = generateOutputTypes;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GenerateOutput.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerateOutput.test.d.ts","sourceRoot":"","sources":["../../../src/file-generators/types/GenerateOutput.test.ts"],"names":[],"mappings":""}