@pdtf/schemas 3.6.0-dev.4 → 3.6.0-dev.6

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 +13 -10
  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 +8190 -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 +94 -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 +1653 -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 +5 -1
  70. package/src/schemas/v3/overlays/extensions/ic.json +42 -8
  71. package/src/schemas/v3/overlays/sef25.json +16 -2
  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
@@ -2,9 +2,24 @@ const { dereference } = require("@jdw/jst");
2
2
  const traverse = require("traverse");
3
3
  const jp = require("jsonpointer");
4
4
  const fs = require("fs");
5
+ const path = require("path");
5
6
  const merge = require("deepmerge");
6
7
 
7
- const combinedSchema = require("../schemas/v3/combined.json");
8
+ const combinedPath =
9
+ process.env.COMBINED_PATH ||
10
+ path.resolve(__dirname, "../schemas/v3/combined.json");
11
+ const outputDir =
12
+ process.env.OUTPUT_DIR ||
13
+ path.resolve(__dirname, "../schemas/v3");
14
+
15
+ if (!fs.existsSync(combinedPath)) {
16
+ throw new Error(`Combined schema not found: ${combinedPath}`);
17
+ }
18
+ if (!fs.existsSync(outputDir)) {
19
+ fs.mkdirSync(outputDir, { recursive: true });
20
+ }
21
+
22
+ const combinedSchema = JSON.parse(fs.readFileSync(combinedPath, "utf8"));
8
23
 
