@redocly/openapi-core 1.0.0-beta.116 → 1.0.0-beta.118

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 (49) hide show
  1. package/lib/bundle.d.ts +1 -1
  2. package/lib/config/config-resolvers.js +13 -8
  3. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  4. package/lib/decorators/common/media-type-examples-override.js +53 -0
  5. package/lib/decorators/oas3/index.d.ts +1 -0
  6. package/lib/decorators/oas3/index.js +2 -0
  7. package/lib/index.d.ts +2 -2
  8. package/lib/index.js +3 -1
  9. package/lib/resolve.js +3 -0
  10. package/lib/rules/common/assertions/asserts.js +10 -2
  11. package/lib/rules/common/assertions/utils.js +12 -6
  12. package/lib/rules/common/spec.js +7 -4
  13. package/lib/rules/oas3/spec-components-invalid-map-name.js +26 -5
  14. package/lib/types/index.d.ts +1 -0
  15. package/lib/types/index.js +7 -1
  16. package/lib/types/oas2.js +16 -11
  17. package/lib/types/oas3.js +28 -11
  18. package/lib/types/oas3_1.js +6 -0
  19. package/lib/types/redocly-yaml.js +1 -0
  20. package/lib/utils.d.ts +1 -0
  21. package/lib/utils.js +6 -1
  22. package/lib/visitors.d.ts +3 -1
  23. package/lib/visitors.js +4 -0
  24. package/lib/walk.js +8 -0
  25. package/package.json +1 -1
  26. package/src/__tests__/__snapshots__/bundle.test.ts.snap +10 -0
  27. package/src/config/config-resolvers.ts +12 -8
  28. package/src/decorators/__tests__/media-type-examples-override.test.ts +665 -0
  29. package/src/decorators/__tests__/resources/request.yaml +3 -0
  30. package/src/decorators/__tests__/resources/response.yaml +3 -0
  31. package/src/decorators/common/media-type-examples-override.ts +79 -0
  32. package/src/decorators/oas3/index.ts +2 -0
  33. package/src/index.ts +2 -1
  34. package/src/resolve.ts +4 -1
  35. package/src/rules/common/assertions/__tests__/asserts.test.ts +89 -19
  36. package/src/rules/common/assertions/asserts.ts +10 -1
  37. package/src/rules/common/assertions/utils.ts +15 -6
  38. package/src/rules/common/spec.ts +8 -5
  39. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +88 -0
  40. package/src/rules/oas3/spec-components-invalid-map-name.ts +26 -5
  41. package/src/types/index.ts +9 -0
  42. package/src/types/oas2.ts +16 -12
  43. package/src/types/oas3.ts +28 -12
  44. package/src/types/oas3_1.ts +6 -0
  45. package/src/types/redocly-yaml.ts +1 -0
  46. package/src/utils.ts +5 -0
  47. package/src/visitors.ts +7 -1
  48. package/src/walk.ts +15 -1
  49. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,665 @@
