@pdtf/schemas 3.6.0-dev.3 → 3.6.0-dev.4

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 (263) hide show
  1. package/charming-napier-57a77c/LICENSE +21 -0
  2. package/charming-napier-57a77c/README.md +430 -0
  3. package/charming-napier-57a77c/docs/sef25-extensions-ui-spec.md +355 -0
  4. package/charming-napier-57a77c/index.js +654 -0
  5. package/charming-napier-57a77c/package-lock.json +7297 -0
  6. package/charming-napier-57a77c/package.json +41 -0
  7. package/charming-napier-57a77c/src/examples/v1/exampleAddParticipantVouch.json +32 -0
  8. package/charming-napier-57a77c/src/examples/v1/exampleDocumentedVouch.json +40 -0
  9. package/charming-napier-57a77c/src/examples/v1/exampleElectronicRecord.json +30 -0
  10. package/charming-napier-57a77c/src/examples/v1/exampleTransaction.json +878 -0
  11. package/charming-napier-57a77c/src/examples/v1/exampleVouch.json +25 -0
  12. package/charming-napier-57a77c/src/examples/v2/exampleTransaction.json +901 -0
  13. package/charming-napier-57a77c/src/examples/v3/exampleAddParticipantVouch.json +38 -0
  14. package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay.json +55 -0
  15. package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay2.json +93 -0
  16. package/charming-napier-57a77c/src/examples/v3/exampleDocumentedVouch.json +47 -0
  17. package/charming-napier-57a77c/src/examples/v3/exampleElectronicRecord.json +36 -0
  18. package/charming-napier-57a77c/src/examples/v3/exampleTransaction.json +1038 -0
  19. package/charming-napier-57a77c/src/examples/v3/exampleVouch.json +32 -0
  20. package/charming-napier-57a77c/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
  21. package/charming-napier-57a77c/src/mappings/adf.js +198 -0
  22. package/charming-napier-57a77c/src/schemas/v1/GeoJSON.json +1279 -0
  23. package/charming-napier-57a77c/src/schemas/v1/baspiNotes.html +102 -0
  24. package/charming-napier-57a77c/src/schemas/v1/energy-performance-certificate.json +124 -0
  25. package/charming-napier-57a77c/src/schemas/v1/freehold-information.json +2051 -0
  26. package/charming-napier-57a77c/src/schemas/v1/leasehold-information.json +2064 -0
  27. package/charming-napier-57a77c/src/schemas/v1/legal-information.json +1045 -0
  28. package/charming-napier-57a77c/src/schemas/v1/material-facts.json +2109 -0
  29. package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
  30. package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction.json +191 -0
  31. package/charming-napier-57a77c/src/schemas/v1/searches/drainage-and-water.json +261 -0
  32. package/charming-napier-57a77c/src/schemas/v1/searches/local-land-charges.json +69 -0
  33. package/charming-napier-57a77c/src/schemas/v1/searches/local-searches-required.json +857 -0
  34. package/charming-napier-57a77c/src/schemas/v1/searches.json +237 -0
  35. package/charming-napier-57a77c/src/schemas/v1/title-deed.json +841 -0
  36. package/charming-napier-57a77c/src/schemas/v2/baspiNotes.html +102 -0
  37. package/charming-napier-57a77c/src/schemas/v2/combined.json +37731 -0
  38. package/charming-napier-57a77c/src/schemas/v2/overlays/baspi.json +8132 -0
  39. package/charming-napier-57a77c/src/schemas/v2/overlays/con29DW.json +705 -0
  40. package/charming-napier-57a77c/src/schemas/v2/overlays/con29R.json +2956 -0
  41. package/charming-napier-57a77c/src/schemas/v2/overlays/fme1.json +1259 -0
  42. package/charming-napier-57a77c/src/schemas/v2/overlays/llc1.json +25 -0
  43. package/charming-napier-57a77c/src/schemas/v2/overlays/lpe1.json +2171 -0
  44. package/charming-napier-57a77c/src/schemas/v2/overlays/nts.json +326 -0
  45. package/charming-napier-57a77c/src/schemas/v2/overlays/oc1.json +2799 -0
  46. package/charming-napier-57a77c/src/schemas/v2/overlays/piq.json +3419 -0
  47. package/charming-napier-57a77c/src/schemas/v2/overlays/rds.json +3736 -0
  48. package/charming-napier-57a77c/src/schemas/v2/overlays/ta10.json +5306 -0
  49. package/charming-napier-57a77c/src/schemas/v2/overlays/ta6.json +4533 -0
  50. package/charming-napier-57a77c/src/schemas/v2/overlays/ta7.json +1045 -0
  51. package/charming-napier-57a77c/src/schemas/v2/pdtf-transaction.json +34351 -0
  52. package/charming-napier-57a77c/src/schemas/v2/skeleton.json +3973 -0
  53. package/charming-napier-57a77c/src/schemas/v3/combined.json +48153 -0
  54. package/charming-napier-57a77c/src/schemas/v3/compactSkeleton.txt +4457 -0
  55. package/charming-napier-57a77c/src/schemas/v3/overlays/README.md +299 -0
  56. package/charming-napier-57a77c/src/schemas/v3/overlays/baspi4.json +8027 -0
  57. package/charming-napier-57a77c/src/schemas/v3/overlays/baspi5.json +8177 -0
  58. package/charming-napier-57a77c/src/schemas/v3/overlays/con29DW.json +716 -0
  59. package/charming-napier-57a77c/src/schemas/v3/overlays/con29R.json +2981 -0
  60. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ac.json +333 -0
  61. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/as.json +74 -0
  62. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dk.json +32 -0
  63. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dr.json +73 -0
  64. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/er.json +85 -0
  65. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/fd.json +75 -0
  66. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hi.json +51 -0
  67. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hs.json +73 -0
  68. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ic.json +59 -0
  69. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/jk.json +96 -0
  70. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/la.json +85 -0
  71. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/lc.json +75 -0
  72. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ma.json +90 -0
  73. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mc.json +38 -0
  74. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mi.json +69 -0
  75. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/nd.json +43 -0
  76. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oa.json +24 -0
  77. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oc.json +57 -0
  78. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/pc.json +37 -0
  79. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ph.json +194 -0
  80. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/rw.json +68 -0
  81. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sb.json +73 -0
  82. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sc.json +129 -0
  83. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sd.json +63 -0
  84. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sf.json +74 -0
  85. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sl.json +68 -0
  86. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ta.json +240 -0
  87. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tf.json +103 -0
  88. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tr.json +73 -0
  89. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/wg.json +350 -0
  90. package/charming-napier-57a77c/src/schemas/v3/overlays/fme1.json +1266 -0
  91. package/charming-napier-57a77c/src/schemas/v3/overlays/llc1.json +25 -0
  92. package/charming-napier-57a77c/src/schemas/v3/overlays/lpe1.json +2199 -0
  93. package/charming-napier-57a77c/src/schemas/v3/overlays/nts.json +2157 -0
  94. package/charming-napier-57a77c/src/schemas/v3/overlays/nts2.json +2742 -0
  95. package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl.json +1813 -0
  96. package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl2.json +2217 -0
  97. package/charming-napier-57a77c/src/schemas/v3/overlays/oc1.json +2817 -0
  98. package/charming-napier-57a77c/src/schemas/v3/overlays/piq.json +3321 -0
  99. package/charming-napier-57a77c/src/schemas/v3/overlays/rds.json +3665 -0
  100. package/charming-napier-57a77c/src/schemas/v3/overlays/sef25.json +1639 -0
  101. package/charming-napier-57a77c/src/schemas/v3/overlays/sr24.json +38 -0
  102. package/charming-napier-57a77c/src/schemas/v3/overlays/ta10.json +4654 -0
  103. package/charming-napier-57a77c/src/schemas/v3/overlays/ta6.json +4568 -0
  104. package/charming-napier-57a77c/src/schemas/v3/overlays/ta6ed6.json +6537 -0
  105. package/charming-napier-57a77c/src/schemas/v3/overlays/ta7.json +1537 -0
  106. package/charming-napier-57a77c/src/schemas/v3/overlays/ta7ed5.json +1551 -0
  107. package/charming-napier-57a77c/src/schemas/v3/pdtf-transaction.json +41229 -0
  108. package/charming-napier-57a77c/src/schemas/v3/skeleton.json +5703 -0
  109. package/charming-napier-57a77c/src/schemas/verifiedClaims/README.md +21 -0
  110. package/charming-napier-57a77c/src/schemas/verifiedClaims/pdtf-verified-claims.json +447 -0
  111. package/charming-napier-57a77c/src/tests/v3/buyerCircumstances.test.js +543 -0
  112. package/charming-napier-57a77c/src/tests/v3/caching.test.js +591 -0
  113. package/charming-napier-57a77c/src/tests/v3/enquiries.test.js +1096 -0
  114. package/charming-napier-57a77c/src/tests/v3/extensionOverlays.test.js +1599 -0
  115. package/charming-napier-57a77c/src/tests/v3/offers.test.js +823 -0
  116. package/charming-napier-57a77c/src/tests/v3/patternProperties.test.js +688 -0
  117. package/charming-napier-57a77c/src/tests/v3/ta6ed6.test.js +2374 -0
  118. package/charming-napier-57a77c/src/tests/v3/ta7ed5.test.js +600 -0
  119. package/charming-napier-57a77c/src/tests/v3/transactionSchema.test.js +646 -0
  120. package/charming-napier-57a77c/src/tests/v3/verifiedClaimsValidator.test.js +195 -0
  121. package/charming-napier-57a77c/src/utils/compactSkeleton.js +84 -0
  122. package/charming-napier-57a77c/src/utils/countTokens.js +67 -0
  123. package/charming-napier-57a77c/src/utils/extractExtensionOverlays.js +624 -0
  124. package/charming-napier-57a77c/src/utils/extractOverlay.js +381 -0
  125. package/charming-napier-57a77c/src/utils/extractProperties.js +44 -0
  126. package/charming-napier-57a77c/src/utils/listPathTitles.js +36 -0
  127. package/charming-napier-57a77c/src/utils/minimalSkeleton.js +85 -0
  128. package/charming-napier-57a77c/src/utils/pathList.csv +903 -0
  129. package/charming-napier-57a77c/src/utils/pathSkeleton.js +181 -0
  130. package/keen-dewdney-6ae15b/LICENSE +21 -0
  131. package/keen-dewdney-6ae15b/README.md +334 -0
  132. package/keen-dewdney-6ae15b/index.js +557 -0
  133. package/keen-dewdney-6ae15b/package-lock.json +7296 -0
  134. package/keen-dewdney-6ae15b/package.json +39 -0
  135. package/keen-dewdney-6ae15b/src/examples/v1/exampleAddParticipantVouch.json +32 -0
  136. package/keen-dewdney-6ae15b/src/examples/v1/exampleDocumentedVouch.json +40 -0
  137. package/keen-dewdney-6ae15b/src/examples/v1/exampleElectronicRecord.json +30 -0
  138. package/keen-dewdney-6ae15b/src/examples/v1/exampleTransaction.json +878 -0
  139. package/keen-dewdney-6ae15b/src/examples/v1/exampleVouch.json +25 -0
  140. package/keen-dewdney-6ae15b/src/examples/v2/exampleTransaction.json +901 -0
  141. package/keen-dewdney-6ae15b/src/examples/v3/exampleAddParticipantVouch.json +35 -0
  142. package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay.json +55 -0
  143. package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay2.json +93 -0
  144. package/keen-dewdney-6ae15b/src/examples/v3/exampleDocumentedVouch.json +44 -0
  145. package/keen-dewdney-6ae15b/src/examples/v3/exampleElectronicRecord.json +33 -0
  146. package/keen-dewdney-6ae15b/src/examples/v3/exampleTransaction.json +1034 -0
  147. package/keen-dewdney-6ae15b/src/examples/v3/exampleVouch.json +29 -0
  148. package/keen-dewdney-6ae15b/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
  149. package/keen-dewdney-6ae15b/src/mappings/adf.js +198 -0
  150. package/keen-dewdney-6ae15b/src/schemas/v1/GeoJSON.json +1279 -0
  151. package/keen-dewdney-6ae15b/src/schemas/v1/baspiNotes.html +102 -0
  152. package/keen-dewdney-6ae15b/src/schemas/v1/energy-performance-certificate.json +124 -0
  153. package/keen-dewdney-6ae15b/src/schemas/v1/freehold-information.json +2051 -0
  154. package/keen-dewdney-6ae15b/src/schemas/v1/leasehold-information.json +2064 -0
  155. package/keen-dewdney-6ae15b/src/schemas/v1/legal-information.json +1045 -0
  156. package/keen-dewdney-6ae15b/src/schemas/v1/material-facts.json +2109 -0
  157. package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
  158. package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction.json +191 -0
  159. package/keen-dewdney-6ae15b/src/schemas/v1/searches/drainage-and-water.json +261 -0
  160. package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-land-charges.json +69 -0
  161. package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-searches-required.json +857 -0
  162. package/keen-dewdney-6ae15b/src/schemas/v1/searches.json +237 -0
  163. package/keen-dewdney-6ae15b/src/schemas/v1/title-deed.json +841 -0
  164. package/keen-dewdney-6ae15b/src/schemas/v2/baspiNotes.html +102 -0
  165. package/keen-dewdney-6ae15b/src/schemas/v2/combined.json +37731 -0
  166. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/baspi.json +8132 -0
  167. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29DW.json +705 -0
  168. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29R.json +2956 -0
  169. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/fme1.json +1259 -0
  170. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/llc1.json +25 -0
  171. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/lpe1.json +2171 -0
  172. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/nts.json +326 -0
  173. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/oc1.json +2799 -0
  174. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/piq.json +3419 -0
  175. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/rds.json +3736 -0
  176. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta10.json +5306 -0
  177. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta6.json +4533 -0
  178. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta7.json +1045 -0
  179. package/keen-dewdney-6ae15b/src/schemas/v2/pdtf-transaction.json +34351 -0
  180. package/keen-dewdney-6ae15b/src/schemas/v2/skeleton.json +3973 -0
  181. package/keen-dewdney-6ae15b/src/schemas/v3/combined.json +41720 -0
  182. package/keen-dewdney-6ae15b/src/schemas/v3/compactSkeleton.txt +3325 -0
  183. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/README.md +299 -0
  184. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi4.json +7872 -0
  185. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi5.json +8019 -0
  186. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29DW.json +716 -0
  187. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29R.json +2981 -0
  188. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/as.json +72 -0
  189. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/dr.json +73 -0
  190. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/er.json +83 -0
  191. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/fd.json +72 -0
  192. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hi.json +48 -0
  193. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hs.json +71 -0
  194. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/jk.json +76 -0
  195. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/la.json +83 -0
  196. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/ma.json +87 -0
  197. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/mc.json +36 -0
  198. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oa.json +22 -0
  199. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oc.json +55 -0
  200. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sb.json +71 -0
  201. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sf.json +72 -0
  202. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sl.json +66 -0
  203. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/tf.json +100 -0
  204. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/fme1.json +1264 -0
  205. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/llc1.json +25 -0
  206. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/lpe1.json +2226 -0
  207. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts.json +2090 -0
  208. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts2.json +2678 -0
  209. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl.json +1746 -0
  210. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl2.json +2153 -0
  211. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/oc1.json +2817 -0
  212. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/piq.json +3276 -0
  213. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/rds.json +3552 -0
  214. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/sr24.json +38 -0
  215. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta10.json +4642 -0
  216. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta6.json +4501 -0
  217. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta7.json +1435 -0
  218. package/keen-dewdney-6ae15b/src/schemas/v3/pdtf-transaction.json +37225 -0
  219. package/keen-dewdney-6ae15b/src/schemas/v3/skeleton.json +4323 -0
  220. package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/README.md +12 -0
  221. package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/pdtf-verified-claims.json +431 -0
  222. package/keen-dewdney-6ae15b/src/tests/v3/caching.test.js +591 -0
  223. package/keen-dewdney-6ae15b/src/tests/v3/extensionOverlays.test.js +525 -0
  224. package/keen-dewdney-6ae15b/src/tests/v3/transactionSchema.test.js +574 -0
  225. package/keen-dewdney-6ae15b/src/tests/v3/verifiedClaimsValidator.test.js +128 -0
  226. package/keen-dewdney-6ae15b/src/utils/compactSkeleton.js +84 -0
  227. package/keen-dewdney-6ae15b/src/utils/countTokens.js +67 -0
  228. package/keen-dewdney-6ae15b/src/utils/extractExtensionOverlays.js +362 -0
  229. package/keen-dewdney-6ae15b/src/utils/extractOverlay.js +290 -0
  230. package/keen-dewdney-6ae15b/src/utils/extractProperties.js +44 -0
  231. package/keen-dewdney-6ae15b/src/utils/listPathTitles.js +36 -0
  232. package/keen-dewdney-6ae15b/src/utils/minimalSkeleton.js +85 -0
  233. package/keen-dewdney-6ae15b/src/utils/pathList.csv +903 -0
  234. package/keen-dewdney-6ae15b/src/utils/pathSkeleton.js +181 -0
  235. package/package.json +1 -1
  236. package/src/schemas/v3/combined.json +8 -15
  237. package/src/schemas/v3/overlays/baspi4.json +12 -7
  238. package/src/schemas/v3/overlays/baspi5.json +12 -7
  239. package/src/schemas/v3/overlays/extensions/ac.json +2 -1
  240. package/src/schemas/v3/overlays/extensions/dk.json +3 -2
  241. package/src/schemas/v3/overlays/extensions/ic.json +2 -1
  242. package/src/schemas/v3/overlays/extensions/lc.json +3 -2
  243. package/src/schemas/v3/overlays/extensions/mi.json +2 -1
  244. package/src/schemas/v3/overlays/extensions/nd.json +3 -2
  245. package/src/schemas/v3/overlays/extensions/pc.json +3 -2
  246. package/src/schemas/v3/overlays/extensions/ph.json +2 -1
  247. package/src/schemas/v3/overlays/extensions/rw.json +4 -3
  248. package/src/schemas/v3/overlays/extensions/sc.json +8 -4
  249. package/src/schemas/v3/overlays/extensions/sd.json +3 -2
  250. package/src/schemas/v3/overlays/extensions/tr.json +3 -2
  251. package/src/schemas/v3/overlays/extensions/wg.json +2 -1
  252. package/src/schemas/v3/overlays/lpe1.json +1 -1
  253. package/src/schemas/v3/overlays/nts.json +3 -1
  254. package/src/schemas/v3/overlays/nts2.json +3 -1
  255. package/src/schemas/v3/overlays/ntsl.json +3 -1
  256. package/src/schemas/v3/overlays/ntsl2.json +3 -1
  257. package/src/schemas/v3/overlays/piq.json +7 -5
  258. package/src/schemas/v3/overlays/rds.json +9 -6
  259. package/src/schemas/v3/overlays/ta10.json +0 -9
  260. package/src/schemas/v3/overlays/ta6.json +8 -4
  261. package/src/schemas/v3/overlays/ta6ed6.json +4 -2
  262. package/src/schemas/v3/pdtf-transaction.json +15 -18
  263. package/src/utils/extractExtensionOverlays.js +10 -1
