@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
@@ -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.5",
4
4
  "description": "Property Data Trust Framework Schemas and Utilities",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -25765,6 +25765,7 @@
25765
25765
  "rdsRef": "Insurance/isInsured=no|yes|true|false",
25766
25766
  "ta6Ref": "6.1",
25767
25767
  "ta6ed6Ref": "7.1",
25768
+ "sef25Ref": "I1.2",
25768
25769
  "piqRef": "A8.2",
25769
25770
  "title": "Do you currently insure the property?",
25770
25771
  "ta6Title": "Does the seller insure the property?",
@@ -3,9 +3,30 @@
3
3
  "propertyPack": {
4
4
  "properties": {
5
5
  "insurance": {
6
+ "ntsRef": "I1",
7
+ "discriminator": {
8
+ "propertyName": "isInsured"
9
+ },
10
+ "properties": {
11
+ "isInsured": {
12
+ "ntsRef": "I1.2",
13
+ "type": "string"
14
+ }
15
+ },
6
16
  "oneOf": [
7
- null,
8
17
  {
18
+ "properties": {
19
+ "isInsured": {
20
+ "enum": [
21
+ "No"
22
+ ]
23
+ }
24
+ }
25
+ },
26
+ {
27
+ "required": [
28
+ "insuranceClaims"
29
+ ],
9
30
  "properties": {
10
31
  "insuranceClaims": {
11
32
  "ntsRef": "I1.1",
@@ -40,15 +61,17 @@
40
61
  }
41
62
  }
42
63
  }
43
- ],
44
- "type": "object"
64
+ ]
65
+ },
66
+ "isInsured": {
67
+ "enum": [
68
+ "Yes"
69
+ ]
45
70
  }
46
- },
47
- "required": [
48
- "insuranceClaims"
49
- ]
71
+ }
50
72
  }
51
- ]
73
+ ],
74
+ "type": "object"
52
75
  }
53
76
  },
54
77
  "ntsRef": "0"
@@ -1150,7 +1150,12 @@
1150
1150
  "insuranceClaims"
1151
1151
  ]
1152
1152
  }
1153
- ]
1153
+ ],
1154
+ "properties": {
1155
+ "isInsured": {
1156
+ "sef25Ref": "I1.2"
1157
+ }
1158
+ }
1154
1159
  },
1155
1160
  "rightsAndInformalArrangements": {
1156
1161
  "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