@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.
Files changed (131) hide show
  1. package/compassionate-easley-bafb14/CLAUDE.md +101 -0
  2. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/README.md +166 -65
  3. package/compassionate-easley-bafb14/docs/branch-release-workflow.md +138 -0
  4. package/compassionate-easley-bafb14/docs/sef25-extensions-ui-spec.md +355 -0
  5. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/index.js +160 -63
  6. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/package-lock.json +10 -9
  7. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/package.json +7 -2
  8. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleAddParticipantVouch.json +3 -0
  9. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleDocumentedVouch.json +3 -0
  10. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleElectronicRecord.json +3 -0
  11. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleTransaction.json +7 -3
  12. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleVouch.json +3 -0
  13. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/combined.json +8187 -1446
  14. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/compactSkeleton.txt +1208 -14
  15. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/baspi4.json +186 -28
  16. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/baspi5.json +191 -30
  17. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ac.json +334 -0
  18. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/as.json +4 -2
  19. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/dk.json +33 -0
  20. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/dr.json +9 -9
  21. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/er.json +4 -2
  22. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/fd.json +6 -3
  23. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/hi.json +6 -3
  24. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/hs.json +4 -2
  25. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ic.json +83 -0
  26. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/jk.json +28 -8
  27. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/la.json +4 -2
  28. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/lc.json +76 -0
  29. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/ma.json +6 -3
  30. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/mc.json +4 -2
  31. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/mi.json +70 -0
  32. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/nd.json +44 -0
  33. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/oa.json +4 -2
  34. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/oc.json +4 -2
  35. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/pc.json +38 -0
  36. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ph.json +195 -0
  37. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/rw.json +69 -0
  38. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sb.json +4 -2
  39. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sc.json +133 -0
  40. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/sd.json +64 -0
  41. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sf.json +4 -2
  42. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/sl.json +4 -2
  43. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/ta.json +204 -0
  44. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/extensions/tf.json +6 -3
  45. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/tr.json +74 -0
  46. package/compassionate-easley-bafb14/src/schemas/v3/overlays/extensions/wg.json +351 -0
  47. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/fme1.json +16 -14
  48. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/lpe1.json +61 -88
  49. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/nts.json +71 -2
  50. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/nts2.json +71 -5
  51. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ntsl.json +71 -2
  52. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ntsl2.json +71 -5
  53. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/piq.json +56 -8
  54. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/rds.json +128 -12
  55. package/compassionate-easley-bafb14/src/schemas/v3/overlays/sef25.json +1644 -0
  56. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta10.json +12 -9
  57. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta6.json +103 -32
  58. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta6ed6.json +6536 -0
  59. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/ta7.json +134 -32
  60. package/compassionate-easley-bafb14/src/schemas/v3/overlays/ta7ed5.json +1551 -0
  61. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/pdtf-transaction.json +4835 -490
  62. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/skeleton.json +1481 -37
  63. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/verifiedClaims/README.md +12 -3
  64. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/verifiedClaims/pdtf-verified-claims.json +16 -0
  65. package/compassionate-easley-bafb14/src/utils/extractExtensionOverlays.js +633 -0
  66. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/extractOverlay.js +129 -38
  67. package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/pathSkeleton.js +1 -1
  68. package/package.json +1 -1
  69. package/src/schemas/v3/combined.json +1 -0
  70. package/src/schemas/v3/overlays/extensions/ic.json +31 -8
  71. package/src/schemas/v3/overlays/sef25.json +6 -1
  72. package/src/utils/extractExtensionOverlays.js +1 -1
  73. package/keen-dewdney-6ae15b/src/tests/v3/caching.test.js +0 -591
  74. package/keen-dewdney-6ae15b/src/tests/v3/extensionOverlays.test.js +0 -525
  75. package/keen-dewdney-6ae15b/src/tests/v3/transactionSchema.test.js +0 -574
  76. package/keen-dewdney-6ae15b/src/tests/v3/verifiedClaimsValidator.test.js +0 -128
  77. package/keen-dewdney-6ae15b/src/utils/extractExtensionOverlays.js +0 -362
  78. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/LICENSE +0 -0
  79. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleAddParticipantVouch.json +0 -0
  80. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleDocumentedVouch.json +0 -0
  81. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleElectronicRecord.json +0 -0
  82. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleTransaction.json +0 -0
  83. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v1/exampleVouch.json +0 -0
  84. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v2/exampleTransaction.json +0 -0
  85. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleCustomOverlay.json +0 -0
  86. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/examples/v3/exampleCustomOverlay2.json +0 -0
  87. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/mappings/SendPropertyDetailsRequestSchema.json +0 -0
  88. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/mappings/adf.js +0 -0
  89. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/GeoJSON.json +0 -0
  90. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/baspiNotes.html +0 -0
  91. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/energy-performance-certificate.json +0 -0
  92. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/freehold-information.json +0 -0
  93. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/leasehold-information.json +0 -0
  94. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/legal-information.json +0 -0
  95. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/material-facts.json +0 -0
  96. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/pdtf-transaction-search-results.json +0 -0
  97. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/pdtf-transaction.json +0 -0
  98. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/drainage-and-water.json +0 -0
  99. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/local-land-charges.json +0 -0
  100. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches/local-searches-required.json +0 -0
  101. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/searches.json +0 -0
  102. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v1/title-deed.json +0 -0
  103. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/baspiNotes.html +0 -0
  104. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/combined.json +0 -0
  105. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/baspi.json +0 -0
  106. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/con29DW.json +0 -0
  107. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/con29R.json +0 -0
  108. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/fme1.json +0 -0
  109. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/llc1.json +0 -0
  110. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/lpe1.json +0 -0
  111. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/nts.json +0 -0
  112. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/oc1.json +0 -0
  113. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/piq.json +0 -0
  114. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/rds.json +0 -0
  115. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta10.json +0 -0
  116. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta6.json +0 -0
  117. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/overlays/ta7.json +0 -0
  118. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/pdtf-transaction.json +0 -0
  119. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v2/skeleton.json +0 -0
  120. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/README.md +0 -0
  121. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/con29DW.json +0 -0
  122. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/con29R.json +0 -0
  123. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/llc1.json +0 -0
  124. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/oc1.json +0 -0
  125. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/schemas/v3/overlays/sr24.json +0 -0
  126. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/compactSkeleton.js +0 -0
  127. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/countTokens.js +0 -0
  128. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/extractProperties.js +0 -0
  129. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/listPathTitles.js +0 -0
  130. /package/{keen-dewdney-6ae15b → compassionate-easley-bafb14}/src/utils/minimalSkeleton.js +0 -0
  131. /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