9
24
  const extractFields = [
10
25
  "baspi4",
@@ -14,7 +29,9 @@ const extractFields = [
14
29
  "ntsl",
15
30
  "ntsl2",
16
31
  "ta6",
32
+ "ta6ed6",
17
33
  "ta7",
34
+ "ta7ed5",
18
35
  "ta10",
19
36
  "lpe1",
20
37
  "fme1",
@@ -25,20 +42,35 @@ const extractFields = [
25
42
  "rds",
26
43
  "oc1",
27
44
  "sr24",
45
+ "sef25",
28
46
  ];
29
47
 
48
+ const metadataFields = [...extractFields, "ta6ed6Compat"];
49
+
30
50
  const flattenSkeleton = (schema) => {
31
51
  if (!schema) return undefined;
32
-
52
+
33
53
  // Handle arrays - mark with special notation
34
54
  if (schema.type === "array" && schema.items) {
35
55
  const itemSchema = flattenSkeleton(schema.items);
36
56
  // Use array notation to indicate this is an array
37
57
  return [itemSchema];
38
58
  }
39
-
59
+
60
+ // Handle patternProperties (dynamic keys like in offers and enquiries)
61
+ if (schema.type === "object" && schema.patternProperties) {
62
+ // Get the schema from the first pattern (usually ".*")
63
+ const patternKeys = Object.keys(schema.patternProperties);
64
+ if (patternKeys.length > 0) {
65
+ const patternSchema = schema.patternProperties[patternKeys[0]];
66
+ const itemSchema = flattenSkeleton(patternSchema);
67
+ // Use {*: schema} notation to indicate this is a keyed object
68
+ return { "*": itemSchema };
69
+ }
70
+ }
71
+
40
72
  // Handle primitives - return type indicator
41
- if (schema.type && !schema.properties && !schema.oneOf && !schema.items) {
73
+ if (schema.type && !schema.properties && !schema.oneOf && !schema.items && !schema.patternProperties) {
42
74
  // Return a type indicator for primitive types
43
75
  if (schema.type === "string") return "string";
44
76
  if (schema.type === "number") return "number";
@@ -46,45 +78,60 @@ const flattenSkeleton = (schema) => {
46
78
  if (schema.type === "boolean") return "boolean";
47
79
  if (schema.type === "null") return "null";
48
80
  }
49
-
81
+
50
82
  let returnStructure = {};
51
-
83
+
52
84
  // Handle object properties
53
85
  if (schema.properties) {
54
86
  Object.keys(schema.properties).forEach((key) => {
55
87
  returnStructure[key] = flattenSkeleton(schema.properties[key]);
56
88
  });
57
89
  }
58
-
59
- // Handle oneOf - merge all possible properties
90
+
91
+ // Handle oneOf - merge all possible properties (recursively handles nested oneOf)
60
92
  if (schema.oneOf) {
61
93
  schema.oneOf.forEach((aOneOf) => {
62
- if (aOneOf.properties) {
63
- Object.entries(aOneOf.properties).forEach(([key, value]) => {
64
- // If property already exists and differs, mark as variant
65
- const newValue = flattenSkeleton(value);
66
- if (returnStructure[key] && JSON.stringify(returnStructure[key]) !== JSON.stringify(newValue)) {
67
- // For primitive types, just mark as variant type
68
- if (typeof returnStructure[key] === "string" || typeof newValue === "string") {
94
+ const variantResult = flattenSkeleton(aOneOf);
95
+ if (variantResult && typeof variantResult === "object" && !Array.isArray(variantResult)) {
96
+ Object.entries(variantResult).forEach(([key, value]) => {
97
+ if (key === "_variants") return;
98
+ if (returnStructure[key] && JSON.stringify(returnStructure[key]) !== JSON.stringify(value)) {
99
+ if (typeof returnStructure[key] === "string" || typeof value === "string") {
69
100
  returnStructure[key] = "variant";
70
101
  } else {
71
- // For complex types, merge properties
72
- returnStructure[key] = { ...returnStructure[key], ...newValue, _variants: true };
102
+ returnStructure[key] = { ...returnStructure[key], ...value, _variants: true };
73
103
  }
74
104
  } else {
75
- returnStructure[key] = newValue;
105
+ returnStructure[key] = value;
76
106
  }
77
107
  });
78
108
  }
79
109
  });
80
110
  }
81
-
111
+
82
112
  // Return empty object for objects without properties
83
113
  return Object.keys(returnStructure).length > 0 ? returnStructure : {};
84
114
  };
85
115
 
86
116
  const extractOverlay = (sourceSchema, ref) => {
87
117
  const refName = `${ref}Ref`;
118
+ const extendedTagMap = {
119
+ Type: "type",
120
+ MinLength: "minLength",
121
+ MaxLength: "maxLength",
122
+ Pattern: "pattern",
123
+ Minimum: "minimum",
124
+ Maximum: "maximum",
125
+ MinItems: "minItems",
126
+ MaxItems: "maxItems",
127
+ UniqueItems: "uniqueItems",
128
+ AdditionalProperties: "additionalProperties",
129
+ Format: "format",
130
+ MinProperties: "minProperties",
131
+ MaxProperties: "maxProperties",
132
+ MultipleOf: "multipleOf",
133
+ Const: "const",
134
+ };
88
135
  const returnSchema = {
89
136
  $schema: "http://json-schema.org/draft-07/schema#",
90
137
  $id: `https://trust.propdata.org.uk/schemas/v3/overlays/${ref}.json`,
@@ -95,7 +142,7 @@ const extractOverlay = (sourceSchema, ref) => {
95
142
  if (element[refName]) {
96
143
  jp.set(returnSchema, `${path}/${refName}`, element[refName]);
97
144
 
98
- if (element.discriminator) {
145
+ if (element.discriminator && Array.isArray(element.oneOf)) {
99
146
  jp.set(returnSchema, `${path}/discriminator`, element.discriminator);
100
147
  const { propertyName } = element.discriminator;
101
148
  element.oneOf.forEach((oneOf, index) => {
@@ -122,7 +169,7 @@ const extractOverlay = (sourceSchema, ref) => {
122
169
  }
123
170
 
124
171
  // also handle discriminator properties nested in items
125
- if (element.items?.discriminator) {
172
+ if (element.items?.discriminator && Array.isArray(element.items.oneOf)) {
126
173
  jp.set(
127
174
  returnSchema,
128
175
  `${path}/items/discriminator`,
@@ -172,6 +219,18 @@ const extractOverlay = (sourceSchema, ref) => {
172
219
  if (element[refEnum]) {
173
220
  jp.set(returnSchema, `${path}/enum`, element[refEnum]);
174
221
  }
222
+
223
+ const refConst = `${ref}Const`;
224
+ if (Object.prototype.hasOwnProperty.call(element, refConst)) {
225
+ jp.set(returnSchema, `${path}/const`, element[refConst]);
226
+ }
227
+
228
+ Object.entries(extendedTagMap).forEach(([suffix, schemaKey]) => {
229
+ const tagKey = `${ref}${suffix}`;
230
+ if (Object.prototype.hasOwnProperty.call(element, tagKey)) {
231
+ jp.set(returnSchema, `${path}/${schemaKey}`, element[tagKey]);
232
+ }
233
+ });
175
234
  });
176
235
  return returnSchema;
177
236
  };
@@ -186,28 +245,48 @@ const deleteProperties = (sourceSchema, propertyNames) => {
186
245
  };
187
246
 
188
247
  const overlays = {};
248
+ const overlaysDir = path.join(outputDir, "overlays");
249
+ if (!fs.existsSync(overlaysDir)) {
250
+ fs.mkdirSync(overlaysDir, { recursive: true });
251
+ }
189
252
 
190
253
  extractFields.forEach((key) => {
191
254
  let overlay = extractOverlay(combinedSchema, key);
192
255
  overlays[key] = overlay;
193
- const fileName = `../schemas/v3/overlays/${key}.json`;
256
+ const fileName = path.join(overlaysDir, `${key}.json`);
194
257
  fs.writeFileSync(fileName, JSON.stringify(overlay, null, 2));
195
258
  console.log(`Overlay ${key} written to ${fileName}`);
196
259
  });
197
260
 
198
261
  const coreSchema = deleteProperties(combinedSchema, [
199
262
  "discriminator",
200
- ...extractFields.map((item) => `${item}Ref`),
201
- ...extractFields.map((item) => `${item}Required`),
202
- ...extractFields.map((item) => `${item}Title`),
203
- ...extractFields.map((item) => `${item}Enum`),
263
+ ...metadataFields.map((item) => `${item}Ref`),
264
+ ...metadataFields.map((item) => `${item}Required`),
265
+ ...metadataFields.map((item) => `${item}Title`),
266
+ ...metadataFields.map((item) => `${item}Description`),
267
+ ...metadataFields.map((item) => `${item}Enum`),
268
+ ...metadataFields.map((item) => `${item}Type`),
269
+ ...metadataFields.map((item) => `${item}MinLength`),
270
+ ...metadataFields.map((item) => `${item}MaxLength`),
271
+ ...metadataFields.map((item) => `${item}Pattern`),
272
+ ...metadataFields.map((item) => `${item}Minimum`),
273
+ ...metadataFields.map((item) => `${item}Maximum`),
274
+ ...metadataFields.map((item) => `${item}MinItems`),
275
+ ...metadataFields.map((item) => `${item}MaxItems`),
276
+ ...metadataFields.map((item) => `${item}UniqueItems`),
277
+ ...metadataFields.map((item) => `${item}AdditionalProperties`),
278
+ ...metadataFields.map((item) => `${item}Format`),
279
+ ...metadataFields.map((item) => `${item}MinProperties`),
280
+ ...metadataFields.map((item) => `${item}MaxProperties`),
281
+ ...metadataFields.map((item) => `${item}MultipleOf`),
282
+ ...metadataFields.map((item) => `${item}Const`),
204
283
  ]);
205
284
 
206
285
  fs.writeFileSync(
207
- "../schemas/v3/pdtf-transaction.json",
286
+ path.join(outputDir, "pdtf-transaction.json"),
208
287
  JSON.stringify(coreSchema, null, 2)
209
288
  );
210
- console.log("Core schema written to ../schemas/v3/pdtf-transaction.json");
289
+ console.log(`Core schema written to ${path.join(outputDir, "pdtf-transaction.json")}`);
211
290
 
212
291
  const skeletonSchema = deleteProperties(coreSchema, [
213
292
  "$schema",
@@ -226,10 +305,10 @@ const skeletonSchema = deleteProperties(coreSchema, [
226
305
  const skeletonSchemaFlattened = flattenSkeleton(skeletonSchema);
227
306
 
228
307
  fs.writeFileSync(
229
- "../schemas/v3/skeleton.json",
308
+ path.join(outputDir, "skeleton.json"),
230
309
  JSON.stringify(skeletonSchemaFlattened, null, 2)
231
310
  );
232
- console.log("Flat Skeleton schema written to ../schemas/v3/skeleton.json");
311
+ console.log(`Flat Skeleton schema written to ${path.join(outputDir, "skeleton.json")}`);
233
312
 
234
313
  // Generate compact skeleton format for better token efficiency
235
314
  const toCompact = (obj, indent = "") => {
@@ -237,7 +316,7 @@ const toCompact = (obj, indent = "") => {
237
316
  // Skip type indicators entirely
238
317
  return "";
239
318
  }
240
-
319
+
241
320
  if (Array.isArray(obj)) {
242
321
  if (obj.length === 0) return "[]";
243
322
  // Array with content
@@ -247,16 +326,25 @@ const toCompact = (obj, indent = "") => {
247
326
  }
248
327
  return `[\n${inner}\n${indent}]`;
249
328
  }
250
-
329
+
251
330
  if (obj && typeof obj === "object") {
252
331
  const keys = Object.keys(obj);
253
332
  if (keys.length === 0) return "";
254
-
333
+
334
+ // Check if this is a keyed object (has "*" key)
335
+ if (keys.length === 1 && keys[0] === "*") {
336
+ const inner = toCompact(obj["*"], indent);
337
+ if (inner === "" || inner === "{*}") {
338
+ return "{*}"; // Keyed object of primitives (or nested keyed objects with no structure)
339
+ }
340
+ return `{*}\n${inner}`;
341
+ }
342
+
255
343
  // Process each key
256
344
  const lines = [];
257
345
  keys.forEach(k => {
258
346
  const val = toCompact(obj[k], indent + " ");
259
-
347
+
260
348
  if (val === "") {
261
349
  // Leaf node - just show the property name
262
350
  lines.push(`${indent} ${k}`);
@@ -266,16 +354,19 @@ const toCompact = (obj, indent = "") => {
266
354
  } else if (val.startsWith("[")) {
267
355
  // Array with nested content - simple concatenation
268
356
  lines.push(`${indent} ${k}${val}`);
357
+ } else if (val.startsWith("{*}")) {
358
+ // Keyed object property - simple concatenation
359
+ lines.push(`${indent} ${k}${val}`);
269
360
  } else {
270
361
  // Object property - show name on its own line, content below
271
362
  lines.push(`${indent} ${k}`);
272
363
  lines.push(val);
273
364
  }
274
365
  });
275
-
366
+
276
367
  return lines.length > 0 ? lines.join("\n") : "";
277
368
  }
278
-
369
+
279
370
  return "";
280
371
  };
281
372
 
@@ -284,7 +375,7 @@ const innerContent = toCompact(skeletonSchemaFlattened, "");
284
375
  const compactSkeleton = innerContent ? innerContent : "";
285
376
 
286
377
  fs.writeFileSync(
287
- "../schemas/v3/compactSkeleton.txt",
378
+ path.join(outputDir, "compactSkeleton.txt"),
288
379
  compactSkeleton
289
380
  );
290
- console.log("Compact Skeleton written to ../schemas/v3/compactSkeleton.txt");
381
+ console.log(`Compact Skeleton written to ${path.join(outputDir, "compactSkeleton.txt")}`);
@@ -6,7 +6,7 @@ const combinedSchema = require("../schemas/v3/combined.json");
6
6
  // Extract fields that have overlay-specific properties
7
7
  const extractFields = [
8
8
  "baspi4", "baspi5", "nts", "nts2", "ntsl", "ntsl2",
9
- "ta6", "ta7", "ta10", "lpe1", "fme1", "piq",
9
+ "ta6", "ta7", "ta7ed5", "ta10", "lpe1", "fme1", "piq",
10
10
  "con29R", "con29DW", "llc1", "rds", "oc1", "sr24",
11
11
  ];
12
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdtf/schemas",
3
- "version": "3.6.0-dev.4",
3
+ "version": "3.6.0-dev.6",
4
4
  "description": "Property Data Trust Framework Schemas and Utilities",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -25468,6 +25468,7 @@
25468
25468
  "isInsured",
25469
25469
  "difficultiesObtainingInsurance"
25470
25470
  ],
25471
+ "sef25Required": ["isInsured"],
25471
25472
  "properties": {
25472
25473
  "difficultiesObtainingInsurance": {
25473
25474
  "baspi4Ref": "A8.1.2.1",
@@ -25765,6 +25766,7 @@
25765
25766
  "rdsRef": "Insurance/isInsured=no|yes|true|false",
25766
25767
  "ta6Ref": "6.1",
25767
25768
  "ta6ed6Ref": "7.1",
25769
+ "sef25Ref": "I1.2",
25768
25770
  "piqRef": "A8.2",
25769
25771
  "title": "Do you currently insure the property?",
25770
25772
  "ta6Title": "Does the seller insure the property?",
@@ -25869,6 +25871,7 @@
25869
25871
  "baspi5Ref": "A8.2.1",
25870
25872
  "ta6Ref": "6.5.2",
25871
25873
  "ta6ed6Ref": "7.3.2",
25874
+ "sef25Ref": "I1.1.2",
25872
25875
  "title": "Provide details",
25873
25876
  "ta6ed6Title": "Give details, including the date(s) of any claim(s) and how they were resolved",
25874
25877
  "type": "string",
@@ -25878,7 +25881,8 @@
25878
25881
  "baspi4Required": ["details"],
25879
25882
  "baspi5Required": ["details"],
25880
25883
  "ta6Required": ["details"],
25881
- "ta6ed6Required": ["details"]
25884
+ "ta6ed6Required": ["details"],
25885
+ "sef25Required": ["details"]
25882
25886
  }
25883
25887
  ]
25884
25888
  }
@@ -3,9 +3,33 @@
3
3
  "propertyPack": {
4
4
  "properties": {
5
5
  "insurance": {
6
+ "ntsRef": "I1",
7
+ "required": [
8
+ "isInsured"
9
+ ],
10
+ "discriminator": {
11
+ "propertyName": "isInsured"
12
+ },
13
+ "properties": {
14
+ "isInsured": {
15
+ "ntsRef": "I1.2",
16
+ "type": "string"
17
+ }
18
+ },
6
19
  "oneOf": [
7
- null,
8
20
  {
21
+ "properties": {
22
+ "isInsured": {
23
+ "enum": [
24
+ "No"
25
+ ]
26
+ }
27
+ }
28
+ },
29
+ {
30
+ "required": [
31
+ "insuranceClaims"
32
+ ],
9
33
  "properties": {
10
34
  "insuranceClaims": {
11
35
  "ntsRef": "I1.1",
@@ -32,7 +56,15 @@
32
56
  }
33
57
  },
34
58
  {
59
+ "required": [
60
+ "details"
61
+ ],
35
62
  "properties": {
63
+ "details": {
64
+ "ntsRef": "I1.1.2",
65
+ "type": "string",
66
+ "minLength": 1
67
+ },
36
68
  "yesNo": {
37
69
  "enum": [
38
70
  "Yes"
@@ -40,15 +72,17 @@
40
72
  }
41
73
  }
42
74
  }
43
- ],
44
- "type": "object"
75
+ ]
76
+ },
77
+ "isInsured": {
78
+ "enum": [
79
+ "Yes"
80
+ ]
45
81
  }
46
- },
47
- "required": [
48
- "insuranceClaims"
49
- ]
82
+ }
50
83
  }
51
- ]
84
+ ],
85
+ "type": "object"
52
86
  }
53
87
  },
54
88
  "ntsRef": "0"
@@ -1132,8 +1132,14 @@
1132
1132
  "enum": [
1133
1133
  "Yes"
1134
1134
  ]
1135
+ },
1136
+ "details": {
1137
+ "sef25Ref": "I1.1.2"
1135
1138
  }
1136
- }
1139
+ },
1140
+ "required": [
1141
+ "details"
1142
+ ]
1137
1143
  }
1138
1144
  ],
1139
1145
  "required": [
@@ -1150,7 +1156,15 @@
1150
1156
  "insuranceClaims"
1151
1157
  ]
1152
1158
  }
1153
- ]
1159
+ ],
1160
+ "required": [
1161
+ "isInsured"
1162
+ ],
1163
+ "properties": {
1164
+ "isInsured": {
1165
+ "sef25Ref": "I1.2"
1166
+ }
1167
+ }
1154
1168
  },
1155
1169
  "rightsAndInformalArrangements": {
1156
1170
  "sef25Ref": "R1",
@@ -274,7 +274,7 @@ const extensionMappings = {
274
274
  description: "Insurance claims upfront for SEF25",
275
275
  refType: "sef25Ref",
276
276
  paths: [
277
- "/properties/propertyPack/properties/insurance/oneOf/1/properties/insuranceClaims",
277
+ "/properties/propertyPack/properties/insurance",
278
278
  ],
279
279
  },
280
280