@furystack/rest 8.0.41 → 8.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +37 -1
  3. package/esm/api-endpoint-schema.d.ts +47 -2
  4. package/esm/api-endpoint-schema.d.ts.map +1 -1
  5. package/esm/index.d.ts +4 -1
  6. package/esm/index.d.ts.map +1 -1
  7. package/esm/index.js +4 -1
  8. package/esm/index.js.map +1 -1
  9. package/esm/openapi-document.d.ts +303 -0
  10. package/esm/openapi-document.d.ts.map +1 -0
  11. package/esm/openapi-document.js +2 -0
  12. package/esm/openapi-document.js.map +1 -0
  13. package/esm/openapi-resolve-refs.d.ts +20 -0
  14. package/esm/openapi-resolve-refs.d.ts.map +1 -0
  15. package/esm/openapi-resolve-refs.js +68 -0
  16. package/esm/openapi-resolve-refs.js.map +1 -0
  17. package/esm/openapi-resolve-refs.spec.d.ts +2 -0
  18. package/esm/openapi-resolve-refs.spec.d.ts.map +1 -0
  19. package/esm/openapi-resolve-refs.spec.js +294 -0
  20. package/esm/openapi-resolve-refs.spec.js.map +1 -0
  21. package/esm/openapi-to-rest-api.d.ts +197 -0
  22. package/esm/openapi-to-rest-api.d.ts.map +1 -0
  23. package/esm/openapi-to-rest-api.js +2 -0
  24. package/esm/openapi-to-rest-api.js.map +1 -0
  25. package/esm/openapi-to-rest-api.spec.d.ts +2 -0
  26. package/esm/openapi-to-rest-api.spec.d.ts.map +1 -0
  27. package/esm/openapi-to-rest-api.spec.js +665 -0
  28. package/esm/openapi-to-rest-api.spec.js.map +1 -0
  29. package/esm/openapi-to-schema.d.ts +24 -0
  30. package/esm/openapi-to-schema.d.ts.map +1 -0
  31. package/esm/openapi-to-schema.js +145 -0
  32. package/esm/openapi-to-schema.js.map +1 -0
  33. package/esm/openapi-to-schema.spec.d.ts +2 -0
  34. package/esm/openapi-to-schema.spec.d.ts.map +1 -0
  35. package/esm/openapi-to-schema.spec.js +610 -0
  36. package/esm/openapi-to-schema.spec.js.map +1 -0
  37. package/esm/rest-api.d.ts +21 -4
  38. package/esm/rest-api.d.ts.map +1 -1
  39. package/esm/swagger-document.d.ts +2 -195
  40. package/esm/swagger-document.d.ts.map +1 -1
  41. package/esm/swagger-document.js +2 -1
  42. package/esm/swagger-document.js.map +1 -1
  43. package/package.json +4 -4
  44. package/src/api-endpoint-schema.ts +56 -3
  45. package/src/index.ts +4 -1
  46. package/src/openapi-document.ts +328 -0
  47. package/src/openapi-resolve-refs.spec.ts +324 -0
  48. package/src/openapi-resolve-refs.ts +71 -0
  49. package/src/openapi-to-rest-api.spec.ts +823 -0
  50. package/src/openapi-to-rest-api.ts +263 -0
  51. package/src/openapi-to-schema.spec.ts +707 -0
  52. package/src/openapi-to-schema.ts +163 -0
  53. package/src/rest-api.ts +26 -5
  54. package/src/swagger-document.ts +2 -220