- // 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
- );
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), use source if it exists, otherwise use target
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
- 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];
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 === 'object') {
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 = cacheStats.totalQueries > 0 ? (cacheStats.hits / cacheStats.totalQueries * 100) : 0;
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 === 'function',
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: entries.length > 0 ? Math.max(...entries.map(e => e.age)) : 0,
398
- newestEntry: entries.length > 0 ? Math.min(...entries.map(e => e.age)) : 0
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 = (paths, schemaId = "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json", overlaysList = []) => {
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 = overlaysList.length > 0 ? overlaysList : defaultOverlays;
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
- .sort((a, b) => a[1].createdAt - b[1].createdAt);
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.4.1-6",
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.4.1-6",
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.30001565",
1360
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz",
1361
- "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==",
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.30001565",
5184
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz",
5185
- "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==",
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.5.0",
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",
@@ -20,6 +20,9 @@
20
20
  }
21
21
  ]
22
22
  },
23
+ "terms_of_use": {
24
+ "confidentiality_level": "restricted"
25
+ },
23
26
  "claims": {
24
27
  "/participants/-": {
25
28
  "name": {
@@ -32,6 +32,9 @@
32
32
  }
33
33
  ]
34
34
  },
35
+ "terms_of_use": {
36
+ "confidentiality_level": "public"
37
+ },
35
38
  "claims": {
36
39
  "/propertyPack/councilTax": {
37
40
  "councilTaxBand": "D",
@@ -21,6 +21,9 @@
21
21
  }
22
22
  ]
23
23
  },
24
+ "terms_of_use": {
25
+ "confidentiality_level": "public"
26
+ },
24
27
  "claims": {
25
28
  "/propertyPack/address": {
26
29
  "line1": "3 The Hollys",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "role": "Seller",
21
21
  "sellersCapacity": { "capacity": "Legal Owner" },
22
- "externalIds": { "Moverly": "123434" }
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
- "Moverly": "file123"
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
- "Moverly": "123434"
1030
+ "Platform": "123434"
1027
1031
  },
1028
1032
  "role": "Seller",
1029
1033
  "contractHash": "IYnBjUI8TauXFop6WCvnPA=="
@@ -21,6 +21,9 @@
21
21
  }
22
22
  ]
23
23
  },
24
+ "terms_of_use": {
25
+ "confidentiality_level": "restricted"
26
+ },
24
27
  "claims": {
25
28
  "/propertyPack/delayFactors/hasDelayFactors": {
26
29
  "yesNo": "No"