@@ -1428,3 +1428,330 @@ test('Regression 2.5.2', t => {
1428
1428
1429
1429
t . equal ( output , '[{"field":"parent","sub":{"field":"joined"}}]' )
1430
1430
} )
1431
+
1432
+ test ( 'Reference through multiple definitions' , ( t ) => {
1433
+ t . plan ( 2 )
1434
+
1435
+ const schema = {
1436
+ $ref : '#/definitions/A' ,
1437
+ definitions : {
1438
+ A : {
1439
+ type : 'object' ,
1440
+ additionalProperties : false ,
1441
+ properties : { a : { anyOf : [ { $ref : '#/definitions/B' } ] } } ,
1442
+ required : [ 'a' ]
1443
+ } ,
1444
+ B : {
1445
+ type : 'object' ,
1446
+ properties : { b : { anyOf : [ { $ref : '#/definitions/C' } ] } } ,
1447
+ required : [ 'b' ] ,
1448
+ additionalProperties : false
1449
+ } ,
1450
+ C : {
1451
+ type : 'object' ,
1452
+ properties : { c : { type : 'string' , const : 'd' } } ,
1453
+ required : [ 'c' ] ,
1454
+ additionalProperties : false
1455
+ }
1456
+ }
1457
+ }
1458
+
1459
+ const object = { a : { b : { c : 'd' } } }
1460
+
1461
+ const stringify = build ( schema )
1462
+ const output = stringify ( object )
1463
+
1464
+ JSON . parse ( output )
1465
+ t . pass ( )
1466
+
1467
+ t . equal ( output , JSON . stringify ( object ) )
1468
+ } )
1469
+
1470
+ test ( 'issue #350' , ( t ) => {
1471
+ t . plan ( 2 )
1472
+
1473
+ const schema = {
1474
+ title : 'Example Schema' ,
1475
+ type : 'object' ,
1476
+ properties : {
1477
+ firstName : { $ref : '#foo' } ,
1478
+ lastName : { $ref : '#foo' } ,
1479
+ nested : {
1480
+ type : 'object' ,
1481
+ properties : {
1482
+ firstName : { $ref : '#foo' } ,
1483
+ lastName : { $ref : '#foo' }
1484
+ }
1485
+ }
1486
+ } ,
1487
+ definitions : {
1488
+ foo : {
1489
+ $id : '#foo' ,
1490
+ type : 'string'
1491
+ }
1492
+ }
1493
+ }
1494
+
1495
+ const object = {
1496
+ firstName : 'Matteo' ,
1497
+ lastName : 'Collina' ,
1498
+ nested : {
1499
+ firstName : 'Matteo' ,
1500
+ lastName : 'Collina'
1501
+ }
1502
+ }
1503
+
1504
+ const stringify = build ( schema )
1505
+ const output = stringify ( object )
1506
+
1507
+ JSON . parse ( output )
1508
+ t . pass ( )
1509
+
1510
+ t . equal ( output , JSON . stringify ( object ) )
1511
+ } )
1512
+
1513
+ test ( 'deep union type' , ( t ) => {
1514
+ const stringify = build ( {
1515
+ schema : {
1516
+ type : 'array' ,
1517
+ items : {
1518
+ oneOf : [
1519
+ {
1520
+ $ref : 'components#/schemas/IDirectory'
1521
+ } ,
1522
+ {
1523
+ $ref : 'components#/schemas/IImageFile'
1524
+ } ,
1525
+ {
1526
+ $ref : 'components#/schemas/ITextFile'
1527
+ } ,
1528
+ {
1529
+ $ref : 'components#/schemas/IZipFile'
1530
+ }
1531
+ ]
1532
+ } ,
1533
+ nullable : false
1534
+ } ,
1535
+ components : {
1536
+ schemas : {
1537
+ IDirectory : {
1538
+ $id : 'IDirectory' ,
1539
+ $recursiveAnchor : true ,
1540
+ type : 'object' ,
1541
+ properties : {
1542
+ children : {
1543
+ type : 'array' ,
1544
+ items : {
1545
+ oneOf : [
1546
+ {
1547
+ $recursiveRef : '#'
1548
+ } ,
1549
+ {
1550
+ $ref : 'components#/schemas/IImageFile'
1551
+ } ,
1552
+ {
1553
+ $ref : 'components#/schemas/ITextFile'
1554
+ } ,
1555
+ {
1556
+ $ref : 'components#/schemas/IZipFile'
1557
+ }
1558
+ ]
1559
+ } ,
1560
+ nullable : false
1561
+ } ,
1562
+ type : {
1563
+ type : 'string' ,
1564
+ nullable : false
1565
+ } ,
1566
+ id : {
1567
+ type : 'string' ,
1568
+ nullable : false
1569
+ } ,
1570
+ name : {
1571
+ type : 'string' ,
1572
+ nullable : false
1573
+ }
1574
+ } ,
1575
+ nullable : false ,
1576
+ required : [
1577
+ 'children' ,
1578
+ 'type' ,
1579
+ 'id' ,
1580
+ 'name'
1581
+ ]
1582
+ }
10000
,
1583
+ IImageFile : {
1584
+ $id : 'IImageFile' ,
1585
+ type : 'object' ,
1586
+ properties : {
1587
+ width : {
1588
+ type : 'number' ,
1589
+ nullable : false
1590
+ } ,
1591
+ height : {
1592
+ type : 'number' ,
1593
+ nullable : false
1594
+ } ,
1595
+ url : {
1596
+ type : 'string' ,
1597
+ nullable : false
1598
+ } ,
1599
+ extension : {
1600
+ type : 'string' ,
1601
+ nullable : false
1602
+ } ,
1603
+ size : {
1604
+ type : 'number' ,
1605
+ nullable : false
1606
+ } ,
1607
+ type : {
1608
+ type : 'string' ,
1609
+ nullable : false
1610
+ } ,
1611
+ id : {
1612
+ type : 'string' ,
1613
+ nullable : false
1614
+ } ,
1615
+ name : {
1616
+ type : 'string' ,
1617
+ nullable : false
1618
+ }
1619
+ } ,
1620
+ nullable : false ,
1621
+ required : [
1622
+ 'width' ,
1623
+ 'height' ,
1624
+ 'url' ,
1625
+ 'extension' ,
1626
+ 'size' ,
1627
+ 'type' ,
1628
+ 'id' ,
1629
+ 'name'
1630
+ ]
1631
+ } ,
1632
+ ITextFile : {
1633
+ $id : 'ITextFile' ,
1634
+ type : 'object' ,
1635
+ properties : {
1636
+ content : {
1637
+ type : 'string' ,
1638
+ nullable : false
1639
+ } ,
1640
+ extension : {
1641
+ type : 'string' ,
1642
+ nullable : false
1643
+ } ,
1644
+ size : {
1645
+ type : 'number' ,
1646
+ nullable : false
1647
+ } ,
1648
+ type : {
1649
+ type : 'string' ,
1650
+ nullable : false
1651
+ } ,
1652
+ id : {
1653
+ type : 'string' ,
1654
+ nullable : false
1655
+ } ,
1656
+ name : {
1657
+ type : 'string' ,
1658
+ nullable : false
1659
+ }
1660
+ } ,
1661
+ nullable : false ,
1662
+ required : [
1663
+ 'content' ,
1664
+ 'extension' ,
1665
+ 'size' ,
1666
+ 'type' ,
1667
+ 'id' ,
1668
+ 'name'
1669
+ ]
1670
+ } ,
1671
+ IZipFile : {
1672
+ $id : 'IZipFile' ,
1673
+ type : 'object' ,
1674
+ properties : {
1675
+ files : {
1676
+ type : 'number' ,
1677
+ nullable : false
1678
+ } ,
1679
+ extension : {
1680
+ type : 'string' ,
1681
+ nullable : false
1682
+ } ,
1683
+ size : {
1684
+ type : 'number' ,
1685
+ nullable : false
1686
+ } ,
1687
+ type : {
1688
+ type : 'string' ,
1689
+ nullable : false
1690
+ } ,
1691
+ id : {
1692
+ type : 'string' ,
1693
+ nullable : false
1694
+ } ,
1695
+ name : {
1696
+ type : 'string' ,
1697
+ nullable : false
1698
+ }
1699
+ } ,
1700
+ nullable : false ,
1701
+ required : [
1702
+ 'files' ,
1703
+ 'extension' ,
1704
+ 'size' ,
1705
+ 'type' ,
1706
+ 'id' ,
1707
+ 'name'
1708
+ ]
1709
+ }
1710
+ }
1711
+ }
1712
+ } )
1713
+
1714
+ const obj = [
1715
+ {
1716
+ type : 'directory' ,
1717
+ id : '7b1068a4-dd6e-474a-8d85-09a2d77639cb' ,
1718
+ name : 'ixcWGOKI' ,
1719
+ children : [
1720
+ {
1721
+ type : 'directory' ,
1722
+ id : '5883e17c-b207-46d4-ad2d-be72249711ce' ,
1723
+ name : 'vecQwFGS' ,
1724
+ children : [ ]
1725
+ } ,
1726
+ {
1727
+ type : 'file' ,
1728
+ id : '670b6556-a610-4a48-8a16-9c2da97a0d18' ,
1729
+ name : 'eStFddzX' ,
1730
+ extension : 'jpg' ,
1731
+ size : 7 ,
1732
+ width : 300 ,
1733
+ height : 1200 ,
1734
+ url : 'https://github.com/samchon/typescript-json'
1735
+ } ,
1736
+ {
1737
+ type : 'file' ,
1738
+ id : '85dc796d-9593-4833-b1a1-addc8ebf74ea' ,
1739
+ name : 'kTdUfwRJ' ,
1740
+ extension : 'ts' ,
1741
+ size : 86 ,
1742
+ content : 'console.log("Hello world");'
1743
+ } ,
1744
+ {
1745
+ type : 'file' ,
1746
+ id : '8933c86a-7a1e-4d4a-b0a6-17d6896fdf89' ,
1747
+ name : 'NBPkefUG' ,
1748
+ extension : 'zip' ,
1749
+ size : 22 ,
1750
+ files : 20
1751
+ }
1752
+ ]
1753
+ }
1754
+ ]
1755
+ t . equal ( JSON . stringify ( obj ) , stringify ( obj ) )
1756
+ t . autoend ( )
1757
+ } )
0 commit comments