@pdtf/schemas 3.5.0 → 3.5.1-2

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.
@@ -20,8 +20,18 @@
20
20
  "WebFetch(domain:github.com)",
21
21
  "Bash(tree:*)",
22
22
  "Bash(sed:*)",
23
- "Bash(find:*)"
23
+ "Bash(find:*)",
24
+ "Bash(chmod:*)",
25
+ "Bash(git rev-parse:*)",
26
+ "Bash(/dev/null)",
27
+ "Bash(git log:*)",
28
+ "Bash(for file in src/schemas/v2/overlays/*.json)",
29
+ "Bash(done)",
30
+ "Bash(while read file)",
31
+ "Bash(for:*)",
32
+ "Bash(do echo \"=== $file ===\")",
33
+ "Bash(do echo \"$file:\")"
24
34
  ],
25
35
  "deny": []
26
36
  }
27
- }
37
+ }
package/README.md CHANGED
@@ -7,18 +7,20 @@ The Property Data Trust Framework (PDTF) Schemas provide standardized JSON Schem
7
7
 
8
8
  ## Project Goals & Status
9
9
 
10
- **Current Version:** 3.4.0 (Schema v3 - Stable)
10
+ **Current Version:** 3.5.0 (3.5.1-1 available as a pre-release on branch/package-tag `next`)
11
11
 