@@ -0,0 +1,610 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { convertOpenApiPathToFuryStack, openApiToSchema } from './openapi-to-schema.js';
3
+ describe('convertOpenApiPathToFuryStack', () => {
4
+ it('Should convert single {param} to :param', () => {
5
+ expect(convertOpenApiPathToFuryStack('/users/{id}')).toBe('/users/:id');
6
+ });
7
+ it('Should convert multiple params', () => {
8
+ expect(convertOpenApiPathToFuryStack('/users/{userId}/posts/{postId}')).toBe('/users/:userId/posts/:postId');
9
+ });
10
+ it('Should pass through paths without params', () => {
11
+ expect(convertOpenApiPathToFuryStack('/users')).toBe('/users');
12
+ });
13
+ it('Should handle root path', () => {
14
+ expect(convertOpenApiPathToFuryStack('/')).toBe('/');
15
+ });
16
+ it('Should handle param at the start', () => {
17
+ expect(convertOpenApiPathToFuryStack('/{version}')).toBe('/:version');
18
+ });
19
+ });
20
+ describe('openApiToSchema', () => {
21
+ describe('Document info', () => {
22
+ it('Should extract title, version, and description', () => {
23
+ const doc = {
24
+ openapi: '3.1.0',
25
+ info: { title: 'My API', version: '2.0.0', description: 'A test API' },
26
+ };
27
+ const schema = openApiToSchema(doc);
28
+ expect(schema.name).toBe('My API');
29
+ expect(schema.version).toBe('2.0.0');
30
+ expect(schema.description).toBe('A test API');
31
+ });
32
+ it('Should default description to empty string when absent', () => {
33
+ const doc = {
34
+ openapi: '3.1.0',
35
+ info: { title: 'Test', version: '1.0.0' },
36
+ };
37
+ const schema = openApiToSchema(doc);
38
+ expect(schema.description).toBe('');
39
+ });
40
+ });
41
+ describe('HTTP methods', () => {
42
+ it('Should extract GET endpoints', () => {
43
+ const doc = {
44
+ openapi: '3.1.0',
45
+ info: { title: 'Test', version: '1.0.0' },
46
+ paths: { '/items': { get: { responses: { '200': { description: 'OK' } } } } },
47
+ };
48
+ const schema = openApiToSchema(doc);
49
+ expect(schema.endpoints.GET).toBeDefined();
50
+ expect(schema.endpoints.GET['/items']).toBeDefined();
51
+ });
52
+ it('Should extract POST endpoints', () => {
53
+ const doc = {
54
+ openapi: '3.1.0',
55
+ info: { title: 'Test', version: '1.0.0' },
56
+ paths: { '/items': { post: { responses: { '201': { description: 'Created' } } } } },
57
+ };
58
+ const schema = openApiToSchema(doc);
59
+ expect(schema.endpoints.POST).toBeDefined();
60
+ expect(schema.endpoints.POST['/items']).toBeDefined();
61
+ });
62
+ it('Should extract PUT endpoints', () => {
63
+ const doc = {
64
+ openapi: '3.1.0',
65
+ info: { title: 'Test', version: '1.0.0' },
66
+ paths: { '/items/{id}': { put: { responses: { '200': { description: 'OK' } } } } },
67
+ };
68
+ const schema = openApiToSchema(doc);
69
+ expect(schema.endpoints.PUT).toBeDefined();
70
+ expect(schema.endpoints.PUT['/items/:id']).toBeDefined();
71
+ });
72
+ it('Should extract DELETE endpoints', () => {
73
+ const doc = {
74
+ openapi: '3.1.0',
75
+ info: { title: 'Test', version: '1.0.0' },
76
+ paths: { '/items/{id}': { delete: { responses: { '200': { description: 'OK' } } } } },
77
+ };
78
+ const schema = openApiToSchema(doc);
79
+ expect(schema.endpoints.DELETE).toBeDefined();
80
+ expect(schema.endpoints.DELETE['/items/:id']).toBeDefined();
81
+ });
82
+ it('Should extract PATCH endpoints', () => {
83
+ const doc = {
84
+ openapi: '3.1.0',
85
+ info: { title: 'Test', version: '1.0.0' },
86
+ paths: { '/items/{id}': { patch: { responses: { '200': { description: 'OK' } } } } },
87
+ };
88
+ const schema = openApiToSchema(doc);
89
+ expect(schema.endpoints.PATCH).toBeDefined();
90
+ expect(schema.endpoints.PATCH['/items/:id']).toBeDefined();
91
+ });
92
+ it('Should extract HEAD endpoints', () => {
93
+ const doc = {
94
+ openapi: '3.1.0',
95
+ info: { title: 'Test', version: '1.0.0' },
96
+ paths: { '/items': { head: { responses: { '200': { description: 'OK' } } } } },
97
+ };
98
+ const schema = openApiToSchema(doc);
99
+ expect(schema.endpoints.HEAD).toBeDefined();
100
+ expect(schema.endpoints.HEAD['/items']).toBeDefined();
101
+ });
102
+ it('Should extract OPTIONS endpoints', () => {
103
+ const doc = {
104
+ openapi: '3.1.0',
105
+ info: { title: 'Test', version: '1.0.0' },
106
+ paths: { '/items': { options: { responses: { '200': { description: 'OK' } } } } },
107
+ };
108
+ const schema = openApiToSchema(doc);
109
+ expect(schema.endpoints.OPTIONS).toBeDefined();
110
+ expect(schema.endpoints.OPTIONS['/items']).toBeDefined();
111
+ });
112
+ it('Should extract TRACE endpoints', () => {
113
+ const doc = {
114
+ openapi: '3.1.0',
115
+ info: { title: 'Test', version: '1.0.0' },
116
+ paths: { '/items': { trace: { responses: { '200': { description: 'OK' } } } } },
117
+ };
118
+ const schema = openApiToSchema(doc);
119
+ expect(schema.endpoints.TRACE).toBeDefined();
120
+ expect(schema.endpoints.TRACE['/items']).toBeDefined();
121
+ });
122
+ it('Should handle multiple HTTP methods on the same path', () => {
123
+ const doc = {
124
+ openapi: '3.1.0',
125
+ info: { title: 'Test', version: '1.0.0' },
126
+ paths: {
127
+ '/items': {
128
+ get: { responses: { '200': { description: 'OK' } } },
129
+ post: { responses: { '201': { description: 'Created' } } },
130
+ delete: { responses: { '200': { description: 'Deleted' } } },
131
+ },
132
+ },
133
+ };
134
+ const schema = openApiToSchema(doc);
135
+ expect(schema.endpoints.GET['/items']).toBeDefined();
136
+ expect(schema.endpoints.POST['/items']).toBeDefined();
137
+ expect(schema.endpoints.DELETE['/items']).toBeDefined();
138
+ });
139
+ });
140
+ describe('Path parameters', () => {
141
+ it('Should convert single {param} to :param', () => {
142
+ const doc = {
143
+ openapi: '3.1.0',
144
+ info: { title: 'Test', version: '1.0.0' },
145
+ paths: {
146
+ '/users/{id}': { get: { responses: { '200': { description: 'OK' } } } },
147
+ },
148
+ };
149
+ const schema = openApiToSchema(doc);
150
+ expect(schema.endpoints.GET['/users/:id']).toBeDefined();
151
+ expect(schema.endpoints.GET['/users/:id'].path).toBe('/users/:id');
152
+ });
153
+ it('Should convert multiple {params} to :params', () => {
154
+ const doc = {
155
+ openapi: '3.1.0',
156
+ info: { title: 'Test', version: '1.0.0' },
157
+ paths: {
158
+ '/users/{userId}/posts/{postId}': { get: { responses: { '200': { description: 'OK' } } } },
159
+ },
160
+ };
161
+ const schema = openApiToSchema(doc);
162
+ expect(schema.endpoints.GET['/users/:userId/posts/:postId']).toBeDefined();
163
+ expect(schema.endpoints.GET['/users/:userId/posts/:postId'].path).toBe('/users/:userId/posts/:postId');
164
+ });
165
+ });
166
+ describe('Response schema extraction', () => {
167
+ it('Should extract schema from 200 response', () => {
168
+ const responseSchema = { type: 'object', properties: { id: { type: 'string' } } };
169
+ const doc = {
170
+ openapi: '3.1.0',
171
+ info: { title: 'Test', version: '1.0.0' },
172
+ paths: {
173
+ '/items': {
174
+ get: {
175
+ responses: {
176
+ '200': { description: 'OK', content: { 'application/json': { schema: responseSchema } } },
177
+ },
178
+ },
179
+ },
180
+ },
181
+ };
182
+ const schema = openApiToSchema(doc);
183
+ expect(schema.endpoints.GET['/items'].schema).toEqual(responseSchema);
184
+ });
185
+ it('Should fall back to 201 response schema', () => {
186
+ const responseSchema = { type: 'object', properties: { id: { type: 'string' } } };
187
+ const doc = {
188
+ openapi: '3.1.0',
189
+ info: { title: 'Test', version: '1.0.0' },
190
+ paths: {
191
+ '/items': {
192
+ post: {
193
+ responses: {
194
+ '201': { description: 'Created', content: { 'application/json': { schema: responseSchema } } },
195
+ },
196
+ },
197
+ },
198
+ },
199
+ };
200
+ const schema = openApiToSchema(doc);
201
+ expect(schema.endpoints.POST['/items'].schema).toEqual(responseSchema);
202
+ });
203
+ it('Should return empty object for responses without content', () => {
204
+ const doc = {
205
+ openapi: '3.1.0',
206
+ info: { title: 'Test', version: '1.0.0' },
207
+ paths: {
208
+ '/health': { get: { responses: { '200': { description: 'OK' } } } },
209
+ },
210
+ };
211
+ const schema = openApiToSchema(doc);
212
+ expect(schema.endpoints.GET['/health'].schema).toEqual({});
213
+ });
214
+ it('Should skip $ref response objects', () => {
215
+ const doc = {
216
+ openapi: '3.1.0',
217
+ info: { title: 'Test', version: '1.0.0' },
218
+ paths: {
219
+ '/items': {
220
+ get: {
221
+ responses: {
222
+ '200': { $ref: '#/components/responses/Success' },
223
+ },
224
+ },
225
+ },
226
+ },
227
+ };
228
+ const schema = openApiToSchema(doc);
229
+ expect(schema.endpoints.GET['/items'].schema).toEqual({});
230
+ });
231
+ });
232
+ describe('Schema naming', () => {
233
+ it('Should use operationId as schemaName when available', () => {
234
+ const doc = {
235
+ openapi: '3.1.0',
236
+ info: { title: 'Test', version: '1.0.0' },
237
+ paths: {
238
+ '/users': { get: { operationId: 'listUsers', responses: { '200': { description: 'OK' } } } },
239
+ },
240
+ };
241
+ const schema = openApiToSchema(doc);
242
+ expect(schema.endpoints.GET['/users'].schemaName).toBe('listUsers');
243
+ });
244
+ it('Should generate schemaName from method and path when no operationId', () => {
245
+ const doc = {
246
+ openapi: '3.1.0',
247
+ info: { title: 'Test', version: '1.0.0' },
248
+ paths: {
249
+ '/users/{id}': { get: { responses: { '200': { description: 'OK' } } } },
250
+ },
251
+ };
252
+ const schema = openApiToSchema(doc);
253
+ expect(schema.endpoints.GET['/users/:id'].schemaName).toBe('get_users_id');
254
+ });
255
+ });
256
+ describe('Authentication detection', () => {
257
+ it('Should mark as not authenticated when no security defined', () => {
258
+ const doc = {
259
+ openapi: '3.1.0',
260
+ info: { title: 'Test', version: '1.0.0' },
261
+ paths: {
262
+ '/public': { get: { responses: { '200': { description: 'OK' } } } },
263
+ },
264
+ };
265
+ const schema = openApiToSchema(doc);
266
+ expect(schema.endpoints.GET['/public'].isAuthenticated).toBe(false);
267
+ });
268
+ it('Should mark as not authenticated with empty operation security', () => {
269
+ const doc = {
270
+ openapi: '3.1.0',
271
+ info: { title: 'Test', version: '1.0.0' },
272
+ paths: {
273
+ '/public': { get: { security: [], responses: { '200': { description: 'OK' } } } },
274
+ },
275
+ };
276
+ const schema = openApiToSchema(doc);
277
+ expect(schema.endpoints.GET['/public'].isAuthenticated).toBe(false);
278
+ });
279
+ it('Should mark as authenticated from operation-level security', () => {
280
+ const doc = {
281
+ openapi: '3.1.0',
282
+ info: { title: 'Test', version: '1.0.0' },
283
+ paths: {
284
+ '/private': {
285
+ get: { security: [{ bearerAuth: [] }], responses: { '200': { description: 'OK' } } },
286
+ },
287
+ },
288
+ };
289
+ const schema = openApiToSchema(doc);
290
+ expect(schema.endpoints.GET['/private'].isAuthenticated).toBe(true);
291
+ });
292
+ it('Should mark as authenticated from document-level security', () => {
293
+ const doc = {
294
+ openapi: '3.1.0',
295
+ info: { title: 'Test', version: '1.0.0' },
296
+ security: [{ apiKey: [] }],
297
+ paths: {
298
+ '/items': { get: { responses: { '200': { description: 'OK' } } } },
299
+ },
300
+ };
301
+ const schema = openApiToSchema(doc);
302
+ expect(schema.endpoints.GET['/items'].isAuthenticated).toBe(true);
303
+ });
304
+ it('Should prefer operation-level security over document-level', () => {
305
+ const doc = {
306
+ openapi: '3.1.0',
307
+ info: { title: 'Test', version: '1.0.0' },
308
+ security: [{ apiKey: [] }],
309
+ paths: {
310
+ '/public': {
311
+ get: { security: [], responses: { '200': { description: 'OK' } } },
312
+ },
313
+ },
314
+ };
315
+ const schema = openApiToSchema(doc);
316
+ expect(schema.endpoints.GET['/public'].isAuthenticated).toBe(false);
317
+ });
318
+ });
319
+ describe('Security scheme name extraction', () => {
320
+ it('Should extract operation-level security scheme names', () => {
321
+ const doc = {
322
+ openapi: '3.1.0',
323
+ info: { title: 'Test', version: '1.0.0' },
324
+ paths: {
325
+ '/private': {
326
+ get: { security: [{ bearerAuth: [] }], responses: { '200': { description: 'OK' } } },
327
+ },
328
+ },
329
+ };
330
+ const schema = openApiToSchema(doc);
331
+ expect(schema.endpoints.GET['/private'].securitySchemes).toEqual(['bearerAuth']);
332
+ });
333
+ it('Should extract multiple security scheme names', () => {
334
+ const doc = {
335
+ openapi: '3.1.0',
336
+ info: { title: 'Test', version: '1.0.0' },
337
+ paths: {
338
+ '/private': {
339
+ get: {
340
+ security: [{ bearerAuth: [] }, { apiKey: [] }],
341
+ responses: { '200': { description: 'OK' } },
342
+ },
343
+ },
344
+ },
345
+ };
346
+ const schema = openApiToSchema(doc);
347
+ expect(schema.endpoints.GET['/private'].securitySchemes).toEqual(['bearerAuth', 'apiKey']);
348
+ });
349
+ it('Should inherit document-level security scheme names', () => {
350
+ const doc = {
351
+ openapi: '3.1.0',
352
+ info: { title: 'Test', version: '1.0.0' },
353
+ security: [{ apiKey: [] }],
354
+ paths: {
355
+ '/items': { get: { responses: { '200': { description: 'OK' } } } },
356
+ },
357
+ };
358
+ const schema = openApiToSchema(doc);
359
+ expect(schema.endpoints.GET['/items'].securitySchemes).toEqual(['apiKey']);
360
+ });
361
+ it('Should not set securitySchemes when security is empty', () => {
362
+ const doc = {
363
+ openapi: '3.1.0',
364
+ info: { title: 'Test', version: '1.0.0' },
365
+ paths: {
366
+ '/public': { get: { security: [], responses: { '200': { description: 'OK' } } } },
367
+ },
368
+ };
369
+ const schema = openApiToSchema(doc);
370
+ expect(schema.endpoints.GET['/public'].securitySchemes).toBeUndefined();
371
+ });
372
+ it('Should not set securitySchemes when no security defined', () => {
373
+ const doc = {
374
+ openapi: '3.1.0',
375
+ info: { title: 'Test', version: '1.0.0' },
376
+ paths: {
377
+ '/public': { get: { responses: { '200': { description: 'OK' } } } },
378
+ },
379
+ };
380
+ const schema = openApiToSchema(doc);
381
+ expect(schema.endpoints.GET['/public'].securitySchemes).toBeUndefined();
382
+ });
383
+ it('Should prefer operation-level scheme names over document-level', () => {
384
+ const doc = {
385
+ openapi: '3.1.0',
386
+ info: { title: 'Test', version: '1.0.0' },
387
+ security: [{ apiKey: [] }],
388
+ paths: {
389
+ '/custom': {
390
+ get: { security: [{ bearerAuth: [] }], responses: { '200': { description: 'OK' } } },
391
+ },
392
+ },
393
+ };
394
+ const schema = openApiToSchema(doc);
395
+ expect(schema.endpoints.GET['/custom'].securitySchemes).toEqual(['bearerAuth']);
396
+ });
397
+ });
398
+ describe('Edge cases', () => {
399
+ it('Should handle documents with no paths', () => {
400
+ const doc = {
401
+ openapi: '3.1.0',
402
+ info: { title: 'Empty', version: '0.0.1' },
403
+ };
404
+ const schema = openApiToSchema(doc);
405
+ expect(schema.endpoints).toEqual({});
406
+ });
407
+ it('Should skip $ref path items', () => {
408
+ const paths = {
409
+ '/ref-path': { $ref: '#/components/pathItems/SomePath' },
410
+ '/real-path': { get: { responses: { '200': { description: 'OK' } } } },
411
+ };
412
+ const doc = {
413
+ openapi: '3.1.0',
414
+ info: { title: 'Test', version: '1.0.0' },
415
+ paths: paths,
416
+ };
417
+ const schema = openApiToSchema(doc);
418
+ expect(schema.endpoints.GET['/real-path']).toBeDefined();
419
+ expect(schema.endpoints.GET['/ref-path']).toBeUndefined();
420
+ });
421
+ it('Should handle path items with summary/description but no operations', () => {
422
+ const doc = {
423
+ openapi: '3.1.0',
424
+ info: { title: 'Test', version: '1.0.0' },
425
+ paths: {
426
+ '/no-ops': { summary: 'A path with no operations' },
427
+ },
428
+ };
429
+ const schema = openApiToSchema(doc);
430
+ expect(Object.keys(schema.endpoints)).toEqual([]);
431
+ });
432
+ });
433
+ describe('Document-level metadata extraction', () => {
434
+ it('Should extract all info metadata fields', () => {
435
+ const doc = {
436
+ openapi: '3.1.0',
437
+ info: {
438
+ title: 'Test',
439
+ version: '1.0.0',
440
+ summary: 'A test API',
441
+ termsOfService: 'https://example.com/terms',
442
+ contact: { name: 'Support', email: 'support@example.com' },
443
+ license: { name: 'MIT' },
444
+ },
445
+ };
446
+ const schema = openApiToSchema(doc);
447
+ expect(schema.metadata?.summary).toBe('A test API');
448
+ expect(schema.metadata?.termsOfService).toBe('https://example.com/terms');
449
+ expect(schema.metadata?.contact).toEqual({ name: 'Support', email: 'support@example.com' });
450
+ expect(schema.metadata?.license).toEqual({ name: 'MIT' });
451
+ });
452
+ it('Should extract servers with variables', () => {
453
+ const doc = {
454
+ openapi: '3.1.0',
455
+ info: { title: 'Test', version: '1.0.0' },
456
+ servers: [
457
+ {
458
+ url: 'https://{env}.example.com',
459
+ variables: { env: { default: 'prod', enum: ['prod', 'staging'] } },
460
+ },
461
+ ],
462
+ };
463
+ const schema = openApiToSchema(doc);
464
+ expect(schema.metadata?.servers).toHaveLength(1);
465
+ expect(schema.metadata?.servers?.[0].url).toBe('https://{env}.example.com');
466
+ expect(schema.metadata?.servers?.[0].variables?.env.default).toBe('prod');
467
+ });
468
+ it('Should extract tags', () => {
469
+ const doc = {
470
+ openapi: '3.1.0',
471
+ info: { title: 'Test', version: '1.0.0' },
472
+ tags: [
473
+ { name: 'pets', description: 'Pet operations' },
474
+ { name: 'store', externalDocs: { url: 'https://example.com/docs' } },
475
+ ],
476
+ };
477
+ const schema = openApiToSchema(doc);
478
+ expect(schema.metadata?.tags).toHaveLength(2);
479
+ expect(schema.metadata?.tags?.[0].name).toBe('pets');
480
+ });
481
+ it('Should extract externalDocs', () => {
482
+ const doc = {
483
+ openapi: '3.1.0',
484
+ info: { title: 'Test', version: '1.0.0' },
485
+ externalDocs: { url: 'https://example.com/docs', description: 'Full docs' },
486
+ };
487
+ const schema = openApiToSchema(doc);
488
+ expect(schema.metadata?.externalDocs).toEqual({ url: 'https://example.com/docs', description: 'Full docs' });
489
+ });
490
+ it('Should extract security schemes', () => {
491
+ const doc = {
492
+ openapi: '3.1.0',
493
+ info: { title: 'Test', version: '1.0.0' },
494
+ components: {
495
+ securitySchemes: {
496
+ bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
497
+ apiKey: { type: 'apiKey', in: 'header', name: 'X-API-Key' },
498
+ },
499
+ },
500
+ };
501
+ const schema = openApiToSchema(doc);
502
+ expect(schema.metadata?.securitySchemes?.bearerAuth).toEqual({
503
+ type: 'http',
504
+ scheme: 'bearer',
505
+ bearerFormat: 'JWT',
506
+ });
507
+ expect(schema.metadata?.securitySchemes?.apiKey).toBeDefined();
508
+ });
509
+ it('Should skip $ref security schemes', () => {
510
+ const doc = {
511
+ openapi: '3.1.0',
512
+ info: { title: 'Test', version: '1.0.0' },
513
+ components: {
514
+ securitySchemes: {
515
+ external: { $ref: '#/components/securitySchemes/Other' },
516
+ local: { type: 'apiKey', in: 'header', name: 'X-Key' },
517
+ },
518
+ },
519
+ };
520
+ const schema = openApiToSchema(doc);
521
+ expect(schema.metadata?.securitySchemes?.local).toBeDefined();
522
+ expect(schema.metadata?.securitySchemes?.external).toBeUndefined();
523
+ });
524
+ it('Should not set securitySchemes when all are $ref', () => {
525
+ const schemes = {
526
+ external: { $ref: '#/other' },
527
+ };
528
+ const doc = {
529
+ openapi: '3.1.0',
530
+ info: { title: 'Test', version: '1.0.0' },
531
+ components: {
532
+ securitySchemes: schemes,
533
+ },
534
+ };
535
+ const schema = openApiToSchema(doc);
536
+ expect(schema.metadata?.securitySchemes).toBeUndefined();
537
+ });
538
+ it('Should return undefined metadata when no metadata present', () => {
539
+ const doc = {
540
+ openapi: '3.1.0',
541
+ info: { title: 'Test', version: '1.0.0' },
542
+ };
543
+ const schema = openApiToSchema(doc);
544
+ expect(schema.metadata).toBeUndefined();
545
+ });
546
+ });
547
+ describe('Operation-level metadata extraction', () => {
548
+ it('Should extract tags from operations', () => {
549
+ const doc = {
550
+ openapi: '3.1.0',
551
+ info: { title: 'Test', version: '1.0.0' },
552
+ paths: {
553
+ '/pets': {
554
+ get: { tags: ['pets'], responses: { '200': { description: 'OK' } } },
555
+ },
556
+ },
557
+ };
558
+ const schema = openApiToSchema(doc);
559
+ expect(schema.endpoints.GET['/pets'].tags).toEqual(['pets']);
560
+ });
561
+ it('Should extract deprecated flag from operations', () => {
562
+ const doc = {
563
+ openapi: '3.1.0',
564
+ info: { title: 'Test', version: '1.0.0' },
565
+ paths: {
566
+ '/old': {
567
+ get: { deprecated: true, responses: { '200': { description: 'OK' } } },
568
+ },
569
+ },
570
+ };
571
+ const schema = openApiToSchema(doc);
572
+ expect(schema.endpoints.GET['/old'].deprecated).toBe(true);
573
+ });
574
+ it('Should extract summary and description from operations', () => {
575
+ const doc = {
576
+ openapi: '3.1.0',
577
+ info: { title: 'Test', version: '1.0.0' },
578
+ paths: {
579
+ '/pets': {
580
+ get: {
581
+ summary: 'List pets',
582
+ description: 'Returns all pets',
583
+ responses: { '200': { description: 'OK' } },
584
+ },
585
+ },
586
+ },
587
+ };
588
+ const schema = openApiToSchema(doc);
589
+ expect(schema.endpoints.GET['/pets'].summary).toBe('List pets');
590
+ expect(schema.endpoints.GET['/pets'].description).toBe('Returns all pets');
591
+ });
592
+ it('Should not set metadata fields when absent', () => {
593
+ const doc = {
594
+ openapi: '3.1.0',
595
+ info: { title: 'Test', version: '1.0.0' },
596
+ paths: {
597
+ '/items': {
598
+ get: { responses: { '200': { description: 'OK' } } },
599
+ },
600
+ },
601
+ };
602
+ const schema = openApiToSchema(doc);
603
+ expect(schema.endpoints.GET['/items'].tags).toBeUndefined();
604
+ expect(schema.endpoints.GET['/items'].deprecated).toBeUndefined();
605
+ expect(schema.endpoints.GET['/items'].summary).toBeUndefined();
606
+ expect(schema.endpoints.GET['/items'].description).toBeUndefined();
607
+ });
608
+ });
609
+ });
610
+ //# sourceMappingURL=openapi-to-schema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-to-schema.spec.js","sourceRoot":"","sources":["../src/openapi-to-schema.spec.ts"],"names":[],"mappings":"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"}