@pdtf/schemas 3.6.0-dev.4 → 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.
- package/compassionate-easley-bafb14/CLAUDE.md +101 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/README.md +166 -65
- package/compassionate-easley-bafb14/docs/branch-release-workflow.md +138 -0
- package/compassionate-easley-bafb14/docs/sef25-extensions-ui-spec.md +355 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/index.js +160 -63
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/package-lock.json +10 -9
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/package.json +7 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleAddParticipantVouch.json +3 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleDocumentedVouch.json +3 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleElectronicRecord.json +3 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleTransaction.json +7 -3
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleVouch.json +3 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/combined.json +8187 -1446
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/compactSkeleton.txt +1208 -14
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/baspi4.json +186 -28
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/baspi5.json +191 -30
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ac.json +334 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/as.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/dk.json +33 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/dr.json +9 -9
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/er.json +4 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/fd.json +6 -3
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/hi.json +6 -3
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/hs.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ic.json +83 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/jk.json +28 -8
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/la.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/lc.json +76 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/ma.json +6 -3
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/mc.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/mi.json +70 -0
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/nd.json +44 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/oa.json +4 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/oc.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/pc.json +38 -0
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ph.json +195 -0
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/rw.json +69 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sb.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sc.json +133 -0
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sd.json +64 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sf.json +4 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sl.json +4 -2
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ta.json +204 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/tf.json +6 -3
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/tr.json +74 -0
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/wg.json +351 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/fme1.json +16 -14
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/lpe1.json +61 -88
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/nts.json +71 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/nts2.json +71 -5
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ntsl.json +71 -2
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ntsl2.json +71 -5
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/piq.json +56 -8
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/rds.json +128 -12
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/sef25.json +1644 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta10.json +12 -9
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta6.json +103 -32
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta6ed6.json +6536 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta7.json +134 -32
- package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta7ed5.json +1551 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/pdtf-transaction.json +4835 -490
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/skeleton.json +1481 -37
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/verifiedClaims/README.md +12 -3
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/verifiedClaims/pdtf-verified-claims.json +16 -0
- package/compassionate-easley-bafb14/src/utils/extractExtensionOverlays.js +633 -0
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/extractOverlay.js +129 -38
- package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/pathSkeleton.js +1 -1
- package/package.json +1 -1
- package/src/schemas/v3/combined.json +1 -0
- package/src/schemas/v3/overlays/extensions/ic.json +31 -8
- package/src/schemas/v3/overlays/sef25.json +6 -1
- package/src/utils/extractExtensionOverlays.js +1 -1
- package/keen-dewdney-6ae15b/src/tests/v3/caching.test.js +0 -591
- package/keen-dewdney-6ae15b/src/tests/v3/extensionOverlays.test.js +0 -525
- package/keen-dewdney-6ae15b/src/tests/v3/transactionSchema.test.js +0 -574
- package/keen-dewdney-6ae15b/src/tests/v3/verifiedClaimsValidator.test.js +0 -128
- package/keen-dewdney-6ae15b/src/utils/extractExtensionOverlays.js +0 -362
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/LICENSE +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleAddParticipantVouch.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleDocumentedVouch.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleElectronicRecord.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleTransaction.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleVouch.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v2/exampleTransaction.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleCustomOverlay.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleCustomOverlay2.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/mappings/SendPropertyDetailsRequestSchema.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/mappings/adf.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/GeoJSON.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/baspiNotes.html +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/energy-performance-certificate.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/freehold-information.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/leasehold-information.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/legal-information.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/material-facts.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/pdtf-transaction-search-results.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/pdtf-transaction.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/drainage-and-water.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/local-land-charges.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/local-searches-required.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/title-deed.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/baspiNotes.html +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/combined.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/baspi.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/con29DW.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/con29R.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/fme1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/llc1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/lpe1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/nts.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/oc1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/piq.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/rds.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta10.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta6.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta7.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/pdtf-transaction.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/skeleton.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/README.md +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/con29DW.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/con29R.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/llc1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/oc1.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/sr24.json +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/compactSkeleton.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/countTokens.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/extractProperties.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/listPathTitles.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/minimalSkeleton.js +0 -0
- /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/pathList.csv +0 -0
|
@@ -18,7 +18,7 @@ const cacheStats = {
|
|
|
18
18
|
hits: 0,
|
|
19
19
|
misses: 0,
|
|
20
20
|
totalQueries: 0,
|
|
21
|
-
cacheStartTime: Date.now()
|
|
21
|
+
cacheStartTime: Date.now(),
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
const verifiedClaimsSchema = require("./src/schemas/verifiedClaims/pdtf-verified-claims.json");
|
|
@@ -52,6 +52,24 @@ const extensionOverlays = {
|
|
|
52
52
|
|
|
53
53
|
// Transaction Extensions
|
|
54
54
|
oc: require("./src/schemas/v3/overlays/extensions/oc.json"),
|
|
55
|
+
|
|
56
|
+
// SEF25 Extensions
|
|
57
|
+
sc: require("./src/schemas/v3/overlays/extensions/sc.json"),
|
|
58
|
+
pc: require("./src/schemas/v3/overlays/extensions/pc.json"),
|
|
59
|
+
ph: require("./src/schemas/v3/overlays/extensions/ph.json"),
|
|
60
|
+
dk: require("./src/schemas/v3/overlays/extensions/dk.json"),
|
|
61
|
+
rw: require("./src/schemas/v3/overlays/extensions/rw.json"),
|
|
62
|
+
sd: require("./src/schemas/v3/overlays/extensions/sd.json"),
|
|
63
|
+
lc: require("./src/schemas/v3/overlays/extensions/lc.json"),
|
|
64
|
+
wg: require("./src/schemas/v3/overlays/extensions/wg.json"),
|
|
65
|
+
ic: require("./src/schemas/v3/overlays/extensions/ic.json"),
|
|
66
|
+
nd: require("./src/schemas/v3/overlays/extensions/nd.json"),
|
|
67
|
+
mi: require("./src/schemas/v3/overlays/extensions/mi.json"),
|
|
68
|
+
tr: require("./src/schemas/v3/overlays/extensions/tr.json"),
|
|
69
|
+
ac: require("./src/schemas/v3/overlays/extensions/ac.json"),
|
|
70
|
+
|
|
71
|
+
// Compatibility Extensions
|
|
72
|
+
ta: require("./src/schemas/v3/overlays/extensions/ta.json"),
|
|
55
73
|
};
|
|
56
74
|
|
|
57
75
|
const overlaysMap = {
|
|
@@ -75,7 +93,9 @@ const overlaysMap = {
|
|
|
75
93
|
baspiV4: require("./src/schemas/v3/overlays/baspi4.json"),
|
|
76
94
|
baspiV5: require("./src/schemas/v3/overlays/baspi5.json"),
|
|
77
95
|
ta6ed4: require("./src/schemas/v3/overlays/ta6.json"),
|
|
96
|
+
ta6ed6: require("./src/schemas/v3/overlays/ta6ed6.json"),
|
|
78
97
|
ta7ed3: require("./src/schemas/v3/overlays/ta7.json"),
|
|
98
|
+
ta7ed5: require("./src/schemas/v3/overlays/ta7ed5.json"),
|
|
79
99
|
ta10ed3: require("./src/schemas/v3/overlays/ta10.json"),
|
|
80
100
|
lpe1ed4: require("./src/schemas/v3/overlays/lpe1.json"),
|
|
81
101
|
fme1ed2: require("./src/schemas/v3/overlays/fme1.json"),
|
|
@@ -104,7 +124,7 @@ const transactionSchemas = {
|
|
|
104
124
|
};
|
|
105
125
|
|
|
106
126
|
// Custom array merge function for oneOf arrays
|
|
107
|
-
const arrayMerge = (target, source) => {
|
|
127
|
+
const arrayMerge = (target, source, options) => {
|
|
108
128
|
// For string arrays (enum, required, etc.)
|
|
109
129
|
if (
|
|
110
130
|
target.length > 0 &&
|
|
@@ -114,17 +134,30 @@ const arrayMerge = (target, source) => {
|
|
|
114
134
|
source[0] &&
|
|
115
135
|
typeof source[0] === "string"
|
|
116
136
|
) {
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
item
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
137
|
+
// Detect if this is a required array by checking the parent key
|
|
138
|
+
// Required arrays are property names (camelCase, no spaces)
|
|
139
|
+
// Enum arrays are values (can contain spaces, capitals, etc.)
|
|
140
|
+
const isRequiredArray =
|
|
141
|
+
target.every(
|
|
142
|
+
(item) =>
|
|
143
|
+
typeof item === "string" &&
|
|
144
|
+
item.length > 0 &&
|
|
145
|
+
// Required field names are typically camelCase without spaces
|
|
146
|
+
!item.includes(" ") &&
|
|
147
|
+
// First character is usually lowercase for field names
|
|
148
|
+
(item[0] === item[0].toLowerCase() ||
|
|
149
|
+
item.startsWith("is") ||
|
|
150
|
+
item.startsWith("has")),
|
|
151
|
+
) &&
|
|
152
|
+
source.every(
|
|
153
|
+
(item) =>
|
|
154
|
+
typeof item === "string" &&
|
|
155
|
+
item.length > 0 &&
|
|
156
|
+
!item.includes(" ") &&
|
|
157
|
+
(item[0] === item[0].toLowerCase() ||
|
|
158
|
+
item.startsWith("is") ||
|
|
159
|
+
item.startsWith("has")),
|
|
160
|
+
);
|
|
128
161
|
|
|
129
162
|
if (isRequiredArray) {
|
|
130
163
|
// Combine required arrays
|
|
@@ -137,7 +170,7 @@ const arrayMerge = (target, source) => {
|
|
|
137
170
|
return combined;
|
|
138
171
|
}
|
|
139
172
|
|
|
140
|
-
// For other string arrays (like enum),
|
|
173
|
+
// For other string arrays (like enum), replace with source
|
|
141
174
|
return source.length > 0 ? source : target;
|
|
142
175
|
}
|
|
143
176
|
|
|
@@ -169,7 +202,7 @@ const arrayMerge = (target, source) => {
|
|
|
169
202
|
|
|
170
203
|
const getTransactionSchema = (
|
|
171
204
|
schemaId = "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
|
|
172
|
-
overlays
|
|
205
|
+
overlays,
|
|
173
206
|
) => {
|
|
174
207
|
const sourceSchema = transactionSchemas[schemaId];
|
|
175
208
|
if (!overlays || overlays.length < 1) return sourceSchema;
|
|
@@ -177,7 +210,7 @@ const getTransactionSchema = (
|
|
|
177
210
|
let mergedSchema = JSON.parse(JSON.stringify(sourceSchema)); // Deep copy
|
|
178
211
|
overlays.forEach((overlay) => {
|
|
179
212
|
const overlaySchema = JSON.parse(
|
|
180
|
-
JSON.stringify(overlaysMap[schemaId][overlay] || {})
|
|
213
|
+
JSON.stringify(overlaysMap[schemaId][overlay] || {}),
|
|
181
214
|
); // Deep copy
|
|
182
215
|
mergedSchema = merge(mergedSchema, overlaySchema, { arrayMerge });
|
|
183
216
|
});
|
|
@@ -204,24 +237,77 @@ const getCachedSchemaData = (path, schemaId, overlays) => {
|
|
|
204
237
|
const sourceSchema = getTransactionSchema(schemaId, overlays);
|
|
205
238
|
const pathArray = path.split("/").slice(1);
|
|
206
239
|
let subSchema = sourceSchema;
|
|
207
|
-
|
|
240
|
+
|
|
208
241
|
if (pathArray.length >= 1) {
|
|
209
242
|
subSchema = pathArray.reduce((schema, pathElement) => {
|
|
210
243
|
if (!schema) return undefined;
|
|
211
|
-
const { type, items, properties, oneOf } = schema;
|
|
244
|
+
const { type, items, properties, patternProperties, oneOf } = schema;
|
|
245
|
+
|
|
246
|
+
// Check array type
|
|
212
247
|
if (type === "array") return items;
|
|
248
|
+
|
|
249
|
+
// Check explicit properties first
|
|
213
250
|
if (properties?.[pathElement]) return properties[pathElement];
|
|
251
|
+
|
|
252
|
+
// Check patternProperties
|
|
253
|
+
if (patternProperties) {
|
|
254
|
+
for (const pattern in patternProperties) {
|
|
255
|
+
try {
|
|
256
|
+
const regex = new RegExp(pattern);
|
|
257
|
+
if (regex.test(pathElement)) {
|
|
258
|
+
return patternProperties[pattern];
|
|
259
|
+
}
|
|
260
|
+
} catch (e) {
|
|
261
|
+
// Invalid regex pattern in schema - skip it
|
|
262
|
+
console.warn(
|
|
263
|
+
`Invalid regex pattern in patternProperties: ${pattern}`,
|
|
264
|
+
e,
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Check oneOf discriminators (recursively for nested oneOf)
|
|
214
271
|
if (oneOf) {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
272
|
+
const findInOneOf = (branches) => {
|
|
273
|
+
let arrayFallback;
|
|
274
|
+
for (const branch of branches) {
|
|
275
|
+
if (!branch) continue;
|
|
276
|
+
// Track array matches as fallback (prefer property matches)
|
|
277
|
+
if (
|
|
278
|
+
branch.type === "array" &&
|
|
279
|
+
!Number.isNaN(pathElement) &&
|
|
280
|
+
!arrayFallback
|
|
281
|
+
) {
|
|
282
|
+
arrayFallback = branch.items;
|
|
283
|
+
}
|
|
284
|
+
if (branch.properties?.[pathElement]) {
|
|
285
|
+
return branch.properties[pathElement];
|
|
286
|
+
}
|
|
287
|
+
if (branch.patternProperties) {
|
|
288
|
+
for (const pattern in branch.patternProperties) {
|
|
289
|
+
try {
|
|
290
|
+
const regex = new RegExp(pattern);
|
|
291
|
+
if (regex.test(pathElement)) {
|
|
292
|
+
return branch.patternProperties[pattern];
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {
|
|
295
|
+
// Invalid regex pattern - skip
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Recurse into nested oneOf branches
|
|
300
|
+
if (branch.oneOf) {
|
|
301
|
+
const nested = findInOneOf(branch.oneOf);
|
|
302
|
+
if (nested) return nested;
|
|
303
|
+
}
|
|
221
304
|
}
|
|
222
|
-
|
|
305
|
+
return arrayFallback;
|
|
306
|
+
};
|
|
307
|
+
const matchingProperty = findInOneOf(oneOf);
|
|
223
308
|
if (matchingProperty) return matchingProperty;
|
|
224
309
|
}
|
|
310
|
+
|
|
225
311
|
return undefined;
|
|
226
312
|
}, sourceSchema);
|
|
227
313
|
}
|
|
@@ -229,7 +315,7 @@ const getCachedSchemaData = (path, schemaId, overlays) => {
|
|
|
229
315
|
// Add schema to AJV and get validator
|
|
230
316
|
// Only add valid schemas to AJV
|
|
231
317
|
let validator;
|
|
232
|
-
if (subSchema && typeof subSchema ===
|
|
318
|
+
if (subSchema && typeof subSchema === "object") {
|
|
233
319
|
// Check if schema already exists in AJV to avoid duplicates
|
|
234
320
|
validator = ajv.getSchema(cacheKey);
|
|
235
321
|
if (!validator) {
|
|
@@ -246,7 +332,7 @@ const getCachedSchemaData = (path, schemaId, overlays) => {
|
|
|
246
332
|
subSchema,
|
|
247
333
|
validator,
|
|
248
334
|
cacheKey,
|
|
249
|
-
createdAt: Date.now()
|
|
335
|
+
createdAt: Date.now(),
|
|
250
336
|
};
|
|
251
337
|
schemaCache.set(cacheKey, cached);
|
|
252
338
|
} else {
|
|
@@ -312,13 +398,13 @@ const getTitleAtPath = (schema, path, rootPath = path) => {
|
|
|
312
398
|
if (oneOfs) {
|
|
313
399
|
// only single dependency discriminator, oneOf keyword is supported
|
|
314
400
|
const matchingOneOf = oneOfs.find(
|
|
315
|
-
(oneOf) => oneOf["properties"][propertyName]
|
|
401
|
+
(oneOf) => oneOf["properties"][propertyName],
|
|
316
402
|
);
|
|
317
403
|
if (matchingOneOf)
|
|
318
404
|
return getTitleAtPath(
|
|
319
405
|
matchingOneOf["properties"][propertyName],
|
|
320
406
|
subPath,
|
|
321
|
-
rootPath
|
|
407
|
+
rootPath,
|
|
322
408
|
);
|
|
323
409
|
}
|
|
324
410
|
};
|
|
@@ -351,7 +437,7 @@ const validateVerifiedClaims = (verifiedClaims, schemaId, overlays) => {
|
|
|
351
437
|
}
|
|
352
438
|
} else {
|
|
353
439
|
validationErrorsArr.push(
|
|
354
|
-
`Path ${path} is not a valid PDTF schema path
|
|
440
|
+
`Path ${path} is not a valid PDTF schema path`,
|
|
355
441
|
);
|
|
356
442
|
}
|
|
357
443
|
}
|
|
@@ -363,8 +449,11 @@ const validateVerifiedClaims = (verifiedClaims, schemaId, overlays) => {
|
|
|
363
449
|
// Cache management functions
|
|
364
450
|
const getCacheStats = () => {
|
|
365
451
|
const runtime = Date.now() - cacheStats.cacheStartTime;
|
|
366
|
-
const hitRate =
|
|
367
|
-
|
|
452
|
+
const hitRate =
|
|
453
|
+
cacheStats.totalQueries > 0
|
|
454
|
+
? (cacheStats.hits / cacheStats.totalQueries) * 100
|
|
455
|
+
: 0;
|
|
456
|
+
|
|
368
457
|
return {
|
|
369
458
|
totalEntries: schemaCache.size,
|
|
370
459
|
hits: cacheStats.hits,
|
|
@@ -376,8 +465,8 @@ const getCacheStats = () => {
|
|
|
376
465
|
memoryUsage: {
|
|
377
466
|
entriesCount: schemaCache.size,
|
|
378
467
|
// Rough estimate of memory usage per entry
|
|
379
|
-
estimatedSizeKB: Math.round((schemaCache.size * 2) / 1024 * 100) / 100 // Rough estimate
|
|
380
|
-
}
|
|
468
|
+
estimatedSizeKB: Math.round(((schemaCache.size * 2) / 1024) * 100) / 100, // Rough estimate
|
|
469
|
+
},
|
|
381
470
|
};
|
|
382
471
|
};
|
|
383
472
|
|
|
@@ -387,15 +476,17 @@ const getDetailedCacheStats = () => {
|
|
|
387
476
|
key,
|
|
388
477
|
createdAt: value.createdAt,
|
|
389
478
|
age: Date.now() - value.createdAt,
|
|
390
|
-
hasValidator: typeof value.validator ===
|
|
391
|
-
hasSubSchema: value.subSchema !== undefined
|
|
479
|
+
hasValidator: typeof value.validator === "function",
|
|
480
|
+
hasSubSchema: value.subSchema !== undefined,
|
|
392
481
|
}));
|
|
393
482
|
|
|
394
483
|
return {
|
|
395
484
|
...baseStats,
|
|
396
485
|
entries: entries.sort((a, b) => b.createdAt - a.createdAt), // Most recent first
|
|
397
|
-
oldestEntry:
|
|
398
|
-
|
|
486
|
+
oldestEntry:
|
|
487
|
+
entries.length > 0 ? Math.max(...entries.map((e) => e.age)) : 0,
|
|
488
|
+
newestEntry:
|
|
489
|
+
entries.length > 0 ? Math.min(...entries.map((e) => e.age)) : 0,
|
|
399
490
|
};
|
|
400
491
|
};
|
|
401
492
|
|
|
@@ -408,17 +499,17 @@ const clearSchemaCache = (pattern) => {
|
|
|
408
499
|
keysToDelete.push(key);
|
|
409
500
|
}
|
|
410
501
|
});
|
|
411
|
-
keysToDelete.forEach(key => schemaCache.delete(key));
|
|
412
|
-
|
|
502
|
+
keysToDelete.forEach((key) => schemaCache.delete(key));
|
|
503
|
+
|
|
413
504
|
// Also remove matching schemas from AJV
|
|
414
|
-
keysToDelete.forEach(key => {
|
|
505
|
+
keysToDelete.forEach((key) => {
|
|
415
506
|
try {
|
|
416
507
|
ajv.removeSchema(key);
|
|
417
508
|
} catch (e) {
|
|
418
509
|
// Schema might not exist in AJV, ignore
|
|
419
510
|
}
|
|
420
511
|
});
|
|
421
|
-
|
|
512
|
+
|
|
422
513
|
return keysToDelete.length;
|
|
423
514
|
} else {
|
|
424
515
|
// Clear all cache
|
|
@@ -429,20 +520,24 @@ const clearSchemaCache = (pattern) => {
|
|
|
429
520
|
cacheStats.misses = 0;
|
|
430
521
|
cacheStats.totalQueries = 0;
|
|
431
522
|
cacheStats.cacheStartTime = Date.now();
|
|
432
|
-
|
|
523
|
+
|
|
433
524
|
// Also clear AJV's internal cache to prevent duplicates
|
|
434
525
|
ajv.removeSchema();
|
|
435
|
-
|
|
526
|
+
|
|
436
527
|
return entriesCleared;
|
|
437
528
|
}
|
|
438
529
|
};
|
|
439
530
|
|
|
440
|
-
const warmupCache = (
|
|
531
|
+
const warmupCache = (
|
|
532
|
+
paths,
|
|
533
|
+
schemaId = "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
|
|
534
|
+
overlaysList = [],
|
|
535
|
+
) => {
|
|
441
536
|
const warmupStats = {
|
|
442
537
|
totalAttempted: 0,
|
|
443
538
|
successful: 0,
|
|
444
539
|
failed: 0,
|
|
445
|
-
errors: []
|
|
540
|
+
errors: [],
|
|
446
541
|
};
|
|
447
542
|
|
|
448
543
|
// Default common paths if none provided
|
|
@@ -454,7 +549,7 @@ const warmupCache = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3
|
|
|
454
549
|
"/propertyPack/valuations",
|
|
455
550
|
"/propertyPack/waterAndDrainage",
|
|
456
551
|
"/propertyPack/ownership",
|
|
457
|
-
"/propertyPack/notices"
|
|
552
|
+
"/propertyPack/notices",
|
|
458
553
|
];
|
|
459
554
|
|
|
460
555
|
// Default common overlays if none provided
|
|
@@ -463,14 +558,15 @@ const warmupCache = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3
|
|
|
463
558
|
["baspiV5"],
|
|
464
559
|
["ta6ed4"],
|
|
465
560
|
["nts2023"],
|
|
466
|
-
["baspiV5", "ta6ed4"]
|
|
561
|
+
["baspiV5", "ta6ed4"],
|
|
467
562
|
];
|
|
468
563
|
|
|
469
564
|
const pathsToWarm = paths || defaultPaths;
|
|
470
|
-
const overlaysToWarm =
|
|
565
|
+
const overlaysToWarm =
|
|
566
|
+
overlaysList.length > 0 ? overlaysList : defaultOverlays;
|
|
471
567
|
|
|
472
|
-
pathsToWarm.forEach(path => {
|
|
473
|
-
overlaysToWarm.forEach(overlays => {
|
|
568
|
+
pathsToWarm.forEach((path) => {
|
|
569
|
+
overlaysToWarm.forEach((overlays) => {
|
|
474
570
|
warmupStats.totalAttempted++;
|
|
475
571
|
try {
|
|
476
572
|
// This will populate the cache
|
|
@@ -482,7 +578,7 @@ const warmupCache = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3
|
|
|
482
578
|
warmupStats.errors.push({
|
|
483
579
|
path,
|
|
484
580
|
overlays,
|
|
485
|
-
error: error.message
|
|
581
|
+
error: error.message,
|
|
486
582
|
});
|
|
487
583
|
}
|
|
488
584
|
});
|
|
@@ -494,14 +590,14 @@ const warmupCache = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3
|
|
|
494
590
|
const pruneCacheByAge = (maxAgeMs) => {
|
|
495
591
|
const now = Date.now();
|
|
496
592
|
const keysToDelete = [];
|
|
497
|
-
|
|
593
|
+
|
|
498
594
|
schemaCache.forEach((value, key) => {
|
|
499
595
|
if (now - value.createdAt > maxAgeMs) {
|
|
500
596
|
keysToDelete.push(key);
|
|
501
597
|
}
|
|
502
598
|
});
|
|
503
|
-
|
|
504
|
-
keysToDelete.forEach(key => {
|
|
599
|
+
|
|
600
|
+
keysToDelete.forEach((key) => {
|
|
505
601
|
schemaCache.delete(key);
|
|
506
602
|
try {
|
|
507
603
|
ajv.removeSchema(key);
|
|
@@ -509,21 +605,22 @@ const pruneCacheByAge = (maxAgeMs) => {
|
|
|
509
605
|
// Schema might not exist in AJV, ignore
|
|
510
606
|
}
|
|
511
607
|
});
|
|
512
|
-
|
|
608
|
+
|
|
513
609
|
return keysToDelete.length;
|
|
514
610
|
};
|
|
515
611
|
|
|
516
612
|
const setCacheMaxSize = (maxSize) => {
|
|
517
613
|
if (schemaCache.size <= maxSize) return 0;
|
|
518
|
-
|
|
614
|
+
|
|
519
615
|
// Get entries sorted by creation time (oldest first)
|
|
520
|
-
const entries = Array.from(schemaCache.entries())
|
|
521
|
-
|
|
522
|
-
|
|
616
|
+
const entries = Array.from(schemaCache.entries()).sort(
|
|
617
|
+
(a, b) => a[1].createdAt - b[1].createdAt,
|
|
618
|
+
);
|
|
619
|
+
|
|
523
620
|
const toRemove = schemaCache.size - maxSize;
|
|
524
621
|
const keysToDelete = entries.slice(0, toRemove).map(([key]) => key);
|
|
525
|
-
|
|
526
|
-
keysToDelete.forEach(key => {
|
|
622
|
+
|
|
623
|
+
keysToDelete.forEach((key) => {
|
|
527
624
|
schemaCache.delete(key);
|
|
528
625
|
try {
|
|
529
626
|
ajv.removeSchema(key);
|
|
@@ -531,7 +628,7 @@ const setCacheMaxSize = (maxSize) => {
|
|
|
531
628
|
// Schema might not exist in AJV, ignore
|
|
532
629
|
}
|
|
533
630
|
});
|
|
534
|
-
|
|
631
|
+
|
|
535
632
|
return keysToDelete.length;
|
|
536
633
|
};
|
|
537
634
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdtf/schemas",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0-dev.5",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@pdtf/schemas",
|
|
9
|
-
"version": "3.
|
|
9
|
+
"version": "3.6.0-dev.5",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@jdw/jst": "^2.0.0-beta.15",
|
|
@@ -1356,9 +1356,9 @@
|
|
|
1356
1356
|
}
|
|
1357
1357
|
},
|
|
1358
1358
|
"node_modules/caniuse-lite": {
|
|
1359
|
-
"version": "1.0.
|
|
1360
|
-
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.
|
|
1361
|
-
"integrity": "sha512-
|
|
1359
|
+
"version": "1.0.30001755",
|
|
1360
|
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz",
|
|
1361
|
+
"integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==",
|
|
1362
1362
|
"dev": true,
|
|
1363
1363
|
"funding": [
|
|
1364
1364
|
{
|
|
@@ -1373,7 +1373,8 @@
|
|
|
1373
1373
|
"type": "github",
|
|
1374
1374
|
"url": "https://github.com/sponsors/ai"
|
|
1375
1375
|
}
|
|
1376
|
-
]
|
|
1376
|
+
],
|
|
1377
|
+
"license": "CC-BY-4.0"
|
|
1377
1378
|
},
|
|
1378
1379
|
"node_modules/chalk": {
|
|
1379
1380
|
"version": "4.1.2",
|
|
@@ -5180,9 +5181,9 @@
|
|
|
5180
5181
|
"dev": true
|
|
5181
5182
|
},
|
|
5182
5183
|
"caniuse-lite": {
|
|
5183
|
-
"version": "1.0.
|
|
5184
|
-
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.
|
|
5185
|
-
"integrity": "sha512-
|
|
5184
|
+
"version": "1.0.30001755",
|
|
5185
|
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz",
|
|
5186
|
+
"integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==",
|
|
5186
5187
|
"dev": true
|
|
5187
5188
|
},
|
|
5188
5189
|
"chalk": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pdtf/schemas",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0-dev.5",
|
|
4
4
|
"description": "Property Data Trust Framework Schemas and Utilities",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"directories": {
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"test": "jest",
|
|
11
|
-
"test:watch": "jest --watch"
|
|
11
|
+
"test:watch": "jest --watch",
|
|
12
|
+
"extract-overlays": "cd src/utils && node extractOverlay.js",
|
|
13
|
+
"extract-extension-overlays": "cd src/utils && node extractExtensionOverlays.js",
|
|
14
|
+
"publish:dev": "npm publish --tag dev",
|
|
15
|
+
"publish:next": "npm publish --tag next",
|
|
16
|
+
"publish:latest": "npm publish --tag latest"
|
|
12
17
|
},
|
|
13
18
|
"repository": {
|
|
14
19
|
"type": "git",
|
package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleTransaction.json
RENAMED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"role": "Seller",
|
|
21
21
|
"sellersCapacity": { "capacity": "Legal Owner" },
|
|
22
|
-
"externalIds": { "
|
|
22
|
+
"externalIds": { "Platform": "123434" }
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"role": "Seller's Conveyancer",
|
|
@@ -525,6 +525,10 @@
|
|
|
525
525
|
},
|
|
526
526
|
"environmentalIssues": {
|
|
527
527
|
"flooding": {
|
|
528
|
+
"floodRiskReport": {
|
|
529
|
+
"hasReportBeenPrepared": "Yes",
|
|
530
|
+
"attachments": "Attached"
|
|
531
|
+
},
|
|
528
532
|
"floodRisk": {
|
|
529
533
|
"riskIndicator": "Yes",
|
|
530
534
|
"summary": "Likely to flood from surface water"
|
|
@@ -984,7 +988,7 @@
|
|
|
984
988
|
"name": "Example Agency Agreement",
|
|
985
989
|
"url": "https://example.com/example-agency-agreement",
|
|
986
990
|
"externalIds": {
|
|
987
|
-
"
|
|
991
|
+
"Platform": "file123"
|
|
988
992
|
},
|
|
989
993
|
"requiredSignatories": [
|
|
990
994
|
{
|
|
@@ -1023,7 +1027,7 @@
|
|
|
1023
1027
|
"name": "Peter Ronald Hetherington-Smythe",
|
|
1024
1028
|
"signedOn": "2024-11-29T16:15:02.735Z",
|
|
1025
1029
|
"externalIds": {
|
|
1026
|
-
"
|
|
1030
|
+
"Platform": "123434"
|
|
1027
1031
|
},
|
|
1028
1032
|
"role": "Seller",
|
|
1029
1033
|
"contractHash": "IYnBjUI8TauXFop6WCvnPA=="
|