@@ -0,0 +1,600 @@
1
+ const {
2
+ getTransactionSchema,
3
+ getSubschemaValidator,
4
+ } = require("../../../index.js");
5
+ const ta7ed5Overlay = require("../../schemas/v3/overlays/ta7ed5.json");
6
+
7
+ const schemaId =
8
+ "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json";
9
+
10
+ const overlays = ["ta7ed5"];
11
+
12
+ const collectRequiredWithoutPropertyIssues = (schema) => {
13
+ const issues = [];
14
+
15
+ const walk = (node, path = "#") => {
16
+ if (!node || typeof node !== "object") return;
17
+
18
+ if (Array.isArray(node.required)) {
19
+ node.required.forEach((propertyName) => {
20
+ if (!node.properties?.[propertyName]) {
21
+ issues.push(`${path} requires ${propertyName}`);
22
+ }
23
+ });
24
+ }
25
+
26
+ Object.entries(node.properties || {}).forEach(([key, value]) =>
27
+ walk(value, `${path}/properties/${key}`)
28
+ );
29
+ (node.oneOf || []).forEach((value, index) =>
30
+ walk(value, `${path}/oneOf/${index}`)
31
+ );
32
+ if (node.items) walk(node.items, `${path}/items`);
33
+ };
34
+
35
+ walk(schema);
36
+ return issues;
37
+ };
38
+
39
+ // Helper: navigate to a deeply nested property in the merged schema
40
+ const getSchemaProperty = (schema, dotPath) => {
41
+ return dotPath.split(".").reduce((obj, key) => obj?.[key], schema);
42
+ };
43
+
44
+ // Base path to leasehold information (through the ownership discriminator)
45
+ // The /0/ element navigates through the array type to items, then
46
+ // leaseholdInformation is found in the Leasehold oneOf branch.
47
+ const leaseholdBase =
48
+ "/propertyPack/ownership/ownershipsToBeTransferred/0/leaseholdInformation";
49
+
50
+ describe("TA7 5th edition overlay", () => {
51
+ let schema;
52
+
53
+ beforeAll(() => {
54
+ schema = getTransactionSchema(schemaId, overlays);
55
+ });
56
+
57
+ // ---------------------------------------------------------------
58
+ // Schema structure tests
59
+ // ---------------------------------------------------------------
60
+
61
+ describe("overlay structure", () => {
62
+ test("merged schema requires address and ownership at propertyPack level", () => {
63
+ const required = schema.properties?.propertyPack?.required;
64
+ expect(required).toContain("address");
65
+ expect(required).toContain("ownership");
66
+ });
67
+
68
+ test("generated overlay exposes every TA7 edition 5 required property", () => {
69
+ expect(collectRequiredWithoutPropertyIssues(ta7ed5Overlay)).toEqual([]);
70
+ });
71
+
72
+ test("leasehold branch requires the referenced ta7ed5 sections", () => {
73
+ const leaseholdOneOf =
74
+ schema.properties?.propertyPack?.properties?.ownership?.properties
75
+ ?.ownershipsToBeTransferred?.items?.oneOf;
76
+
77
+ // Find the Leasehold branch
78
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
79
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
80
+ );
81
+ expect(leaseholdBranch).toBeDefined();
82
+
83
+ const required =
84
+ leaseholdBranch.properties.leaseholdInformation.required;
85
+ expect(required).toContain("typeOfLeasehold");
86
+ expect(required).toContain("contactDetails");
87
+ expect(required).toContain("ownershipAndManagement");
88
+ expect(required).toContain("serviceCharge");
89
+ expect(required).toContain("disputes");
90
+ expect(required).toContain("buildingSafetyAct");
91
+ expect(required).toContain("enfranchisement");
92
+ expect(required).toContain("requiredDocuments");
93
+ expect(required).toContain("additionalInformation");
94
+ expect(required).toContain("confirmationOfAccuracy");
95
+ expect(required).not.toContain("buildingSafety");
96
+ });
97
+ });
98
+
99
+ // ---------------------------------------------------------------
100
+ // typeOfLeasehold discriminator (section 2.1)
101
+ // ---------------------------------------------------------------
102
+
103
+ describe("typeOfLeasehold discriminator", () => {
104
+ const path = `${leaseholdBase}/typeOfLeasehold`;
105
+
106
+ test("valid with a standard leasehold type", () => {
107
+ const validator = getSubschemaValidator(path, schemaId, overlays);
108
+ expect(validator({ leaseholdType: "Flat" })).toBe(true);
109
+ });
110
+
111
+ test("valid with Other when otherLeaseholdType provided", () => {
112
+ const validator = getSubschemaValidator(path, schemaId, overlays);
113
+ expect(
114
+ validator({
115
+ leaseholdType: "Other",
116
+ otherLeaseholdType: "Live/work unit",
117
+ })
118
+ ).toBe(true);
119
+ });
120
+
121
+ test("invalid with Other when otherLeaseholdType missing", () => {
122
+ const validator = getSubschemaValidator(path, schemaId, overlays);
123
+ expect(validator({ leaseholdType: "Other" })).toBe(false);
124
+ const err = validator.errors.find((e) =>
125
+ e.message.includes("otherLeaseholdType")
126
+ );
127
+ expect(err).toBeDefined();
128
+ });
129
+
130
+ test("invalid when leaseholdType missing entirely", () => {
131
+ const validator = getSubschemaValidator(path, schemaId, overlays);
132
+ expect(validator({})).toBe(false);
133
+ });
134
+
135
+ test("invalid with unrecognised enum value", () => {
136
+ const validator = getSubschemaValidator(path, schemaId, overlays);
137
+ expect(validator({ leaseholdType: "Bungalow" })).toBe(false);
138
+ });
139
+ });
140
+
141
+ // ---------------------------------------------------------------
142
+ // Managing agent contact required fields (section 4.1)
143
+ // ---------------------------------------------------------------
144
+
145
+ describe("managingAgent contact required fields", () => {
146
+ const path = `${leaseholdBase}/contactDetails/contacts/managingAgent`;
147
+
148
+ test("valid managing agent with all required fields", () => {
149
+ const validator = getSubschemaValidator(path, schemaId, overlays);
150
+ expect(
151
+ validator({
152
+ contact: {
153
+ nameOrOrganisation: "ABC Property Management",
154
+ address: { line1: "1 High St", postcode: "SW1A 1AA" },
155
+ emailAddress: "info@abc.co.uk",
156
+ },
157
+ })
158
+ ).toBe(true);
159
+ });
160
+
161
+ test("invalid when contact is missing", () => {
162
+ const validator = getSubschemaValidator(path, schemaId, overlays);
163
+ expect(validator({})).toBe(false);
164
+ const err = validator.errors.find((e) =>
165
+ e.message.includes("contact")
166
+ );
167
+ expect(err).toBeDefined();
168
+ });
169
+
170
+ test("invalid when contact.emailAddress is missing", () => {
171
+ const validator = getSubschemaValidator(path, schemaId, overlays);
172
+ expect(
173
+ validator({
174
+ contact: {
175
+ nameOrOrganisation: "ABC Property Management",
176
+ address: { line1: "1 High St", postcode: "SW1A 1AA" },
177
+ },
178
+ })
179
+ ).toBe(false);
180
+ const err = validator.errors.find((e) =>
181
+ e.message.includes("emailAddress")
182
+ );
183
+ expect(err).toBeDefined();
184
+ });
185
+
186
+ test("invalid when contact.nameOrOrganisation is missing", () => {
187
+ const validator = getSubschemaValidator(path, schemaId, overlays);
188
+ expect(
189
+ validator({
190
+ contact: {
191
+ address: { line1: "1 High St", postcode: "SW1A 1AA" },
192
+ emailAddress: "info@abc.co.uk",
193
+ },
194
+ })
195
+ ).toBe(false);
196
+ });
197
+
198
+ test("telephone is not required for managing agent contact", () => {
199
+ const validator = getSubschemaValidator(path, schemaId, overlays);
200
+ // Valid without telephone
201
+ expect(
202
+ validator({
203
+ contact: {
204
+ nameOrOrganisation: "ABC Property Management",
205
+ address: { line1: "1 High St", postcode: "SW1A 1AA" },
206
+ emailAddress: "info@abc.co.uk",
207
+ },
208
+ })
209
+ ).toBe(true);
210
+ });
211
+ });
212
+
213
+ // ---------------------------------------------------------------
214
+ // ownershipAndManagement required fields (section 4)
215
+ // ---------------------------------------------------------------
216
+
217
+ describe("ownershipAndManagement required fields", () => {
218
+ const path = `${leaseholdBase}/ownershipAndManagement`;
219
+
220
+ test("requires isManagingAgentEmployed, sellerOwnership, hasTenantCompanyDissolved", () => {
221
+ const validator = getSubschemaValidator(path, schemaId, overlays);
222
+ expect(validator({})).toBe(false);
223
+
224
+ const missingFields = validator.errors
225
+ .filter((e) => e.keyword === "required")
226
+ .map((e) => e.params.missingProperty);
227
+
228
+ expect(missingFields).toContain("isManagingAgentEmployed");
229
+ expect(missingFields).toContain("sellerOwnership");
230
+ expect(missingFields).toContain("hasTenantCompanyDissolved");
231
+ });
232
+
233
+ test("isManagingAgentEmployed accepts Not applicable", () => {
234
+ const validator = getSubschemaValidator(path, schemaId, overlays);
235
+ validator({
236
+ isManagingAgentEmployed: "Not applicable",
237
+ sellerOwnership: { yesNo: "No" },
238
+ hasTenantCompanyDissolved: "No",
239
+ });
240
+ // Should not have enum errors for isManagingAgentEmployed
241
+ const enumErr = (validator.errors || []).find(
242
+ (e) =>
243
+ e.instancePath === "/isManagingAgentEmployed" &&
244
+ e.keyword === "enum"
245
+ );
246
+ expect(enumErr).toBeUndefined();
247
+ });
248
+ });
249
+
250
+ // ---------------------------------------------------------------
251
+ // collectsGroundRent discriminator (section 4.3)
252
+ // ---------------------------------------------------------------
253
+
254
+ describe("collectsGroundRent discriminator", () => {
255
+ const path = `${leaseholdBase}/contactDetails/serviceContactAssignments/collectsGroundRent`;
256
+
257
+ test("requires collector field", () => {
258
+ const validator = getSubschemaValidator(path, schemaId, overlays);
259
+ expect(validator({})).toBe(false);
260
+ const err = validator.errors.find(
261
+ (e) =>
262
+ e.keyword === "required" &&
263
+ e.params.missingProperty === "collector"
264
+ );
265
+ expect(err).toBeDefined();
266
+ });
267
+
268
+ test("valid with Landlord (no otherCollector needed)", () => {
269
+ const validator = getSubschemaValidator(path, schemaId, overlays);
270
+ expect(validator({ collector: "Landlord" })).toBe(true);
271
+ });
272
+
273
+ test("valid with Management Company (no otherCollector needed)", () => {
274
+ const validator = getSubschemaValidator(path, schemaId, overlays);
275
+ expect(validator({ collector: "Management Company" })).toBe(true);
276
+ });
277
+
278
+ test("invalid with Other when otherCollector is missing", () => {
279
+ const validator = getSubschemaValidator(path, schemaId, overlays);
280
+ expect(validator({ collector: "Other" })).toBe(false);
281
+ const err = validator.errors.find(
282
+ (e) =>
283
+ e.keyword === "required" &&
284
+ e.params.missingProperty === "otherCollector"
285
+ );
286
+ expect(err).toBeDefined();
287
+ });
288
+
289
+ test("valid with Other when otherCollector is provided", () => {
290
+ const validator = getSubschemaValidator(path, schemaId, overlays);
291
+ expect(
292
+ validator({ collector: "Other", otherCollector: "The Crown Estate" })
293
+ ).toBe(true);
294
+ });
295
+
296
+ test("invalid with Other when otherCollector is empty string", () => {
297
+ const validator = getSubschemaValidator(path, schemaId, overlays);
298
+ expect(
299
+ validator({ collector: "Other", otherCollector: "" })
300
+ ).toBe(false);
301
+ });
302
+
303
+ test("invalid with unrecognised enum value", () => {
304
+ const validator = getSubschemaValidator(path, schemaId, overlays);
305
+ expect(validator({ collector: "The Pope" })).toBe(false);
306
+ });
307
+
308
+ test("invalid when collector is wrong type", () => {
309
+ const validator = getSubschemaValidator(path, schemaId, overlays);
310
+ expect(validator({ collector: 42 })).toBe(false);
311
+ });
312
+
313
+ test("ta7ed5 overlay enum has exactly 3 values", () => {
314
+ const leaseholdOneOf =
315
+ schema.properties?.propertyPack?.properties?.ownership?.properties
316
+ ?.ownershipsToBeTransferred?.items?.oneOf;
317
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
318
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
319
+ );
320
+ const collector =
321
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
322
+ ?.contactDetails?.properties?.serviceContactAssignments?.properties
323
+ ?.collectsGroundRent?.properties?.collector;
324
+ expect(collector?.enum).toEqual([
325
+ "Landlord",
326
+ "Management Company",
327
+ "Other",
328
+ ]);
329
+ });
330
+ });
331
+
332
+ // ---------------------------------------------------------------
333
+ // collectsbuildingInsurancePremiums discriminator (section 4.2)
334
+ // ---------------------------------------------------------------
335
+
336
+ describe("collectsbuildingInsurancePremiums discriminator", () => {
337
+ const path = `${leaseholdBase}/contactDetails/serviceContactAssignments/collectsbuildingInsurancePremiums`;
338
+
339
+ test("requires collector field", () => {
340
+ const validator = getSubschemaValidator(path, schemaId, overlays);
341
+ expect(validator({})).toBe(false);
342
+ const err = validator.errors.find(
343
+ (e) =>
344
+ e.keyword === "required" &&
345
+ e.params.missingProperty === "collector"
346
+ );
347
+ expect(err).toBeDefined();
348
+ });
349
+
350
+ test("valid with Freeholder (no otherCollector needed)", () => {
351
+ const validator = getSubschemaValidator(path, schemaId, overlays);
352
+ expect(validator({ collector: "Freeholder" })).toBe(true);
353
+ });
354
+
355
+ test("valid with each non-Other enum value", () => {
356
+ const validator = getSubschemaValidator(path, schemaId, overlays);
357
+ for (const value of [
358
+ "Freeholder",
359
+ "Landlord",
360
+ "Management Company",
361
+ "Head Leaseholder",
362
+ "Seller",
363
+ ]) {
364
+ expect(validator({ collector: value })).toBe(true);
365
+ }
366
+ });
367
+
368
+ test("invalid with Other when otherCollector is missing", () => {
369
+ const validator = getSubschemaValidator(path, schemaId, overlays);
370
+ expect(validator({ collector: "Other" })).toBe(false);
371
+ const err = validator.errors.find(
372
+ (e) =>
373
+ e.keyword === "required" &&
374
+ e.params.missingProperty === "otherCollector"
375
+ );
376
+ expect(err).toBeDefined();
377
+ });
378
+
379
+ test("valid with Other when otherCollector is provided", () => {
380
+ const validator = getSubschemaValidator(path, schemaId, overlays);
381
+ expect(
382
+ validator({
383
+ collector: "Other",
384
+ otherCollector: "Residents association",
385
+ })
386
+ ).toBe(true);
387
+ });
388
+
389
+ test("invalid with Other when otherCollector is empty string", () => {
390
+ const validator = getSubschemaValidator(path, schemaId, overlays);
391
+ expect(
392
+ validator({ collector: "Other", otherCollector: "" })
393
+ ).toBe(false);
394
+ });
395
+
396
+ test("invalid with unrecognised enum value", () => {
397
+ const validator = getSubschemaValidator(path, schemaId, overlays);
398
+ expect(validator({ collector: "Managing Agent" })).toBe(false);
399
+ });
400
+
401
+ test("ta7ed5 overlay enum has exactly 6 values", () => {
402
+ const leaseholdOneOf =
403
+ schema.properties?.propertyPack?.properties?.ownership?.properties
404
+ ?.ownershipsToBeTransferred?.items?.oneOf;
405
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
406
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
407
+ );
408
+ const collector =
409
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
410
+ ?.contactDetails?.properties?.serviceContactAssignments?.properties
411
+ ?.collectsbuildingInsurancePremiums?.properties?.collector;
412
+ expect(collector?.enum).toEqual([
413
+ "Freeholder",
414
+ "Landlord",
415
+ "Management Company",
416
+ "Head Leaseholder",
417
+ "Seller",
418
+ "Other",
419
+ ]);
420
+ });
421
+ });
422
+
423
+ // ---------------------------------------------------------------
424
+ // serviceContactAssignments required fields
425
+ // ---------------------------------------------------------------
426
+
427
+ describe("serviceContactAssignments required fields", () => {
428
+ const path = `${leaseholdBase}/contactDetails/serviceContactAssignments`;
429
+
430
+ test("requires collectsGroundRent and collectsbuildingInsurancePremiums", () => {
431
+ const validator = getSubschemaValidator(path, schemaId, overlays);
432
+ expect(validator({})).toBe(false);
433
+
434
+ const missingFields = validator.errors
435
+ .filter((e) => e.keyword === "required")
436
+ .map((e) => e.params.missingProperty);
437
+
438
+ expect(missingFields).toContain("collectsGroundRent");
439
+ expect(missingFields).toContain("collectsbuildingInsurancePremiums");
440
+ });
441
+
442
+ test("valid when both collection fields provided", () => {
443
+ const validator = getSubschemaValidator(path, schemaId, overlays);
444
+ expect(
445
+ validator({
446
+ collectsGroundRent: { collector: "Landlord" },
447
+ collectsbuildingInsurancePremiums: { collector: "Management Company" },
448
+ })
449
+ ).toBe(true);
450
+ });
451
+
452
+ test("invalid when collectsGroundRent is a string instead of object", () => {
453
+ const validator = getSubschemaValidator(path, schemaId, overlays);
454
+ expect(
455
+ validator({
456
+ collectsGroundRent: "Landlord",
457
+ collectsbuildingInsurancePremiums: { collector: "Landlord" },
458
+ })
459
+ ).toBe(false);
460
+ });
461
+ });
462
+
463
+ // ---------------------------------------------------------------
464
+ // Removed properties should not exist
465
+ // ---------------------------------------------------------------
466
+
467
+ describe("removed redundant properties", () => {
468
+ test("isGroundRentCollectedByManagingAgent does not exist in merged schema", () => {
469
+ const leaseholdOneOf =
470
+ schema.properties?.propertyPack?.properties?.ownership?.properties
471
+ ?.ownershipsToBeTransferred?.items?.oneOf;
472
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
473
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
474
+ );
475
+ const serviceContactAssignments =
476
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
477
+ ?.contactDetails?.properties?.serviceContactAssignments;
478
+
479
+ expect(
480
+ serviceContactAssignments?.properties
481
+ ?.isGroundRentCollectedByManagingAgent
482
+ ).toBeUndefined();
483
+ });
484
+
485
+ test("managingAgentArrangesOrCollectsBuildingInsuranceCharges does not exist in merged schema", () => {
486
+ const leaseholdOneOf =
487
+ schema.properties?.propertyPack?.properties?.ownership?.properties
488
+ ?.ownershipsToBeTransferred?.items?.oneOf;
489
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
490
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
491
+ );
492
+ const serviceContactAssignments =
493
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
494
+ ?.contactDetails?.properties?.serviceContactAssignments;
495
+
496
+ expect(
497
+ serviceContactAssignments?.properties
498
+ ?.managingAgentArrangesOrCollectsBuildingInsuranceCharges
499
+ ).toBeUndefined();
500
+ });
501
+
502
+ test("standalone groundRentOtherCollector does not exist (absorbed into collectsGroundRent oneOf)", () => {
503
+ const leaseholdOneOf =
504
+ schema.properties?.propertyPack?.properties?.ownership?.properties
505
+ ?.ownershipsToBeTransferred?.items?.oneOf;
506
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
507
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
508
+ );
509
+ const serviceContactAssignments =
510
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
511
+ ?.contactDetails?.properties?.serviceContactAssignments;
512
+
513
+ expect(
514
+ serviceContactAssignments?.properties?.groundRentOtherCollector
515
+ ).toBeUndefined();
516
+ });
517
+
518
+ test("standalone buildingInsurancePremiumsOtherCollector does not exist (absorbed into collectsbuildingInsurancePremiums oneOf)", () => {
519
+ const leaseholdOneOf =
520
+ schema.properties?.propertyPack?.properties?.ownership?.properties
521
+ ?.ownershipsToBeTransferred?.items?.oneOf;
522
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
523
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
524
+ );
525
+ const serviceContactAssignments =
526
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
527
+ ?.contactDetails?.properties?.serviceContactAssignments;
528
+
529
+ expect(
530
+ serviceContactAssignments?.properties
531
+ ?.buildingInsurancePremiumsOtherCollector
532
+ ).toBeUndefined();
533
+ });
534
+ });
535
+
536
+ // ---------------------------------------------------------------
537
+ // Discriminator structure in the overlay
538
+ // ---------------------------------------------------------------
539
+
540
+ describe("discriminator oneOf structure", () => {
541
+ test("collectsGroundRent has discriminator on collector with two branches", () => {
542
+ const leaseholdOneOf =
543
+ schema.properties?.propertyPack?.properties?.ownership?.properties
544
+ ?.ownershipsToBeTransferred?.items?.oneOf;
545
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
546
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
547
+ );
548
+ const collectsGroundRent =
549
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
550
+ ?.contactDetails?.properties?.serviceContactAssignments?.properties
551
+ ?.collectsGroundRent;
552
+
553
+ expect(collectsGroundRent.discriminator).toEqual({
554
+ propertyName: "collector",
555
+ });
556
+ expect(collectsGroundRent.oneOf).toHaveLength(2);
557
+
558
+ // Branch 1: non-Other values
559
+ const branch1Enum =
560
+ collectsGroundRent.oneOf[0].properties.collector.enum;
561
+ expect(branch1Enum).not.toContain("Other");
562
+
563
+ // Branch 2: Other + required otherCollector
564
+ const branch2 = collectsGroundRent.oneOf[1];
565
+ expect(branch2.properties.collector.enum).toEqual(["Other"]);
566
+ expect(branch2.required).toContain("otherCollector");
567
+ expect(branch2.properties.otherCollector).toBeDefined();
568
+ expect(branch2.properties.otherCollector.type).toBe("string");
569
+ });
570
+
571
+ test("collectsbuildingInsurancePremiums has discriminator on collector with two branches", () => {
572
+ const leaseholdOneOf =
573
+ schema.properties?.propertyPack?.properties?.ownership?.properties
574
+ ?.ownershipsToBeTransferred?.items?.oneOf;
575
+ const leaseholdBranch = leaseholdOneOf?.find((branch) =>
576
+ branch.properties?.ownershipType?.enum?.includes("Leasehold")
577
+ );
578
+ const collectsInsurance =
579
+ leaseholdBranch?.properties?.leaseholdInformation?.properties
580
+ ?.contactDetails?.properties?.serviceContactAssignments?.properties
581
+ ?.collectsbuildingInsurancePremiums;
582
+
583
+ expect(collectsInsurance.discriminator).toEqual({
584
+ propertyName: "collector",
585
+ });
586
+ expect(collectsInsurance.oneOf).toHaveLength(2);
587
+
588
+ // Branch 1: non-Other values (superset of all overlay values)
589
+ const branch1Enum =
590
+ collectsInsurance.oneOf[0].properties.collector.enum;
591
+ expect(branch1Enum).toHaveLength(7);
592
+ expect(branch1Enum).not.toContain("Other");
593
+
594
+ // Branch 2: Other + required otherCollector
595
+ const branch2 = collectsInsurance.oneOf[1];
596
+ expect(branch2.properties.collector.enum).toEqual(["Other"]);
597
+ expect(branch2.required).toContain("otherCollector");
598
+ });
599
+ });
600
+ });