1
+ import { makeConfig, parseYamlToDocument, yamlSerializer } from '../../../__tests__/utils';
2
+ import { outdent } from 'outdent';
3
+ import { bundleDocument } from '../../bundle';
4
+ import { BaseResolver } from '../../resolve';
5
+
6
+ describe('oas3 media-type-examples-override', () => {
7
+ expect.addSnapshotSerializer(yamlSerializer);
8
+ it('should override response example', async () => {
9
+ const testDocument = parseYamlToDocument(
10
+ outdent`
11
+ openapi: 3.0.0
12
+ paths:
13
+ /pet:
14
+ get:
15
+ operationId: getUserById
16
+ responses:
17
+ 200:
18
+ description: json
19
+ content:
20
+ application/json:
21
+ examples:
22
+ def:
23
+ value:
24
+ a: test
25
+
26
+ `
27
+ );
28
+ const { bundle: res } = await bundleDocument({
29
+ document: testDocument,
30
+ externalRefResolver: new BaseResolver(),
31
+ config: await makeConfig(
32
+ {},
33
+ {
34
+ 'media-type-examples-override': {
35
+ operationIds: {
36
+ getUserById: {
37
+ responses: {
38
+ '200': {
39
+ 'application/json':
40
+ 'packages/core/src/decorators/__tests__/resources/request.yaml',
41
+ },
42
+ },
43
+ },
44
+ },
45
+ },
46
+ }
47
+ ),
48
+ });
49
+
50
+ expect(res.parsed).toMatchInlineSnapshot(`
51
+ openapi: 3.0.0
52
+ paths:
53
+ /pet:
54
+ get:
55
+ operationId: getUserById
56
+ responses:
57
+ '200':
58
+ description: json
59
+ content:
60
+ application/json:
61
+ examples:
62
+ def:
63
+ value:
64
+ b: from external file
65
+ components: {}
66
+
67
+ `);
68
+ });
69
+
70
+ it('should override requestBody examples', async () => {
71
+ const testDocument = parseYamlToDocument(
72
+ outdent`
73
+ openapi: 3.0.0
74
+ paths:
75
+ /pet:
76
+ get:
77
+ operationId: getUserById
78
+ requestBody:
79
+ content:
80
+ application/json:
81
+ examples:
82
+ def:
83
+ value:
84
+ a: test123
85
+
86
+ `
87
+ );
88
+ const { bundle: res } = await bundleDocument({
89
+ document: testDocument,
90
+ externalRefResolver: new BaseResolver(),
91
+ config: await makeConfig(
92
+ {},
93
+ {
94
+ 'media-type-examples-override': {
95
+ operationIds: {
96
+ getUserById: {
97
+ request: {
98
+ 'application/json':
99
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
100
+ },
101
+ },
102
+ },
103
+ },
104
+ }
105
+ ),
106
+ });
107
+
108
+ expect(res.parsed).toMatchInlineSnapshot(`
109
+ openapi: 3.0.0
110
+ paths:
111
+ /pet:
112
+ get:
113
+ operationId: getUserById
114
+ requestBody:
115
+ content:
116
+ application/json:
117
+ examples:
118
+ def:
119
+ value:
120
+ name: test response name
121
+ components: {}
122
+
123
+ `);
124
+ });
125
+
126
+ it('should override requestBody examples and 200 response', async () => {
127
+ const testDocument = parseYamlToDocument(
128
+ outdent`
129
+ openapi: 3.0.0
130
+ paths:
131
+ /pet:
132
+ get:
133
+ operationId: getUserById
134
+ responses:
135
+ '200':
136
+ description: json
137
+ content:
138
+ application/json:
139
+ examples:
140
+ def:
141
+ value:
142
+ message: test
143
+ requestBody:
144
+ content:
145
+ application/json:
146
+ examples:
147
+ def:
148
+ value:
149
+ a: test123
150
+
151
+ `
152
+ );
153
+ const { bundle: res } = await bundleDocument({
154
+ document: testDocument,
155
+ externalRefResolver: new BaseResolver(),
156
+ config: await makeConfig(
157
+ {},
158
+ {
159
+ 'media-type-examples-override': {
160
+ operationIds: {
161
+ getUserById: {
162
+ request: {
163
+ 'application/json':
164
+ 'packages/core/src/decorators/__tests__/resources/request.yaml',
165
+ },
166
+ responses: {
167
+ '200': {
168
+ 'application/json':
169
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
170
+ },
171
+ '201': {
172
+ 'application/json':
173
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
174
+ },
175
+ },
176
+ },
177
+ },
178
+ },
179
+ }
180
+ ),
181
+ });
182
+
183
+ expect(res.parsed).toMatchInlineSnapshot(`
184
+ openapi: 3.0.0
185
+ paths:
186
+ /pet:
187
+ get:
188
+ operationId: getUserById
189
+ responses:
190
+ '200':
191
+ description: json
192
+ content:
193
+ application/json:
194
+ examples:
195
+ def:
196
+ value:
197
+ name: test response name
198
+ requestBody:
199
+ content:
200
+ application/json:
201
+ examples:
202
+ def:
203
+ value:
204
+ b: from external file
205
+ components: {}
206
+
207
+ `);
208
+ });
209
+
210
+ it('should override response and request examples with refs', async () => {
211
+ const testDocument = parseYamlToDocument(
212
+ outdent`
213
+ openapi: 3.0.0
214
+ paths:
215
+ /pet:
216
+ get:
217
+ operationId: getUserById
218
+ responses:
219
+ '200':
220
+ $ref: '#/components/responses/okay200'
221
+ requestBody:
222
+ $ref: '#/components/requestBodies/testRequest'
223
+ components:
224
+ requestBodies:
225
+ testRequest:
226
+ content:
227
+ application/json:
228
+ examples:
229
+ def:
230
+ value:
231
+ a: test123
232
+ responses:
233
+ okay200:
234
+ description: json
235
+ content:
236
+ application/json:
237
+ examples:
238
+ def:
239
+ value:
240
+ a: t
241
+ b: 3
242
+ `
243
+ );
244
+
245
+ const { bundle: res } = await bundleDocument({
246
+ document: testDocument,
247
+ externalRefResolver: new BaseResolver(),
248
+ config: await makeConfig(
249
+ {},
250
+ {
251
+ 'media-type-examples-override': {
252
+ operationIds: {
253
+ getUserById: {
254
+ request: {
255
+ 'application/json':
256
+ 'packages/core/src/decorators/__tests__/resources/request.yaml',
257
+ },
258
+ responses: {
259
+ '200': {
260
+ 'application/json':
261
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
262
+ },
263
+ },
264
+ },
265
+ },
266
+ },
267
+ }
268
+ ),
269
+ });
270
+
271
+ expect(res.parsed).toMatchInlineSnapshot(`
272
+ openapi: 3.0.0
273
+ paths:
274
+ /pet:
275
+ get:
276
+ operationId: getUserById
277
+ responses:
278
+ '200':
279
+ description: json
280
+ content:
281
+ application/json:
282
+ examples:
283
+ def:
284
+ value:
285
+ name: test response name
286
+ requestBody:
287
+ content:
288
+ application/json:
289
+ examples:
290
+ def:
291
+ value:
292
+ b: from external file
293
+ components:
294
+ requestBodies:
295
+ testRequest:
296
+ content:
297
+ application/json:
298
+ examples:
299
+ def:
300
+ value:
301
+ a: test123
302
+ responses:
303
+ okay200:
304
+ description: json
305
+ content:
306
+ application/json:
307
+ examples:
308
+ def:
309
+ value:
310
+ a: t
311
+ b: 3
312
+
313
+ `);
314
+ });
315
+
316
+ it('should override examples with ref', async () => {
317
+ const testDocument = parseYamlToDocument(
318
+ outdent`
319
+ openapi: 3.0.0
320
+ paths:
321
+ /pet:
322
+ get:
323
+ operationId: getUserById
324
+ responses:
325
+ '400':
326
+ description: bad request
327
+ content:
328
+ application/json:
329
+ examples:
330
+ $ref: '#/components/examples/testExample'
331
+ requestBody:
332
+ content:
333
+ application/json:
334
+ examples:
335
+ obj:
336
+ $ref: '#/components/examples/testExample'
337
+ components:
338
+ examples:
339
+ testExample:
340
+ value:
341
+ test: 1
342
+ `
343
+ );
344
+
345
+ const { bundle: res } = await bundleDocument({
346
+ document: testDocument,
347
+ externalRefResolver: new BaseResolver(),
348
+ config: await makeConfig(
349
+ {},
350
+ {
351
+ 'media-type-examples-override': {
352
+ operationIds: {
353
+ getUserById: {
354
+ request: {
355
+ 'application/json':
356
+ 'packages/core/src/decorators/__tests__/resources/request.yaml',
357
+ },
358
+ responses: {
359
+ '400': {
360
+ 'application/json':
361
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
362
+ },
363
+ },
364
+ },
365
+ },
366
+ },
367
+ }
368
+ ),
369
+ });
370
+
371
+ expect(res.parsed).toMatchInlineSnapshot(`
372
+ openapi: 3.0.0
373
+ paths:
374
+ /pet:
375
+ get:
376
+ operationId: getUserById
377
+ responses:
378
+ '400':
379
+ description: bad request
380
+ content:
381
+ application/json:
382
+ examples:
383
+ def:
384
+ value:
385
+ name: test response name
386
+ requestBody:
387
+ content:
388
+ application/json:
389
+ examples:
390
+ def:
391
+ value:
392
+ b: from external file
393
+ components:
394
+ examples:
395
+ testExample:
396
+ value:
397
+ test: 1
398
+
399
+ `);
400
+ });
401
+
402
+ it('should add the examples to response and request', async () => {
403
+ const testDocument = parseYamlToDocument(
404
+ outdent`
405
+ openapi: 3.0.0
406
+ paths:
407
+ /pet:
408
+ get:
409
+ operationId: getUserById
410
+ requestBody:
411
+ description: empty body
412
+ responses:
413
+ '200':
414
+ description: json
415
+ `
416
+ );
417
+ const { bundle: res } = await bundleDocument({
418
+ document: testDocument,
419
+ externalRefResolver: new BaseResolver(),
420
+ config: await makeConfig(
421
+ {},
422
+ {
423
+ 'media-type-examples-override': {
424
+ operationIds: {
425
+ getUserById: {
426
+ request: {
427
+ 'application/json':
428
+ 'packages/core/src/decorators/__tests__/resources/request.yaml',
429
+ },
430
+ responses: {
431
+ '200': {
432
+ 'application/json':
433
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
434
+ },
435
+ },
436
+ },
437
+ },
438
+ },
439
+ }
440
+ ),
441
+ });
442
+
443
+ expect(res.parsed).toMatchInlineSnapshot(`
444
+ openapi: 3.0.0
445
+ paths:
446
+ /pet:
447
+ get:
448
+ operationId: getUserById
449
+ requestBody:
450
+ description: empty body
451
+ content:
452
+ application/json:
453
+ examples:
454
+ def:
455
+ value:
456
+ b: from external file
457
+ responses:
458
+ '200':
459
+ description: json
460
+ content:
461
+ application/json:
462
+ examples:
463
+ def:
464
+ value:
465
+ name: test response name
466
+ components: {}
467
+
468
+ `);
469
+ });
470
+
471
+ it('should add examples to response', async () => {
472
+ const testDocument = parseYamlToDocument(
473
+ outdent`
474
+ openapi: 3.0.0
475
+ paths:
476
+ /pet:
477
+ get:
478
+ operationId: getUserById
479
+ responses:
480
+ '200':
481
+ description: json
482
+ content:
483
+ application/json:
484
+ schema:
485
+ $ref: "#/components/schemas/Pet"
486
+ ,
487
+ `
488
+ );
489
+ const { bundle: res } = await bundleDocument({
490
+ document: testDocument,
491
+ externalRefResolver: new BaseResolver(),
492
+ config: await makeConfig(
493
+ {},
494
+ {
495
+ 'media-type-examples-override': {
496
+ operationIds: {
497
+ getUserById: {
498
+ responses: {
499
+ '200': {
500
+ 'application/json':
501
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
502
+ },
503
+ },
504
+ },
505
+ },
506
+ },
507
+ }
508
+ ),
509
+ });
510
+
511
+ expect(res.parsed).toMatchInlineSnapshot(`
512
+ openapi: 3.0.0
513
+ paths:
514
+ /pet:
515
+ get:
516
+ operationId: getUserById
517
+ responses:
518
+ '200':
519
+ description: json
520
+ content:
521
+ application/json:
522
+ schema:
523
+ $ref: '#/components/schemas/Pet'
524
+ examples:
525
+ def:
526
+ value:
527
+ name: test response name
528
+ components: {}
529
+
530
+ `);
531
+ });
532
+
533
+ it('should add examples to requestBody', async () => {
534
+ const testDocument = parseYamlToDocument(
535
+ outdent`
536
+ openapi: 3.0.0
537
+ paths:
538
+ /pet:
539
+ get:
540
+ operationId: getUserById
541
+ requestBody:
542
+ content:
543
+ application/json:
544
+ schema:
545
+ $ref: "#/components/schemas/Pet"
546
+
547
+ ,
548
+ `
549
+ );
550
+ const { bundle: res } = await bundleDocument({
551
+ document: testDocument,
552
+ externalRefResolver: new BaseResolver(),
553
+ config: await makeConfig(
554
+ {},
555
+ {
556
+ 'media-type-examples-override': {
557
+ operationIds: {
558
+ getUserById: {
559
+ request: {
560
+ 'application/json':
561
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
562
+ 'application/xml':
563
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
564
+ },
565
+ },
566
+ },
567
+ },
568
+ }
569
+ ),
570
+ });
571
+
572
+ expect(res.parsed).toMatchInlineSnapshot(`
573
+ openapi: 3.0.0
574
+ paths:
575
+ /pet:
576
+ get:
577
+ operationId: getUserById
578
+ requestBody:
579
+ content:
580
+ application/json:
581
+ schema:
582
+ $ref: '#/components/schemas/Pet'
583
+ examples:
584
+ def:
585
+ value:
586
+ name: test response name
587
+ application/xml:
588
+ examples:
589
+ def:
590
+ value:
591
+ name: test response name
592
+ components: {}
593
+
594
+ `);
595
+ });
596
+
597
+ it('should add new examples with new content type to response', async () => {
598
+ const testDocument = parseYamlToDocument(
599
+ outdent`
600
+ openapi: 3.0.0
601
+ paths:
602
+ /pet:
603
+ get:
604
+ operationId: getUserById
605
+ requestBody:
606
+ description: empty body
607
+ responses:
608
+ '200':
609
+ description: json
610
+ content:
611
+ examples:
612
+ application/json:
613
+ value:
614
+ name: json type
615
+ `
616
+ );
617
+
618
+ const { bundle: res } = await bundleDocument({
619
+ document: testDocument,
620
+ externalRefResolver: new BaseResolver(),
621
+ config: await makeConfig(
622
+ {},
623
+ {
624
+ 'media-type-examples-override': {
625
+ operationIds: {
626
+ getUserById: {
627
+ responses: {
628
+ '200': {
629
+ 'application/xml':
630
+ 'packages/core/src/decorators/__tests__/resources/response.yaml',
631
+ },
632
+ },
633
+ },
634
+ },
635
+ },
636
+ }
637
+ ),
638
+ });
639
+
640
+ expect(res.parsed).toMatchInlineSnapshot(`
641
+ openapi: 3.0.0
642
+ paths:
643
+ /pet:
644
+ get:
645
+ operationId: getUserById
646
+ requestBody:
647
+ description: empty body
648
+ responses:
649
+ '200':
650
+ description: json
651
+ content:
652
+ examples:
653
+ application/json:
654
+ value:
655
+ name: json type
656
+ application/xml:
657
+ examples:
658
+ def:
659
+ value:
660
+ name: test response name
661
+ components: {}
662
+
663
+ `);
664
+ });
665
+ });
@@ -0,0 +1,3 @@
1
+ def:
2
+ value:
3
+ b: from external file
@@ -0,0 +1,3 @@
1
+ def:
2
+ value:
3
+ name: test response name