12
12
  This schema framework aims to support the [Home Buying and Selling Group](https://homebuyingandsellinggroup.co.uk) 'Property Pack' initiative, encompassing all requirements starting with the Buyers and Sellers Property Information set ([BASPI v4.0](https://homebuyingandsellinggroup.co.uk/baspi/)).
13
13
 
14
14
  **Key Objectives:**
15
+
15
16
  - 🏠 **Standardize** residential property data exchange across England and Wales
16
- - 🔗 **Enable** frictionless data sharing between software products and services
17
+ - 🔗 **Enable** frictionless data sharing between software products and services
17
18
  - 🛡️ **Maintain** trusted information about data provenance and verification
18
19
  - 📋 **Support** industry-standard forms (BASPI, NTS, Law Society TA forms)
19
20
  - 🧩 **Provide** modular components for flexible implementation
20
21
 
21
22
  **Related Projects:**
23
+
22
24
  - [API Specifications](https://github.com/Property-Data-Trust-Framework/api) - OpenAPI specs for data exchange protocols
23
25
  - [PDTF Website](https://trust.propdata.org.uk) - Official framework documentation
24
26
 
@@ -35,7 +37,7 @@ npm install @pdtf/schemas
35
37
  ### Basic Usage
36
38
 
37
39
  ```javascript
38
- const { getTransactionSchema, getValidator } = require('@pdtf/schemas');
40
+ const { getTransactionSchema, getValidator } = require("@pdtf/schemas");
39
41
 
40
42
  // Get a schema with BASPI v5 overlay
41
43
  const schema = getTransactionSchema(
@@ -45,14 +47,14 @@ const schema = getTransactionSchema(
45
47
 
46
48
  // Create a validator
47
49
  const validator = getValidator(
48
- "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
50
+ "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
49
51
  ["baspiV5"]
50
52
  );
51
53
 
52
54
  // Validate data
53
55
  const isValid = validator(propertyData);
54
56
  if (!isValid) {
55
- console.log('Validation errors:', validator.errors);
57
+ console.log("Validation errors:", validator.errors);
56
58
  }
57
59
  ```
58
60
 
@@ -122,6 +124,7 @@ const schema = getTransactionSchema(
122
124
  ```
123
125
 
124
126
  **Parameters:**
127
+
125
128
  - `schemaId` (string): Schema version URL
126
129
  - `overlays` (array): Array of overlay names or objects
127
130
 
@@ -146,15 +149,15 @@ const errors = validateVerifiedClaims(verifiedClaims, schemaId, ["nts2023"]);
146
149
 
147
150
  #### Main Form Overlays
148
151
 
149
- | Overlay | Description | Version |
150
- |---------|-------------|---------|
151
- | `baspiV4` | Buyers and Sellers Property Information | v4.0 |
152
- | `baspiV5` | Buyers and Sellers Property Information | v5.0 |
153
- | `nts2023` | National Trading Standards | 2023 |
154
- | `nts2025` | National Trading Standards | 2025 |
155
- | `ta6ed4` | Law Society Property Information Form | Edition 4 |
156
- | `ta7ed3` | Law Society Leasehold Information Form | Edition 3 |
157
- | `ta10ed3` | Law Society Fittings and Contents Form | Edition 3 |
152
+ | Overlay | Description | Version |
153
+ | --------- | --------------------------------------- | --------- |
154
+ | `baspiV4` | Buyers and Sellers Property Information | v4.0 |
155
+ | `baspiV5` | Buyers and Sellers Property Information | v5.0 |
156
+ | `nts2023` | National Trading Standards | 2023 |
157
+ | `nts2025` | National Trading Standards | 2025 |
158
+ | `ta6ed4` | Law Society Property Information Form | Edition 4 |
159
+ | `ta7ed3` | Law Society Leasehold Information Form | Edition 3 |
160
+ | `ta10ed3` | Law Society Fittings and Contents Form | Edition 3 |
158
161
 
159
162
  [View all overlays →](src/schemas/v3/overlays/README.md)
160
163
 
@@ -167,16 +170,22 @@ Modular NTS2 features for selective adoption:
167
170
  const schema = getTransactionSchema(schemaId, ["nts2023", "jk", "tf"]);
168
171
 
169
172
  // Multiple specialist issues
170
- const schema = getTransactionSchema(schemaId, ["nts2023", "as", "dr", "jk", "sb"]);
173
+ const schema = getTransactionSchema(schemaId, [
174
+ "nts2023",
175
+ "as",
176
+ "dr",
177
+ "jk",
178
+ "sb",
179
+ ]);
171
180
  ```
172
181
 
173
- | Extension | Code | Description |
174
- |-----------|------|-------------|
182
+ | Extension | Code | Description |
183
+ | ----------------- | ---- | -------------------------------- |
175
184
  | Japanese Knotweed | `jk` | Knotweed presence and management |
176
- | Transfer Fees | `tf` | Additional leasehold fees |
177
- | Managing Agent | `ma` | Leasehold managing agent details |
178
- | Solar Panels | `sl` | Solar panel ownership details |
179
- | Asbestos | `as` | Asbestos presence and management |
185
+ | Transfer Fees | `tf` | Additional leasehold fees |
186
+ | Managing Agent | `ma` | Leasehold managing agent details |
187
+ | Solar Panels | `sl` | Solar panel ownership details |
188
+ | Asbestos | `as` | Asbestos presence and management |
180
189
 
181
190
  [View all extensions →](src/schemas/v3/overlays/README.md#extension-overlays)
182
191
 
@@ -200,22 +209,27 @@ const ntsSchema = getTransactionSchema(schemaId, ["nts2023"]);
200
209
  ```javascript
201
210
  // Selective NTS2 adoption
202
211
  const partialNts2 = getTransactionSchema(schemaId, [
203
- "nts2023", // Base NTS
204
- "jk", // Japanese Knotweed
205
- "tf", // Transfer Fees
206
- "ma" // Managing Agent
212
+ "nts2023", // Base NTS
213
+ "jk", // Japanese Knotweed
214
+ "tf", // Transfer Fees
215
+ "ma", // Managing Agent
207
216
  ]);
208
217
 
209
218
  // Full specialist issues
210
219
  const specialistIssues = getTransactionSchema(schemaId, [
211
- "nts2023", "as", "dr", "jk", "sb", "hs"
220
+ "nts2023",
221
+ "as",
222
+ "dr",
223
+ "jk",
224
+ "sb",
225
+ "hs",
212
226
  ]);
213
227
  ```
214
228
 
215
229
  ### Data Validation
216
230
 
217
231
  ```javascript
218
- const { getValidator } = require('@pdtf/schemas');
232
+ const { getValidator } = require("@pdtf/schemas");
219
233
 
220
234
  const validator = getValidator(schemaId, ["baspiV5"]);
221
235
 
@@ -223,16 +237,16 @@ const propertyData = {
223
237
  propertyPack: {
224
238
  priceInformation: {
225
239
  price: 350000,
226
- priceQualifier: "Freehold"
240
+ priceQualifier: "Freehold",
227
241
  },
228
242
  // ... more property data
229
- }
243
+ },
230
244
  };
231
245
 
232
246
  if (validator(propertyData)) {
233
- console.log('✅ Data is valid');
247
+ console.log("✅ Data is valid");
234
248
  } else {
235
- console.log('❌ Validation errors:', validator.errors);
249
+ console.log("❌ Validation errors:", validator.errors);
236
250
  }
237
251
  ```
238
252
 
@@ -241,39 +255,44 @@ if (validator(propertyData)) {
241
255
  PDTF supports verified claims to maintain data provenance and trust throughout property transactions. Claims package specific property data with verification evidence, enabling traceability back to authoritative sources.
242
256
 
243
257
  ```javascript
244
- const { validateVerifiedClaims } = require('@pdtf/schemas');
258
+ const { validateVerifiedClaims } = require("@pdtf/schemas");
245
259
 
246
260
  // Current verified claims format
247
- const verifiedClaims = [{
248
- id: "claim-12345",
249
- transactionId: "txn-67890",
250
- schemaVersion: "3.4.0",
251
- verification: {
252
- trust_framework: "uk_pdtf",
253
- time: "2024-07-01T10:30:00Z",
254
- evidence: [{
255
- type: "vouch",
256
- attestation: {
257
- type: "digital_attestation",
258
- voucher: { name: "Estate Agent Ltd" }
259
- },
260
- verification_method: { type: "auth" }
261
- }]
261
+ const verifiedClaims = [
262
+ {
263
+ id: "claim-12345",
264
+ transactionId: "txn-67890",
265
+ schemaVersion: "3.4.0",
266
+ verification: {
267
+ trust_framework: "uk_pdtf",
268
+ time: "2024-07-01T10:30:00Z",
269
+ evidence: [
270
+ {
271
+ type: "vouch",
272
+ attestation: {
273
+ type: "digital_attestation",
274
+ voucher: { name: "Estate Agent Ltd" },
275
+ },
276
+ verification_method: { type: "auth" },
277
+ },
278
+ ],
279
+ },
280
+ claims: {
281
+ "/propertyPack/priceInformation/price": 350000,
282
+ "/propertyPack/energyEfficiency/epcRating": "C",
283
+ },
262
284
  },
263
- claims: {
264
- "/propertyPack/priceInformation/price": 350000,
265
- "/propertyPack/energyEfficiency/epcRating": "C"
266
- }
267
- }];
285
+ ];
268
286
 
269
287
  // Validate claims against schema
270
288
  const errors = validateVerifiedClaims(verifiedClaims, schemaId, ["baspiV5"]);
271
289
  if (errors.length === 0) {
272
- console.log('✅ Verified claims are valid');
290
+ console.log("✅ Verified claims are valid");
273
291
  }
274
292
  ```
275
293
 
276
294
  **Key Features:**
295
+
277
296
  - **Schema Path Validation** - Claims reference specific schema paths (e.g., `/propertyPack/priceInformation/price`)
278
297
  - **Provenance Tracking** - Each claim includes verification evidence and source attribution
279
298
  - **Trust Framework Integration** - Claims operate within the UK PDTF trust framework
@@ -281,6 +300,7 @@ if (errors.length === 0) {
281
300
 
282
301
  **Roadmap - W3C Verifiable Credentials:**
283
302
  The next version of the PDTF framework will migrate to [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) to provide:
303
+
284
304
  - **Enhanced Security** - Cryptographically signed claims with tamper detection
285
305
  - **Granular Permissions** - Fine-grained access control over claim data
286
306
  - **Interoperability** - Standards-based approach for broader ecosystem compatibility
@@ -311,17 +331,17 @@ npm test -- --testPathPattern=extensionOverlays
311
331
  npm test -- --testPathPattern=transactionSchema
312
332
  ```
313
333
 
314
-
315
334
  ## Versioning
316
335
 
317
336
  The schema follows semantic versioning:
337
+
318
338
  - **Patch** (3.4.x): Bug fixes, no breaking changes
319
339
  - **Minor** (3.x.0): New fields, backward compatible
320
340
  - **Major** (x.0.0): Breaking changes, migration required
321
341
 
322
342
  ## Licensing
323
343
 
324
- Licensed under the [MIT License](https://opensource.org/licenses/MIT).
344
+ Licensed under the [MIT License](https://opensource.org/licenses/MIT).
325
345
 
326
346
  **Important:** Overlays contain fields from licensed forms ([BASPI](https://homebuyingsellingcouncil.co.uk/wp-content/uploads/2021/03/Terms-of-Licence-mandatory-download-for-use-of-BASPI.pdf), [PIQ](https://www.propertymark.co.uk/static/14e7c154-98de-4230-957f09bd8d5ddeec/f542b10a-7710-4c37-b3958ccaeec25d4b/property-information-questionnaire-residential-sales.pdf), [Law Society TA](https://www.lawsociety.org.uk/topics/property/transaction-forms)). When rendering data into these forms, ensure compliance with their respective license terms.
327
347
 
@@ -331,4 +351,3 @@ Licensed under the [MIT License](https://opensource.org/licenses/MIT).
331
351
  - 📁 [Example Files](src/examples/)
332
352
  - 🐛 [Issue Tracker](https://github.com/Property-Data-Trust-Framework/schemas/issues)
333
353
  - 🌐 [PDTF Website](https://trust.propdata.org.uk)
334
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pdtf/schemas",
3
- "version": "3.5.0",
3
+ "version": "3.5.1-2",
4
4
  "description": "Property Data Trust Framework Schemas and Utilities",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -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"
@@ -6625,7 +6625,6 @@
6625
6625
  "enum": ["Yes", "No"]
6626
6626
  }
6627
6627
  },
6628
- "lpe1Required": ["yesNo"],
6629
6628
  "ta7Required": ["yesNo"],
6630
6629
  "discriminator": {
6631
6630
  "propertyName": "yesNo"
@@ -6649,7 +6648,6 @@
6649
6648
  "type": "string"
6650
6649
  }
6651
6650
  },
6652
- "lpe1Required": ["details"],
6653
6651
  "ta7Required": ["details"]
6654
6652
  }
6655
6653
  ]
@@ -6666,7 +6664,6 @@
6666
6664
  "enum": ["Yes", "No"]
6667
6665
  }
6668
6666
  },
6669
- "lpe1Required": ["yesNo"],
6670
6667
  "ta7Required": ["yesNo"],
6671
6668
  "discriminator": {
6672
6669
  "propertyName": "yesNo"
@@ -6690,15 +6687,48 @@
6690
6687
  "type": "string"
6691
6688
  }
6692
6689
  },
6693
- "lpe1Required": ["details"]
6690
+ "ta7Required": ["details"]
6694
6691
  }
6695
6692
  ]
6696
6693
  },
6697
6694
  "dangerousCladdingOrDefects": {
6698
6695
  "ta7Ref": "5.8",
6699
6696
  "title": "Does the seller know of the existence or suspected existence in the building of dangerous cladding or any other defects that create a building safety risk?",
6700
- "type": "string",
6701
- "enum": ["Yes", "No"]
6697
+ "type": "object",
6698
+ "properties": {
6699
+ "yesNo": {
6700
+ "ta7Ref": "5.8.1",
6701
+ "type": "string",
6702
+ "title": "",
6703
+ "enum": ["Yes", "No"]
6704
+ }
6705
+ },
6706
+ "ta7Required": ["yesNo"],
6707
+ "discriminator": {
6708
+ "propertyName": "yesNo"
6709
+ },
6710
+ "oneOf": [
6711
+ {
6712
+ "properties": {
6713
+ "yesNo": {
6714
+ "enum": ["No"]
6715
+ }
6716
+ }
6717
+ },
6718
+ {
6719
+ "properties": {
6720
+ "yesNo": {
6721
+ "enum": ["Yes"]
6722
+ },
6723
+ "details": {
6724
+ "ta7Ref": "5.8.2",
6725
+ "title": "Please give details:",
6726
+ "type": "string"
6727
+ }
6728
+ },
6729
+ "ta7Required": ["details"]
6730
+ }
6731
+ ]
6702
6732
  },
6703
6733
  "difficultyInCollectingServiceCharge": {
6704
6734
  "ta7Ref": "5.9",
@@ -6712,7 +6742,6 @@
6712
6742
  "enum": ["Yes", "No"]
6713
6743
  }
6714
6744
  },
6715
- "lpe1Required": ["yesNo"],
6716
6745
  "ta7Required": ["yesNo"],
6717
6746
  "discriminator": {
6718
6747
  "propertyName": "yesNo"
@@ -6736,7 +6765,6 @@
6736
6765
  "type": "string"
6737
6766
  }
6738
6767
  },
6739
- "lpe1Required": ["details"],
6740
6768
  "ta7Required": ["details"]
6741
6769
  }
6742
6770
  ]
@@ -6753,7 +6781,6 @@
6753
6781
  "enum": ["Yes", "No"]
6754
6782
  }
6755
6783
  },
6756
- "lpe1Required": ["yesNo"],
6757
6784
  "ta7Required": ["yesNo"],
6758
6785
  "discriminator": {
6759
6786
  "propertyName": "yesNo"
@@ -6777,7 +6804,7 @@
6777
6804
  "type": "string"
6778
6805
  }
6779
6806
  },
6780
- "lpe1Required": ["details"]
6807
+ "ta7Required": ["details"]
6781
6808
  }
6782
6809
  ]
6783
6810
  },
@@ -7337,11 +7364,6 @@
7337
7364
  "lpe1Required": [
7338
7365
  "annualServiceCharge",
7339
7366
  "largeAdditionalExpense",
7340
- "problemInServiceChargeLevel",
7341
- "serviceChargeChallenged",
7342
- "dangerousCladdingOrDefects",
7343
- "difficultyInCollectingServiceCharge",
7344
- "serviceChargeOwed",
7345
7367
  "propertiesContributingToMaintenanceOfManagedArea",
7346
7368
  "adHocExpenses",
7347
7369
  "serviceChargePaidUpToDate",
@@ -22519,7 +22541,7 @@
22519
22541
  "baspi4Ref": "A11.1.1",
22520
22542
  "baspi5Ref": "A11.1.1",
22521
22543
  "rdsRef": "Sustainability/Environmental|Natural|Situational",
22522
- "ta6Ref": "7.1.0",
22544
+ "ta6Ref": "7",
22523
22545
  "title": "Flooding",
22524
22546
  "type": "object",
22525
22547
  "baspi4Required": ["historicalFlooding"],
@@ -22536,8 +22558,48 @@
22536
22558
  "historicalFlooding",
22537
22559
  "floodDefences"
22538
22560
  ],
22539
- "ta6Required": ["historicalFlooding"],
22561
+ "ta6Required": ["floodRiskReport", "historicalFlooding"],
22540
22562
  "properties": {
22563
+ "floodRiskReport": {
22564
+ "ta6Ref": "7.3",
22565
+ "title": "Flood risk report",
22566
+ "type": "object",
22567
+ "ta6Required": ["hasReportBeenPrepared"],
22568
+ "properties": {
22569
+ "hasReportBeenPrepared": {
22570
+ "ta6Ref": "7.3.1",
22571
+ "title": "Has a flood risk report been prepared?",
22572
+ "type": "string",
22573
+ "enum": ["Yes", "No"]
22574
+ }
22575
+ },
22576
+ "discriminator": {
22577
+ "propertyName": "hasReportBeenPrepared"
22578
+ },
22579
+ "oneOf": [
22580
+ {
22581
+ "properties": {
22582
+ "hasReportBeenPrepared": {
22583
+ "enum": ["No"]
22584
+ }
22585
+ }
22586
+ },
22587
+ {
22588
+ "properties": {
22589
+ "hasReportBeenPrepared": {
22590
+ "enum": ["Yes"]
22591
+ },
22592
+ "attachments": {
22593
+ "ta6Ref": "7.3.2",
22594
+ "title": "Please supply a copy",
22595
+ "type": "string",
22596
+ "enum": ["Attached", "To follow"]
22597
+ }
22598
+ },
22599
+ "ta6Required": ["attachments"]
22600
+ }
22601
+ ]
22602
+ },
22541
22603
  "floodRisk": {
22542
22604
  "ntsRef": "C3.1.1.1",
22543
22605
  "nts2Ref": "C3.1.1.1",