@tracepass/dpp-schemas 1.8.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./LICENSE)
12
12
  [![npm](https://img.shields.io/npm/v/@tracepass/dpp-schemas.svg)](https://www.npmjs.com/package/@tracepass/dpp-schemas)
13
- [![Fields](https://img.shields.io/badge/fields-984-informational)](#whats-in-here)
13
+ [![Fields](https://img.shields.io/badge/fields-987-informational)](#whats-in-here)
14
14
  [![Categories](https://img.shields.io/badge/categories-13-informational)](#whats-in-here)
15
15
  [![Dependencies](https://img.shields.io/badge/dependencies-none-success)](#no-build-step)
16
16
  [![Schema](https://img.shields.io/badge/JSON%20Schema-2020--12-orange)](./schema.json)
@@ -39,31 +39,35 @@ this repository contains.
39
39
 
40
40
  ## What's in here
41
41
 
42
- Thirteen JSON files, one per product category. **984 fields in total. 152 are required by
43
- an instrument in force; 228 are anticipated under a rule that has not yet been adopted.**
42
+ Thirteen JSON files, one per product category. **987 fields in total. 65 are required by
43
+ a law that creates a passport; 220 are anticipated under a rule that has not yet been adopted.**
44
+ Every other legal duty (on the product, the label, a safety data sheet, a document) is
45
+ recorded per field in `regulationRef.obligations` instead of being marked required.
44
46
 
45
47
  | Category | Fields | Required | Instrument |
46
48
  |---|---:|---:|---|
47
- | `battery` | 120 | 50 | Regulation (EU) 2023/1542 |
48
- | `construction` | 49 | 4 | CPR (EU) 2024/3110 |
49
- | `detergents` | 83 | 18 | Regulation (EU) 2026/405 |
50
- | `electronics` | 160 | 4 | ESPR (EU) 2024/1781 |
51
- | `fmcg` | 42 | 9 | ESPR (EU) 2024/1781 |
52
- | `furniture` | 79 | 4 | ESPR (EU) 2024/1781 |
53
- | `jewelry` | 53 | 3 | ESPR (EU) 2024/1781 |
54
- | `packaging` | 64 | 8 | PPWR (EU) 2025/40 |
55
- | `paints-coatings` | 69 | 15 | Directive 2004/42/EC |
56
- | `steel` | 84 | 16 | ESPR (EU) 2024/1781 |
57
- | `textile` | 60 | 5 | ESPR (EU) 2024/1781 |
58
- | `toys` | 28 | 14 | Regulation (EU) 2025/2509 |
59
- | `tyres` | 93 | 2 | ESPR (EU) 2024/1781 |
49
+ | `battery` | 120 | 38 | Regulation (EU) 2023/1542 |
50
+ | `construction` | 49 | 0 | CPR (EU) 2024/3110 |
51
+ | `detergents` | 76 | 12 | Regulation (EU) 2026/405 |
52
+ | `electronics` | 160 | 0 | ESPR (EU) 2024/1781 |
53
+ | `fmcg` | 42 | 0 | ESPR (EU) 2024/1781 |
54
+ | `furniture` | 79 | 0 | ESPR (EU) 2024/1781 |
55
+ | `jewelry` | 53 | 0 | ESPR (EU) 2024/1781 |
56
+ | `packaging` | 64 | 0 | PPWR (EU) 2025/40 |
57
+ | `paints-coatings` | 65 | 0 | Directive 2004/42/EC |
58
+ | `steel` | 84 | 0 | ESPR (EU) 2024/1781 |
59
+ | `textile` | 60 | 0 | ESPR (EU) 2024/1781 |
60
+ | `toys` | 42 | 15 | Regulation (EU) 2025/2509 |
61
+ | `tyres` | 93 | 0 | ESPR (EU) 2024/1781 |
60
62
 
61
63
  Battery carries the most required fields because Regulation (EU) 2023/1542 Art. 77 sets a
62
64
  real statutory date — 18 February 2027 — rather than awaiting a delegated act. The only
63
65
  other categories whose passport duty rests on an adopted instrument are `detergents` and
64
66
  `toys` (`dateBasis: "statutory"`); the remaining ten are `"indicative"` — either awaiting
65
67
  an ESPR delegated act, or citing an instrument that creates no passport duty at all
66
- (`paints-coatings`, `packaging`, `construction`).
68
+ (`paints-coatings`, `packaging`, `construction`). Those three passport categories are the only ones
69
+ with required fields; construction's passport points are recorded as obligations
70
+ conditional on the delegated act under Reg (EU) 2024/3110 Art. 75(1).
67
71
 
68
72
  It is not the case that every battery field is required: the template also carries fields that are
69
73
  `anticipated` (pending the carbon-footprint and due-diligence acts, and — per the
@@ -191,7 +195,14 @@ else:
191
195
 
192
196
  **`regulationRef`** is the reason this data is worth having. Every field says which
193
197
  article and annex mandates it, so a compliance report can cite its source rather than
194
- assert it.
198
+ assert it. `regulationRef.obligations` lists every law that requires the datum, each with
199
+ the provision, where the law puts it (the passport, the product, the label, a safety data
200
+ sheet, a notification, a document, a customs declaration), any condition, and the
201
+ operative sentence quoted from the act. A field is `required` only when a passport law puts
202
+ it in the passport for every product; a duty elsewhere is recorded, not required. So a
203
+ manufacturer name can be required in the battery passport and, in a category with no
204
+ passport law yet, optional with GPSR Art. 9(6) recorded as the duty to show it on the
205
+ product.
195
206
 
196
207
  **`label`** is provided in the 24 official EU languages, because ESPR Article 8 requires
197
208
  the passport to be available in the language of the member state where the product is
package/index.json CHANGED
@@ -7,9 +7,9 @@
7
7
  },
8
8
  "totals": {
9
9
  "categories": 13,
10
- "fields": 984,
11
- "requiredFields": 152,
12
- "anticipatedFields": 228
10
+ "fields": 987,
11
+ "requiredFields": 65,
12
+ "anticipatedFields": 220
13
13
  },
14
14
  "categories": [
15
15
  {
@@ -18,7 +18,7 @@
18
18
  "file": "templates/battery.json",
19
19
  "version": 5,
20
20
  "fieldCount": 120,
21
- "requiredFieldCount": 50,
21
+ "requiredFieldCount": 38,
22
22
  "anticipatedFieldCount": 16,
23
23
  "regulation": {
24
24
  "name": "EU Battery Regulation",
@@ -34,7 +34,7 @@
34
34
  "file": "templates/construction.json",
35
35
  "version": 2,
36
36
  "fieldCount": 49,
37
- "requiredFieldCount": 4,
37
+ "requiredFieldCount": 0,
38
38
  "anticipatedFieldCount": 0,
39
39
  "regulation": {
40
40
  "name": "Construction Products Regulation",
@@ -51,9 +51,9 @@
51
51
  "label": "Detergents & Surfactants",
52
52
  "file": "templates/detergents.json",
53
53
  "version": 1,
54
- "fieldCount": 83,
55
- "requiredFieldCount": 18,
56
- "anticipatedFieldCount": 17,
54
+ "fieldCount": 76,
55
+ "requiredFieldCount": 12,
56
+ "anticipatedFieldCount": 10,
57
57
  "regulation": {
58
58
  "name": "Detergents Regulation",
59
59
  "number": "(EU) 2026/405",
@@ -68,7 +68,7 @@
68
68
  "file": "templates/electronics.json",
69
69
  "version": 2,
70
70
  "fieldCount": 160,
71
- "requiredFieldCount": 4,
71
+ "requiredFieldCount": 0,
72
72
  "anticipatedFieldCount": 19,
73
73
  "regulation": {
74
74
  "name": "EU ESPR - Electronics",
@@ -86,7 +86,7 @@
86
86
  "file": "templates/fmcg.json",
87
87
  "version": 2,
88
88
  "fieldCount": 42,
89
- "requiredFieldCount": 9,
89
+ "requiredFieldCount": 0,
90
90
  "anticipatedFieldCount": 6,
91
91
  "regulation": {
92
92
  "name": "EU ESPR - FMCG",
@@ -104,7 +104,7 @@
104
104
  "file": "templates/furniture.json",
105
105
  "version": 2,
106
106
  "fieldCount": 79,
107
- "requiredFieldCount": 4,
107
+ "requiredFieldCount": 0,
108
108
  "anticipatedFieldCount": 26,
109
109
  "regulation": {
110
110
  "name": "EU ESPR - Furniture",
@@ -122,7 +122,7 @@
122
122
  "file": "templates/jewelry.json",
123
123
  "version": 2,
124
124
  "fieldCount": 53,
125
- "requiredFieldCount": 3,
125
+ "requiredFieldCount": 0,
126
126
  "anticipatedFieldCount": 10,
127
127
  "regulation": {
128
128
  "name": "EU ESPR - Jewelry",
@@ -140,7 +140,7 @@
140
140
  "file": "templates/packaging.json",
141
141
  "version": 2,
142
142
  "fieldCount": 64,
143
- "requiredFieldCount": 8,
143
+ "requiredFieldCount": 0,
144
144
  "anticipatedFieldCount": 29,
145
145
  "regulation": {
146
146
  "name": "Packaging and Packaging Waste Regulation",
@@ -157,8 +157,8 @@
157
157
  "label": "Paints & Coatings",
158
158
  "file": "templates/paints-coatings.json",
159
159
  "version": 1,
160
- "fieldCount": 69,
161
- "requiredFieldCount": 15,
160
+ "fieldCount": 65,
161
+ "requiredFieldCount": 0,
162
162
  "anticipatedFieldCount": 12,
163
163
  "regulation": {
164
164
  "name": "Decopaint Directive",
@@ -174,7 +174,7 @@
174
174
  "file": "templates/steel.json",
175
175
  "version": 2,
176
176
  "fieldCount": 84,
177
- "requiredFieldCount": 16,
177
+ "requiredFieldCount": 0,
178
178
  "anticipatedFieldCount": 27,
179
179
  "regulation": {
180
180
  "name": "EU ESPR - Iron, Steel & Aluminium",
@@ -192,7 +192,7 @@
192
192
  "file": "templates/textile.json",
193
193
  "version": 2,
194
194
  "fieldCount": 60,
195
- "requiredFieldCount": 5,
195
+ "requiredFieldCount": 0,
196
196
  "anticipatedFieldCount": 32,
197
197
  "regulation": {
198
198
  "name": "EU ESPR - Textiles",
@@ -209,9 +209,9 @@
209
209
  "label": "Toys",
210
210
  "file": "templates/toys.json",
211
211
  "version": 2,
212
- "fieldCount": 28,
213
- "requiredFieldCount": 14,
214
- "anticipatedFieldCount": 8,
212
+ "fieldCount": 42,
213
+ "requiredFieldCount": 15,
214
+ "anticipatedFieldCount": 7,
215
215
  "regulation": {
216
216
  "name": "Toy Safety Regulation",
217
217
  "number": "(EU) 2025/2509",
@@ -226,7 +226,7 @@
226
226
  "file": "templates/tyres.json",
227
227
  "version": 2,
228
228
  "fieldCount": 93,
229
- "requiredFieldCount": 2,
229
+ "requiredFieldCount": 0,
230
230
  "anticipatedFieldCount": 26,
231
231
  "regulation": {
232
232
  "name": "EU ESPR - Tyres",
package/instruments.json CHANGED
@@ -346,6 +346,21 @@
346
346
  "eli": "http://data.europa.eu/eli/reg/2019/2019/oj",
347
347
  "createsDpp": false,
348
348
  "note": "Under Ecodesign Directive 2009/125/EC. Applies from 1 March 2021. Annex V provides indicative benchmarks; no Digital Product Passport created."
349
+ },
350
+ "32011R0305": {
351
+ "kind": "legislation",
352
+ "shortName": "CPR 2011",
353
+ "title": "Regulation (EU) No 305/2011 laying down harmonised conditions for the marketing of construction products",
354
+ "eli": "http://data.europa.eu/eli/reg/2011/305/oj",
355
+ "createsDpp": false,
356
+ "note": "Repealed by Regulation (EU) 2024/3110, but Art. 94 of that Regulation keeps its Articles 4 to 9 and 11 to 18 applying to products under its harmonised standards until 8 January 2040."
357
+ },
358
+ "32014L0068": {
359
+ "kind": "legislation",
360
+ "shortName": "Pressure Equipment Directive",
361
+ "title": "Directive 2014/68/EU on the harmonisation of the laws of the Member States relating to the making available on the market of pressure equipment",
362
+ "eli": "http://data.europa.eu/eli/dir/2014/68/oj",
363
+ "createsDpp": false
349
364
  }
350
365
  },
351
366
  "nonLegislative": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-schemas",
3
- "version": "1.8.0",
4
- "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 984 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
3
+ "version": "1.10.0",
4
+ "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories, 987 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
7
7
  "dpp",
package/schema.json CHANGED
@@ -534,6 +534,55 @@
534
534
  },
535
535
  "uniqueItems": true,
536
536
  "description": "Keys into `standards.json` for the technical standards this field relates to (test method, declaration format, identifier scheme). Relating to a standard never makes a field required — only `kind: legislation` can — and naming one is not a claim of conformity."
537
+ },
538
+ "obligations": {
539
+ "type": "array",
540
+ "description": "Every law, verified against its primary text, that requires this datum to exist, and where it puts it. A field is `validation.required` exactly when one entry has carrier `passport` from a law that creates a digital product passport and no condition the template cannot express; other entries record duties elsewhere (on the product, the label, a safety data sheet, a notification, a document, a customs declaration), which make the datum worth having without making it passport-mandatory. Added only by reading the act; npm run check:audit enforces the link to `required`.",
541
+ "items": {
542
+ "type": "object",
543
+ "additionalProperties": false,
544
+ "required": [
545
+ "instrument",
546
+ "provision",
547
+ "carrier",
548
+ "quote"
549
+ ],
550
+ "properties": {
551
+ "instrument": {
552
+ "type": "string",
553
+ "description": "CELEX id, e.g. \"32026R0405\"."
554
+ },
555
+ "provision": {
556
+ "type": "string",
557
+ "description": "Where in the act, e.g. \"Annex VI Part A(h)\"."
558
+ },
559
+ "carrier": {
560
+ "type": "string",
561
+ "enum": [
562
+ "passport",
563
+ "product",
564
+ "label",
565
+ "sds",
566
+ "notification",
567
+ "document",
568
+ "customs"
569
+ ],
570
+ "description": "Where the law puts the datum: the digital product passport, a marking on the product, its label or packaging, a safety data sheet, a notification to an authority or body, an accompanying document (declaration of conformity, instructions), or a customs declaration."
571
+ },
572
+ "condition": {
573
+ "type": [
574
+ "string",
575
+ "null"
576
+ ],
577
+ "description": "The condition the law attaches when the duty does not bind every product of the category (e.g. \"consumer products only\"); null when it binds all."
578
+ },
579
+ "quote": {
580
+ "type": "string",
581
+ "minLength": 5,
582
+ "description": "The operative sentence or sub-point, verbatim from the Official Journal text (ellipses allowed). Annex points can be as short as \"the weight;\"."
583
+ }
584
+ }
585
+ }
537
586
  }
538
587
  }
539
588
  },