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

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 (280) 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/compassionate-easley-bafb14/CLAUDE.md +101 -0
  131. package/compassionate-easley-bafb14/LICENSE +21 -0
  132. package/compassionate-easley-bafb14/README.md +435 -0
  133. package/compassionate-easley-bafb14/docs/branch-release-workflow.md +138 -0
  134. package/compassionate-easley-bafb14/docs/sef25-extensions-ui-spec.md +355 -0
  135. package/compassionate-easley-bafb14/index.js +654 -0
  136. package/compassionate-easley-bafb14/package-lock.json +7297 -0
  137. package/compassionate-easley-bafb14/package.json +44 -0
  138. package/compassionate-easley-bafb14/src/examples/v1/exampleAddParticipantVouch.json +32 -0
  139. package/compassionate-easley-bafb14/src/examples/v1/exampleDocumentedVouch.json +40 -0
  140. package/compassionate-easley-bafb14/src/examples/v1/exampleElectronicRecord.json +30 -0
  141. package/compassionate-easley-bafb14/src/examples/v1/exampleTransaction.json +878 -0
  142. package/compassionate-easley-bafb14/src/examples/v1/exampleVouch.json +25 -0
  143. package/compassionate-easley-bafb14/src/examples/v2/exampleTransaction.json +901 -0
  144. package/compassionate-easley-bafb14/src/examples/v3/exampleAddParticipantVouch.json +38 -0
  145. package/compassionate-easley-bafb14/src/examples/v3/exampleCustomOverlay.json +55 -0
  146. package/compassionate-easley-bafb14/src/examples/v3/exampleCustomOverlay2.json +93 -0
  147. package/compassionate-easley-bafb14/src/examples/v3/exampleDocumentedVouch.json +47 -0
  148. package/compassionate-easley-bafb14/src/examples/v3/exampleElectronicRecord.json +36 -0
  149. package/compassionate-easley-bafb14/src/examples/v3/exampleTransaction.json +1038 -0
  150. package/compassionate-easley-bafb14/src/examples/v3/exampleVouch.json +32 -0
  151. package/compassionate-easley-bafb14/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
  152. package/compassionate-easley-bafb14/src/mappings/adf.js +198 -0
  153. package/compassionate-easley-bafb14/src/schemas/v1/GeoJSON.json +1279 -0
  154. package/compassionate-easley-bafb14/src/schemas/v1/baspiNotes.html +102 -0
  155. package/compassionate-easley-bafb14/src/schemas/v1/energy-performance-certificate.json +124 -0
  156. package/compassionate-easley-bafb14/src/schemas/v1/freehold-information.json +2051 -0
  157. package/compassionate-easley-bafb14/src/schemas/v1/leasehold-information.json +2064 -0
  158. package/compassionate-easley-bafb14/src/schemas/v1/legal-information.json +1045 -0
  159. package/compassionate-easley-bafb14/src/schemas/v1/material-facts.json +2109 -0
  160. package/compassionate-easley-bafb14/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
  161. package/compassionate-easley-bafb14/src/schemas/v1/pdtf-transaction.json +191 -0
  162. package/compassionate-easley-bafb14/src/schemas/v1/searches/drainage-and-water.json +261 -0
  163. package/compassionate-easley-bafb14/src/schemas/v1/searches/local-land-charges.json +69 -0
  164. package/compassionate-easley-bafb14/src/schemas/v1/searches/local-searches-required.json +857 -0
  165. package/compassionate-easley-bafb14/src/schemas/v1/searches.json +237 -0
  166. package/compassionate-easley-bafb14/src/schemas/v1/title-deed.json +841 -0
  167. package/compassionate-easley-bafb14/src/schemas/v2/baspiNotes.html +102 -0
  168. package/compassionate-easley-bafb14/src/schemas/v2/combined.json +37731 -0
  169. package/compassionate-easley-bafb14/src/schemas/v2/overlays/baspi.json +8132 -0
  170. package/compassionate-easley-bafb14/src/schemas/v2/overlays/con29DW.json +705 -0
  171. package/compassionate-easley-bafb14/src/schemas/v2/overlays/con29R.json +2956 -0
  172. package/compassionate-easley-bafb14/src/schemas/v2/overlays/fme1.json +1259 -0
  173. package/compassionate-easley-bafb14/src/schemas/v2/overlays/llc1.json +25 -0
  174. package/compassionate-easley-bafb14/src/schemas/v2/overlays/lpe1.json +2171 -0
  175. package/compassionate-easley-bafb14/src/schemas/v2/overlays/nts.json +326 -0
  176. package/compassionate-easley-bafb14/src/schemas/v2/overlays/oc1.json +2799 -0
  177. package/compassionate-easley-bafb14/src/schemas/v2/overlays/piq.json +3419 -0
  178. package/compassionate-easley-bafb14/src/schemas/v2/overlays/rds.json +3736 -0
  179. package/compassionate-easley-bafb14/src/schemas/v2/overlays/ta10.json +5306 -0
  180. package/compassionate-easley-bafb14/src/schemas/v2/overlays/ta6.json +4533 -0
  181. package/compassionate-easley-bafb14/src/schemas/v2/overlays/ta7.json +1045 -0
  182. package/compassionate-easley-bafb14/src/schemas/v2/pdtf-transaction.json +34351 -0
  183. package/compassionate-easley-bafb14/src/schemas/v2/skeleton.json +3973 -0
  184. package/compassionate-easley-bafb14/src/schemas/v3/combined.json +48461 -0
  185. package/compassionate-easley-bafb14/src/schemas/v3/compactSkeleton.txt +4519 -0
  186. package/compassionate-easley-bafb14/src/schemas/v3/overlays/README.md +299 -0
  187. package/compassionate-easley-bafb14/src/schemas/v3/overlays/baspi4.json +8030 -0
  188. package/compassionate-easley-bafb14/src/schemas/v3/overlays/baspi5.json +8180 -0
  189. package/compassionate-easley-bafb14/src/schemas/v3/overlays/con29DW.json +716 -0
  190. package/compassionate-easley-bafb14/src/schemas/v3/overlays/con29R.json +2981 -0
  191. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ac.json +334 -0
  192. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/as.json +74 -0
  193. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/dk.json +33 -0
  194. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/dr.json +73 -0
  195. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/er.json +85 -0
  196. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/fd.json +75 -0
  197. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/hi.json +51 -0
  198. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/hs.json +73 -0
  199. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ic.json +83 -0
  200. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/jk.json +96 -0
  201. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/la.json +85 -0
  202. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/lc.json +76 -0
  203. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ma.json +90 -0
  204. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/mc.json +38 -0
  205. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/mi.json +70 -0
  206. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/nd.json +44 -0
  207. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/oa.json +24 -0
  208. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/oc.json +57 -0
  209. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/pc.json +38 -0
  210. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ph.json +195 -0
  211. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/rw.json +69 -0
  212. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sb.json +73 -0
  213. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sc.json +133 -0
  214. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sd.json +64 -0
  215. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sf.json +74 -0
  216. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sl.json +68 -0
  217. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ta.json +204 -0
  218. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/tf.json +103 -0
  219. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/tr.json +74 -0
  220. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/wg.json +351 -0
  221. package/compassionate-easley-bafb14/src/schemas/v3/overlays/fme1.json +1266 -0
  222. package/compassionate-easley-bafb14/src/schemas/v3/overlays/llc1.json +25 -0
  223. package/compassionate-easley-bafb14/src/schemas/v3/overlays/lpe1.json +2199 -0
  224. package/compassionate-easley-bafb14/src/schemas/v3/overlays/nts.json +2159 -0
  225. package/compassionate-easley-bafb14/src/schemas/v3/overlays/nts2.json +2744 -0
  226. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ntsl.json +1815 -0
  227. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ntsl2.json +2219 -0
  228. package/compassionate-easley-bafb14/src/schemas/v3/overlays/oc1.json +2817 -0
  229. package/compassionate-easley-bafb14/src/schemas/v3/overlays/piq.json +3324 -0
  230. package/compassionate-easley-bafb14/src/schemas/v3/overlays/rds.json +3668 -0
  231. package/compassionate-easley-bafb14/src/schemas/v3/overlays/sef25.json +1644 -0
  232. package/compassionate-easley-bafb14/src/schemas/v3/overlays/sr24.json +38 -0
  233. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta10.json +4645 -0
  234. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta6.json +4572 -0
  235. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta6ed6.json +6536 -0
  236. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta7.json +1537 -0
  237. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta7ed5.json +1551 -0
  238. package/compassionate-easley-bafb14/src/schemas/v3/pdtf-transaction.json +41570 -0
  239. package/compassionate-easley-bafb14/src/schemas/v3/skeleton.json +5767 -0
  240. package/compassionate-easley-bafb14/src/schemas/verifiedClaims/README.md +21 -0
  241. package/compassionate-easley-bafb14/src/schemas/verifiedClaims/pdtf-verified-claims.json +447 -0
  242. package/compassionate-easley-bafb14/src/utils/compactSkeleton.js +84 -0
  243. package/compassionate-easley-bafb14/src/utils/countTokens.js +67 -0
  244. package/compassionate-easley-bafb14/src/utils/extractExtensionOverlays.js +633 -0
  245. package/compassionate-easley-bafb14/src/utils/extractOverlay.js +381 -0
  246. package/compassionate-easley-bafb14/src/utils/extractProperties.js +44 -0
  247. package/compassionate-easley-bafb14/src/utils/listPathTitles.js +36 -0
  248. package/compassionate-easley-bafb14/src/utils/minimalSkeleton.js +85 -0
  249. package/compassionate-easley-bafb14/src/utils/pathList.csv +903 -0
  250. package/compassionate-easley-bafb14/src/utils/pathSkeleton.js +181 -0
  251. package/package.json +1 -1
  252. package/src/schemas/v3/combined.json +9 -15
  253. package/src/schemas/v3/overlays/baspi4.json +12 -7
  254. package/src/schemas/v3/overlays/baspi5.json +12 -7
  255. package/src/schemas/v3/overlays/extensions/ac.json +2 -1
  256. package/src/schemas/v3/overlays/extensions/dk.json +3 -2
  257. package/src/schemas/v3/overlays/extensions/ic.json +33 -9
  258. package/src/schemas/v3/overlays/extensions/lc.json +3 -2
  259. package/src/schemas/v3/overlays/extensions/mi.json +2 -1
  260. package/src/schemas/v3/overlays/extensions/nd.json +3 -2
  261. package/src/schemas/v3/overlays/extensions/pc.json +3 -2
  262. package/src/schemas/v3/overlays/extensions/ph.json +2 -1
  263. package/src/schemas/v3/overlays/extensions/rw.json +4 -3
  264. package/src/schemas/v3/overlays/extensions/sc.json +8 -4
  265. package/src/schemas/v3/overlays/extensions/sd.json +3 -2
  266. package/src/schemas/v3/overlays/extensions/tr.json +3 -2
  267. package/src/schemas/v3/overlays/extensions/wg.json +2 -1
  268. package/src/schemas/v3/overlays/lpe1.json +1 -1
  269. package/src/schemas/v3/overlays/nts.json +3 -1
  270. package/src/schemas/v3/overlays/nts2.json +3 -1
  271. package/src/schemas/v3/overlays/ntsl.json +3 -1
  272. package/src/schemas/v3/overlays/ntsl2.json +3 -1
  273. package/src/schemas/v3/overlays/piq.json +7 -5
  274. package/src/schemas/v3/overlays/rds.json +9 -6
  275. package/src/schemas/v3/overlays/sef25.json +6 -1
  276. package/src/schemas/v3/overlays/ta10.json +0 -9
  277. package/src/schemas/v3/overlays/ta6.json +8 -4
  278. package/src/schemas/v3/overlays/ta6ed6.json +4 -2
  279. package/src/schemas/v3/pdtf-transaction.json +15 -18
  280. package/src/utils/extractExtensionOverlays.js +11 -2
