@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.
- package/charming-napier-57a77c/LICENSE +21 -0
- package/charming-napier-57a77c/README.md +430 -0
- package/charming-napier-57a77c/docs/sef25-extensions-ui-spec.md +355 -0
- package/charming-napier-57a77c/index.js +654 -0
- package/charming-napier-57a77c/package-lock.json +7297 -0
- package/charming-napier-57a77c/package.json +41 -0
- package/charming-napier-57a77c/src/examples/v1/exampleAddParticipantVouch.json +32 -0
- package/charming-napier-57a77c/src/examples/v1/exampleDocumentedVouch.json +40 -0
- package/charming-napier-57a77c/src/examples/v1/exampleElectronicRecord.json +30 -0
- package/charming-napier-57a77c/src/examples/v1/exampleTransaction.json +878 -0
- package/charming-napier-57a77c/src/examples/v1/exampleVouch.json +25 -0
- package/charming-napier-57a77c/src/examples/v2/exampleTransaction.json +901 -0
- package/charming-napier-57a77c/src/examples/v3/exampleAddParticipantVouch.json +38 -0
- package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay.json +55 -0
- package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay2.json +93 -0
- package/charming-napier-57a77c/src/examples/v3/exampleDocumentedVouch.json +47 -0
- package/charming-napier-57a77c/src/examples/v3/exampleElectronicRecord.json +36 -0
- package/charming-napier-57a77c/src/examples/v3/exampleTransaction.json +1038 -0
- package/charming-napier-57a77c/src/examples/v3/exampleVouch.json +32 -0
- package/charming-napier-57a77c/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
- package/charming-napier-57a77c/src/mappings/adf.js +198 -0
- package/charming-napier-57a77c/src/schemas/v1/GeoJSON.json +1279 -0
- package/charming-napier-57a77c/src/schemas/v1/baspiNotes.html +102 -0
- package/charming-napier-57a77c/src/schemas/v1/energy-performance-certificate.json +124 -0
- package/charming-napier-57a77c/src/schemas/v1/freehold-information.json +2051 -0
- package/charming-napier-57a77c/src/schemas/v1/leasehold-information.json +2064 -0
- package/charming-napier-57a77c/src/schemas/v1/legal-information.json +1045 -0
- package/charming-napier-57a77c/src/schemas/v1/material-facts.json +2109 -0
- package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
- package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction.json +191 -0
- package/charming-napier-57a77c/src/schemas/v1/searches/drainage-and-water.json +261 -0
- package/charming-napier-57a77c/src/schemas/v1/searches/local-land-charges.json +69 -0
- package/charming-napier-57a77c/src/schemas/v1/searches/local-searches-required.json +857 -0
- package/charming-napier-57a77c/src/schemas/v1/searches.json +237 -0
- package/charming-napier-57a77c/src/schemas/v1/title-deed.json +841 -0
- package/charming-napier-57a77c/src/schemas/v2/baspiNotes.html +102 -0
- package/charming-napier-57a77c/src/schemas/v2/combined.json +37731 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/baspi.json +8132 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/con29DW.json +705 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/con29R.json +2956 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/fme1.json +1259 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/llc1.json +25 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/lpe1.json +2171 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/nts.json +326 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/oc1.json +2799 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/piq.json +3419 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/rds.json +3736 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/ta10.json +5306 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/ta6.json +4533 -0
- package/charming-napier-57a77c/src/schemas/v2/overlays/ta7.json +1045 -0
- package/charming-napier-57a77c/src/schemas/v2/pdtf-transaction.json +34351 -0
- package/charming-napier-57a77c/src/schemas/v2/skeleton.json +3973 -0
- package/charming-napier-57a77c/src/schemas/v3/combined.json +48153 -0
- package/charming-napier-57a77c/src/schemas/v3/compactSkeleton.txt +4457 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/README.md +299 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/baspi4.json +8027 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/baspi5.json +8177 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/con29DW.json +716 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/con29R.json +2981 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ac.json +333 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/as.json +74 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dk.json +32 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dr.json +73 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/er.json +85 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/fd.json +75 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hi.json +51 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hs.json +73 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ic.json +59 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/jk.json +96 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/la.json +85 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/lc.json +75 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ma.json +90 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mc.json +38 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mi.json +69 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/nd.json +43 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oa.json +24 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oc.json +57 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/pc.json +37 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ph.json +194 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/rw.json +68 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sb.json +73 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sc.json +129 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sd.json +63 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sf.json +74 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sl.json +68 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ta.json +240 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tf.json +103 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tr.json +73 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/wg.json +350 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/fme1.json +1266 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/llc1.json +25 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/lpe1.json +2199 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/nts.json +2157 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/nts2.json +2742 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl.json +1813 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl2.json +2217 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/oc1.json +2817 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/piq.json +3321 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/rds.json +3665 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/sef25.json +1639 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/sr24.json +38 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ta10.json +4654 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ta6.json +4568 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ta6ed6.json +6537 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ta7.json +1537 -0
- package/charming-napier-57a77c/src/schemas/v3/overlays/ta7ed5.json +1551 -0
- package/charming-napier-57a77c/src/schemas/v3/pdtf-transaction.json +41229 -0
- package/charming-napier-57a77c/src/schemas/v3/skeleton.json +5703 -0
- package/charming-napier-57a77c/src/schemas/verifiedClaims/README.md +21 -0
- package/charming-napier-57a77c/src/schemas/verifiedClaims/pdtf-verified-claims.json +447 -0
- package/charming-napier-57a77c/src/tests/v3/buyerCircumstances.test.js +543 -0
- package/charming-napier-57a77c/src/tests/v3/caching.test.js +591 -0
- package/charming-napier-57a77c/src/tests/v3/enquiries.test.js +1096 -0
- package/charming-napier-57a77c/src/tests/v3/extensionOverlays.test.js +1599 -0
- package/charming-napier-57a77c/src/tests/v3/offers.test.js +823 -0
- package/charming-napier-57a77c/src/tests/v3/patternProperties.test.js +688 -0
- package/charming-napier-57a77c/src/tests/v3/ta6ed6.test.js +2374 -0
- package/charming-napier-57a77c/src/tests/v3/ta7ed5.test.js +600 -0
- package/charming-napier-57a77c/src/tests/v3/transactionSchema.test.js +646 -0
- package/charming-napier-57a77c/src/tests/v3/verifiedClaimsValidator.test.js +195 -0
- package/charming-napier-57a77c/src/utils/compactSkeleton.js +84 -0
- package/charming-napier-57a77c/src/utils/countTokens.js +67 -0
- package/charming-napier-57a77c/src/utils/extractExtensionOverlays.js +624 -0
- package/charming-napier-57a77c/src/utils/extractOverlay.js +381 -0
- package/charming-napier-57a77c/src/utils/extractProperties.js +44 -0
- package/charming-napier-57a77c/src/utils/listPathTitles.js +36 -0
- package/charming-napier-57a77c/src/utils/minimalSkeleton.js +85 -0
- package/charming-napier-57a77c/src/utils/pathList.csv +903 -0
- package/charming-napier-57a77c/src/utils/pathSkeleton.js +181 -0
- package/keen-dewdney-6ae15b/LICENSE +21 -0
- package/keen-dewdney-6ae15b/README.md +334 -0
- package/keen-dewdney-6ae15b/index.js +557 -0
- package/keen-dewdney-6ae15b/package-lock.json +7296 -0
- package/keen-dewdney-6ae15b/package.json +39 -0
- package/keen-dewdney-6ae15b/src/examples/v1/exampleAddParticipantVouch.json +32 -0
- package/keen-dewdney-6ae15b/src/examples/v1/exampleDocumentedVouch.json +40 -0
- package/keen-dewdney-6ae15b/src/examples/v1/exampleElectronicRecord.json +30 -0
- package/keen-dewdney-6ae15b/src/examples/v1/exampleTransaction.json +878 -0
- package/keen-dewdney-6ae15b/src/examples/v1/exampleVouch.json +25 -0
- package/keen-dewdney-6ae15b/src/examples/v2/exampleTransaction.json +901 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleAddParticipantVouch.json +35 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay.json +55 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay2.json +93 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleDocumentedVouch.json +44 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleElectronicRecord.json +33 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleTransaction.json +1034 -0
- package/keen-dewdney-6ae15b/src/examples/v3/exampleVouch.json +29 -0
- package/keen-dewdney-6ae15b/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
- package/keen-dewdney-6ae15b/src/mappings/adf.js +198 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/GeoJSON.json +1279 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/baspiNotes.html +102 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/energy-performance-certificate.json +124 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/freehold-information.json +2051 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/leasehold-information.json +2064 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/legal-information.json +1045 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/material-facts.json +2109 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction.json +191 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/searches/drainage-and-water.json +261 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-land-charges.json +69 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-searches-required.json +857 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/searches.json +237 -0
- package/keen-dewdney-6ae15b/src/schemas/v1/title-deed.json +841 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/baspiNotes.html +102 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/combined.json +37731 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/baspi.json +8132 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29DW.json +705 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29R.json +2956 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/fme1.json +1259 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/llc1.json +25 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/lpe1.json +2171 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/nts.json +326 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/oc1.json +2799 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/piq.json +3419 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/rds.json +3736 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta10.json +5306 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta6.json +4533 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta7.json +1045 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/pdtf-transaction.json +34351 -0
- package/keen-dewdney-6ae15b/src/schemas/v2/skeleton.json +3973 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/combined.json +41720 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/compactSkeleton.txt +3325 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/README.md +299 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi4.json +7872 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi5.json +8019 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29DW.json +716 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29R.json +2981 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/as.json +72 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/dr.json +73 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/er.json +83 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/fd.json +72 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hi.json +48 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hs.json +71 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/jk.json +76 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/la.json +83 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/ma.json +87 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/mc.json +36 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oa.json +22 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oc.json +55 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sb.json +71 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sf.json +72 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sl.json +66 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/tf.json +100 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/fme1.json +1264 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/llc1.json +25 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/lpe1.json +2226 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts.json +2090 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts2.json +2678 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl.json +1746 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl2.json +2153 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/oc1.json +2817 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/piq.json +3276 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/rds.json +3552 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/sr24.json +38 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta10.json +4642 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta6.json +4501 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta7.json +1435 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/pdtf-transaction.json +37225 -0
- package/keen-dewdney-6ae15b/src/schemas/v3/skeleton.json +4323 -0
- package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/README.md +12 -0
- package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/pdtf-verified-claims.json +431 -0
- package/keen-dewdney-6ae15b/src/tests/v3/caching.test.js +591 -0
- package/keen-dewdney-6ae15b/src/tests/v3/extensionOverlays.test.js +525 -0
- package/keen-dewdney-6ae15b/src/tests/v3/transactionSchema.test.js +574 -0
- package/keen-dewdney-6ae15b/src/tests/v3/verifiedClaimsValidator.test.js +128 -0
- package/keen-dewdney-6ae15b/src/utils/compactSkeleton.js +84 -0
- package/keen-dewdney-6ae15b/src/utils/countTokens.js +67 -0
- package/keen-dewdney-6ae15b/src/utils/extractExtensionOverlays.js +362 -0
- package/keen-dewdney-6ae15b/src/utils/extractOverlay.js +290 -0
- package/keen-dewdney-6ae15b/src/utils/extractProperties.js +44 -0
- package/keen-dewdney-6ae15b/src/utils/listPathTitles.js +36 -0
- package/keen-dewdney-6ae15b/src/utils/minimalSkeleton.js +85 -0
- package/keen-dewdney-6ae15b/src/utils/pathList.csv +903 -0
- package/keen-dewdney-6ae15b/src/utils/pathSkeleton.js +181 -0
- package/package.json +1 -1
- package/src/schemas/v3/combined.json +8 -15
- package/src/schemas/v3/overlays/baspi4.json +12 -7
- package/src/schemas/v3/overlays/baspi5.json +12 -7
- package/src/schemas/v3/overlays/extensions/ac.json +2 -1
- package/src/schemas/v3/overlays/extensions/dk.json +3 -2
- package/src/schemas/v3/overlays/extensions/ic.json +2 -1
- package/src/schemas/v3/overlays/extensions/lc.json +3 -2
- package/src/schemas/v3/overlays/extensions/mi.json +2 -1
- package/src/schemas/v3/overlays/extensions/nd.json +3 -2
- package/src/schemas/v3/overlays/extensions/pc.json +3 -2
- package/src/schemas/v3/overlays/extensions/ph.json +2 -1
- package/src/schemas/v3/overlays/extensions/rw.json +4 -3
- package/src/schemas/v3/overlays/extensions/sc.json +8 -4
- package/src/schemas/v3/overlays/extensions/sd.json +3 -2
- package/src/schemas/v3/overlays/extensions/tr.json +3 -2
- package/src/schemas/v3/overlays/extensions/wg.json +2 -1
- package/src/schemas/v3/overlays/lpe1.json +1 -1
- package/src/schemas/v3/overlays/nts.json +3 -1
- package/src/schemas/v3/overlays/nts2.json +3 -1
- package/src/schemas/v3/overlays/ntsl.json +3 -1
- package/src/schemas/v3/overlays/ntsl2.json +3 -1
- package/src/schemas/v3/overlays/piq.json +7 -5
- package/src/schemas/v3/overlays/rds.json +9 -6
- package/src/schemas/v3/overlays/ta10.json +0 -9
- package/src/schemas/v3/overlays/ta6.json +8 -4
- package/src/schemas/v3/overlays/ta6ed6.json +4 -2
- package/src/schemas/v3/pdtf-transaction.json +15 -18
- package/src/utils/extractExtensionOverlays.js +10 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
const {
|
|
2
|
+
getTransactionSchema,
|
|
3
|
+
extensionOverlays,
|
|
4
|
+
getValidator,
|
|
5
|
+
} = require("../../../index.js");
|
|
6
|
+
|
|
7
|
+
const schemaId =
|
|
8
|
+
"https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json";
|
|
9
|
+
|
|
10
|
+
describe("Extension Overlays", () => {
|
|
11
|
+
describe("String key support", () => {
|
|
12
|
+
test("should load extension overlays using string keys", () => {
|
|
13
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "jk"]);
|
|
14
|
+
const jkProp =
|
|
15
|
+
schema.properties?.propertyPack?.properties?.specialistIssues
|
|
16
|
+
?.properties?.japaneseKnotweed;
|
|
17
|
+
|
|
18
|
+
expect(jkProp).toBeDefined();
|
|
19
|
+
expect(jkProp.ntsRef).toBe("A5.3");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("should work with multiple extension string keys", () => {
|
|
23
|
+
const schema = getTransactionSchema(schemaId, [
|
|
24
|
+
"nts2023",
|
|
25
|
+
"jk",
|
|
26
|
+
"tf",
|
|
27
|
+
"ma",
|
|
28
|
+
"er",
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
const jkProp =
|
|
32
|
+
schema.properties?.propertyPack?.properties?.specialistIssues
|
|
33
|
+
?.properties?.japaneseKnotweed;
|
|
34
|
+
const tfProp =
|
|
35
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
36
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
37
|
+
?.leaseholdInformation?.properties?.serviceCharge?.oneOf?.[1]
|
|
38
|
+
?.properties?.transferFees;
|
|
39
|
+
const maProp =
|
|
40
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
41
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
42
|
+
?.leaseholdInformation?.properties?.contactDetails;
|
|
43
|
+
const erProp =
|
|
44
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
45
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[0]?.properties
|
|
46
|
+
?.estateRentcharges;
|
|
47
|
+
|
|
48
|
+
expect(jkProp?.ntsRef).toBe("A5.3");
|
|
49
|
+
expect(tfProp?.ntsRef).toBe("A3.5.1.1");
|
|
50
|
+
expect(maProp?.ntsRef).toBe("A1.5.4");
|
|
51
|
+
expect(erProp?.ntsRef).toBe("A3.4");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("Individual extension functionality", () => {
|
|
56
|
+
test("should add Japanese Knotweed extension correctly", () => {
|
|
57
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "jk"]);
|
|
58
|
+
const jkProp =
|
|
59
|
+
schema.properties?.propertyPack?.properties?.specialistIssues
|
|
60
|
+
?.properties?.japaneseKnotweed;
|
|
61
|
+
|
|
62
|
+
expect(jkProp).toBeDefined();
|
|
63
|
+
|
|
64
|
+
expect(jkProp.ntsRef).toBe("A5.3");
|
|
65
|
+
expect(jkProp.required).toContain("yesNo");
|
|
66
|
+
expect(jkProp.discriminator?.propertyName).toBe("yesNo");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("should add Transfer Fees extension correctly", () => {
|
|
70
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "tf"]);
|
|
71
|
+
const tfProp =
|
|
72
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
73
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
74
|
+
?.leaseholdInformation?.properties?.serviceCharge?.oneOf?.[1]
|
|
75
|
+
?.properties?.transferFees;
|
|
76
|
+
|
|
77
|
+
expect(tfProp).toBeDefined();
|
|
78
|
+
expect(tfProp.ntsRef).toBe("A3.5.1.1");
|
|
79
|
+
expect(tfProp.title).toBe(
|
|
80
|
+
"Are there any additional fees payable on sale or letting?"
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("should add Managing Agent extension correctly", () => {
|
|
85
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "ma"]);
|
|
86
|
+
const maProp =
|
|
87
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
88
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
89
|
+
?.leaseholdInformation?.properties?.contactDetails;
|
|
90
|
+
|
|
91
|
+
expect(maProp).toBeDefined();
|
|
92
|
+
expect(maProp.ntsRef).toBe("A1.5.4");
|
|
93
|
+
expect(maProp.required).toContain("contacts");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("should add Solar Panels extension correctly", () => {
|
|
97
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "sl"]);
|
|
98
|
+
const slProp =
|
|
99
|
+
schema.properties?.propertyPack?.properties?.electricity?.properties
|
|
100
|
+
?.solarPanels?.oneOf?.[1]?.properties?.panelsOwnedOutright;
|
|
101
|
+
|
|
102
|
+
expect(slProp).toBeDefined();
|
|
103
|
+
expect(slProp.ntsRef).toBe("B3.7.1");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("should add Heating Installation extension correctly", () => {
|
|
107
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "hi"]);
|
|
108
|
+
const hiProp =
|
|
109
|
+
schema.properties?.propertyPack?.properties?.heating?.properties
|
|
110
|
+
?.heatingSystem?.oneOf?.[1]?.properties?.centralHeatingDetails
|
|
111
|
+
?.properties?.centralHeatingInstalled;
|
|
112
|
+
|
|
113
|
+
expect(hiProp).toBeDefined();
|
|
114
|
+
expect(hiProp.ntsRef).toBe("B3.4.3.2");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("should add Estate Rentcharges extension correctly", () => {
|
|
118
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "er"]);
|
|
119
|
+
const erProp =
|
|
120
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
121
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[0]?.properties
|
|
122
|
+
?.estateRentcharges;
|
|
123
|
+
|
|
124
|
+
expect(erProp).toBeDefined();
|
|
125
|
+
|
|
126
|
+
expect(erProp.ntsRef).toBe("A3.4");
|
|
127
|
+
expect(erProp.required).toContain("yesNo");
|
|
128
|
+
expect(erProp.discriminator?.propertyName).toBe("yesNo");
|
|
129
|
+
expect(erProp.oneOf).toBeDefined();
|
|
130
|
+
expect(Array.isArray(erProp.oneOf)).toBe(true);
|
|
131
|
+
expect(erProp.oneOf.length).toBeGreaterThan(0);
|
|
132
|
+
|
|
133
|
+
// Check the conditional branch for "Yes" response
|
|
134
|
+
const yesBranch = erProp.oneOf.find(
|
|
135
|
+
(branch) =>
|
|
136
|
+
branch.required?.includes("details") &&
|
|
137
|
+
branch.required?.includes("amount")
|
|
138
|
+
);
|
|
139
|
+
expect(yesBranch).toBeDefined();
|
|
140
|
+
expect(yesBranch.properties?.details?.ntsRef).toBe("A3.4.2");
|
|
141
|
+
expect(yesBranch.properties?.amount?.ntsRef).toBe("A3.4.3");
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("Extension overlay availability", () => {
|
|
146
|
+
test("should export all extension overlays", () => {
|
|
147
|
+
const expectedKeys = [
|
|
148
|
+
"as",
|
|
149
|
+
"dr",
|
|
150
|
+
"jk",
|
|
151
|
+
"sb",
|
|
152
|
+
"hs", // Specialist Issues
|
|
153
|
+
"oa",
|
|
154
|
+
"la",
|
|
155
|
+
"sf",
|
|
156
|
+
"mc", // Property Features
|
|
157
|
+
"er",
|
|
158
|
+
"ma",
|
|
159
|
+
"tf", // Ownership & Financial
|
|
160
|
+
"sl",
|
|
161
|
+
"hi",
|
|
162
|
+
"fd", // Utilities & Services
|
|
163
|
+
"oc", // Transaction
|
|
164
|
+
];
|
|
165
|
+
|
|
166
|
+
expect(Object.keys(extensionOverlays).sort()).toEqual(
|
|
167
|
+
expectedKeys.sort()
|
|
168
|
+
);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test("should have valid JSON structure for all extensions", () => {
|
|
172
|
+
Object.entries(extensionOverlays).forEach(([key, overlay]) => {
|
|
173
|
+
expect(overlay).toBeDefined();
|
|
174
|
+
expect(overlay.$schema).toBe("http://json-schema.org/draft-07/schema#");
|
|
175
|
+
expect(overlay.$id).toContain(`extensions/${key}.json`);
|
|
176
|
+
expect(overlay.properties).toBeDefined();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
describe("NTS2 equivalence test", () => {
|
|
182
|
+
test("should produce equivalent result to nts2 when all relevant extensions are combined", () => {
|
|
183
|
+
// Get the full NTS2 schema
|
|
184
|
+
const nts2Schema = getTransactionSchema(schemaId, ["nts2025"]);
|
|
185
|
+
|
|
186
|
+
// Get NTS base with all relevant extensions
|
|
187
|
+
const allExtensions = [
|
|
188
|
+
"nts2023",
|
|
189
|
+
// Specialist issues extensions
|
|
190
|
+
"as",
|
|
191
|
+
"dr",
|
|
192
|
+
"jk",
|
|
193
|
+
"sb",
|
|
194
|
+
"hs",
|
|
195
|
+
// Property features extensions
|
|
196
|
+
"oa",
|
|
197
|
+
"la",
|
|
198
|
+
"sf",
|
|
199
|
+
"mc",
|
|
200
|
+
// Ownership & financial extensions
|
|
201
|
+
"er",
|
|
202
|
+
"ma",
|
|
203
|
+
"tf",
|
|
204
|
+
// Utilities & services extensions
|
|
205
|
+
"sl",
|
|
206
|
+
"hi",
|
|
207
|
+
"fd",
|
|
208
|
+
// Transaction extensions
|
|
209
|
+
"oc",
|
|
210
|
+
];
|
|
211
|
+
|
|
212
|
+
const ntsWithAllExtensions = getTransactionSchema(
|
|
213
|
+
schemaId,
|
|
214
|
+
allExtensions
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
// Compare key structural elements
|
|
218
|
+
const nts2PropPack = nts2Schema.properties?.propertyPack;
|
|
219
|
+
const extPropPack = ntsWithAllExtensions.properties?.propertyPack;
|
|
220
|
+
|
|
221
|
+
// Check that specialist issues section exists in both
|
|
222
|
+
expect(nts2PropPack?.properties?.specialistIssues).toBeDefined();
|
|
223
|
+
expect(extPropPack?.properties?.specialistIssues).toBeDefined();
|
|
224
|
+
|
|
225
|
+
// Check key specialist issues properties
|
|
226
|
+
const nts2SI = nts2PropPack.properties.specialistIssues.properties;
|
|
227
|
+
const extSI = extPropPack.properties.specialistIssues.properties;
|
|
228
|
+
|
|
229
|
+
expect(extSI?.japaneseKnotweed).toBeDefined();
|
|
230
|
+
expect(extSI?.dryRotEtcTreatment).toBeDefined();
|
|
231
|
+
expect(extSI?.containsAsbestos).toBeDefined();
|
|
232
|
+
expect(extSI?.subsidenceOrStructuralFault).toBeDefined();
|
|
233
|
+
expect(extSI?.ongoingHealthOrSafetyIssue).toBeDefined();
|
|
234
|
+
|
|
235
|
+
// Check that references match (extensions use ntsRef, NTS2 uses nts2Ref)
|
|
236
|
+
if (nts2SI?.japaneseKnotweed && extSI?.japaneseKnotweed) {
|
|
237
|
+
expect(extSI.japaneseKnotweed.ntsRef).toBe("A5.3");
|
|
238
|
+
// NTS2 might have nts2Ref instead - this is expected difference
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Check outside areas
|
|
242
|
+
expect(
|
|
243
|
+
extPropPack?.properties?.residentialPropertyFeatures?.properties
|
|
244
|
+
?.outsideAreas
|
|
245
|
+
).toBeDefined();
|
|
246
|
+
|
|
247
|
+
// Check leasehold extensions
|
|
248
|
+
const leaseholdInfo =
|
|
249
|
+
extPropPack?.properties?.ownership?.properties
|
|
250
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
251
|
+
?.leaseholdInformation;
|
|
252
|
+
expect(leaseholdInfo?.properties?.contactDetails).toBeDefined(); // Managing agent
|
|
253
|
+
expect(
|
|
254
|
+
leaseholdInfo?.properties?.serviceCharge?.oneOf?.[1]?.properties
|
|
255
|
+
?.transferFees
|
|
256
|
+
).toBeDefined(); // Transfer fees
|
|
257
|
+
|
|
258
|
+
// Check utility extensions
|
|
259
|
+
expect(
|
|
260
|
+
extPropPack?.properties?.electricity?.properties?.solarPanels
|
|
261
|
+
?.oneOf?.[1]?.properties?.panelsOwnedOutright
|
|
262
|
+
).toBeDefined();
|
|
263
|
+
expect(
|
|
264
|
+
extPropPack?.properties?.heating?.properties?.heatingSystem?.oneOf?.[1]
|
|
265
|
+
?.properties?.centralHeatingDetails?.properties
|
|
266
|
+
?.centralHeatingInstalled
|
|
267
|
+
).toBeDefined();
|
|
268
|
+
|
|
269
|
+
// Check construction extensions
|
|
270
|
+
expect(
|
|
271
|
+
extPropPack?.properties?.typeOfConstruction?.properties?.loft
|
|
272
|
+
).toBeDefined();
|
|
273
|
+
expect(
|
|
274
|
+
extPropPack?.properties?.typeOfConstruction?.properties
|
|
275
|
+
?.sprayFoamInsulation
|
|
276
|
+
).toBeDefined();
|
|
277
|
+
|
|
278
|
+
// Check completion and moving
|
|
279
|
+
expect(
|
|
280
|
+
extPropPack?.properties?.completionAndMoving?.properties
|
|
281
|
+
?.otherPropertyInChain
|
|
282
|
+
).toBeDefined();
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test("should validate data successfully with all extensions", () => {
|
|
286
|
+
const allExtensions = [
|
|
287
|
+
"nts2023",
|
|
288
|
+
"as",
|
|
289
|
+
"dr",
|
|
290
|
+
"jk",
|
|
291
|
+
"sb",
|
|
292
|
+
"hs",
|
|
293
|
+
"oa",
|
|
294
|
+
"la",
|
|
295
|
+
"sf",
|
|
296
|
+
"mc",
|
|
297
|
+
"er",
|
|
298
|
+
"ma",
|
|
299
|
+
"tf",
|
|
300
|
+
"sl",
|
|
301
|
+
"hi",
|
|
302
|
+
"fd",
|
|
303
|
+
"oc",
|
|
304
|
+
];
|
|
305
|
+
|
|
306
|
+
const validator = getValidator(schemaId, allExtensions);
|
|
307
|
+
expect(validator).toBeDefined();
|
|
308
|
+
expect(typeof validator).toBe("function");
|
|
309
|
+
|
|
310
|
+
// Test with minimal valid data structure
|
|
311
|
+
const testData = {
|
|
312
|
+
propertyPack: {
|
|
313
|
+
priceInformation: { price: 100000, priceQualifier: "Freehold" },
|
|
314
|
+
ownership: { ownershipsToBeTransferred: [] },
|
|
315
|
+
councilTax: { band: "A" },
|
|
316
|
+
energyEfficiency: { epcRating: "C" },
|
|
317
|
+
buildInformation: { building: { buildDate: 2000 } },
|
|
318
|
+
typeOfConstruction: { isStandardForm: { yesNo: "Yes" } },
|
|
319
|
+
electricity: { mainsElectricity: { yesNo: "Yes" } },
|
|
320
|
+
connectivity: { mobilePhoneCoverage: { signal: "Good" } },
|
|
321
|
+
waterAndDrainage: { water: { supplier: "Thames Water" } },
|
|
322
|
+
heating: { heatingSystem: { yesNo: "Yes" } },
|
|
323
|
+
parking: { parkingArrangements: { yesNo: "No" } },
|
|
324
|
+
listingAndConservation: { listedBuilding: { yesNo: "No" } },
|
|
325
|
+
rightsAndInformalArrangements: { rightsGranted: { yesNo: "No" } },
|
|
326
|
+
environmentalIssues: { flooding: { yesNo: "No" } },
|
|
327
|
+
notices: { noticesAndProposals: { yesNo: "No" } },
|
|
328
|
+
specialistIssues: {
|
|
329
|
+
japaneseKnotweed: { yesNo: "No" },
|
|
330
|
+
dryRotEtcTreatment: { yesNo: "No" },
|
|
331
|
+
containsAsbestos: { yesNo: "No" },
|
|
332
|
+
subsidenceOrStructuralFault: { yesNo: "No" },
|
|
333
|
+
ongoingHealthOrSafetyIssue: { yesNo: "No" },
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// This might not validate due to missing required fields, but validator should not throw
|
|
339
|
+
expect(() => validator(testData)).not.toThrow();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
describe("Extension merging behavior", () => {
|
|
344
|
+
test("should preserve required arrays when merging extensions", () => {
|
|
345
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "jk", "as"]);
|
|
346
|
+
const siSection =
|
|
347
|
+
schema.properties?.propertyPack?.properties?.specialistIssues;
|
|
348
|
+
|
|
349
|
+
expect(siSection?.required).toBeDefined();
|
|
350
|
+
expect(siSection.required).toContain("japaneseKnotweed");
|
|
351
|
+
expect(siSection.required).toContain("containsAsbestos");
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
test("should make estateRentcharges required when er extension is applied", () => {
|
|
355
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "er"]);
|
|
356
|
+
|
|
357
|
+
// Check that estateRentcharges is required at the oneOf branch level
|
|
358
|
+
const freeholdBranch =
|
|
359
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
360
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[0];
|
|
361
|
+
|
|
362
|
+
expect(freeholdBranch).toBeDefined();
|
|
363
|
+
expect(freeholdBranch.required).toBeDefined();
|
|
364
|
+
expect(freeholdBranch.required).toContain("estateRentcharges");
|
|
365
|
+
|
|
366
|
+
// Verify the estateRentcharges property itself is properly structured
|
|
367
|
+
const erProp = freeholdBranch.properties?.estateRentcharges;
|
|
368
|
+
expect(erProp).toBeDefined();
|
|
369
|
+
expect(erProp.ntsRef).toBe("A3.4");
|
|
370
|
+
expect(erProp.required).toContain("yesNo");
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
test("should consistently apply required fields at parent level for extension properties", () => {
|
|
374
|
+
// Test multiple extensions that should have required fields at parent level
|
|
375
|
+
const schema = getTransactionSchema(schemaId, [
|
|
376
|
+
"nts2023",
|
|
377
|
+
"jk",
|
|
378
|
+
"er",
|
|
379
|
+
"ma",
|
|
380
|
+
"tf",
|
|
381
|
+
]);
|
|
382
|
+
|
|
383
|
+
// Check specialist issues - japaneseKnotweed should be required
|
|
384
|
+
const siSection =
|
|
385
|
+
schema.properties?.propertyPack?.properties?.specialistIssues;
|
|
386
|
+
expect(siSection?.required).toContain("japaneseKnotweed");
|
|
387
|
+
|
|
388
|
+
// Check ownership - estateRentcharges should be required in freehold branch
|
|
389
|
+
const freeholdBranch =
|
|
390
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
391
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[0];
|
|
392
|
+
expect(freeholdBranch?.required).toContain("estateRentcharges");
|
|
393
|
+
|
|
394
|
+
// Check leasehold - leaseholdInformation should be required in leasehold branch
|
|
395
|
+
const leaseholdBranch =
|
|
396
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
397
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2];
|
|
398
|
+
expect(leaseholdBranch?.required).toContain("leaseholdInformation");
|
|
399
|
+
|
|
400
|
+
// Verify that the required arrays are properly merged (not overwritten)
|
|
401
|
+
// Note: The length check might fail if only one extension is applied to specialistIssues
|
|
402
|
+
// Let's check what's actually in the required arrays
|
|
403
|
+
console.log("SpecialistIssues required:", siSection?.required);
|
|
404
|
+
console.log("FreeholdBranch required:", freeholdBranch?.required);
|
|
405
|
+
console.log("LeaseholdBranch required:", leaseholdBranch?.required);
|
|
406
|
+
|
|
407
|
+
expect(siSection.required.length).toBeGreaterThanOrEqual(1);
|
|
408
|
+
expect(freeholdBranch.required.length).toBeGreaterThan(0);
|
|
409
|
+
expect(leaseholdBranch.required.length).toBeGreaterThan(0);
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
test("should merge required arrays for multiple specialist issues overlays", () => {
|
|
413
|
+
// Apply multiple specialist issues overlays
|
|
414
|
+
const overlays = ["nts2023", "jk", "as", "dr", "sb", "hs"];
|
|
415
|
+
const schema = getTransactionSchema(schemaId, overlays);
|
|
416
|
+
const siSection =
|
|
417
|
+
schema.properties?.propertyPack?.properties?.specialistIssues;
|
|
418
|
+
|
|
419
|
+
// The overlays correspond to these property keys
|
|
420
|
+
const expectedRequired = [
|
|
421
|
+
"japaneseKnotweed",
|
|
422
|
+
"containsAsbestos",
|
|
423
|
+
"dryRotEtcTreatment",
|
|
424
|
+
"subsidenceOrStructuralFault",
|
|
425
|
+
"ongoingHealthOrSafetyIssue",
|
|
426
|
+
];
|
|
427
|
+
|
|
428
|
+
expect(siSection?.required).toBeDefined();
|
|
429
|
+
// Should contain all expected keys
|
|
430
|
+
expectedRequired.forEach((key) => {
|
|
431
|
+
expect(siSection.required).toContain(key);
|
|
432
|
+
});
|
|
433
|
+
// Should be the same length as the number of overlays (excluding nts2023)
|
|
434
|
+
expect(siSection.required.length).toBe(expectedRequired.length);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
test("should handle discriminator patterns correctly", () => {
|
|
438
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "jk"]);
|
|
439
|
+
const jkProp =
|
|
440
|
+
schema.properties?.propertyPack?.properties?.specialistIssues
|
|
441
|
+
?.properties?.japaneseKnotweed;
|
|
442
|
+
|
|
443
|
+
expect(jkProp?.discriminator).toBeDefined();
|
|
444
|
+
expect(jkProp.discriminator.propertyName).toBe("yesNo");
|
|
445
|
+
expect(jkProp.oneOf).toBeDefined();
|
|
446
|
+
expect(Array.isArray(jkProp.oneOf)).toBe(true);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
test("should merge oneOf schemas correctly", () => {
|
|
450
|
+
const schema = getTransactionSchema(schemaId, ["nts2023", "tf"]);
|
|
451
|
+
const tfProp =
|
|
452
|
+
schema.properties?.propertyPack?.properties?.ownership?.properties
|
|
453
|
+
?.ownershipsToBeTransferred?.items?.oneOf?.[2]?.properties
|
|
454
|
+
?.leaseholdInformation?.properties?.serviceCharge?.oneOf?.[1]
|
|
455
|
+
?.properties?.transferFees;
|
|
456
|
+
|
|
457
|
+
expect(tfProp?.oneOf).toBeDefined();
|
|
458
|
+
expect(tfProp.oneOf.length).toBeGreaterThan(0);
|
|
459
|
+
|
|
460
|
+
// Check the structure - details should be in the conditional oneOf branch
|
|
461
|
+
const conditionalBranch = tfProp.oneOf.find(
|
|
462
|
+
(branch) =>
|
|
463
|
+
branch.properties?.details || branch.required?.includes("details")
|
|
464
|
+
);
|
|
465
|
+
expect(conditionalBranch).toBeDefined();
|
|
466
|
+
expect(
|
|
467
|
+
conditionalBranch.properties?.details ||
|
|
468
|
+
conditionalBranch.required?.includes("details")
|
|
469
|
+
).toBeTruthy();
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
test("should not require additional fields when 'No' is selected in extension overlays", () => {
|
|
473
|
+
// Test the 'as' (additional searches) extension overlay
|
|
474
|
+
const schema = getTransactionSchema(schemaId, ["as"]);
|
|
475
|
+
|
|
476
|
+
const containsAsbestos =
|
|
477
|
+
schema.properties?.propertyPack?.properties?.specialistIssues
|
|
478
|
+
?.properties?.containsAsbestos;
|
|
479
|
+
|
|
480
|
+
expect(containsAsbestos).toBeDefined();
|
|
481
|
+
expect(containsAsbestos.discriminator?.propertyName).toBe("yesNo");
|
|
482
|
+
expect(containsAsbestos.oneOf).toBeDefined();
|
|
483
|
+
expect(containsAsbestos.oneOf).toHaveLength(2); // Both "No" and "Yes" branches
|
|
484
|
+
|
|
485
|
+
// Find the "No" branch - it should not have additional required fields
|
|
486
|
+
const noBranch = containsAsbestos.oneOf.find((branch) =>
|
|
487
|
+
branch.properties?.yesNo?.enum?.includes("No")
|
|
488
|
+
);
|
|
489
|
+
expect(noBranch).toBeDefined();
|
|
490
|
+
expect(noBranch.properties.yesNo.enum).toEqual(["No"]);
|
|
491
|
+
// The "No" branch should not have additional required fields beyond "yesNo"
|
|
492
|
+
expect(noBranch.required).toBeUndefined();
|
|
493
|
+
|
|
494
|
+
// Find the "Yes" branch - it should have additional required fields
|
|
495
|
+
const yesBranch = containsAsbestos.oneOf.find((branch) =>
|
|
496
|
+
branch.properties?.yesNo?.enum?.includes("Yes")
|
|
497
|
+
);
|
|
498
|
+
expect(yesBranch).toBeDefined();
|
|
499
|
+
expect(yesBranch.properties.yesNo.enum).toEqual(["Yes"]);
|
|
500
|
+
expect(yesBranch.required).toBeDefined();
|
|
501
|
+
expect(yesBranch.required).toContain("details");
|
|
502
|
+
|
|
503
|
+
// Test that data with "No" answer validates correctly using subschema validation
|
|
504
|
+
const { getSubschemaValidator } = require("../../../index.js");
|
|
505
|
+
const subschemaValidator = getSubschemaValidator(
|
|
506
|
+
"/propertyPack/specialistIssues/containsAsbestos",
|
|
507
|
+
schemaId,
|
|
508
|
+
["as"]
|
|
509
|
+
);
|
|
510
|
+
|
|
511
|
+
const validDataWithNo = {
|
|
512
|
+
yesNo: "No",
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
const result = subschemaValidator(validDataWithNo);
|
|
516
|
+
// Handle both boolean and object return types
|
|
517
|
+
if (typeof result === "boolean") {
|
|
518
|
+
expect(result).toBe(true);
|
|
519
|
+
} else {
|
|
520
|
+
expect(result.valid).toBe(true);
|
|
521
|
+
expect(result.errors).toHaveLength(0);
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
});
|