@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,557 @@
|
|
|
1
|
+
const merge = require("deepmerge");
|
|
2
|
+
const Ajv = require("ajv");
|
|
3
|
+
const addFormats = require("ajv-formats");
|
|
4
|
+
const ajv = new Ajv({
|
|
5
|
+
allErrors: true,
|
|
6
|
+
// schema contains additional baspiRef and RDSRef metadata which is not strictly valid
|
|
7
|
+
strictSchema: false,
|
|
8
|
+
discriminator: true,
|
|
9
|
+
});
|
|
10
|
+
// Adds date formats among other types to the validator.
|
|
11
|
+
addFormats(ajv);
|
|
12
|
+
|
|
13
|
+
// Enhanced caching structure for subschemas and validators
|
|
14
|
+
const schemaCache = new Map();
|
|
15
|
+
|
|
16
|
+
// Cache performance tracking
|
|
17
|
+
const cacheStats = {
|
|
18
|
+
hits: 0,
|
|
19
|
+
misses: 0,
|
|
20
|
+
totalQueries: 0,
|
|
21
|
+
cacheStartTime: Date.now()
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const verifiedClaimsSchema = require("./src/schemas/verifiedClaims/pdtf-verified-claims.json");
|
|
25
|
+
const v2CoreSchema = require("./src/schemas/v2/pdtf-transaction.json");
|
|
26
|
+
const v3CoreSchema = require("./src/schemas/v3/pdtf-transaction.json");
|
|
27
|
+
|
|
28
|
+
// Extension overlays for v3
|
|
29
|
+
const extensionOverlays = {
|
|
30
|
+
// Specialist Issues Extensions
|
|
31
|
+
as: require("./src/schemas/v3/overlays/extensions/as.json"),
|
|
32
|
+
dr: require("./src/schemas/v3/overlays/extensions/dr.json"),
|
|
33
|
+
jk: require("./src/schemas/v3/overlays/extensions/jk.json"),
|
|
34
|
+
sb: require("./src/schemas/v3/overlays/extensions/sb.json"),
|
|
35
|
+
hs: require("./src/schemas/v3/overlays/extensions/hs.json"),
|
|
36
|
+
|
|
37
|
+
// Property Features Extensions
|
|
38
|
+
oa: require("./src/schemas/v3/overlays/extensions/oa.json"),
|
|
39
|
+
la: require("./src/schemas/v3/overlays/extensions/la.json"),
|
|
40
|
+
sf: require("./src/schemas/v3/overlays/extensions/sf.json"),
|
|
41
|
+
mc: require("./src/schemas/v3/overlays/extensions/mc.json"),
|
|
42
|
+
|
|
43
|
+
// Ownership & Financial Extensions
|
|
44
|
+
er: require("./src/schemas/v3/overlays/extensions/er.json"),
|
|
45
|
+
ma: require("./src/schemas/v3/overlays/extensions/ma.json"),
|
|
46
|
+
tf: require("./src/schemas/v3/overlays/extensions/tf.json"),
|
|
47
|
+
|
|
48
|
+
// Utilities & Services Extensions
|
|
49
|
+
sl: require("./src/schemas/v3/overlays/extensions/sl.json"),
|
|
50
|
+
hi: require("./src/schemas/v3/overlays/extensions/hi.json"),
|
|
51
|
+
fd: require("./src/schemas/v3/overlays/extensions/fd.json"),
|
|
52
|
+
|
|
53
|
+
// Transaction Extensions
|
|
54
|
+
oc: require("./src/schemas/v3/overlays/extensions/oc.json"),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const overlaysMap = {
|
|
58
|
+
"https://trust.propdata.org.uk/schemas/v2/pdtf-transaction.json": {
|
|
59
|
+
baspiV4: require("./src/schemas/v2/overlays/baspi.json"),
|
|
60
|
+
ta6ed4: require("./src/schemas/v2/overlays/ta6.json"),
|
|
61
|
+
ta7ed3: require("./src/schemas/v2/overlays/ta7.json"),
|
|
62
|
+
ta10ed3: require("./src/schemas/v2/overlays/ta10.json"),
|
|
63
|
+
lpe1ed4: require("./src/schemas/v2/overlays/lpe1.json"),
|
|
64
|
+
fme1ed2: require("./src/schemas/v2/overlays/fme1.json"),
|
|
65
|
+
llc1v2: require("./src/schemas/v2/overlays/llc1.json"),
|
|
66
|
+
nts2023: require("./src/schemas/v2/overlays/nts.json"),
|
|
67
|
+
con29R2019: require("./src/schemas/v2/overlays/con29R.json"),
|
|
68
|
+
con29DW: require("./src/schemas/v2/overlays/con29DW.json"),
|
|
69
|
+
rdsV333: require("./src/schemas/v2/overlays/rds.json"),
|
|
70
|
+
oc1v21: require("./src/schemas/v2/overlays/oc1.json"),
|
|
71
|
+
piqV3: require("./src/schemas/v2/overlays/piq.json"),
|
|
72
|
+
null: {},
|
|
73
|
+
},
|
|
74
|
+
"https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json": {
|
|
75
|
+
baspiV4: require("./src/schemas/v3/overlays/baspi4.json"),
|
|
76
|
+
baspiV5: require("./src/schemas/v3/overlays/baspi5.json"),
|
|
77
|
+
ta6ed4: require("./src/schemas/v3/overlays/ta6.json"),
|
|
78
|
+
ta7ed3: require("./src/schemas/v3/overlays/ta7.json"),
|
|
79
|
+
ta10ed3: require("./src/schemas/v3/overlays/ta10.json"),
|
|
80
|
+
lpe1ed4: require("./src/schemas/v3/overlays/lpe1.json"),
|
|
81
|
+
fme1ed2: require("./src/schemas/v3/overlays/fme1.json"),
|
|
82
|
+
llc1v2: require("./src/schemas/v3/overlays/llc1.json"),
|
|
83
|
+
nts2023: require("./src/schemas/v3/overlays/nts.json"),
|
|
84
|
+
ntsl2023: require("./src/schemas/v3/overlays/ntsl.json"),
|
|
85
|
+
nts2025: require("./src/schemas/v3/overlays/nts2.json"),
|
|
86
|
+
ntsl2025: require("./src/schemas/v3/overlays/ntsl2.json"),
|
|
87
|
+
con29R2019: require("./src/schemas/v3/overlays/con29R.json"),
|
|
88
|
+
con29DW: require("./src/schemas/v3/overlays/con29DW.json"),
|
|
89
|
+
rdsV333: require("./src/schemas/v3/overlays/rds.json"),
|
|
90
|
+
oc1v21: require("./src/schemas/v3/overlays/oc1.json"),
|
|
91
|
+
piqV3: require("./src/schemas/v3/overlays/piq.json"),
|
|
92
|
+
sr24: require("./src/schemas/v3/overlays/sr24.json"),
|
|
93
|
+
// Include extension overlays for v3
|
|
94
|
+
...extensionOverlays,
|
|
95
|
+
null: {},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const transactionSchemas = {
|
|
100
|
+
"https://trust.propdata.org.uk/schemas/v2/pdtf-transaction.json":
|
|
101
|
+
v2CoreSchema,
|
|
102
|
+
"https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json":
|
|
103
|
+
v3CoreSchema,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// Custom array merge function for oneOf arrays
|
|
107
|
+
const arrayMerge = (target, source) => {
|
|
108
|
+
// For string arrays (enum, required, etc.)
|
|
109
|
+
if (
|
|
110
|
+
target.length > 0 &&
|
|
111
|
+
source.length > 0 &&
|
|
112
|
+
target[0] &&
|
|
113
|
+
typeof target[0] === "string" &&
|
|
114
|
+
source[0] &&
|
|
115
|
+
typeof source[0] === "string"
|
|
116
|
+
) {
|
|
117
|
+
// For required arrays, combine them (remove duplicates)
|
|
118
|
+
// Check if this looks like a required array (contains field names, not enum values)
|
|
119
|
+
const isRequiredArray = target.some(
|
|
120
|
+
(item) =>
|
|
121
|
+
typeof item === "string" &&
|
|
122
|
+
item.length > 0 &&
|
|
123
|
+
!item.includes("Yes") &&
|
|
124
|
+
!item.includes("No") &&
|
|
125
|
+
!item.includes("Not known") &&
|
|
126
|
+
!item.includes("To be connected")
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
if (isRequiredArray) {
|
|
130
|
+
// Combine required arrays
|
|
131
|
+
const combined = [...target];
|
|
132
|
+
source.forEach((item) => {
|
|
133
|
+
if (!combined.includes(item)) {
|
|
134
|
+
combined.push(item);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return combined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// For other string arrays (like enum), use source if it exists, otherwise use target
|
|
141
|
+
return source.length > 0 ? source : target;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// If target is empty but source has values, use source
|
|
145
|
+
if (target.length === 0 && source.length > 0) {
|
|
146
|
+
return source;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Ensure we only process arrays of the same length
|
|
150
|
+
// If source is shorter, pad with nulls
|
|
151
|
+
// If source is longer, truncate to target length
|
|
152
|
+
const paddedSource = [...source];
|
|
153
|
+
while (paddedSource.length < target.length) {
|
|
154
|
+
paddedSource.push(null);
|
|
155
|
+
}
|
|
156
|
+
paddedSource.splice(target.length);
|
|
157
|
+
|
|
158
|
+
return target.map((item, index) => {
|
|
159
|
+
if (paddedSource[index] === null || paddedSource[index] === undefined) {
|
|
160
|
+
return item;
|
|
161
|
+
}
|
|
162
|
+
if (item === null || item === undefined) {
|
|
163
|
+
return paddedSource[index];
|
|
164
|
+
}
|
|
165
|
+
// Recursively merge nested objects and arrays
|
|
166
|
+
return merge(item, paddedSource[index], { arrayMerge });
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const getTransactionSchema = (
|
|
171
|
+
schemaId = "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
|
|
172
|
+
overlays
|
|
173
|
+
) => {
|
|
174
|
+
const sourceSchema = transactionSchemas[schemaId];
|
|
175
|
+
if (!overlays || overlays.length < 1) return sourceSchema;
|
|
176
|
+
|
|
177
|
+
let mergedSchema = JSON.parse(JSON.stringify(sourceSchema)); // Deep copy
|
|
178
|
+
overlays.forEach((overlay) => {
|
|
179
|
+
const overlaySchema = JSON.parse(
|
|
180
|
+
JSON.stringify(overlaysMap[schemaId][overlay] || {})
|
|
181
|
+
); // Deep copy
|
|
182
|
+
mergedSchema = merge(mergedSchema, overlaySchema, { arrayMerge });
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
return mergedSchema;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// Add helper function to generate cache key
|
|
189
|
+
const generateOverlayKey = (overlays) => {
|
|
190
|
+
if (!overlays) return "";
|
|
191
|
+
return overlays.join(".");
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// Enhanced caching function that stores both subschemas and validators
|
|
195
|
+
const getCachedSchemaData = (path, schemaId, overlays) => {
|
|
196
|
+
const overlayKey = generateOverlayKey(overlays);
|
|
197
|
+
const cacheKey = `${path}-${schemaId}-${overlayKey}`;
|
|
198
|
+
|
|
199
|
+
cacheStats.totalQueries++;
|
|
200
|
+
let cached = schemaCache.get(cacheKey);
|
|
201
|
+
if (!cached) {
|
|
202
|
+
cacheStats.misses++;
|
|
203
|
+
// Compute subschema using the original logic
|
|
204
|
+
const sourceSchema = getTransactionSchema(schemaId, overlays);
|
|
205
|
+
const pathArray = path.split("/").slice(1);
|
|
206
|
+
let subSchema = sourceSchema;
|
|
207
|
+
|
|
208
|
+
if (pathArray.length >= 1) {
|
|
209
|
+
subSchema = pathArray.reduce((schema, pathElement) => {
|
|
210
|
+
if (!schema) return undefined;
|
|
211
|
+
const { type, items, properties, oneOf } = schema;
|
|
212
|
+
if (type === "array") return items;
|
|
213
|
+
if (properties?.[pathElement]) return properties[pathElement];
|
|
214
|
+
if (oneOf) {
|
|
215
|
+
let matchingProperty;
|
|
216
|
+
oneOf.forEach((aOneOf) => {
|
|
217
|
+
if (aOneOf.type === "array" && !Number.isNaN(pathElement)) {
|
|
218
|
+
matchingProperty = aOneOf.items;
|
|
219
|
+
} else if (aOneOf.properties?.[pathElement]) {
|
|
220
|
+
matchingProperty = aOneOf.properties?.[pathElement];
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
if (matchingProperty) return matchingProperty;
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}, sourceSchema);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Add schema to AJV and get validator
|
|
230
|
+
// Only add valid schemas to AJV
|
|
231
|
+
let validator;
|
|
232
|
+
if (subSchema && typeof subSchema === 'object') {
|
|
233
|
+
// Check if schema already exists in AJV to avoid duplicates
|
|
234
|
+
validator = ajv.getSchema(cacheKey);
|
|
235
|
+
if (!validator) {
|
|
236
|
+
ajv.addSchema(subSchema, cacheKey);
|
|
237
|
+
validator = ajv.getSchema(cacheKey);
|
|
238
|
+
}
|
|
239
|
+
} else {
|
|
240
|
+
// For invalid paths, create a validator that always fails
|
|
241
|
+
validator = () => false;
|
|
242
|
+
validator.errors = [`Invalid path: schema is ${subSchema}`];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
cached = {
|
|
246
|
+
subSchema,
|
|
247
|
+
validator,
|
|
248
|
+
cacheKey,
|
|
249
|
+
createdAt: Date.now()
|
|
250
|
+
};
|
|
251
|
+
schemaCache.set(cacheKey, cached);
|
|
252
|
+
} else {
|
|
253
|
+
cacheStats.hits++;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return cached;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const getValidator = (schemaId, overlays) => {
|
|
260
|
+
return getSubschemaValidator("", schemaId, overlays);
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// common functions for v1 and v2 - now with caching
|
|
264
|
+
const getSubschema = (path, schemaId, overlays) => {
|
|
265
|
+
const cached = getCachedSchemaData(path, schemaId, overlays);
|
|
266
|
+
return cached.subSchema;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
const isPathValid = (path, schemaId, overlays) => {
|
|
270
|
+
try {
|
|
271
|
+
return getSubschema(path, schemaId, overlays) !== undefined;
|
|
272
|
+
} catch (err) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
const getSubschemaValidator = (path, schemaId, overlays) => {
|
|
278
|
+
const cached = getCachedSchemaData(path, schemaId, overlays);
|
|
279
|
+
return cached.validator;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
// v1, deprecated
|
|
283
|
+
const getTitleAtPath = (schema, path, rootPath = path) => {
|
|
284
|
+
if (path === "") path = "/";
|
|
285
|
+
let pathArray = path.split("/").slice(1);
|
|
286
|
+
if (pathArray.length === 1 && pathArray[0] === "") {
|
|
287
|
+
if (schema.title) return schema.title;
|
|
288
|
+
if (schema.title === "") return ""; // deliberately blank
|
|
289
|
+
// no 'title' property present, so we use the property name to create a readable descriptor
|
|
290
|
+
const propertyName = rootPath
|
|
291
|
+
.split("/")
|
|
292
|
+
.pop()
|
|
293
|
+
.replace(/([A-Z])/g, " $1")
|
|
294
|
+
.toLowerCase()
|
|
295
|
+
.trim();
|
|
296
|
+
return propertyName.charAt(0).toUpperCase() + propertyName.slice(1);
|
|
297
|
+
}
|
|
298
|
+
const propertyName = pathArray.shift();
|
|
299
|
+
const subPath = "/" + pathArray.join("/");
|
|
300
|
+
|
|
301
|
+
let subSchema = schema.properties
|
|
302
|
+
? schema.properties[propertyName]
|
|
303
|
+
: undefined;
|
|
304
|
+
if (subSchema) {
|
|
305
|
+
return getTitleAtPath(subSchema, subPath, rootPath);
|
|
306
|
+
}
|
|
307
|
+
if (schema.type === "array") {
|
|
308
|
+
subSchema = schema.items;
|
|
309
|
+
return getTitleAtPath(subSchema, subPath, rootPath);
|
|
310
|
+
}
|
|
311
|
+
const oneOfs = schema.oneOf;
|
|
312
|
+
if (oneOfs) {
|
|
313
|
+
// only single dependency discriminator, oneOf keyword is supported
|
|
314
|
+
const matchingOneOf = oneOfs.find(
|
|
315
|
+
(oneOf) => oneOf["properties"][propertyName]
|
|
316
|
+
);
|
|
317
|
+
if (matchingOneOf)
|
|
318
|
+
return getTitleAtPath(
|
|
319
|
+
matchingOneOf["properties"][propertyName],
|
|
320
|
+
subPath,
|
|
321
|
+
rootPath
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
const validateVerifiedClaims = (verifiedClaims, schemaId, overlays) => {
|
|
327
|
+
const validatorVClaims = ajv.compile(verifiedClaimsSchema);
|
|
328
|
+
|
|
329
|
+
const validationErrorsArr = [];
|
|
330
|
+
const vClaimSchValidation = validatorVClaims({
|
|
331
|
+
verified_claims: verifiedClaims,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
if (!vClaimSchValidation) {
|
|
335
|
+
validationErrorsArr.push(validatorVClaims.errors);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const verifiedClaimsArray = Array.isArray(verifiedClaims)
|
|
339
|
+
? verifiedClaims
|
|
340
|
+
: [verifiedClaims];
|
|
341
|
+
|
|
342
|
+
verifiedClaimsArray.forEach((claim) => {
|
|
343
|
+
const paths = Object.keys(claim.claims);
|
|
344
|
+
for (const path of paths) {
|
|
345
|
+
const validPath = isPathValid(path, schemaId, overlays);
|
|
346
|
+
if (validPath) {
|
|
347
|
+
const subValidator = getSubschemaValidator(path, schemaId, overlays);
|
|
348
|
+
const isValid = subValidator(claim.claims[path]);
|
|
349
|
+
if (!isValid) {
|
|
350
|
+
validationErrorsArr.push(...subValidator.errors);
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
validationErrorsArr.push(
|
|
354
|
+
`Path ${path} is not a valid PDTF schema path`
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
return validationErrorsArr;
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
// Cache management functions
|
|
364
|
+
const getCacheStats = () => {
|
|
365
|
+
const runtime = Date.now() - cacheStats.cacheStartTime;
|
|
366
|
+
const hitRate = cacheStats.totalQueries > 0 ? (cacheStats.hits / cacheStats.totalQueries * 100) : 0;
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
totalEntries: schemaCache.size,
|
|
370
|
+
hits: cacheStats.hits,
|
|
371
|
+
misses: cacheStats.misses,
|
|
372
|
+
totalQueries: cacheStats.totalQueries,
|
|
373
|
+
hitRate: parseFloat(hitRate.toFixed(2)),
|
|
374
|
+
runtimeMs: runtime,
|
|
375
|
+
cacheKeys: Array.from(schemaCache.keys()),
|
|
376
|
+
memoryUsage: {
|
|
377
|
+
entriesCount: schemaCache.size,
|
|
378
|
+
// Rough estimate of memory usage per entry
|
|
379
|
+
estimatedSizeKB: Math.round((schemaCache.size * 2) / 1024 * 100) / 100 // Rough estimate
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
const getDetailedCacheStats = () => {
|
|
385
|
+
const baseStats = getCacheStats();
|
|
386
|
+
const entries = Array.from(schemaCache.entries()).map(([key, value]) => ({
|
|
387
|
+
key,
|
|
388
|
+
createdAt: value.createdAt,
|
|
389
|
+
age: Date.now() - value.createdAt,
|
|
390
|
+
hasValidator: typeof value.validator === 'function',
|
|
391
|
+
hasSubSchema: value.subSchema !== undefined
|
|
392
|
+
}));
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
...baseStats,
|
|
396
|
+
entries: entries.sort((a, b) => b.createdAt - a.createdAt), // Most recent first
|
|
397
|
+
oldestEntry: entries.length > 0 ? Math.max(...entries.map(e => e.age)) : 0,
|
|
398
|
+
newestEntry: entries.length > 0 ? Math.min(...entries.map(e => e.age)) : 0
|
|
399
|
+
};
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
const clearSchemaCache = (pattern) => {
|
|
403
|
+
if (pattern) {
|
|
404
|
+
// Clear entries matching pattern
|
|
405
|
+
const keysToDelete = [];
|
|
406
|
+
schemaCache.forEach((value, key) => {
|
|
407
|
+
if (key.includes(pattern)) {
|
|
408
|
+
keysToDelete.push(key);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
keysToDelete.forEach(key => schemaCache.delete(key));
|
|
412
|
+
|
|
413
|
+
// Also remove matching schemas from AJV
|
|
414
|
+
keysToDelete.forEach(key => {
|
|
415
|
+
try {
|
|
416
|
+
ajv.removeSchema(key);
|
|
417
|
+
} catch (e) {
|
|
418
|
+
// Schema might not exist in AJV, ignore
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
return keysToDelete.length;
|
|
423
|
+
} else {
|
|
424
|
+
// Clear all cache
|
|
425
|
+
const entriesCleared = schemaCache.size;
|
|
426
|
+
schemaCache.clear();
|
|
427
|
+
// Reset stats
|
|
428
|
+
cacheStats.hits = 0;
|
|
429
|
+
cacheStats.misses = 0;
|
|
430
|
+
cacheStats.totalQueries = 0;
|
|
431
|
+
cacheStats.cacheStartTime = Date.now();
|
|
432
|
+
|
|
433
|
+
// Also clear AJV's internal cache to prevent duplicates
|
|
434
|
+
ajv.removeSchema();
|
|
435
|
+
|
|
436
|
+
return entriesCleared;
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
const warmupCache = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json", overlaysList = []) => {
|
|
441
|
+
const warmupStats = {
|
|
442
|
+
totalAttempted: 0,
|
|
443
|
+
successful: 0,
|
|
444
|
+
failed: 0,
|
|
445
|
+
errors: []
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
// Default common paths if none provided
|
|
449
|
+
const defaultPaths = [
|
|
450
|
+
"/propertyPack",
|
|
451
|
+
"/participants",
|
|
452
|
+
"/status",
|
|
453
|
+
"/propertyPack/surveys",
|
|
454
|
+
"/propertyPack/valuations",
|
|
455
|
+
"/propertyPack/waterAndDrainage",
|
|
456
|
+
"/propertyPack/ownership",
|
|
457
|
+
"/propertyPack/notices"
|
|
458
|
+
];
|
|
459
|
+
|
|
460
|
+
// Default common overlays if none provided
|
|
461
|
+
const defaultOverlays = [
|
|
462
|
+
[],
|
|
463
|
+
["baspiV5"],
|
|
464
|
+
["ta6ed4"],
|
|
465
|
+
["nts2023"],
|
|
466
|
+
["baspiV5", "ta6ed4"]
|
|
467
|
+
];
|
|
468
|
+
|
|
469
|
+
const pathsToWarm = paths || defaultPaths;
|
|
470
|
+
const overlaysToWarm = overlaysList.length > 0 ? overlaysList : defaultOverlays;
|
|
471
|
+
|
|
472
|
+
pathsToWarm.forEach(path => {
|
|
473
|
+
overlaysToWarm.forEach(overlays => {
|
|
474
|
+
warmupStats.totalAttempted++;
|
|
475
|
+
try {
|
|
476
|
+
// This will populate the cache
|
|
477
|
+
getSubschema(path, schemaId, overlays);
|
|
478
|
+
getSubschemaValidator(path, schemaId, overlays);
|
|
479
|
+
warmupStats.successful++;
|
|
480
|
+
} catch (error) {
|
|
481
|
+
warmupStats.failed++;
|
|
482
|
+
warmupStats.errors.push({
|
|
483
|
+
path,
|
|
484
|
+
overlays,
|
|
485
|
+
error: error.message
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
return warmupStats;
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
const pruneCacheByAge = (maxAgeMs) => {
|
|
495
|
+
const now = Date.now();
|
|
496
|
+
const keysToDelete = [];
|
|
497
|
+
|
|
498
|
+
schemaCache.forEach((value, key) => {
|
|
499
|
+
if (now - value.createdAt > maxAgeMs) {
|
|
500
|
+
keysToDelete.push(key);
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
keysToDelete.forEach(key => {
|
|
505
|
+
schemaCache.delete(key);
|
|
506
|
+
try {
|
|
507
|
+
ajv.removeSchema(key);
|
|
508
|
+
} catch (e) {
|
|
509
|
+
// Schema might not exist in AJV, ignore
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
return keysToDelete.length;
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
const setCacheMaxSize = (maxSize) => {
|
|
517
|
+
if (schemaCache.size <= maxSize) return 0;
|
|
518
|
+
|
|
519
|
+
// Get entries sorted by creation time (oldest first)
|
|
520
|
+
const entries = Array.from(schemaCache.entries())
|
|
521
|
+
.sort((a, b) => a[1].createdAt - b[1].createdAt);
|
|
522
|
+
|
|
523
|
+
const toRemove = schemaCache.size - maxSize;
|
|
524
|
+
const keysToDelete = entries.slice(0, toRemove).map(([key]) => key);
|
|
525
|
+
|
|
526
|
+
keysToDelete.forEach(key => {
|
|
527
|
+
schemaCache.delete(key);
|
|
528
|
+
try {
|
|
529
|
+
ajv.removeSchema(key);
|
|
530
|
+
} catch (e) {
|
|
531
|
+
// Schema might not exist in AJV, ignore
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
return keysToDelete.length;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
module.exports = {
|
|
539
|
+
ajv,
|
|
540
|
+
getTransactionSchema,
|
|
541
|
+
getValidator,
|
|
542
|
+
getSubschema,
|
|
543
|
+
isPathValid,
|
|
544
|
+
getSubschemaValidator,
|
|
545
|
+
getTitleAtPath,
|
|
546
|
+
verifiedClaimsSchema,
|
|
547
|
+
validateVerifiedClaims,
|
|
548
|
+
overlaysMap,
|
|
549
|
+
extensionOverlays,
|
|
550
|
+
// Enhanced cache management functions
|
|
551
|
+
getCacheStats,
|
|
552
|
+
getDetailedCacheStats,
|
|
553
|
+
clearSchemaCache,
|
|
554
|
+
warmupCache,
|
|
555
|
+
pruneCacheByAge,
|
|
556
|
+
setCacheMaxSize,
|
|
557
|
+
};
|