@@ -0,0 +1,823 @@
1
+ const { getValidator } = require("../../../index.js");
2
+
3
+ const schemaId =
4
+ "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json";
5
+
6
+ describe("Offers object validation", () => {
7
+ describe("Valid offer keys", () => {
8
+ test("accepts valid UUID as offer key", () => {
9
+ const validator = getValidator(schemaId);
10
+ const transaction = {
11
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
12
+ status: "active",
13
+ participants: [
14
+ {
15
+ role: "Buyer",
16
+ participantStatus: "Active",
17
+ },
18
+ ],
19
+ offers: {
20
+ "550e8400-e29b-41d4-a716-446655440000": {
21
+ amount: 250000,
22
+ currency: "GBP",
23
+ status: "Pending",
24
+ },
25
+ },
26
+ };
27
+
28
+ const isValid = validator(transaction);
29
+ expect(isValid).toBe(true);
30
+ });
31
+
32
+ test("accepts valid DID as offer key", () => {
33
+ const validator = getValidator(schemaId);
34
+ const transaction = {
35
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
36
+ status: "active",
37
+ participants: [
38
+ {
39
+ role: "Buyer",
40
+ participantStatus: "Active",
41
+ },
42
+ ],
43
+ offers: {
44
+ "did:example:123456789abcdefghi": {
45
+ amount: 300000,
46
+ currency: "GBP",
47
+ status: "Accepted",
48
+ },
49
+ },
50
+ };
51
+
52
+ const isValid = validator(transaction);
53
+ expect(isValid).toBe(true);
54
+ });
55
+
56
+ test("accepts DID with various allowed characters", () => {
57
+ const validator = getValidator(schemaId);
58
+ const transaction = {
59
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
60
+ status: "active",
61
+ participants: [
62
+ {
63
+ role: "Buyer",
64
+ participantStatus: "Active",
65
+ },
66
+ ],
67
+ offers: {
68
+ "did:web:example.com:users:alice": {
69
+ amount: 275000,
70
+ currency: "GBP",
71
+ status: "Pending",
72
+ },
73
+ },
74
+ };
75
+
76
+ const isValid = validator(transaction);
77
+ expect(isValid).toBe(true);
78
+ });
79
+
80
+ test("accepts multiple offers with different key types", () => {
81
+ const validator = getValidator(schemaId);
82
+ const transaction = {
83
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
84
+ status: "active",
85
+ participants: [
86
+ {
87
+ role: "Buyer",
88
+ participantStatus: "Active",
89
+ },
90
+ ],
91
+ offers: {
92
+ "550e8400-e29b-41d4-a716-446655440000": {
93
+ amount: 250000,
94
+ currency: "GBP",
95
+ status: "Pending",
96
+ },
97
+ "did:example:buyer123": {
98
+ amount: 260000,
99
+ currency: "GBP",
100
+ status: "Accepted",
101
+ },
102
+ "offer-abc123": {
103
+ amount: 240000,
104
+ currency: "GBP",
105
+ status: "Rejected",
106
+ },
107
+ },
108
+ };
109
+
110
+ const isValid = validator(transaction);
111
+ expect(isValid).toBe(true);
112
+ });
113
+ });
114
+
115
+ describe("Invalid offer keys", () => {
116
+ test("rejects offer key starting with invalid character", () => {
117
+ const validator = getValidator(schemaId);
118
+ const transaction = {
119
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
120
+ status: "active",
121
+ participants: [
122
+ {
123
+ role: "Buyer",
124
+ participantStatus: "Active",
125
+ },
126
+ ],
127
+ offers: {
128
+ "-invalid-key": {
129
+ amount: 250000,
130
+ currency: "GBP",
131
+ status: "Pending",
132
+ },
133
+ },
134
+ };
135
+
136
+ const isValid = validator(transaction);
137
+ expect(isValid).toBe(false);
138
+ expect(validator.errors.length).toBeGreaterThan(0);
139
+ });
140
+
141
+ test("rejects offer key with spaces", () => {
142
+ const validator = getValidator(schemaId);
143
+ const transaction = {
144
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
145
+ status: "active",
146
+ participants: [
147
+ {
148
+ role: "Buyer",
149
+ participantStatus: "Active",
150
+ },
151
+ ],
152
+ offers: {
153
+ "invalid key with spaces": {
154
+ amount: 250000,
155
+ currency: "GBP",
156
+ status: "Pending",
157
+ },
158
+ },
159
+ };
160
+
161
+ const isValid = validator(transaction);
162
+ expect(isValid).toBe(false);
163
+ });
164
+
165
+ test("rejects offer key with special characters", () => {
166
+ const validator = getValidator(schemaId);
167
+ const transaction = {
168
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
169
+ status: "active",
170
+ participants: [
171
+ {
172
+ role: "Buyer",
173
+ participantStatus: "Active",
174
+ },
175
+ ],
176
+ offers: {
177
+ "invalid@key#here": {
178
+ amount: 250000,
179
+ currency: "GBP",
180
+ status: "Pending",
181
+ },
182
+ },
183
+ };
184
+
185
+ const isValid = validator(transaction);
186
+ expect(isValid).toBe(false);
187
+ });
188
+ });
189
+
190
+ describe("Valid offer contents", () => {
191
+ test("accepts offer with all required fields", () => {
192
+ const validator = getValidator(schemaId);
193
+ const transaction = {
194
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
195
+ status: "active",
196
+ participants: [
197
+ {
198
+ role: "Buyer",
199
+ participantStatus: "Active",
200
+ },
201
+ ],
202
+ offers: {
203
+ "offer-1": {
204
+ amount: 250000,
205
+ currency: "GBP",
206
+ status: "Pending",
207
+ },
208
+ },
209
+ };
210
+
211
+ const isValid = validator(transaction);
212
+ expect(isValid).toBe(true);
213
+ });
214
+
215
+ test("accepts offer with all fields including optional ones", () => {
216
+ const validator = getValidator(schemaId);
217
+ const transaction = {
218
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
219
+ status: "active",
220
+ participants: [
221
+ {
222
+ role: "Buyer",
223
+ participantStatus: "Active",
224
+ },
225
+ ],
226
+ offers: {
227
+ "offer-1": {
228
+ amount: 250000,
229
+ currency: "GBP",
230
+ status: "Accepted",
231
+ inclusions: ["curtains", "carpets", "light fixtures"],
232
+ exclusions: ["garden furniture", "shed"],
233
+ conditions: [
234
+ "Subject to survey",
235
+ "Subject to mortgage approval",
236
+ ],
237
+ },
238
+ },
239
+ };
240
+
241
+ const isValid = validator(transaction);
242
+ expect(isValid).toBe(true);
243
+ });
244
+
245
+ test("accepts all valid status values", () => {
246
+ const validator = getValidator(schemaId);
247
+ const validStatuses = [
248
+ "Pending",
249
+ "Withdrawn",
250
+ "Rejected",
251
+ "Accepted",
252
+ "Note of Interest",
253
+ ];
254
+
255
+ validStatuses.forEach((status) => {
256
+ const transaction = {
257
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
258
+ status: "active",
259
+ participants: [
260
+ {
261
+ role: "Buyer",
262
+ participantStatus: "Active",
263
+ },
264
+ ],
265
+ offers: {
266
+ "offer-1": {
267
+ amount: 250000,
268
+ currency: "GBP",
269
+ status: status,
270
+ },
271
+ },
272
+ };
273
+
274
+ const isValid = validator(transaction);
275
+ expect(isValid).toBe(true);
276
+ });
277
+ });
278
+
279
+ test("accepts valid currency codes", () => {
280
+ const validator = getValidator(schemaId);
281
+ const validCurrencies = ["GBP", "USD", "EUR"];
282
+
283
+ validCurrencies.forEach((currency) => {
284
+ const transaction = {
285
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
286
+ status: "active",
287
+ participants: [
288
+ {
289
+ role: "Buyer",
290
+ participantStatus: "Active",
291
+ },
292
+ ],
293
+ offers: {
294
+ "offer-1": {
295
+ amount: 250000,
296
+ currency: currency,
297
+ status: "Pending",
298
+ },
299
+ },
300
+ };
301
+
302
+ const isValid = validator(transaction);
303
+ expect(isValid).toBe(true);
304
+ });
305
+ });
306
+
307
+ test("accepts zero amount", () => {
308
+ const validator = getValidator(schemaId);
309
+ const transaction = {
310
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
311
+ status: "active",
312
+ participants: [
313
+ {
314
+ role: "Buyer",
315
+ participantStatus: "Active",
316
+ },
317
+ ],
318
+ offers: {
319
+ "offer-1": {
320
+ amount: 0,
321
+ currency: "GBP",
322
+ status: "Note of Interest",
323
+ },
324
+ },
325
+ };
326
+
327
+ const isValid = validator(transaction);
328
+ expect(isValid).toBe(true);
329
+ });
330
+ });
331
+
332
+ describe("Invalid offer contents", () => {
333
+ test("accepts offer without amount field (no required fields in schema)", () => {
334
+ const validator = getValidator(schemaId);
335
+ const transaction = {
336
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
337
+ status: "active",
338
+ participants: [
339
+ {
340
+ role: "Buyer",
341
+ participantStatus: "Active",
342
+ },
343
+ ],
344
+ offers: {
345
+ "offer-1": {
346
+ currency: "GBP",
347
+ status: "Pending",
348
+ },
349
+ },
350
+ };
351
+
352
+ const isValid = validator(transaction);
353
+ expect(isValid).toBe(true);
354
+ });
355
+
356
+ test("accepts offer without currency field (no required fields in schema)", () => {
357
+ const validator = getValidator(schemaId);
358
+ const transaction = {
359
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
360
+ status: "active",
361
+ participants: [
362
+ {
363
+ role: "Buyer",
364
+ participantStatus: "Active",
365
+ },
366
+ ],
367
+ offers: {
368
+ "offer-1": {
369
+ amount: 250000,
370
+ status: "Pending",
371
+ },
372
+ },
373
+ };
374
+
375
+ const isValid = validator(transaction);
376
+ expect(isValid).toBe(true);
377
+ });
378
+
379
+ test("accepts offer without status field (no required fields in schema)", () => {
380
+ const validator = getValidator(schemaId);
381
+ const transaction = {
382
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
383
+ status: "active",
384
+ participants: [
385
+ {
386
+ role: "Buyer",
387
+ participantStatus: "Active",
388
+ },
389
+ ],
390
+ offers: {
391
+ "offer-1": {
392
+ amount: 250000,
393
+ currency: "GBP",
394
+ },
395
+ },
396
+ };
397
+
398
+ const isValid = validator(transaction);
399
+ expect(isValid).toBe(true);
400
+ });
401
+
402
+ test("rejects offer with invalid status value", () => {
403
+ const validator = getValidator(schemaId);
404
+ const transaction = {
405
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
406
+ status: "active",
407
+ participants: [
408
+ {
409
+ role: "Buyer",
410
+ participantStatus: "Active",
411
+ },
412
+ ],
413
+ offers: {
414
+ "offer-1": {
415
+ amount: 250000,
416
+ currency: "GBP",
417
+ status: "invalid-status",
418
+ },
419
+ },
420
+ };
421
+
422
+ const isValid = validator(transaction);
423
+ expect(isValid).toBe(false);
424
+ });
425
+
426
+ test("rejects offer with negative amount", () => {
427
+ const validator = getValidator(schemaId);
428
+ const transaction = {
429
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
430
+ status: "active",
431
+ participants: [
432
+ {
433
+ role: "Buyer",
434
+ participantStatus: "Active",
435
+ },
436
+ ],
437
+ offers: {
438
+ "offer-1": {
439
+ amount: -100000,
440
+ currency: "GBP",
441
+ status: "Pending",
442
+ },
443
+ },
444
+ };
445
+
446
+ const isValid = validator(transaction);
447
+ expect(isValid).toBe(false);
448
+ });
449
+
450
+ test("rejects offer with invalid currency code format", () => {
451
+ const validator = getValidator(schemaId);
452
+ const transaction = {
453
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
454
+ status: "active",
455
+ participants: [
456
+ {
457
+ role: "Buyer",
458
+ participantStatus: "Active",
459
+ },
460
+ ],
461
+ offers: {
462
+ "offer-1": {
463
+ amount: 250000,
464
+ currency: "gb",
465
+ status: "Pending",
466
+ },
467
+ },
468
+ };
469
+
470
+ const isValid = validator(transaction);
471
+ expect(isValid).toBe(false);
472
+ });
473
+
474
+ test("rejects offer with lowercase currency code", () => {
475
+ const validator = getValidator(schemaId);
476
+ const transaction = {
477
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
478
+ status: "active",
479
+ participants: [
480
+ {
481
+ role: "Buyer",
482
+ participantStatus: "Active",
483
+ },
484
+ ],
485
+ offers: {
486
+ "offer-1": {
487
+ amount: 250000,
488
+ currency: "gbp",
489
+ status: "Pending",
490
+ },
491
+ },
492
+ };
493
+
494
+ const isValid = validator(transaction);
495
+ expect(isValid).toBe(false);
496
+ });
497
+
498
+ test("rejects offer with non-array inclusions", () => {
499
+ const validator = getValidator(schemaId);
500
+ const transaction = {
501
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
502
+ status: "active",
503
+ participants: [
504
+ {
505
+ role: "Buyer",
506
+ participantStatus: "Active",
507
+ },
508
+ ],
509
+ offers: {
510
+ "offer-1": {
511
+ amount: 250000,
512
+ currency: "GBP",
513
+ status: "Pending",
514
+ inclusions: "curtains",
515
+ },
516
+ },
517
+ };
518
+
519
+ const isValid = validator(transaction);
520
+ expect(isValid).toBe(false);
521
+ });
522
+
523
+ test("rejects offer with non-string items in inclusions array", () => {
524
+ const validator = getValidator(schemaId);
525
+ const transaction = {
526
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
527
+ status: "active",
528
+ participants: [
529
+ {
530
+ role: "Buyer",
531
+ participantStatus: "Active",
532
+ },
533
+ ],
534
+ offers: {
535
+ "offer-1": {
536
+ amount: 250000,
537
+ currency: "GBP",
538
+ status: "Pending",
539
+ inclusions: ["curtains", 123, "carpets"],
540
+ },
541
+ },
542
+ };
543
+
544
+ const isValid = validator(transaction);
545
+ expect(isValid).toBe(false);
546
+ });
547
+
548
+ test("rejects offer with non-array exclusions", () => {
549
+ const validator = getValidator(schemaId);
550
+ const transaction = {
551
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
552
+ status: "active",
553
+ participants: [
554
+ {
555
+ role: "Buyer",
556
+ participantStatus: "Active",
557
+ },
558
+ ],
559
+ offers: {
560
+ "offer-1": {
561
+ amount: 250000,
562
+ currency: "GBP",
563
+ status: "Pending",
564
+ exclusions: { item: "garden furniture" },
565
+ },
566
+ },
567
+ };
568
+
569
+ const isValid = validator(transaction);
570
+ expect(isValid).toBe(false);
571
+ });
572
+
573
+ test("rejects offer with non-array conditions", () => {
574
+ const validator = getValidator(schemaId);
575
+ const transaction = {
576
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
577
+ status: "active",
578
+ participants: [
579
+ {
580
+ role: "Buyer",
581
+ participantStatus: "Active",
582
+ },
583
+ ],
584
+ offers: {
585
+ "offer-1": {
586
+ amount: 250000,
587
+ currency: "GBP",
588
+ status: "Pending",
589
+ conditions: "Subject to survey",
590
+ },
591
+ },
592
+ };
593
+
594
+ const isValid = validator(transaction);
595
+ expect(isValid).toBe(false);
596
+ });
597
+ });
598
+
599
+ describe("Empty offers object", () => {
600
+ test("accepts empty offers object", () => {
601
+ const validator = getValidator(schemaId);
602
+ const transaction = {
603
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
604
+ status: "active",
605
+ participants: [
606
+ {
607
+ role: "Buyer",
608
+ participantStatus: "Active",
609
+ },
610
+ ],
611
+ offers: {},
612
+ };
613
+
614
+ const isValid = validator(transaction);
615
+ expect(isValid).toBe(true);
616
+ });
617
+
618
+ test("accepts transaction without offers property", () => {
619
+ const validator = getValidator(schemaId);
620
+ const transaction = {
621
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
622
+ status: "active",
623
+ participants: [
624
+ {
625
+ role: "Buyer",
626
+ participantStatus: "Active",
627
+ },
628
+ ],
629
+ };
630
+
631
+ const isValid = validator(transaction);
632
+ expect(isValid).toBe(true);
633
+ });
634
+ });
635
+
636
+ describe("Buyer participant with offerId", () => {
637
+ test("accepts Buyer with valid offerId", () => {
638
+ const validator = getValidator(schemaId);
639
+ const transaction = {
640
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
641
+ status: "active",
642
+ participants: [
643
+ {
644
+ role: "Buyer",
645
+ participantStatus: "Active",
646
+ offerId: "550e8400-e29b-41d4-a716-446655440000",
647
+ },
648
+ ],
649
+ offers: {
650
+ "550e8400-e29b-41d4-a716-446655440000": {
651
+ amount: 250000,
652
+ currency: "GBP",
653
+ status: "Accepted",
654
+ },
655
+ },
656
+ };
657
+
658
+ const isValid = validator(transaction);
659
+ expect(isValid).toBe(true);
660
+ });
661
+
662
+ test("accepts Buyer with offerId as DID", () => {
663
+ const validator = getValidator(schemaId);
664
+ const transaction = {
665
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
666
+ status: "active",
667
+ participants: [
668
+ {
669
+ role: "Buyer",
670
+ participantStatus: "Active",
671
+ offerId: "did:example:buyer123",
672
+ },
673
+ ],
674
+ offers: {
675
+ "did:example:buyer123": {
676
+ amount: 260000,
677
+ currency: "GBP",
678
+ status: "Accepted",
679
+ },
680
+ },
681
+ };
682
+
683
+ const isValid = validator(transaction);
684
+ expect(isValid).toBe(true);
685
+ });
686
+
687
+ test("accepts Buyer without offerId", () => {
688
+ const validator = getValidator(schemaId);
689
+ const transaction = {
690
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
691
+ status: "active",
692
+ participants: [
693
+ {
694
+ role: "Buyer",
695
+ participantStatus: "Active",
696
+ },
697
+ ],
698
+ };
699
+
700
+ const isValid = validator(transaction);
701
+ expect(isValid).toBe(true);
702
+ });
703
+
704
+ test("rejects Buyer with invalid offerId format starting with dash", () => {
705
+ const validator = getValidator(schemaId);
706
+ const transaction = {
707
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
708
+ status: "active",
709
+ participants: [
710
+ {
711
+ role: "Buyer",
712
+ participantStatus: "Active",
713
+ offerId: "-invalid-offer-id",
714
+ },
715
+ ],
716
+ };
717
+
718
+ const isValid = validator(transaction);
719
+ expect(isValid).toBe(false);
720
+ // Should fail because offerId pattern requires starting with alphanumeric
721
+ const offerIdError = validator.errors.find(
722
+ (e) => e.instancePath.includes("offerId")
723
+ );
724
+ expect(offerIdError).toBeDefined();
725
+ });
726
+
727
+ test("rejects Buyer with offerId containing spaces", () => {
728
+ const validator = getValidator(schemaId);
729
+ const transaction = {
730
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
731
+ status: "active",
732
+ participants: [
733
+ {
734
+ role: "Buyer",
735
+ participantStatus: "Active",
736
+ offerId: "invalid offer id",
737
+ },
738
+ ],
739
+ };
740
+
741
+ const isValid = validator(transaction);
742
+ expect(isValid).toBe(false);
743
+ });
744
+
745
+ test("accepts multiple Buyers with different offerIds", () => {
746
+ const validator = getValidator(schemaId);
747
+ const transaction = {
748
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
749
+ status: "active",
750
+ participants: [
751
+ {
752
+ role: "Buyer",
753
+ participantStatus: "Active",
754
+ offerId: "offer-1",
755
+ },
756
+ {
757
+ role: "Buyer",
758
+ participantStatus: "Active",
759
+ offerId: "offer-2",
760
+ },
761
+ ],
762
+ offers: {
763
+ "offer-1": {
764
+ amount: 250000,
765
+ currency: "GBP",
766
+ status: "Pending",
767
+ },
768
+ "offer-2": {
769
+ amount: 260000,
770
+ currency: "GBP",
771
+ status: "Accepted",
772
+ },
773
+ },
774
+ };
775
+
776
+ const isValid = validator(transaction);
777
+ expect(isValid).toBe(true);
778
+ });
779
+
780
+ test("accepts Buyer with offerId referencing non-existent offer (schema allows this)", () => {
781
+ // Note: The schema doesn't enforce referential integrity between offerId and offers keys
782
+ // This would need to be enforced at the application level
783
+ const validator = getValidator(schemaId);
784
+ const transaction = {
785
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
786
+ status: "active",
787
+ participants: [
788
+ {
789
+ role: "Buyer",
790
+ participantStatus: "Active",
791
+ offerId: "non-existent-offer",
792
+ },
793
+ ],
794
+ offers: {},
795
+ };
796
+
797
+ const isValid = validator(transaction);
798
+ expect(isValid).toBe(true);
799
+ });
800
+
801
+ test("allows offerId on non-Buyer participants (schema doesn't restrict additionalProperties)", () => {
802
+ // Note: The schema uses oneOf with discriminator on role, but doesn't use
803
+ // additionalProperties: false, so extra properties are allowed on all participants
804
+ // This is intentional to maintain flexibility
805
+ const validator = getValidator(schemaId);
806
+ const transaction = {
807
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
808
+ status: "active",
809
+ participants: [
810
+ {
811
+ role: "Seller",
812
+ participantStatus: "Active",
813
+ offerId: "offer-1",
814
+ },
815
+ ],
816
+ };
817
+
818
+ const isValid = validator(transaction);
819
+ // This will actually pass because additionalProperties is not restricted
820
+ expect(isValid).toBe(true);
821
+ });
822
+ });
823
+ });